diff --git a/404.html b/404.html index 5669ea97ee..fe5dc68fcc 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 193f564bd9..03a4de0f64 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 b3888b98ed..64e857a51f 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 52bc5c064a..6650ca7460 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 5034c462bf..cdadd64ba9 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 38467e82ae..85eb2a6fe0 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 6d28ca9d15..0b98a3492f 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 5083c2cb09..6a0ee676f2 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 5dd86b8a11..54cb0e47a9 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/21.2e28cab5.js b/assets/js/21.22e3493d.js similarity index 99% rename from assets/js/21.2e28cab5.js rename to assets/js/21.22e3493d.js index cd4199b02b..4d93f0fc85 100644 --- a/assets/js/21.2e28cab5.js +++ b/assets/js/21.22e3493d.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"},417: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/31.c4152f8b.js b/assets/js/31.f5fafba6.js similarity index 98% rename from assets/js/31.c4152f8b.js rename to assets/js/31.f5fafba6.js index 7cee13e4c2..0f20a8c730 100644 --- a/assets/js/31.c4152f8b.js +++ b/assets/js/31.f5fafba6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{351:function(t,e,a){t.exports=a.p+"assets/img/BDK-RN-Architecture.42fbc351.png"},352:function(t,e,a){t.exports=a.p+"assets/img/BDK-RN.370f20c3.png"},353:function(t,e,a){t.exports=a.p+"assets/img/android_folder.0ff999be.png"},408:function(t,e,a){"use strict";a.r(e);var n=a(7),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("The "),e("strong",[t._v("BitcoinDevkit")]),t._v("'s "),e("strong",[t._v("React Native")]),t._v(" library ("),e("code",[t._v("bdk-rn")]),t._v(") makes it easy to develop bitcoin applications for both Android and iOS mobile platforms. Using "),e("code",[t._v("bdk-rn")]),t._v(", knowledge of the underlying bitcoin and BDK API is not required and using "),e("code",[t._v("bdk-rn")]),t._v(" is similar to using any other RN module. The goal is "),e("strong",[t._v("Rapid Bitcoin Application Development")]),t._v(" by doing the heavy lifting in advance and providing a reusable library for other developers to use. Developers simply install using "),e("code",[t._v("yarn add")]),t._v(" and start using it in a React Native Project. The native code, Rust lang implementation, configuration and other setup details are all taken care of by "),e("code",[t._v("bdk-rn")]),t._v(".")]),t._v(" "),e("p",[t._v("This article is "),e("strong",[t._v("NOT a guide on how to use bdk-rn")]),t._v(" to build a bitcoin application, rather this is an insight into how "),e("code",[t._v("bdk-rn")]),t._v(" was developed. For help on how to use "),e("code",[t._v("bdk-rn")]),t._v(" to develop a bitcoin wallet or application please refer to the user guide in the "),e("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#usage",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),e("OutboundLink")],1),t._v(" on Github. There will be "),e("code",[t._v("how to guides")]),t._v(" published shortly on getting started with "),e("code",[t._v("bdk-rn")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"react-native-architecture"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#react-native-architecture"}},[t._v("#")]),t._v(" React Native Architecture")]),t._v(" "),e("p",[t._v("At a high level, RN consists of the UI front which is essentially JavaScript which interacts with the native iOS and Android platforms over a bridge. When communicating over the bridge values from JS are converted to native and vice versa.")]),t._v(" "),e("p",[t._v("The native part of RN consists of Android as well as iOS modules and components. The Android and iOS sections are full fledged native projects which interact with the JS side over the native bridge. A RN project has all the build configuraiton required to build both Android and iOS projects.")]),t._v(" "),e("p",[t._v("For the purpose of making "),e("code",[t._v("bdk-rn")]),t._v(", "),e("code",[t._v("bdk-kotlin")]),t._v(" is used as the native Android module and "),e("code",[t._v("bdk-swift")]),t._v(" as the native iOS module. These are configured and wrapped in a RN Project as part of the platform specific native modules within the RN Project. This RN Project is then built to be a reusable React Native module.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(351),alt:""}})]),t._v(" "),e("h2",{attrs:{id:"native-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#native-integration"}},[t._v("#")]),t._v(" Native Integration")]),t._v(" "),e("p",[t._v("In order to communicate to native modules on Android and iOS, React Native provides React Context API for Java/Kotlin as well as Swift. React Context API are used to build the interface to the native bridge allowing communication from JS to native modules.")]),t._v(" "),e("p",[t._v("bdk-rn uses React Context API plus some native code to wrap and enhance bdk-kotlin and bdk-swift APIs. The native code calls and interacts with the Android and iOS native modules which interface with the underlying mobile platform.")]),t._v(" "),e("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"20%"},attrs:{src:a(352)}}),t._v(" "),e("h2",{attrs:{id:"android-module"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#android-module"}},[t._v("#")]),t._v(" Android Module")]),t._v(" "),e("p",[t._v("We will go into the details of how the BDK Android Module is integrated, we wont cover iOS.")]),t._v(" "),e("p",[t._v("Starting off with a basic RN project. This project will be enhanced with bdk-kotlin and bdk-swift binaries and native code. For now lets go into the details for Android, iOS has similar steps to be done in Swift.")]),t._v(" "),e("p",[t._v("The Android native project is located under the root project folder.")]),t._v(" "),e("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"120%"},attrs:{src:a(353)}}),t._v(" "),e("p",[t._v("Here we need to add a dependency in "),e("code",[t._v("build.gradle")]),t._v(" for bdk-kotlin's android native binary. This will enable bdk-kotlin to be downloaded and available as one of the native modules.")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: build.gradle")]),t._v("\n\nrepositories "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mavenCentral")]),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\ndependencies "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//noinspection GradleDynamicVersion")]),t._v("\n implementation "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'com.facebook.react:react-native:+'")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// bitcoindevkit")]),t._v("\n implementation "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'org.bitcoindevkit:bdk-android:0.7.1'")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("We will create an Android native module which will interact with "),e("code",[t._v("bdk-android")]),t._v(".\nThis is done by adding a new Kotlin file "),e("code",[t._v("BdkRnModule.kt")]),t._v(" inside "),e("code",[t._v("android/app/src/main/java/com/bdkrn/")]),t._v(" folder")]),t._v(" "),e("p",[t._v("This will be part of the native code for bdk-rn module.Here a new class will be created to encapsulate the interaction with bitcoindevkit's android native binary.")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" android"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("annotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("SuppressLint\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" android"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Log\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Arguments\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Promise "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Result\n")])])]),e("p",[e("code",[t._v("org.bitcoindevkit")]),t._v(" will also need to be imported here")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bitcoindevkit"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Wallet "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" BdkWallet\n")])])]),e("p",[t._v("To use React Context API "),e("code",[t._v("com.facebook.react.bridge.*")]),t._v(" also needs to be imported")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n")])])]),e("p",[t._v("A new class needs to be defined here which will implement the React Context API")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("BdkRnModule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactApplicationContext"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReactContextBaseJavaModule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[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("override")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getName")]),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 string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BdkRnModule"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("With the base imports and class defined, we can start writing methods.\nThis will demonstrate how bdk native module will be called and how values will be returned to JS over the native bridge")]),t._v(" "),e("p",[t._v("Lets create a method that can be called from JaveScript, to do so we use the "),e("code",[t._v("@ReactMethod")]),t._v(" directive which is part of the React Context API. This will expose the method so that it can be called from JavaScript.")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token annotation builtin"}},[t._v("@ReactMethod")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Promise"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("We need one more file to complete our native framework. A new Kotlin file, "),e("code",[t._v("BdkRnPackage.kt")]),t._v(" is required to package all our native code into a new android module, here we specify the name of the file we just crated as the module name("),e("code",[t._v("BdkRnModule")]),t._v("). This can be done by adding the following code:")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnPackage.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ReactPackage\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("NativeModule\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ReactApplicationContext\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("uimanager"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ViewManager\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" BdkRnPackage "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactPackage "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNativeModules")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactApplicationContext"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n MutableList"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("NativeModule"),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("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mutableListOf")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("BdkRnModule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),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\n")])])]),e("p",[t._v("Now lets add code for creating a wallet in BdkRnModule.kt")]),t._v(" "),e("p",[t._v("The methods used here are for bdk-kotlin and available in the bdk-kotlin documentation.")]),t._v(" "),e("p",[t._v("We first create a key info object")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token annotation builtin"}},[t._v("@ReactMethod")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Promise"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[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("// Create key info with a new mnemonic")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" keys"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ExtendedKeyInfo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateExtendedKey")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n Network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TESTNET"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n WordCount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WORDS12"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// more code to follow...")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create descriptor and change descriptor")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create databaseConfig and blockchainconfig")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create wallet")]),t._v("\n \n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Then key info used to create a wallet descriptor and change descriptor:")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" descriptor"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" String "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh("')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" keys"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("xprv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(' "'),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("84")]),t._v("'"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("'"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("'"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*)\"\n\nval changeDescriptor: String = descriptor.replace(\"/84'/1'/0'/0/*\",\"/84'/1'/0'/1/*\")\n")])])])]),e("p",[t._v("To create a wallet with bdk we need to specify wallet descriptor, network, a database config, blockchain config. We intend to use bitcoin testnet and want to use default memory for data. For bitcoin node we will use a public electrum server. We will need to define these parameters to create a wallet.")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" network "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" `Network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TESTNET`\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" databaseConfig "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DatabaseConfig"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Memory\nblockchainConfig "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n BlockchainConfig"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Electrum")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ElectrumConfig")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 5u"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 10u"),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("p",[t._v("Once done we can use these parameters to create a BDK wallet using the native android BDK library:")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" wallet"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" BdkWallet "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("BdkWallet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n descriptor"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n changeDescriptor"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNetwork")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n databaseConfig"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n config\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Once we have a wallet initialised, we can call methods on it to sync, generate a new address and to get balance")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[t._v("wallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ProgressLog"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" maxAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nwallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nwallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),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 function"}},[t._v("toLong")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("To return a value from the native android code to React Native’s Javascript side over the JS Native bridge we will use "),e("code",[t._v("com.facebook.react.bridge.Promise")]),t._v(". To return balance information to JS, the following code can be used")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" balance"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" String "),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("getBalance")]),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 function"}},[t._v("toLong")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("resolve")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("balance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("At this point we have an Android native module and it can be invoked from JS by calling "),e("code",[t._v("createWallet")]),t._v(" and it will return the balance.")]),t._v(" "),e("p",[t._v("This project can be imported into any RN project to reuse the defined "),e("code",[t._v("createWallet")]),t._v(" method without the need to carry out the setup described above.")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// any js file in React Native")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a wallet and retrieve current balance")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" balance "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),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("\nconsole"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" balance "),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("p",[t._v("The actual "),e("code",[t._v("bdk-rn")]),t._v(" module has organised the native code into granular methods for different stages of creating a wallet and for different interactions and use cases for a bitcoin application, like generating, mnemonic, keys, creating wallet for different networks, creating descriptors, creating or restoring wallet, fetching balance, fetching transactions and many other methods. Please refer to the "),e("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#usage",target:"_blank",rel:"noopener noreferrer"}},[t._v("user guide in the readme"),e("OutboundLink")],1),t._v(" on Github for the complete API. The set of APIs available will grow in the near future as more APIs are added. This article can also be used as a guide to add new methods to the existing bdk-rn project.")]),t._v(" "),e("p",[t._v("The objective of "),e("code",[t._v("bdk-rn")]),t._v(" is to enable React Native developers to quickly start developing applications without the need to package BDK as described above.")]),t._v(" "),e("p",[t._v("Be on the lookout for user guides and tutorials on how to build bitcoin applications using "),e("code",[t._v("bdk-rn")]),t._v(" and "),e("code",[t._v("bdk-flutter")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"references"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),e("p",[t._v("Creating native modules for Android and iOS: "),e("a",{attrs:{href:"https://reactnative.dev/docs/native-modules-intro",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://reactnative.dev/docs/native-modules-intro"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("React Native Architecture: "),e("a",{attrs:{href:"https://www.reactnative.guide/3-react-native-internals/3.1-react-native-internals.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.reactnative.guide/3-react-native-internals/3.1-react-native-internals.html"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("BDK-Android API: "),e("a",{attrs:{href:"https://bitcoindevkit.org/bdk-jvm/bdk-jvm/org.bitcoindevkit/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoindevkit.org/bdk-jvm/bdk-jvm/org.bitcoindevkit/index.html"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("BDK-RN: "),e("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/LtbLightning/bdk-rn"),e("OutboundLink")],1)]),t._v(" "),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/107",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=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{349:function(t,e,a){t.exports=a.p+"assets/img/BDK-RN-Architecture.42fbc351.png"},350:function(t,e,a){t.exports=a.p+"assets/img/BDK-RN.370f20c3.png"},351:function(t,e,a){t.exports=a.p+"assets/img/android_folder.0ff999be.png"},407:function(t,e,a){"use strict";a.r(e);var n=a(7),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("The "),e("strong",[t._v("BitcoinDevkit")]),t._v("'s "),e("strong",[t._v("React Native")]),t._v(" library ("),e("code",[t._v("bdk-rn")]),t._v(") makes it easy to develop bitcoin applications for both Android and iOS mobile platforms. Using "),e("code",[t._v("bdk-rn")]),t._v(", knowledge of the underlying bitcoin and BDK API is not required and using "),e("code",[t._v("bdk-rn")]),t._v(" is similar to using any other RN module. The goal is "),e("strong",[t._v("Rapid Bitcoin Application Development")]),t._v(" by doing the heavy lifting in advance and providing a reusable library for other developers to use. Developers simply install using "),e("code",[t._v("yarn add")]),t._v(" and start using it in a React Native Project. The native code, Rust lang implementation, configuration and other setup details are all taken care of by "),e("code",[t._v("bdk-rn")]),t._v(".")]),t._v(" "),e("p",[t._v("This article is "),e("strong",[t._v("NOT a guide on how to use bdk-rn")]),t._v(" to build a bitcoin application, rather this is an insight into how "),e("code",[t._v("bdk-rn")]),t._v(" was developed. For help on how to use "),e("code",[t._v("bdk-rn")]),t._v(" to develop a bitcoin wallet or application please refer to the user guide in the "),e("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#usage",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),e("OutboundLink")],1),t._v(" on Github. There will be "),e("code",[t._v("how to guides")]),t._v(" published shortly on getting started with "),e("code",[t._v("bdk-rn")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"react-native-architecture"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#react-native-architecture"}},[t._v("#")]),t._v(" React Native Architecture")]),t._v(" "),e("p",[t._v("At a high level, RN consists of the UI front which is essentially JavaScript which interacts with the native iOS and Android platforms over a bridge. When communicating over the bridge values from JS are converted to native and vice versa.")]),t._v(" "),e("p",[t._v("The native part of RN consists of Android as well as iOS modules and components. The Android and iOS sections are full fledged native projects which interact with the JS side over the native bridge. A RN project has all the build configuraiton required to build both Android and iOS projects.")]),t._v(" "),e("p",[t._v("For the purpose of making "),e("code",[t._v("bdk-rn")]),t._v(", "),e("code",[t._v("bdk-kotlin")]),t._v(" is used as the native Android module and "),e("code",[t._v("bdk-swift")]),t._v(" as the native iOS module. These are configured and wrapped in a RN Project as part of the platform specific native modules within the RN Project. This RN Project is then built to be a reusable React Native module.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(349),alt:""}})]),t._v(" "),e("h2",{attrs:{id:"native-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#native-integration"}},[t._v("#")]),t._v(" Native Integration")]),t._v(" "),e("p",[t._v("In order to communicate to native modules on Android and iOS, React Native provides React Context API for Java/Kotlin as well as Swift. React Context API are used to build the interface to the native bridge allowing communication from JS to native modules.")]),t._v(" "),e("p",[t._v("bdk-rn uses React Context API plus some native code to wrap and enhance bdk-kotlin and bdk-swift APIs. The native code calls and interacts with the Android and iOS native modules which interface with the underlying mobile platform.")]),t._v(" "),e("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"20%"},attrs:{src:a(350)}}),t._v(" "),e("h2",{attrs:{id:"android-module"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#android-module"}},[t._v("#")]),t._v(" Android Module")]),t._v(" "),e("p",[t._v("We will go into the details of how the BDK Android Module is integrated, we wont cover iOS.")]),t._v(" "),e("p",[t._v("Starting off with a basic RN project. This project will be enhanced with bdk-kotlin and bdk-swift binaries and native code. For now lets go into the details for Android, iOS has similar steps to be done in Swift.")]),t._v(" "),e("p",[t._v("The Android native project is located under the root project folder.")]),t._v(" "),e("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"120%"},attrs:{src:a(351)}}),t._v(" "),e("p",[t._v("Here we need to add a dependency in "),e("code",[t._v("build.gradle")]),t._v(" for bdk-kotlin's android native binary. This will enable bdk-kotlin to be downloaded and available as one of the native modules.")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: build.gradle")]),t._v("\n\nrepositories "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mavenCentral")]),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\ndependencies "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//noinspection GradleDynamicVersion")]),t._v("\n implementation "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'com.facebook.react:react-native:+'")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// bitcoindevkit")]),t._v("\n implementation "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'org.bitcoindevkit:bdk-android:0.7.1'")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("We will create an Android native module which will interact with "),e("code",[t._v("bdk-android")]),t._v(".\nThis is done by adding a new Kotlin file "),e("code",[t._v("BdkRnModule.kt")]),t._v(" inside "),e("code",[t._v("android/app/src/main/java/com/bdkrn/")]),t._v(" folder")]),t._v(" "),e("p",[t._v("This will be part of the native code for bdk-rn module.Here a new class will be created to encapsulate the interaction with bitcoindevkit's android native binary.")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" android"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("annotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("SuppressLint\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" android"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Log\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Arguments\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Promise "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" Result\n")])])]),e("p",[e("code",[t._v("org.bitcoindevkit")]),t._v(" will also need to be imported here")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bitcoindevkit"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Wallet "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" BdkWallet\n")])])]),e("p",[t._v("To use React Context API "),e("code",[t._v("com.facebook.react.bridge.*")]),t._v(" also needs to be imported")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n")])])]),e("p",[t._v("A new class needs to be defined here which will implement the React Context API")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("BdkRnModule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactApplicationContext"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReactContextBaseJavaModule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[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("override")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getName")]),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 string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BdkRnModule"')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("With the base imports and class defined, we can start writing methods.\nThis will demonstrate how bdk native module will be called and how values will be returned to JS over the native bridge")]),t._v(" "),e("p",[t._v("Lets create a method that can be called from JaveScript, to do so we use the "),e("code",[t._v("@ReactMethod")]),t._v(" directive which is part of the React Context API. This will expose the method so that it can be called from JavaScript.")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token annotation builtin"}},[t._v("@ReactMethod")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Promise"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("We need one more file to complete our native framework. A new Kotlin file, "),e("code",[t._v("BdkRnPackage.kt")]),t._v(" is required to package all our native code into a new android module, here we specify the name of the file we just crated as the module name("),e("code",[t._v("BdkRnModule")]),t._v("). This can be done by adding the following code:")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnPackage.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ReactPackage\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("NativeModule\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bridge"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ReactApplicationContext\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("facebook"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("react"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("uimanager"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ViewManager\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" BdkRnPackage "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactPackage "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createNativeModules")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ReactApplicationContext"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n MutableList"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("NativeModule"),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("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mutableListOf")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("BdkRnModule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reactContext"),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\n")])])]),e("p",[t._v("Now lets add code for creating a wallet in BdkRnModule.kt")]),t._v(" "),e("p",[t._v("The methods used here are for bdk-kotlin and available in the bdk-kotlin documentation.")]),t._v(" "),e("p",[t._v("We first create a key info object")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// File: BdkRnModule.kt")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token annotation builtin"}},[t._v("@ReactMethod")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fun")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Promise"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[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("// Create key info with a new mnemonic")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" keys"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" ExtendedKeyInfo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateExtendedKey")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n Network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TESTNET"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n WordCount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WORDS12"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// more code to follow...")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create descriptor and change descriptor")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create databaseConfig and blockchainconfig")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create wallet")]),t._v("\n \n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Then key info used to create a wallet descriptor and change descriptor:")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" descriptor"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" String "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh("')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" keys"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("xprv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(' "'),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("84")]),t._v("'"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("'"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("'"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*)\"\n\nval changeDescriptor: String = descriptor.replace(\"/84'/1'/0'/0/*\",\"/84'/1'/0'/1/*\")\n")])])])]),e("p",[t._v("To create a wallet with bdk we need to specify wallet descriptor, network, a database config, blockchain config. We intend to use bitcoin testnet and want to use default memory for data. For bitcoin node we will use a public electrum server. We will need to define these parameters to create a wallet.")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" network "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" `Network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TESTNET`\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" databaseConfig "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DatabaseConfig"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Memory\nblockchainConfig "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n BlockchainConfig"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Electrum")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ElectrumConfig")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string-literal singleline"}},[e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 5u"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 10u"),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("p",[t._v("Once done we can use these parameters to create a BDK wallet using the native android BDK library:")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" wallet"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" BdkWallet "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("BdkWallet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n descriptor"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n changeDescriptor"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setNetwork")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n databaseConfig"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n config\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Once we have a wallet initialised, we can call methods on it to sync, generate a new address and to get balance")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[t._v("wallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ProgressLog"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" maxAddress"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nwallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nwallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),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 function"}},[t._v("toLong")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("To return a value from the native android code to React Native’s Javascript side over the JS Native bridge we will use "),e("code",[t._v("com.facebook.react.bridge.Promise")]),t._v(". To return balance information to JS, the following code can be used")]),t._v(" "),e("div",{staticClass:"language-kotlin extra-class"},[e("pre",{pre:!0,attrs:{class:"language-kotlin"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("val")]),t._v(" balance"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" String "),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("getBalance")]),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 function"}},[t._v("toLong")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("resolve")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("balance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("At this point we have an Android native module and it can be invoked from JS by calling "),e("code",[t._v("createWallet")]),t._v(" and it will return the balance.")]),t._v(" "),e("p",[t._v("This project can be imported into any RN project to reuse the defined "),e("code",[t._v("createWallet")]),t._v(" method without the need to carry out the setup described above.")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// any js file in React Native")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a wallet and retrieve current balance")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" balance "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),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("\nconsole"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" balance "),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("p",[t._v("The actual "),e("code",[t._v("bdk-rn")]),t._v(" module has organised the native code into granular methods for different stages of creating a wallet and for different interactions and use cases for a bitcoin application, like generating, mnemonic, keys, creating wallet for different networks, creating descriptors, creating or restoring wallet, fetching balance, fetching transactions and many other methods. Please refer to the "),e("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#usage",target:"_blank",rel:"noopener noreferrer"}},[t._v("user guide in the readme"),e("OutboundLink")],1),t._v(" on Github for the complete API. The set of APIs available will grow in the near future as more APIs are added. This article can also be used as a guide to add new methods to the existing bdk-rn project.")]),t._v(" "),e("p",[t._v("The objective of "),e("code",[t._v("bdk-rn")]),t._v(" is to enable React Native developers to quickly start developing applications without the need to package BDK as described above.")]),t._v(" "),e("p",[t._v("Be on the lookout for user guides and tutorials on how to build bitcoin applications using "),e("code",[t._v("bdk-rn")]),t._v(" and "),e("code",[t._v("bdk-flutter")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"references"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References")]),t._v(" "),e("p",[t._v("Creating native modules for Android and iOS: "),e("a",{attrs:{href:"https://reactnative.dev/docs/native-modules-intro",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://reactnative.dev/docs/native-modules-intro"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("React Native Architecture: "),e("a",{attrs:{href:"https://www.reactnative.guide/3-react-native-internals/3.1-react-native-internals.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.reactnative.guide/3-react-native-internals/3.1-react-native-internals.html"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("BDK-Android API: "),e("a",{attrs:{href:"https://bitcoindevkit.org/bdk-jvm/bdk-jvm/org.bitcoindevkit/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoindevkit.org/bdk-jvm/bdk-jvm/org.bitcoindevkit/index.html"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("BDK-RN: "),e("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/LtbLightning/bdk-rn"),e("OutboundLink")],1)]),t._v(" "),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/107",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=s.exports}}]); \ No newline at end of file diff --git a/assets/js/34.40447606.js b/assets/js/34.9d0e2a00.js similarity index 99% rename from assets/js/34.40447606.js rename to assets/js/34.9d0e2a00.js index af078d2b8a..e9fcf307fd 100644 --- a/assets/js/34.40447606.js +++ b/assets/js/34.9d0e2a00.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"},407: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],{352:function(t,e,a){t.exports=a.p+"assets/img/descriptor-tracker.5942c853.jpg"},353:function(t,e,a){t.exports=a.p+"assets/img/checkpoints.a4179787.jpg"},409: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(352),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(353),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/35.32eda076.js b/assets/js/35.ff437f91.js similarity index 98% rename from assets/js/35.32eda076.js rename to assets/js/35.ff437f91.js index b1ebf8de7b..828d64bd56 100644 --- a/assets/js/35.32eda076.js +++ b/assets/js/35.ff437f91.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{316:function(t,a,s){},375:function(t,a,s){"use strict";s(316)},437:function(t,a,s){"use strict";s.r(a);s(375);var i=s(7),e=Object(i.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"all"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#all"}},[t._v("#")]),t._v(" All")]),t._v(" "),a("p",[t._v("Explore the ecosystem of projects that are built with the BDK family of libraries.")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("\n Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.\n ")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])])]),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://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])])]),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.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://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t._v("Seba Bank")])]),t._v(" "),a("p",[t._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/stackmate-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[t._v("Stackmate")])]),t._v(" "),a("p",[t._v("A multi-purpose Bitcoin Wallet.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])])]),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.")])])]),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://proton.me/wallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/protonwallet-logo-transparent-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[t._v("Proton Wallet")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin wallet from the makers of Proton Mail.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/volt-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[t._v("Volt")])]),t._v(" "),a("p",[t._v("A modern descriptor-based Financial Freedom Bitcoin Wallet aimed at restoring sovereignty to Global Bitcoiners.")])])]),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://www.satsails.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/satsails-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.satsails.com/",target:"_blank"}},[t._v("Satsails")])]),t._v(" "),a("p",[t._v("Satsails is a self self custodial bitcoin wallet with fiat integration for selected countries.")])])]),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.")])])]),t._v(" "),a("br"),t._v(" "),a("a",{staticClass:"nav-link external action-button",attrs:{href:"https://github.com/orgs/bitcoindevkit/discussions/64",target:"_blank",rel:"noopener noreferrer"}},[t._v("\n Add your project!\n")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{317:function(t,a,s){},376:function(t,a,s){"use strict";s(317)},439:function(t,a,s){"use strict";s.r(a);s(376);var i=s(7),e=Object(i.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"all"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#all"}},[t._v("#")]),t._v(" All")]),t._v(" "),a("p",[t._v("Explore the ecosystem of projects that are built with the BDK family of libraries.")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("\n Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.\n ")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])])]),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://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])])]),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.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://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t._v("Seba Bank")])]),t._v(" "),a("p",[t._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/stackmate-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[t._v("Stackmate")])]),t._v(" "),a("p",[t._v("A multi-purpose Bitcoin Wallet.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])])]),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.")])])]),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://proton.me/wallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/protonwallet-logo-transparent-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[t._v("Proton Wallet")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin wallet from the makers of Proton Mail.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/volt-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[t._v("Volt")])]),t._v(" "),a("p",[t._v("A modern descriptor-based Financial Freedom Bitcoin Wallet aimed at restoring sovereignty to Global Bitcoiners.")])])]),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://www.satsails.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/satsails-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.satsails.com/",target:"_blank"}},[t._v("Satsails")])]),t._v(" "),a("p",[t._v("Satsails is a self self custodial bitcoin wallet with fiat integration for selected countries.")])])]),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.")])])]),t._v(" "),a("br"),t._v(" "),a("a",{staticClass:"nav-link external action-button",attrs:{href:"https://github.com/orgs/bitcoindevkit/discussions/64",target:"_blank",rel:"noopener noreferrer"}},[t._v("\n Add your project!\n")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/36.0de87187.js b/assets/js/36.f2305c78.js similarity index 80% rename from assets/js/36.0de87187.js rename to assets/js/36.f2305c78.js index 04414c2f2f..bedcb909a1 100644 --- a/assets/js/36.0de87187.js +++ b/assets/js/36.f2305c78.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{317:function(t,s,a){},376:function(t,s,a){"use strict";a(317)},438:function(t,s,a){"use strict";a.r(s);a(376);var i=a(7),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"custodial"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custodial"}},[this._v("#")]),this._v(" Custodial")]),this._v(" "),t("div",{staticClass:"project"},[t("div",{staticClass:"project-logo"},[t("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})])]),this._v(" "),t("div",{staticClass:"tagline"},[t("h3",[t("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[this._v("Seba Bank")])]),this._v(" "),t("p",[this._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{316:function(t,s,a){},375:function(t,s,a){"use strict";a(316)},438:function(t,s,a){"use strict";a.r(s);a(375);var i=a(7),e=Object(i.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"custodial"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custodial"}},[this._v("#")]),this._v(" Custodial")]),this._v(" "),t("div",{staticClass:"project"},[t("div",{staticClass:"project-logo"},[t("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})])]),this._v(" "),t("div",{staticClass:"tagline"},[t("h3",[t("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[this._v("Seba Bank")])]),this._v(" "),t("p",[this._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/37.4206e9e0.js b/assets/js/37.87c3a0a8.js similarity index 98% rename from assets/js/37.4206e9e0.js rename to assets/js/37.87c3a0a8.js index 8b910c426d..bf22370cb5 100644 --- a/assets/js/37.4206e9e0.js +++ b/assets/js/37.87c3a0a8.js @@ -1 +1 @@ -(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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{318:function(t,a,s){},377:function(t,a,s){"use strict";s(318)},440: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.580fe351.js b/assets/js/38.8fd5c156.js similarity index 95% rename from assets/js/38.580fe351.js rename to assets/js/38.8fd5c156.js index d33338060c..a07a819ce2 100644 --- a/assets/js/38.580fe351.js +++ b/assets/js/38.8fd5c156.js @@ -1 +1 @@ -(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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{319:function(t,a,s){},378:function(t,a,s){"use strict";s(319)},441: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/39.cb1ff7a2.js b/assets/js/39.f8b5da6d.js similarity index 96% rename from assets/js/39.cb1ff7a2.js rename to assets/js/39.f8b5da6d.js index 30425aea7f..973612f8d4 100644 --- a/assets/js/39.cb1ff7a2.js +++ b/assets/js/39.f8b5da6d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{320:function(t,a,s){},379:function(t,a,s){"use strict";s(320)},441:function(t,a,s){"use strict";s.r(a);s(379);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:"hardware"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#hardware"}},[t._v("#")]),t._v(" Hardware")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("\n Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.\n ")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])])])}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{320:function(t,a,s){},379:function(t,a,s){"use strict";s(320)},442:function(t,a,s){"use strict";s.r(a);s(379);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:"hardware"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#hardware"}},[t._v("#")]),t._v(" Hardware")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("\n Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.\n ")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])])])}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/40.1e9955ce.js b/assets/js/40.5f4c9ecf.js similarity index 96% rename from assets/js/40.1e9955ce.js rename to assets/js/40.5f4c9ecf.js index b1c0a31d80..55fa07ac46 100644 --- a/assets/js/40.1e9955ce.js +++ b/assets/js/40.5f4c9ecf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{321:function(t,a,s){},380:function(t,a,s){"use strict";s(321)},442:function(t,a,s){"use strict";s.r(a);s(380);var r=s(7),i=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"infrastructure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#infrastructure"}},[t._v("#")]),t._v(" Infrastructure")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])])]),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=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{321:function(t,a,s){},380:function(t,a,s){"use strict";s(321)},443:function(t,a,s){"use strict";s.r(a);s(380);var r=s(7),i=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"infrastructure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#infrastructure"}},[t._v("#")]),t._v(" Infrastructure")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])])]),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=i.exports}}]); \ No newline at end of file diff --git a/assets/js/41.79fc88d1.js b/assets/js/41.017da959.js similarity index 98% rename from assets/js/41.79fc88d1.js rename to assets/js/41.017da959.js index 246d70b9cb..13876893ee 100644 --- a/assets/js/41.79fc88d1.js +++ b/assets/js/41.017da959.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{323:function(t,a,s){},382:function(t,a,s){"use strict";s(323)},445:function(t,a,s){"use strict";s.r(a);s(382);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:"mobile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mobile"}},[t._v("#")]),t._v(" Mobile")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("\n Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.\n ")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])]),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://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])])]),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.")])])]),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://proton.me/wallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/protonwallet-logo-transparent-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[t._v("Proton Wallet")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin wallet from the makers of Proton Mail.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/volt-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[t._v("Volt")])]),t._v(" "),a("p",[t._v("A modern descriptor-based Financial Freedom Bitcoin Wallet aimed at restoring sovereignty to Global Bitcoiners.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.satsails.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/satsails-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.satsails.com/",target:"_blank"}},[t._v("Satsails")])]),t._v(" "),a("p",[t._v("Satsails is a self self custodial bitcoin wallet with fiat integration for selected countries.")])])])])}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{322:function(t,a,s){},381:function(t,a,s){"use strict";s(322)},444:function(t,a,s){"use strict";s.r(a);s(381);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:"mobile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mobile"}},[t._v("#")]),t._v(" Mobile")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("\n Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.\n ")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h2",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])]),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://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])])]),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.")])])]),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://proton.me/wallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/protonwallet-logo-transparent-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[t._v("Proton Wallet")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin wallet from the makers of Proton Mail.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/volt-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/Zero-1729/volt",target:"_blank"}},[t._v("Volt")])]),t._v(" "),a("p",[t._v("A modern descriptor-based Financial Freedom Bitcoin Wallet aimed at restoring sovereignty to Global Bitcoiners.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.satsails.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/satsails-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.satsails.com/",target:"_blank"}},[t._v("Satsails")])]),t._v(" "),a("p",[t._v("Satsails is a self self custodial bitcoin wallet with fiat integration for selected countries.")])])])])}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/42.bf416f89.js b/assets/js/42.c35335fc.js similarity index 91% rename from assets/js/42.bf416f89.js rename to assets/js/42.c35335fc.js index 0b6e160bc2..aa871455b3 100644 --- a/assets/js/42.bf416f89.js +++ b/assets/js/42.c35335fc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{322:function(t,a,s){},381:function(t,a,s){"use strict";s(322)},444:function(t,a,s){"use strict";s.r(a);s(381);var e=s(7),o=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"web"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#web"}},[t._v("#")]),t._v(" Web")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])])]),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://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/protonwallet-logo-transparent-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[t._v("Proton Wallet")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin wallet from the makers of Proton Mail.")])])])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{323:function(t,a,s){},382:function(t,a,s){"use strict";s(323)},445:function(t,a,s){"use strict";s.r(a);s(382);var e=s(7),o=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"web"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#web"}},[t._v("#")]),t._v(" Web")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])])]),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://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/protonwallet-logo-transparent-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://proton.me/wallet",target:"_blank"}},[t._v("Proton Wallet")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin wallet from the makers of Proton Mail.")])])])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/46.c88b1de0.js b/assets/js/46.8a620891.js similarity index 99% rename from assets/js/46.c88b1de0.js rename to assets/js/46.8a620891.js index 5ce1bfe02a..ec54614572 100644 --- a/assets/js/46.c88b1de0.js +++ b/assets/js/46.8a620891.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{399:function(e,t,r){"use strict";r.r(t);var n=r(7),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h3",{attrs:{id:"this-post"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#this-post"}},[e._v("#")]),e._v(" This Post")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spiral"),t("OutboundLink")],1),e._v(" team has graciously supported BDK financially (and spiritually) for the past four years and since early 2022 the BDK team has let folks know what we've been up to via the "),t("a",{attrs:{href:"https://spiral.xyz/blog/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spiral blog"),t("OutboundLink")],1),e._v(". As of last summer we are grateful to also have received a generous "),t("a",{attrs:{href:"https://opensats.org/blog/bitcoin-and-nostr-grants-august-2023",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenSats grant"),t("OutboundLink")],1),e._v(" supporting our project. To keep our current and future financial supporters, open source contributors, and downstream users updated on our progress, starting this year we will be publishing a quarterly BDK project updates here on our blog.")]),e._v(" "),t("h3",{attrs:{id:"end-of-year-review"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#end-of-year-review"}},[e._v("#")]),e._v(" End of Year Review")]),e._v(" "),t("p",[e._v("The BDK project is made up of a core suite of "),t("a",{attrs:{href:"https://www.rust-lang.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust"),t("OutboundLink")],1),e._v(" libraries ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk?tab=readme-ov-file#architecture",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-*"),t("OutboundLink")],1),e._v(") that work together to provide everything an application developer needs to incorporate on-chain bitcoin wallet functionality into their project. Wrapped around the BDK core libraries is our "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-ffi"),t("OutboundLink")],1),e._v(" bindings libraries that let Kotlin (desktop/android), Swift (desktop/iOS), and Python developers use BDK seamlessly in their projects. And wrapped around all of this software is documentation and examples. For over a year the BDK team has been working on a major "),t("a",{attrs:{href:"https://bitcoindevkit.org/blog/tags/architecture/",target:"_blank",rel:"noopener noreferrer"}},[e._v("re-architecture"),t("OutboundLink")],1),e._v(" of the BDK libraries to improve blockchain syncing, embedded device support ("),t("a",{attrs:{href:"https://docs.rust-embedded.org/book/intro/no-std.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("no-std"),t("OutboundLink")],1),e._v("), update key dependencies ("),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(") and finally to provide a stable 1.0 API that our users can rely on for their production applications.")]),e._v(" "),t("p",[e._v("The team is currently working on the 1.0.0-alpha release train. The purposed of these alpha releases is to give early adopters (including our own "),t("code",[e._v("bdk-ffi")]),e._v(" contributors) a chance to try-out new BDK features and updated APIs and provide feedback. Once we have a stable, feature complete 1.0.0 BDK that our alpha users love we'll begin publishing 1.0.0-beta releases. With our beta releases we will finish updating tutorials and examples and performance testing, and ask all BDK users to start migrating and testing their applications with BDK 1.0.0. When our key contributors and users are satisfied that we have shaken out any final 1.0.0-beta issues we'll publish our BDK 1.0.0 release. Once 1.0.0 is out subsequent releases will use "),t("a",{attrs:{href:"https://semver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("semantic versioning"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("For those keeping score, we'd originally planned to have the BDK 1.0.0 release out last year, but (spoiler) that didn't happen. As I'm sure our kind readers understand making safe, feature rich, easy to use bitcoin software isn't easy, reviewing it is even harder, and we, like every project in the space are short-handed. But with every release, as we build the software we also on-board new contributors and build the team that will deliver BDK 1.0.0, 1.1.0, 2.0.0, and beyond.")]),e._v(" "),t("h3",{attrs:{id:"core-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#core-bdk"}},[e._v("#")]),e._v(" Core BDK")]),e._v(" "),t("p",[e._v("For Q4 2023 we "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pulls?page=1&q=is%3Apr+merged%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("merged 33 PRs"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues?q=is%3Aissue+closed%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("closed 32 issues"),t("OutboundLink")],1),e._v(", and completed two 1.0.0-alpha releases, "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("1.0.0-alpha.2"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("1.0.0-alpha.3"),t("OutboundLink")],1),e._v(". The primary deliverable of these releases was to further stabilize the "),t("code",[e._v("bdk_chain")]),e._v(" crate which provides the central logic for tracking and updating wallet keychains and scripts to be tracked and manages all of the related blockchain and transaction data. Additional PRs started this quarter lay the groundwork for the next phase of development focused on improving how we sync data via blockchain clients and save that data to persistent storage. We also made one maintenance release "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v0.29.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.29.0"),t("OutboundLink")],1),e._v(" that upgraded our "),t("code",[e._v("rust-bitcoin")]),e._v(" dependency to release to 0.30.")]),e._v(" "),t("h3",{attrs:{id:"bdk-ffi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-ffi"}},[e._v("#")]),e._v(" BDK-FFI")]),e._v(" "),t("p",[e._v("In Q4 the BDK-FFI bindings for Kotlin, Swift, and Python saw "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/pulls?page=1&q=is%3Apr+merged%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("23 PRs merged"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/issues?q=is%3Aissue+closed%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("15 issues closed"),t("OutboundLink")],1),e._v(". One maintenance release was completed, "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v0.31.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.31.0"),t("OutboundLink")],1),e._v(", which updated the language bindings dependency to the latest rust "),t("code",[e._v("bdk")]),e._v(" maintenance release 0.29.0 and in doing so updated the BDK FFI "),t("code",[e._v("rust-bitcoin")]),e._v(" dependency to version 0.30. This quarter the team took on the major task of creating the first language bindings based on the "),t("code",[e._v("bdk")]),e._v(" 1.0.0-alpha API. The resulting "),t("code",[e._v("bdk-ffi")]),e._v(" "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v1.0.0-alpha.2a",target:"_blank",rel:"noopener noreferrer"}},[e._v("v1.0.0-alpha2a"),t("OutboundLink")],1),e._v(" release is only able to expose part of the full "),t("code",[e._v("bdk")]),e._v(" 1.0.0 API but prepares the project for full support in future releases. As part of this work the current Kotlin API docs were removed, but fear not they will return in future alpha releases and be better than ever with not only API docs for Kotlin but also Swift and Python.")]),e._v(" "),t("h3",{attrs:{id:"bdk-contributors-spotlight"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-contributors-spotlight"}},[e._v("#")]),e._v(" BDK contributors spotlight")]),e._v(" "),t("p",[e._v("In this section we share what some of our hardworking contributors are doing to educate people about BDK, help on board new projects, and generally promote bitcoin and open source development around the world.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/danielabrozzoni/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Daniela Brozzoni"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("November 3: Gave a "),t("a",{attrs:{href:"https://bolt.fun",target:"_blank",rel:"noopener noreferrer"}},[e._v("bolt.fun"),t("OutboundLink")],1),e._v(" talk on open source development, "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=P75nCR1owws",target:"_blank",rel:"noopener noreferrer"}},[e._v("YouTube"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("October 25-26: Joined a "),t("a",{attrs:{href:"https://planb.lugano.ch/contributing-to-free-and-open-source-projects/",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Contributing to free and open source projects" panel'),t("OutboundLink")],1),e._v(" at "),t("a",{attrs:{href:"https://planb.lugano.ch/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Plan B"),t("OutboundLink")],1),e._v(" lugano.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/evanlinjin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Evan Linjin"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("November 15: Worked with "),t("a",{attrs:{href:"https://wizardsardine.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("wizardsardine"),t("OutboundLink")],1),e._v(" team to "),t("a",{attrs:{href:"https://twitter.com/darosior/status/1724842410839093562",target:"_blank",rel:"noopener noreferrer"}},[e._v("extract and integrate BDK coin-selection into the Liana wallet"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("December 3: Spoke at the "),t("a",{attrs:{href:"https://twitter.com/TaiwanBitdevs/status/1726537941688967238",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Tech Summit Taipei"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("December 13: Gave a talk about Bitcoin and BDK at "),t("a",{attrs:{href:"https://twitter.com/JCBA_org/status/1735100779172856170",target:"_blank",rel:"noopener noreferrer"}},[e._v("Taipei Blockchain Week"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Thunderbiscuit"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("November 8: Created the educational "),t("a",{attrs:{href:"https://opcodeexplained.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Opcode Explained"),t("OutboundLink")],1),e._v(" website to help... explain bitcoin opcodes!")]),e._v(" "),t("p",[e._v("November 15: Joined the panel on the "),t("a",{attrs:{href:"https://bitcoin.review/podcast/episode-55/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Review Podcast Episode 55"),t("OutboundLink")],1),e._v(" to talked about his "),t("a",{attrs:{href:"https://github.com/thunderbiscuit/padawan-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("padawan-wallet"),t("OutboundLink")],1),e._v(" project.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/reez/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matthew Ramsden"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("October 11: Spoke at the "),t("a",{attrs:{href:"https://www.meetup.com/bitcoinpark/events/291768716/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Park OpenHouse"),t("OutboundLink")],1),e._v(" on the topic "),t("a",{attrs:{href:"https://podcasts.apple.com/us/podcast/open-house-exploring-the-lightning-network-ldk/id1646515985?i=1000631904227",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Exploring the Lightning Network"'),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("November 8: Created a video for the "),t("a",{attrs:{href:"https://www.youtube.com/@bitcoindevelopers",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Developers"),t("OutboundLink")],1),e._v(" channel on YouTube titled "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=rcU3LU6iZCs",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Lightning Development with Swift: Make Your First Lightning App with LDK Node Swift"'),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Other current and future contributors...")])]),e._v(" "),t("p",[e._v("If you are a contributor to BDK and doing something fun that's BDK and/or bitcoin related let us know! Tag "),t("a",{attrs:{href:"https://twitter.com/bitcoindevkit/",target:"_blank",rel:"noopener noreferrer"}},[e._v("@bitcoindevkit"),t("OutboundLink")],1),e._v(" on X, "),t("a",{attrs:{href:"https://primal.net/profile/npub1ke470rdgnxg4gjs9cw3tv0dp690wl68f5xak5smflpsksedadd7qtf8jfm",target:"_blank",rel:"noopener noreferrer"}},[e._v("notmandatory"),t("OutboundLink")],1),e._v(" on nostr, or send us an email: blog at bitcoindevkit dot org.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{400:function(e,t,r){"use strict";r.r(t);var n=r(7),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h3",{attrs:{id:"this-post"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#this-post"}},[e._v("#")]),e._v(" This Post")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spiral"),t("OutboundLink")],1),e._v(" team has graciously supported BDK financially (and spiritually) for the past four years and since early 2022 the BDK team has let folks know what we've been up to via the "),t("a",{attrs:{href:"https://spiral.xyz/blog/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spiral blog"),t("OutboundLink")],1),e._v(". As of last summer we are grateful to also have received a generous "),t("a",{attrs:{href:"https://opensats.org/blog/bitcoin-and-nostr-grants-august-2023",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenSats grant"),t("OutboundLink")],1),e._v(" supporting our project. To keep our current and future financial supporters, open source contributors, and downstream users updated on our progress, starting this year we will be publishing a quarterly BDK project updates here on our blog.")]),e._v(" "),t("h3",{attrs:{id:"end-of-year-review"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#end-of-year-review"}},[e._v("#")]),e._v(" End of Year Review")]),e._v(" "),t("p",[e._v("The BDK project is made up of a core suite of "),t("a",{attrs:{href:"https://www.rust-lang.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust"),t("OutboundLink")],1),e._v(" libraries ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk?tab=readme-ov-file#architecture",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-*"),t("OutboundLink")],1),e._v(") that work together to provide everything an application developer needs to incorporate on-chain bitcoin wallet functionality into their project. Wrapped around the BDK core libraries is our "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-ffi"),t("OutboundLink")],1),e._v(" bindings libraries that let Kotlin (desktop/android), Swift (desktop/iOS), and Python developers use BDK seamlessly in their projects. And wrapped around all of this software is documentation and examples. For over a year the BDK team has been working on a major "),t("a",{attrs:{href:"https://bitcoindevkit.org/blog/tags/architecture/",target:"_blank",rel:"noopener noreferrer"}},[e._v("re-architecture"),t("OutboundLink")],1),e._v(" of the BDK libraries to improve blockchain syncing, embedded device support ("),t("a",{attrs:{href:"https://docs.rust-embedded.org/book/intro/no-std.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("no-std"),t("OutboundLink")],1),e._v("), update key dependencies ("),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(") and finally to provide a stable 1.0 API that our users can rely on for their production applications.")]),e._v(" "),t("p",[e._v("The team is currently working on the 1.0.0-alpha release train. The purposed of these alpha releases is to give early adopters (including our own "),t("code",[e._v("bdk-ffi")]),e._v(" contributors) a chance to try-out new BDK features and updated APIs and provide feedback. Once we have a stable, feature complete 1.0.0 BDK that our alpha users love we'll begin publishing 1.0.0-beta releases. With our beta releases we will finish updating tutorials and examples and performance testing, and ask all BDK users to start migrating and testing their applications with BDK 1.0.0. When our key contributors and users are satisfied that we have shaken out any final 1.0.0-beta issues we'll publish our BDK 1.0.0 release. Once 1.0.0 is out subsequent releases will use "),t("a",{attrs:{href:"https://semver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("semantic versioning"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("For those keeping score, we'd originally planned to have the BDK 1.0.0 release out last year, but (spoiler) that didn't happen. As I'm sure our kind readers understand making safe, feature rich, easy to use bitcoin software isn't easy, reviewing it is even harder, and we, like every project in the space are short-handed. But with every release, as we build the software we also on-board new contributors and build the team that will deliver BDK 1.0.0, 1.1.0, 2.0.0, and beyond.")]),e._v(" "),t("h3",{attrs:{id:"core-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#core-bdk"}},[e._v("#")]),e._v(" Core BDK")]),e._v(" "),t("p",[e._v("For Q4 2023 we "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pulls?page=1&q=is%3Apr+merged%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("merged 33 PRs"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues?q=is%3Aissue+closed%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("closed 32 issues"),t("OutboundLink")],1),e._v(", and completed two 1.0.0-alpha releases, "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("1.0.0-alpha.2"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("1.0.0-alpha.3"),t("OutboundLink")],1),e._v(". The primary deliverable of these releases was to further stabilize the "),t("code",[e._v("bdk_chain")]),e._v(" crate which provides the central logic for tracking and updating wallet keychains and scripts to be tracked and manages all of the related blockchain and transaction data. Additional PRs started this quarter lay the groundwork for the next phase of development focused on improving how we sync data via blockchain clients and save that data to persistent storage. We also made one maintenance release "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v0.29.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.29.0"),t("OutboundLink")],1),e._v(" that upgraded our "),t("code",[e._v("rust-bitcoin")]),e._v(" dependency to release to 0.30.")]),e._v(" "),t("h3",{attrs:{id:"bdk-ffi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-ffi"}},[e._v("#")]),e._v(" BDK-FFI")]),e._v(" "),t("p",[e._v("In Q4 the BDK-FFI bindings for Kotlin, Swift, and Python saw "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/pulls?page=1&q=is%3Apr+merged%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("23 PRs merged"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/issues?q=is%3Aissue+closed%3A2023-10-01..2023-12-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("15 issues closed"),t("OutboundLink")],1),e._v(". One maintenance release was completed, "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v0.31.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.31.0"),t("OutboundLink")],1),e._v(", which updated the language bindings dependency to the latest rust "),t("code",[e._v("bdk")]),e._v(" maintenance release 0.29.0 and in doing so updated the BDK FFI "),t("code",[e._v("rust-bitcoin")]),e._v(" dependency to version 0.30. This quarter the team took on the major task of creating the first language bindings based on the "),t("code",[e._v("bdk")]),e._v(" 1.0.0-alpha API. The resulting "),t("code",[e._v("bdk-ffi")]),e._v(" "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v1.0.0-alpha.2a",target:"_blank",rel:"noopener noreferrer"}},[e._v("v1.0.0-alpha2a"),t("OutboundLink")],1),e._v(" release is only able to expose part of the full "),t("code",[e._v("bdk")]),e._v(" 1.0.0 API but prepares the project for full support in future releases. As part of this work the current Kotlin API docs were removed, but fear not they will return in future alpha releases and be better than ever with not only API docs for Kotlin but also Swift and Python.")]),e._v(" "),t("h3",{attrs:{id:"bdk-contributors-spotlight"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-contributors-spotlight"}},[e._v("#")]),e._v(" BDK contributors spotlight")]),e._v(" "),t("p",[e._v("In this section we share what some of our hardworking contributors are doing to educate people about BDK, help on board new projects, and generally promote bitcoin and open source development around the world.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/danielabrozzoni/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Daniela Brozzoni"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("November 3: Gave a "),t("a",{attrs:{href:"https://bolt.fun",target:"_blank",rel:"noopener noreferrer"}},[e._v("bolt.fun"),t("OutboundLink")],1),e._v(" talk on open source development, "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=P75nCR1owws",target:"_blank",rel:"noopener noreferrer"}},[e._v("YouTube"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("October 25-26: Joined a "),t("a",{attrs:{href:"https://planb.lugano.ch/contributing-to-free-and-open-source-projects/",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Contributing to free and open source projects" panel'),t("OutboundLink")],1),e._v(" at "),t("a",{attrs:{href:"https://planb.lugano.ch/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Plan B"),t("OutboundLink")],1),e._v(" lugano.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/evanlinjin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Evan Linjin"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("November 15: Worked with "),t("a",{attrs:{href:"https://wizardsardine.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("wizardsardine"),t("OutboundLink")],1),e._v(" team to "),t("a",{attrs:{href:"https://twitter.com/darosior/status/1724842410839093562",target:"_blank",rel:"noopener noreferrer"}},[e._v("extract and integrate BDK coin-selection into the Liana wallet"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("December 3: Spoke at the "),t("a",{attrs:{href:"https://twitter.com/TaiwanBitdevs/status/1726537941688967238",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Tech Summit Taipei"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("December 13: Gave a talk about Bitcoin and BDK at "),t("a",{attrs:{href:"https://twitter.com/JCBA_org/status/1735100779172856170",target:"_blank",rel:"noopener noreferrer"}},[e._v("Taipei Blockchain Week"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Thunderbiscuit"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("November 8: Created the educational "),t("a",{attrs:{href:"https://opcodeexplained.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Opcode Explained"),t("OutboundLink")],1),e._v(" website to help... explain bitcoin opcodes!")]),e._v(" "),t("p",[e._v("November 15: Joined the panel on the "),t("a",{attrs:{href:"https://bitcoin.review/podcast/episode-55/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Review Podcast Episode 55"),t("OutboundLink")],1),e._v(" to talked about his "),t("a",{attrs:{href:"https://github.com/thunderbiscuit/padawan-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("padawan-wallet"),t("OutboundLink")],1),e._v(" project.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/reez/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matthew Ramsden"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("October 11: Spoke at the "),t("a",{attrs:{href:"https://www.meetup.com/bitcoinpark/events/291768716/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Park OpenHouse"),t("OutboundLink")],1),e._v(" on the topic "),t("a",{attrs:{href:"https://podcasts.apple.com/us/podcast/open-house-exploring-the-lightning-network-ldk/id1646515985?i=1000631904227",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Exploring the Lightning Network"'),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("November 8: Created a video for the "),t("a",{attrs:{href:"https://www.youtube.com/@bitcoindevelopers",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Developers"),t("OutboundLink")],1),e._v(" channel on YouTube titled "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=rcU3LU6iZCs",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Lightning Development with Swift: Make Your First Lightning App with LDK Node Swift"'),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Other current and future contributors...")])]),e._v(" "),t("p",[e._v("If you are a contributor to BDK and doing something fun that's BDK and/or bitcoin related let us know! Tag "),t("a",{attrs:{href:"https://twitter.com/bitcoindevkit/",target:"_blank",rel:"noopener noreferrer"}},[e._v("@bitcoindevkit"),t("OutboundLink")],1),e._v(" on X, "),t("a",{attrs:{href:"https://primal.net/profile/npub1ke470rdgnxg4gjs9cw3tv0dp690wl68f5xak5smflpsksedadd7qtf8jfm",target:"_blank",rel:"noopener noreferrer"}},[e._v("notmandatory"),t("OutboundLink")],1),e._v(" on nostr, or send us an email: blog at bitcoindevkit dot org.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/47.70dc63ea.js b/assets/js/47.1e361a05.js similarity index 98% rename from assets/js/47.70dc63ea.js rename to assets/js/47.1e361a05.js index c289322578..235d95e7f4 100644 --- a/assets/js/47.70dc63ea.js +++ b/assets/js/47.1e361a05.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{400:function(e,t,r){"use strict";r.r(t);var a=r(7),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("br"),e._v(" "),t("h3",{attrs:{id:"core-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#core-bdk"}},[e._v("#")]),e._v(" Core BDK")]),e._v(" "),t("p",[e._v("The majority of BDK rust library work this quarter was towards finishing new and improved electrum, esplora and Bitcoin Core RPC (block-by-block) syncing APIs. Bug fixes and improvements were also completed for the transaction builder and other wallet APIs. Six bi-weekly 1.0.0-alpha releases were made ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.3"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.4",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.4"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.5",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.5"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.6",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.6"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.7",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.7"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.8",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.8"),t("OutboundLink")],1),e._v("). For the quarter "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pulls?q=is%3Apr+merged%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("54 PRs"),t("OutboundLink")],1),e._v(" were merged and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues?q=is%3Aissue+closed%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("55 issues"),t("OutboundLink")],1),e._v(" were closed.")]),e._v(" "),t("h3",{attrs:{id:"bdk-ffi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-ffi"}},[e._v("#")]),e._v(" BDK-FFI")]),e._v(" "),t("p",[e._v("For the language binding libraries (Kotlin, Swift, Python) the focus was on small bug fixes for the pre-1.0 releases ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v0.31.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.30.0"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v0.31.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.30.1"),t("OutboundLink")],1),e._v(") and creating the first 1.0.0-alpha bindings release ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v1.0.0-alpha.7",target:"_blank",rel:"noopener noreferrer"}},[e._v("1.0.0-alpha.7"),t("OutboundLink")],1),e._v("). For the quarter "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/pulls?q=is%3Apr+merged%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("23 PRs"),t("OutboundLink")],1),e._v(" were merged and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/issues?q=is%3Aissue+closed%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("8 issues"),t("OutboundLink")],1),e._v(" closed.")]),e._v(" "),t("h3",{attrs:{id:"plans-for-next-quarter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plans-for-next-quarter"}},[e._v("#")]),e._v(" Plans for Next Quarter")]),e._v(" "),t("p",[e._v("The focus for Q2 development is completing our first 1.0.0 beta release and improving user docs and testing for it. The team will also work on updating all language bindings (Kotlin/Swift/Python) to use new rust lib 1.0.0 beta APIs.")]),e._v(" "),t("h3",{attrs:{id:"bdk-contributors-spotlight"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-contributors-spotlight"}},[e._v("#")]),e._v(" BDK contributors spotlight")]),e._v(" "),t("p",[e._v("In this section we share what some of our hardworking contributors are doing to educate people about BDK, help on board new projects, and generally promote bitcoin and open source development around the world.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/evanlinjin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Evan Linjin"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("February 22: Gave a talk on "),t("a",{attrs:{href:"https://btcplusplus.dev/conf/ba24/talks",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK 1.0 at BTC++"),t("OutboundLink")],1),e._v(" in Buena Aires, Argentina.")]),e._v(" "),t("p",[t("strong",[e._v("Other current and future contributors...")])]),e._v(" "),t("p",[e._v("If you are a contributor to BDK and doing something fun that's BDK and/or bitcoin related let us know! Tag "),t("a",{attrs:{href:"https://twitter.com/bitcoindevkit/",target:"_blank",rel:"noopener noreferrer"}},[e._v("@bitcoindevkit"),t("OutboundLink")],1),e._v(" on X, "),t("a",{attrs:{href:"https://primal.net/profile/npub1ke470rdgnxg4gjs9cw3tv0dp690wl68f5xak5smflpsksedadd7qtf8jfm",target:"_blank",rel:"noopener noreferrer"}},[e._v("notmandatory"),t("OutboundLink")],1),e._v(" on nostr, or send us an email: blog at bitcoindevkit dot org.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{399:function(e,t,r){"use strict";r.r(t);var a=r(7),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("br"),e._v(" "),t("h3",{attrs:{id:"core-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#core-bdk"}},[e._v("#")]),e._v(" Core BDK")]),e._v(" "),t("p",[e._v("The majority of BDK rust library work this quarter was towards finishing new and improved electrum, esplora and Bitcoin Core RPC (block-by-block) syncing APIs. Bug fixes and improvements were also completed for the transaction builder and other wallet APIs. Six bi-weekly 1.0.0-alpha releases were made ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.3"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.4",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.4"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.5",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.5"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.6",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.6"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.7",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.7"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v1.0.0-alpha.8",target:"_blank",rel:"noopener noreferrer"}},[e._v("alpha.8"),t("OutboundLink")],1),e._v("). For the quarter "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pulls?q=is%3Apr+merged%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("54 PRs"),t("OutboundLink")],1),e._v(" were merged and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues?q=is%3Aissue+closed%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("55 issues"),t("OutboundLink")],1),e._v(" were closed.")]),e._v(" "),t("h3",{attrs:{id:"bdk-ffi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-ffi"}},[e._v("#")]),e._v(" BDK-FFI")]),e._v(" "),t("p",[e._v("For the language binding libraries (Kotlin, Swift, Python) the focus was on small bug fixes for the pre-1.0 releases ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v0.31.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.30.0"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v0.31.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.30.1"),t("OutboundLink")],1),e._v(") and creating the first 1.0.0-alpha bindings release ("),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/releases/tag/v1.0.0-alpha.7",target:"_blank",rel:"noopener noreferrer"}},[e._v("1.0.0-alpha.7"),t("OutboundLink")],1),e._v("). For the quarter "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/pulls?q=is%3Apr+merged%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("23 PRs"),t("OutboundLink")],1),e._v(" were merged and "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi/issues?q=is%3Aissue+closed%3A2024-01-01..2024-03-31+",target:"_blank",rel:"noopener noreferrer"}},[e._v("8 issues"),t("OutboundLink")],1),e._v(" closed.")]),e._v(" "),t("h3",{attrs:{id:"plans-for-next-quarter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plans-for-next-quarter"}},[e._v("#")]),e._v(" Plans for Next Quarter")]),e._v(" "),t("p",[e._v("The focus for Q2 development is completing our first 1.0.0 beta release and improving user docs and testing for it. The team will also work on updating all language bindings (Kotlin/Swift/Python) to use new rust lib 1.0.0 beta APIs.")]),e._v(" "),t("h3",{attrs:{id:"bdk-contributors-spotlight"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-contributors-spotlight"}},[e._v("#")]),e._v(" BDK contributors spotlight")]),e._v(" "),t("p",[e._v("In this section we share what some of our hardworking contributors are doing to educate people about BDK, help on board new projects, and generally promote bitcoin and open source development around the world.")]),e._v(" "),t("p",[t("strong",[t("a",{attrs:{href:"https://github.com/evanlinjin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Evan Linjin"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("February 22: Gave a talk on "),t("a",{attrs:{href:"https://btcplusplus.dev/conf/ba24/talks",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK 1.0 at BTC++"),t("OutboundLink")],1),e._v(" in Buena Aires, Argentina.")]),e._v(" "),t("p",[t("strong",[e._v("Other current and future contributors...")])]),e._v(" "),t("p",[e._v("If you are a contributor to BDK and doing something fun that's BDK and/or bitcoin related let us know! Tag "),t("a",{attrs:{href:"https://twitter.com/bitcoindevkit/",target:"_blank",rel:"noopener noreferrer"}},[e._v("@bitcoindevkit"),t("OutboundLink")],1),e._v(" on X, "),t("a",{attrs:{href:"https://primal.net/profile/npub1ke470rdgnxg4gjs9cw3tv0dp690wl68f5xak5smflpsksedadd7qtf8jfm",target:"_blank",rel:"noopener noreferrer"}},[e._v("notmandatory"),t("OutboundLink")],1),e._v(" on nostr, or send us an email: blog at bitcoindevkit dot org.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/48.1c4bedef.js b/assets/js/48.6c8fd04b.js similarity index 99% rename from assets/js/48.1c4bedef.js rename to assets/js/48.6c8fd04b.js index edb49d7120..478fcc7f4c 100644 --- a/assets/js/48.1c4bedef.js +++ b/assets/js/48.6c8fd04b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{402:function(e,t,n){"use strict";n.r(t);var i=n(7),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("The bitcoindevkit team has been hard at work for Q2 in 2024, pushing to stabilize the API of its "),t("code",[e._v("bdk_wallet")]),e._v(" crate and releasing 4 new alpha versions (9, 10, 11, and 12!), and aiming to release a 1.0 beta in July. Here are some of the notable changes and upgrades to the software libraries we maintain:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Update "),t("code",[e._v("bdk_electrum")]),e._v(" to use merkle proofs.")]),e._v(" This PR is the first step in reworking "),t("code",[e._v("bdk_electrum")]),e._v(" to use merkle proofs. When we fetch a transaction, we now also obtain the merkle proof and block header for verification. We then confirm a transaction is in a block only after validating it's Merkle proof.")]),e._v(" "),t("li",[t("strong",[e._v("Upgrade of rust-bitcoin and rust-miniscript.")]),e._v(" We upgraded our dependencies on these crates to the latest "),t("code",[e._v("0.32.0")]),e._v(" and "),t("code",[e._v("0.12.0")]),e._v(" respectively.")]),e._v(" "),t("li",[t("strong",[e._v("Added examples.")]),e._v(" We added examples and cleaned up our current example crates to help builders stay up-to-date on the latest changes.")]),e._v(" "),t("li",[t("strong",[e._v("Use bitcoin::Amount in most public APIs.")]),e._v(" This change ensures type safety when requiring and providing bitcoin amount in our APIs, using the rust-bitcoin crate "),t("code",[e._v("Amount")]),e._v(" type.")]),e._v(" "),t("li",[t("strong",[e._v("Introduce Sync and FullScan related types.")]),e._v(" This change introduced universal structures that represent sync/full-scan requests/results for all SPK-based syncing clients.")]),e._v(" "),t("li",[t("strong",[e._v("Allow user provided RNG.")]),e._v(" This change makes the "),t("code",[e._v("rand")]),e._v(" dependency optional.")])]),e._v(" "),t("p",[e._v("The language bindings for iOS, Android, and Python have also seen some new alpha release and a ton of new features, in preparation for the beta release.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Upgrade to the latest uniffi (0.28.0).")]),e._v(" This was a major upgrade that gave us a whole new set of functionalities: the ability to implement traits in the foreign languages, using the "),t("code",[e._v("Display")]),e._v(" trait to auto-generate the "),t("code",[e._v("toString()")]),e._v(" methods, enable API docs in the UDL file, and support for async!")]),e._v(" "),t("li",[t("strong",[e._v("Brand new iOS build workflow.")]),e._v(" This one is nerdy but a goodie. Anyone interested in how we build bindings should check out this major cleanup of our iOS library build workflow!")]),e._v(" "),t("li",[t("strong",[e._v("Starting the work on bitcoin-ffi.")]),e._v(" The team has started the work on a separate crate called "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-ffi"),t("OutboundLink")],1),e._v(", effectively migrating the types we exposed from rust-bitcoin into a standalone crate that other projects building on uniffi can use.")])]),e._v(" "),t("h3",{attrs:{id:"our-grantees-in-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-grantees-in-action"}},[e._v("#")]),e._v(" Our Grantees in Action")]),e._v(" "),t("p",[e._v("In addition to our full-time grantees, the "),t("a",{attrs:{href:"https://bitcoindevkit.org/foundation/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK Foundation"),t("OutboundLink")],1),e._v(" provides part-time grants to folks on special projects. Q2 is funding 2 projects in particular:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Wei Chen.")]),e._v(" Wei has been contributing to BDK since late 2023 and was formerly a full stack Java developer based in Washington D.C. with ten years of experience. The focus of his contributions will be towards assisting with the restructuring of the electrum crate, reengineering of the TxGraph data components to simplify the tracking of lineal conflicts, as well as on performance optimization and the continued debugging of BDK.")]),e._v(" "),t("li",[t("strong",[e._v("Manuel Gatti.")]),e._v(" Manuel is a Project Manager at Wizard Sardine. He is involved in some educational projects related to bitcoin in Italy and hosts an Italian podcast about libertarian philosophy with episodes dedicated to bitcoin as a tool for freedom. He has been contributing to BDK since April 2023 mostly on the project management side (holding calls, helping with triage and prioritization, updating stakeholders). His project consists of conducting user interviews in order to get feedback on BDK usage and possible pain points with the aim to help the team with the definition and prioritization of the development activities.")])]),e._v(" "),t("p",[e._v("We've also been active at conferences!")]),e._v(" "),t("ul",[t("li",[e._v("Evan made his way to South Korea to host a workshop at the "),t("a",{attrs:{href:"https://www.bitcoinseoul.kr/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Seoul"),t("OutboundLink")],1),e._v(" conference.")]),e._v(" "),t("li",[e._v("Evan and ValuedMammal also made their way to the "),t("a",{attrs:{href:"https://btcplusplus.dev/conf/ba24",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin++ conference in Buenos Aires"),t("OutboundLink")],1),e._v(" to talk about BDK.")]),e._v(" "),t("li",[e._v("thunderbiscuit was in Montreal for the "),t("a",{attrs:{href:"https://canadianbitcoinconf.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Canadian Bitcoin Conference"),t("OutboundLink")],1),e._v(" again this year. A fantastic event with many users of BDK present!")])]),e._v(" "),t("h3",{attrs:{id:"bdk-in-the-wild"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-in-the-wild"}},[e._v("#")]),e._v(" BDK in the Wild")]),e._v(" "),t("ul",[t("li",[e._v("In Q2, "),t("a",{attrs:{href:"https://bitkey.world/en-US",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitkey"),t("OutboundLink")],1),e._v(" open sourced their app, making it one of the biggest users of BDK on mobile.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.bullbitcoin.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bull Bitcoin"),t("OutboundLink")],1),e._v(" released their "),t("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.bullbitcoin.mobile",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android app"),t("OutboundLink")],1),e._v(" based on the bdk-flutter library at the Canadian Bitcoin Conference in Montreal!")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{401:function(e,t,n){"use strict";n.r(t);var i=n(7),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("The bitcoindevkit team has been hard at work for Q2 in 2024, pushing to stabilize the API of its "),t("code",[e._v("bdk_wallet")]),e._v(" crate and releasing 4 new alpha versions (9, 10, 11, and 12!), and aiming to release a 1.0 beta in July. Here are some of the notable changes and upgrades to the software libraries we maintain:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Update "),t("code",[e._v("bdk_electrum")]),e._v(" to use merkle proofs.")]),e._v(" This PR is the first step in reworking "),t("code",[e._v("bdk_electrum")]),e._v(" to use merkle proofs. When we fetch a transaction, we now also obtain the merkle proof and block header for verification. We then confirm a transaction is in a block only after validating it's Merkle proof.")]),e._v(" "),t("li",[t("strong",[e._v("Upgrade of rust-bitcoin and rust-miniscript.")]),e._v(" We upgraded our dependencies on these crates to the latest "),t("code",[e._v("0.32.0")]),e._v(" and "),t("code",[e._v("0.12.0")]),e._v(" respectively.")]),e._v(" "),t("li",[t("strong",[e._v("Added examples.")]),e._v(" We added examples and cleaned up our current example crates to help builders stay up-to-date on the latest changes.")]),e._v(" "),t("li",[t("strong",[e._v("Use bitcoin::Amount in most public APIs.")]),e._v(" This change ensures type safety when requiring and providing bitcoin amount in our APIs, using the rust-bitcoin crate "),t("code",[e._v("Amount")]),e._v(" type.")]),e._v(" "),t("li",[t("strong",[e._v("Introduce Sync and FullScan related types.")]),e._v(" This change introduced universal structures that represent sync/full-scan requests/results for all SPK-based syncing clients.")]),e._v(" "),t("li",[t("strong",[e._v("Allow user provided RNG.")]),e._v(" This change makes the "),t("code",[e._v("rand")]),e._v(" dependency optional.")])]),e._v(" "),t("p",[e._v("The language bindings for iOS, Android, and Python have also seen some new alpha release and a ton of new features, in preparation for the beta release.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Upgrade to the latest uniffi (0.28.0).")]),e._v(" This was a major upgrade that gave us a whole new set of functionalities: the ability to implement traits in the foreign languages, using the "),t("code",[e._v("Display")]),e._v(" trait to auto-generate the "),t("code",[e._v("toString()")]),e._v(" methods, enable API docs in the UDL file, and support for async!")]),e._v(" "),t("li",[t("strong",[e._v("Brand new iOS build workflow.")]),e._v(" This one is nerdy but a goodie. Anyone interested in how we build bindings should check out this major cleanup of our iOS library build workflow!")]),e._v(" "),t("li",[t("strong",[e._v("Starting the work on bitcoin-ffi.")]),e._v(" The team has started the work on a separate crate called "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-ffi"),t("OutboundLink")],1),e._v(", effectively migrating the types we exposed from rust-bitcoin into a standalone crate that other projects building on uniffi can use.")])]),e._v(" "),t("h3",{attrs:{id:"our-grantees-in-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-grantees-in-action"}},[e._v("#")]),e._v(" Our Grantees in Action")]),e._v(" "),t("p",[e._v("In addition to our full-time grantees, the "),t("a",{attrs:{href:"https://bitcoindevkit.org/foundation/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK Foundation"),t("OutboundLink")],1),e._v(" provides part-time grants to folks on special projects. Q2 is funding 2 projects in particular:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Wei Chen.")]),e._v(" Wei has been contributing to BDK since late 2023 and was formerly a full stack Java developer based in Washington D.C. with ten years of experience. The focus of his contributions will be towards assisting with the restructuring of the electrum crate, reengineering of the TxGraph data components to simplify the tracking of lineal conflicts, as well as on performance optimization and the continued debugging of BDK.")]),e._v(" "),t("li",[t("strong",[e._v("Manuel Gatti.")]),e._v(" Manuel is a Project Manager at Wizard Sardine. He is involved in some educational projects related to bitcoin in Italy and hosts an Italian podcast about libertarian philosophy with episodes dedicated to bitcoin as a tool for freedom. He has been contributing to BDK since April 2023 mostly on the project management side (holding calls, helping with triage and prioritization, updating stakeholders). His project consists of conducting user interviews in order to get feedback on BDK usage and possible pain points with the aim to help the team with the definition and prioritization of the development activities.")])]),e._v(" "),t("p",[e._v("We've also been active at conferences!")]),e._v(" "),t("ul",[t("li",[e._v("Evan made his way to South Korea to host a workshop at the "),t("a",{attrs:{href:"https://www.bitcoinseoul.kr/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Seoul"),t("OutboundLink")],1),e._v(" conference.")]),e._v(" "),t("li",[e._v("Evan and ValuedMammal also made their way to the "),t("a",{attrs:{href:"https://btcplusplus.dev/conf/ba24",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin++ conference in Buenos Aires"),t("OutboundLink")],1),e._v(" to talk about BDK.")]),e._v(" "),t("li",[e._v("thunderbiscuit was in Montreal for the "),t("a",{attrs:{href:"https://canadianbitcoinconf.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Canadian Bitcoin Conference"),t("OutboundLink")],1),e._v(" again this year. A fantastic event with many users of BDK present!")])]),e._v(" "),t("h3",{attrs:{id:"bdk-in-the-wild"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-in-the-wild"}},[e._v("#")]),e._v(" BDK in the Wild")]),e._v(" "),t("ul",[t("li",[e._v("In Q2, "),t("a",{attrs:{href:"https://bitkey.world/en-US",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitkey"),t("OutboundLink")],1),e._v(" open sourced their app, making it one of the biggest users of BDK on mobile.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.bullbitcoin.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bull Bitcoin"),t("OutboundLink")],1),e._v(" released their "),t("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.bullbitcoin.mobile",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android app"),t("OutboundLink")],1),e._v(" based on the bdk-flutter library at the Canadian Bitcoin Conference in Montreal!")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/49.3295c4d3.js b/assets/js/49.5320af3f.js similarity index 98% rename from assets/js/49.3295c4d3.js rename to assets/js/49.5320af3f.js index ca31ba948a..697065556b 100644 --- a/assets/js/49.3295c4d3.js +++ b/assets/js/49.5320af3f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{401:function(i,e,t){"use strict";t.r(e);var o=t(7),n=Object(o.a)({},(function(){var i=this,e=i._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":i.$parent.slotKey}},[e("p",[i._v("The Bitcoin Dev Kit (BDK) Foundation is seeking proposals for a full-time Rust maintainer to support the ongoing development and maintenance of the BDK suite of open source software. We invite qualified individuals to submit grant applications for this critical role.")]),i._v(" "),e("h2",{attrs:{id:"grant-overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#grant-overview"}},[i._v("#")]),i._v(" Grant Overview")]),i._v(" "),e("p",[i._v("Position: Open source Rust library maintainer"),e("br"),i._v("\nDuration: Minimum 1-2 years, full-time commitment"),e("br"),i._v("\nFocus: Maintaining and improving the BDK Rust codebase")]),i._v(" "),e("h2",{attrs:{id:"key-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#key-requirements"}},[i._v("#")]),i._v(" Key Requirements")]),i._v(" "),e("ul",[e("li",[i._v("Strong Rust development skills with experience in API design and usage")]),i._v(" "),e("li",[i._v("Demonstrated ability to contribute to open source projects, particularly in the Bitcoin ecosystem")]),i._v(" "),e("li",[i._v("Solid understanding of Bitcoin on-chain protocols and technology")]),i._v(" "),e("li",[i._v("Excellent communication skills and ability to work effectively in a team")]),i._v(" "),e("li",[i._v("Commitment to mentoring and supporting other developers in the BDK and Bitcoin community")]),i._v(" "),e("li",[i._v("Willingness to contribute to non-coding aspects of the project (e.g., documentation, CI, release management)")])]),i._v(" "),e("h2",{attrs:{id:"desired-qualifications"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#desired-qualifications"}},[i._v("#")]),i._v(" Desired Qualifications")]),i._v(" "),e("ul",[e("li",[i._v("Vision for maintaining and improving the overall BDK Rust codebase")]),i._v(" "),e("li",[i._v("Specific proposals for new or existing BDK Rust features or modules to improve and maintain")]),i._v(" "),e("li",[i._v("Engagement with upstream projects (e.g., rust-bitcoin, rust-miniscript, uniffi-rs)")]),i._v(" "),e("li",[i._v("Involvement with downstream projects utilizing BDK")]),i._v(" "),e("li",[i._v("Understanding of or experience with related protocols (e.g., Lightning, e-cash)")]),i._v(" "),e("li",[i._v("Active participation in your local Bitcoin community")]),i._v(" "),e("li",[i._v("Potential to start or work for a project/company using BDK in the future")])]),i._v(" "),e("h2",{attrs:{id:"proposal-guidelines"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#proposal-guidelines"}},[i._v("#")]),i._v(" Proposal Guidelines")]),i._v(" "),e("p",[i._v("Your grant proposal should include:")]),i._v(" "),e("ul",[e("li",[i._v("Your background and relevant experience in Rust and Bitcoin development")]),i._v(" "),e("li",[i._v("Examples of your contributions to open source projects, particularly in the Bitcoin ecosystem")]),i._v(" "),e("li",[i._v("Your vision for maintaining and improving the BDK Rust codebase")]),i._v(" "),e("li",[i._v("Specific ideas or proposals for features or modules you want to work on")]),i._v(" "),e("li",[i._v("How you plan to engage with the broader BDK and Bitcoin developer community")]),i._v(" "),e("li",[i._v("Any additional skills or experiences that align with the BDK Foundation's mission and goals")])]),i._v(" "),e("h2",{attrs:{id:"evaluation-criteria"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#evaluation-criteria"}},[i._v("#")]),i._v(" Evaluation Criteria")]),i._v(" "),e("p",[i._v("Proposals will be evaluated based on the applicant's technical skills, open source contribution history, alignment with the BDK Foundation's mission, and potential impact on the BDK ecosystem.")]),i._v(" "),e("h2",{attrs:{id:"submission-process"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#submission-process"}},[i._v("#")]),i._v(" Submission Process")]),i._v(" "),e("p",[i._v("Please send your detailed grant proposal to "),e("a",{attrs:{href:"mailto:grants@bitcoindevkit.org"}},[i._v("grants@bitcoindevkit.org")]),i._v('. Include "Full-Time Rust Maintainer Grant Proposal" in the subject line.')]),i._v(" "),e("p",[i._v("The BDK Foundation is committed to supporting diverse voices in the Bitcoin development community. We encourage applications from all backgrounds to apply.")]),i._v(" "),e("p",[i._v("For more information about the BDK Foundation and our grants program, please visit our "),e("a",{attrs:{href:"https://bitcoindevkit.org",target:"_blank",rel:"noopener noreferrer"}},[i._v("website"),e("OutboundLink")],1),i._v(". We look forward to reviewing your proposals and welcoming a new member to our team of open source developers working to improve Bitcoin application security, privacy, and usability.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{402:function(i,e,t){"use strict";t.r(e);var o=t(7),n=Object(o.a)({},(function(){var i=this,e=i._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":i.$parent.slotKey}},[e("p",[i._v("The Bitcoin Dev Kit (BDK) Foundation is seeking proposals for a full-time Rust maintainer to support the ongoing development and maintenance of the BDK suite of open source software. We invite qualified individuals to submit grant applications for this critical role.")]),i._v(" "),e("h2",{attrs:{id:"grant-overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#grant-overview"}},[i._v("#")]),i._v(" Grant Overview")]),i._v(" "),e("p",[i._v("Position: Open source Rust library maintainer"),e("br"),i._v("\nDuration: Minimum 1-2 years, full-time commitment"),e("br"),i._v("\nFocus: Maintaining and improving the BDK Rust codebase")]),i._v(" "),e("h2",{attrs:{id:"key-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#key-requirements"}},[i._v("#")]),i._v(" Key Requirements")]),i._v(" "),e("ul",[e("li",[i._v("Strong Rust development skills with experience in API design and usage")]),i._v(" "),e("li",[i._v("Demonstrated ability to contribute to open source projects, particularly in the Bitcoin ecosystem")]),i._v(" "),e("li",[i._v("Solid understanding of Bitcoin on-chain protocols and technology")]),i._v(" "),e("li",[i._v("Excellent communication skills and ability to work effectively in a team")]),i._v(" "),e("li",[i._v("Commitment to mentoring and supporting other developers in the BDK and Bitcoin community")]),i._v(" "),e("li",[i._v("Willingness to contribute to non-coding aspects of the project (e.g., documentation, CI, release management)")])]),i._v(" "),e("h2",{attrs:{id:"desired-qualifications"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#desired-qualifications"}},[i._v("#")]),i._v(" Desired Qualifications")]),i._v(" "),e("ul",[e("li",[i._v("Vision for maintaining and improving the overall BDK Rust codebase")]),i._v(" "),e("li",[i._v("Specific proposals for new or existing BDK Rust features or modules to improve and maintain")]),i._v(" "),e("li",[i._v("Engagement with upstream projects (e.g., rust-bitcoin, rust-miniscript, uniffi-rs)")]),i._v(" "),e("li",[i._v("Involvement with downstream projects utilizing BDK")]),i._v(" "),e("li",[i._v("Understanding of or experience with related protocols (e.g., Lightning, e-cash)")]),i._v(" "),e("li",[i._v("Active participation in your local Bitcoin community")]),i._v(" "),e("li",[i._v("Potential to start or work for a project/company using BDK in the future")])]),i._v(" "),e("h2",{attrs:{id:"proposal-guidelines"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#proposal-guidelines"}},[i._v("#")]),i._v(" Proposal Guidelines")]),i._v(" "),e("p",[i._v("Your grant proposal should include:")]),i._v(" "),e("ul",[e("li",[i._v("Your background and relevant experience in Rust and Bitcoin development")]),i._v(" "),e("li",[i._v("Examples of your contributions to open source projects, particularly in the Bitcoin ecosystem")]),i._v(" "),e("li",[i._v("Your vision for maintaining and improving the BDK Rust codebase")]),i._v(" "),e("li",[i._v("Specific ideas or proposals for features or modules you want to work on")]),i._v(" "),e("li",[i._v("How you plan to engage with the broader BDK and Bitcoin developer community")]),i._v(" "),e("li",[i._v("Any additional skills or experiences that align with the BDK Foundation's mission and goals")])]),i._v(" "),e("h2",{attrs:{id:"evaluation-criteria"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#evaluation-criteria"}},[i._v("#")]),i._v(" Evaluation Criteria")]),i._v(" "),e("p",[i._v("Proposals will be evaluated based on the applicant's technical skills, open source contribution history, alignment with the BDK Foundation's mission, and potential impact on the BDK ecosystem.")]),i._v(" "),e("h2",{attrs:{id:"submission-process"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#submission-process"}},[i._v("#")]),i._v(" Submission Process")]),i._v(" "),e("p",[i._v("Please send your detailed grant proposal to "),e("a",{attrs:{href:"mailto:grants@bitcoindevkit.org"}},[i._v("grants@bitcoindevkit.org")]),i._v('. Include "Full-Time Rust Maintainer Grant Proposal" in the subject line.')]),i._v(" "),e("p",[i._v("The BDK Foundation is committed to supporting diverse voices in the Bitcoin development community. We encourage applications from all backgrounds to apply.")]),i._v(" "),e("p",[i._v("For more information about the BDK Foundation and our grants program, please visit our "),e("a",{attrs:{href:"https://bitcoindevkit.org",target:"_blank",rel:"noopener noreferrer"}},[i._v("website"),e("OutboundLink")],1),i._v(". We look forward to reviewing your proposals and welcoming a new member to our team of open source developers working to improve Bitcoin application security, privacy, and usability.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/50.93b277cb.js b/assets/js/50.1660efbd.js similarity index 99% rename from assets/js/50.93b277cb.js rename to assets/js/50.1660efbd.js index 4d297105be..2f927a5839 100644 --- a/assets/js/50.93b277cb.js +++ b/assets/js/50.1660efbd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{404:function(e,t,n){"use strict";n.r(t);var a=n(7),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("The bitcoindevkit team has been hard at work for Q3 in 2024, polishing the API of our "),t("code",[e._v("bdk_wallet")]),e._v(" crate and releasing 4 new beta versions (1, 2, 3, and 4!), and aiming to release a final 1.0 release by the end of 2024. Here are some of the notable changes and upgrades to the software libraries we maintain:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("RBF by default on TxBuilder.")]),e._v(" The transaction builder in BDK will now signal RBF by default.")]),e._v(" "),t("li",[t("strong",[e._v("New wallet builder API.")]),e._v(" The new wallet builder offers flexibility and ease-of-development for future features. We've also been listening to user feedback, and brought back support for single-descriptor wallets.")]),e._v(" "),t("li",[t("strong",[e._v("MVP of the Book of BDK.")]),e._v(" We are working on a high-level documentation website for BDK libraries called the Book of BDK. The MVP website is live at "),t("a",{attrs:{href:"https://bookofbdk.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bookofbdk.com"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Bug chasing and optimizations.")]),e._v(" As feedback from early testers comes in, we are keeping a close eye on reported bugs and questions, and have been fixing a ton of smaller but very important snags!")]),e._v(" "),t("li",[t("strong",[e._v("Development of a CBF client crate and related bindings.")]),e._v(" Work is ongoing on a crate to allow BDK users to interoperate with a new CBF library called "),t("a",{attrs:{href:"https://github.com/rustaceanrob/kyoto",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kyoto"),t("OutboundLink")],1),e._v(". Work has been done to integrate this with the language bindings for mobile users, and the preliminary integrations have been very positive.")])]),e._v(" "),t("p",[e._v("The language bindings for iOS, Android, and Python have also seen some new beta releases and a ton of new features, in preparation for the 1.0 final release.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Exposing a much larger number of Wallet APIs.")]),e._v(" The Wallet type in the language bindings now exposes most of what users will need for a 1.0 release.")]),e._v(" "),t("li",[t("strong",[e._v("Rework of the Kotlin and Swift build systems.")]),e._v(" We have migrated the build workflows for bdk-jvm and bdk-android from Gradle scripts to shell scripts, making them easier to parse and consume for contributors and other libraries wanting to leverage our approach to bindings. We have also made it much easier to build the Swift package for iOS users.")]),e._v(" "),t("li",[t("strong",[e._v("Testing of Compact Block Filters for both Android and iOS.")]),e._v(" Both our wallet examples have full examples of using the new "),t("a",{attrs:{href:"https://github.com/rustaceanrob/kyoto",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kyoto"),t("OutboundLink")],1),e._v(" client on mobile phones. Once the PR for the new client lands, users will have access to clear examples on how to leverage the new client!")]),e._v(" "),t("li",[t("strong",[e._v("Building bitcoin-ffi.")]),e._v(" The team has been working on a crate called "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-ffi"),t("OutboundLink")],1),e._v(", migrating the types we exposed from rust-bitcoin into a standalone crate that other projects building on uniffi can use. We have been stress-testing this in production and are finding new ways to leverage this approach.")])]),e._v(" "),t("h3",{attrs:{id:"our-grantees-in-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-grantees-in-action"}},[e._v("#")]),e._v(" Our Grantees in Action")]),e._v(" "),t("p",[e._v("Full-time grants changes:")]),e._v(" "),t("ul",[t("li",[e._v("Our lead Rust developer Evan is moving to a part-time grant while he goes and works for a company that leverages BDK!\nIn addition to our full-time grantees, the "),t("a",{attrs:{href:"https://bitcoindevkit.org/foundation/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK Foundation"),t("OutboundLink")],1),e._v(" provides part-time grants to folks on special projects. Q3 is funding 2 projects in particular:")]),e._v(" "),t("li",[t("strong",[e._v("Leonardo.")]),e._v(" "),t("a",{attrs:{href:""}},[e._v("Leo")]),e._v("'s been working on our integration of the Tor Rust client into the Electrum and Esplora crates.")]),e._v(" "),t("li",[t("strong",[e._v("Rob.")]),e._v(" "),t("a",{attrs:{href:""}},[e._v("Rob")]),e._v(" is the brain behind the "),t("a",{attrs:{href:""}},[e._v("Kyoto")]),e._v(" client, its BDK integration with "),t("code",[e._v("bdk_kyoto")]),e._v(", and the PR to wrap it all up into our language bindings!")]),e._v(" "),t("li",[t("strong",[e._v("Wei Chen.")]),e._v(" "),t("a",{attrs:{href:"https://github.com/LagginTimes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wei"),t("OutboundLink")],1),e._v(" is continuing his work on the lower-level BDK crates "),t("code",[e._v("bdk_chain")]),e._v(" and "),t("code",[e._v("bdk_core")]),e._v(", as well as his work on the Electrum client.")])]),e._v(" "),t("p",[e._v("We've also been active at conferences!")]),e._v(" "),t("ul",[t("li",[e._v("Steve "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Qlbwxbe7xHE",target:"_blank",rel:"noopener noreferrer"}},[e._v("was on a panel at the 2024 Bitcoin Conference"),t("OutboundLink")],1),e._v(" discussing with 2 teams that are building on BDK.")]),e._v(" "),t("li",[e._v('The team was in Nashville for a week of hard work and collaboration between devs in the Rust bitcoin ecosystem we called the "Rust Bitcoin Summit". The event was so successful we\'re hoping to do it again next year! Here is a link to a '),t("a",{attrs:{href:"https://serve.podhome.fm/episodepage/CitadelDispatch/cd136-rust-bitcoin-summit-with-poelstra-harding-myers-corallo-and-more",target:"_blank",rel:"noopener noreferrer"}},[e._v("Citadel Dispatch podcast"),t("OutboundLink")],1),e._v(" with some of the devs who hosted and participated.")])]),e._v(" "),t("h3",{attrs:{id:"bdk-in-the-wild"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-in-the-wild"}},[e._v("#")]),e._v(" BDK in the Wild")]),e._v(" "),t("p",[e._v("In Q3, a number of new projects have started using BDK:")]),e._v(" "),t("ul",[t("li",[e._v("The Protonmail team has released the latest tool in the Proton family: the "),t("a",{attrs:{href:"https://proton.me/blog/proton-wallet-launch",target:"_blank",rel:"noopener noreferrer"}},[e._v("Proton Bitcoin Wallet App"),t("OutboundLink")],1),e._v(". The wallet is using the 1.0 beta version of the library. Welcome aboard Proton!")]),e._v(" "),t("li",[e._v("The "),t("a",{attrs:{href:""}},[e._v("bark Ark implementation")]),e._v(" started using the BDK beta releases for its wallet implementation.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://bitcoin-safe.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Safe"),t("OutboundLink")],1),e._v(" released its first beta release.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.satsails.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Satsails"),t("OutboundLink")],1),e._v(" is now live on the Play Store!")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.stratabtc.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Strata"),t("OutboundLink")],1),e._v(" has released a devnet version of their CLI wallet, which uses BDK.")]),e._v(" "),t("li",[e._v("Our BDK Swift Example Wallet is "),t("a",{attrs:{href:"https://testflight.apple.com/join/A3nAuYvZ",target:"_blank",rel:"noopener noreferrer"}},[e._v("now available on iOS Testflight"),t("OutboundLink")],1),e._v("!")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{403:function(e,t,n){"use strict";n.r(t);var a=n(7),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("The bitcoindevkit team has been hard at work for Q3 in 2024, polishing the API of our "),t("code",[e._v("bdk_wallet")]),e._v(" crate and releasing 4 new beta versions (1, 2, 3, and 4!), and aiming to release a final 1.0 release by the end of 2024. Here are some of the notable changes and upgrades to the software libraries we maintain:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("RBF by default on TxBuilder.")]),e._v(" The transaction builder in BDK will now signal RBF by default.")]),e._v(" "),t("li",[t("strong",[e._v("New wallet builder API.")]),e._v(" The new wallet builder offers flexibility and ease-of-development for future features. We've also been listening to user feedback, and brought back support for single-descriptor wallets.")]),e._v(" "),t("li",[t("strong",[e._v("MVP of the Book of BDK.")]),e._v(" We are working on a high-level documentation website for BDK libraries called the Book of BDK. The MVP website is live at "),t("a",{attrs:{href:"https://bookofbdk.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bookofbdk.com"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("Bug chasing and optimizations.")]),e._v(" As feedback from early testers comes in, we are keeping a close eye on reported bugs and questions, and have been fixing a ton of smaller but very important snags!")]),e._v(" "),t("li",[t("strong",[e._v("Development of a CBF client crate and related bindings.")]),e._v(" Work is ongoing on a crate to allow BDK users to interoperate with a new CBF library called "),t("a",{attrs:{href:"https://github.com/rustaceanrob/kyoto",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kyoto"),t("OutboundLink")],1),e._v(". Work has been done to integrate this with the language bindings for mobile users, and the preliminary integrations have been very positive.")])]),e._v(" "),t("p",[e._v("The language bindings for iOS, Android, and Python have also seen some new beta releases and a ton of new features, in preparation for the 1.0 final release.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Exposing a much larger number of Wallet APIs.")]),e._v(" The Wallet type in the language bindings now exposes most of what users will need for a 1.0 release.")]),e._v(" "),t("li",[t("strong",[e._v("Rework of the Kotlin and Swift build systems.")]),e._v(" We have migrated the build workflows for bdk-jvm and bdk-android from Gradle scripts to shell scripts, making them easier to parse and consume for contributors and other libraries wanting to leverage our approach to bindings. We have also made it much easier to build the Swift package for iOS users.")]),e._v(" "),t("li",[t("strong",[e._v("Testing of Compact Block Filters for both Android and iOS.")]),e._v(" Both our wallet examples have full examples of using the new "),t("a",{attrs:{href:"https://github.com/rustaceanrob/kyoto",target:"_blank",rel:"noopener noreferrer"}},[e._v("Kyoto"),t("OutboundLink")],1),e._v(" client on mobile phones. Once the PR for the new client lands, users will have access to clear examples on how to leverage the new client!")]),e._v(" "),t("li",[t("strong",[e._v("Building bitcoin-ffi.")]),e._v(" The team has been working on a crate called "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-ffi"),t("OutboundLink")],1),e._v(", migrating the types we exposed from rust-bitcoin into a standalone crate that other projects building on uniffi can use. We have been stress-testing this in production and are finding new ways to leverage this approach.")])]),e._v(" "),t("h3",{attrs:{id:"our-grantees-in-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-grantees-in-action"}},[e._v("#")]),e._v(" Our Grantees in Action")]),e._v(" "),t("p",[e._v("Full-time grants changes:")]),e._v(" "),t("ul",[t("li",[e._v("Our lead Rust developer Evan is moving to a part-time grant while he goes and works for a company that leverages BDK!\nIn addition to our full-time grantees, the "),t("a",{attrs:{href:"https://bitcoindevkit.org/foundation/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK Foundation"),t("OutboundLink")],1),e._v(" provides part-time grants to folks on special projects. Q3 is funding 2 projects in particular:")]),e._v(" "),t("li",[t("strong",[e._v("Leonardo.")]),e._v(" "),t("a",{attrs:{href:""}},[e._v("Leo")]),e._v("'s been working on our integration of the Tor Rust client into the Electrum and Esplora crates.")]),e._v(" "),t("li",[t("strong",[e._v("Rob.")]),e._v(" "),t("a",{attrs:{href:""}},[e._v("Rob")]),e._v(" is the brain behind the "),t("a",{attrs:{href:""}},[e._v("Kyoto")]),e._v(" client, its BDK integration with "),t("code",[e._v("bdk_kyoto")]),e._v(", and the PR to wrap it all up into our language bindings!")]),e._v(" "),t("li",[t("strong",[e._v("Wei Chen.")]),e._v(" "),t("a",{attrs:{href:"https://github.com/LagginTimes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wei"),t("OutboundLink")],1),e._v(" is continuing his work on the lower-level BDK crates "),t("code",[e._v("bdk_chain")]),e._v(" and "),t("code",[e._v("bdk_core")]),e._v(", as well as his work on the Electrum client.")])]),e._v(" "),t("p",[e._v("We've also been active at conferences!")]),e._v(" "),t("ul",[t("li",[e._v("Steve "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=Qlbwxbe7xHE",target:"_blank",rel:"noopener noreferrer"}},[e._v("was on a panel at the 2024 Bitcoin Conference"),t("OutboundLink")],1),e._v(" discussing with 2 teams that are building on BDK.")]),e._v(" "),t("li",[e._v('The team was in Nashville for a week of hard work and collaboration between devs in the Rust bitcoin ecosystem we called the "Rust Bitcoin Summit". The event was so successful we\'re hoping to do it again next year! Here is a link to a '),t("a",{attrs:{href:"https://serve.podhome.fm/episodepage/CitadelDispatch/cd136-rust-bitcoin-summit-with-poelstra-harding-myers-corallo-and-more",target:"_blank",rel:"noopener noreferrer"}},[e._v("Citadel Dispatch podcast"),t("OutboundLink")],1),e._v(" with some of the devs who hosted and participated.")])]),e._v(" "),t("h3",{attrs:{id:"bdk-in-the-wild"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk-in-the-wild"}},[e._v("#")]),e._v(" BDK in the Wild")]),e._v(" "),t("p",[e._v("In Q3, a number of new projects have started using BDK:")]),e._v(" "),t("ul",[t("li",[e._v("The Protonmail team has released the latest tool in the Proton family: the "),t("a",{attrs:{href:"https://proton.me/blog/proton-wallet-launch",target:"_blank",rel:"noopener noreferrer"}},[e._v("Proton Bitcoin Wallet App"),t("OutboundLink")],1),e._v(". The wallet is using the 1.0 beta version of the library. Welcome aboard Proton!")]),e._v(" "),t("li",[e._v("The "),t("a",{attrs:{href:""}},[e._v("bark Ark implementation")]),e._v(" started using the BDK beta releases for its wallet implementation.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://bitcoin-safe.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Safe"),t("OutboundLink")],1),e._v(" released its first beta release.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.satsails.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Satsails"),t("OutboundLink")],1),e._v(" is now live on the Play Store!")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.stratabtc.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Strata"),t("OutboundLink")],1),e._v(" has released a devnet version of their CLI wallet, which uses BDK.")]),e._v(" "),t("li",[e._v("Our BDK Swift Example Wallet is "),t("a",{attrs:{href:"https://testflight.apple.com/join/A3nAuYvZ",target:"_blank",rel:"noopener noreferrer"}},[e._v("now available on iOS Testflight"),t("OutboundLink")],1),e._v("!")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/51.8de4cf97.js b/assets/js/51.c7124b55.js similarity index 99% rename from assets/js/51.8de4cf97.js rename to assets/js/51.c7124b55.js index 4566fcb827..acd292d1b3 100644 --- a/assets/js/51.8de4cf97.js +++ b/assets/js/51.c7124b55.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{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([[51],{406: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/52.2fe94958.js b/assets/js/52.912712b1.js similarity index 99% rename from assets/js/52.2fe94958.js rename to assets/js/52.912712b1.js index 81f659ccad..ade7d53a89 100644 --- a/assets/js/52.2fe94958.js +++ b/assets/js/52.912712b1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{405: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([[52],{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 diff --git a/assets/js/53.185fde0b.js b/assets/js/53.796735ee.js similarity index 99% rename from assets/js/53.185fde0b.js rename to assets/js/53.796735ee.js index 20e580b331..e88153d561 100644 --- a/assets/js/53.185fde0b.js +++ b/assets/js/53.796735ee.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{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 diff --git a/assets/js/54.c56c2eff.js b/assets/js/54.37a4c8ce.js similarity index 99% rename from assets/js/54.c56c2eff.js rename to assets/js/54.37a4c8ce.js index b94a225fae..51000fdbdd 100644 --- a/assets/js/54.c56c2eff.js +++ b/assets/js/54.37a4c8ce.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{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 diff --git a/assets/js/57.bafb3dd1.js b/assets/js/57.d52298cb.js similarity index 99% rename from assets/js/57.bafb3dd1.js rename to assets/js/57.d52298cb.js index 9c58810685..5a58ca9a36 100644 --- a/assets/js/57.bafb3dd1.js +++ b/assets/js/57.d52298cb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{413: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([[57],{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/58.4694f4b5.js b/assets/js/58.10758a4f.js similarity index 99% rename from assets/js/58.4694f4b5.js rename to assets/js/58.10758a4f.js index c93c725651..c9c32aef0d 100644 --- a/assets/js/58.4694f4b5.js +++ b/assets/js/58.10758a4f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{412: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([[58],{413: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/59.0a69b495.js b/assets/js/59.9b9541ac.js similarity index 99% rename from assets/js/59.0a69b495.js rename to assets/js/59.9b9541ac.js index 1af6c26fe8..d3de51f9c0 100644 --- a/assets/js/59.0a69b495.js +++ b/assets/js/59.9b9541ac.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{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 +(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 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/60.48c95147.js b/assets/js/60.3b526e17.js similarity index 99% rename from assets/js/60.48c95147.js rename to assets/js/60.3b526e17.js index f8136e6826..f62190d2f1 100644 --- a/assets/js/60.48c95147.js +++ b/assets/js/60.3b526e17.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{417: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([[60],{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 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/61.5594ba11.js b/assets/js/61.f6ea4853.js similarity index 99% rename from assets/js/61.5594ba11.js rename to assets/js/61.f6ea4853.js index 2fe90b7dc6..202ab5eb02 100644 --- a/assets/js/61.5594ba11.js +++ b/assets/js/61.f6ea4853.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{419:function(e,t,a){"use strict";a.r(t);var n=a(7),s=Object(n.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 3 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-2/"}},[e._v("Part 2")]),e._v(")")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-model"}},[e._v("The model")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#splitting"}},[e._v("Splitting")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#preprocessing"}},[e._v("Preprocessing")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#build"}},[e._v("Build")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#finally--training"}},[e._v("Finally, training")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-prediction-phase"}},[e._v("The prediction phase")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#conclusion-and-future-development"}},[e._v("Conclusion and future development")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#acknowledgements"}},[e._v("Acknowledgements")])])]),e._v(" "),t("h2",{attrs:{id:"the-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-model"}},[e._v("#")]),e._v(" The model")]),e._v(" "),t("p",[e._v("The code building and training the model with "),t("a",{attrs:{href:"https://www.tensorflow.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("tensorflow"),t("OutboundLink")],1),e._v(" is available in "),t("a",{attrs:{href:"https://colab.research.google.com/drive/1yamwh8nE4NhmGButep-pfUT-1uRKs49a?usp=sharing",target:"_blank",rel:"noopener noreferrer"}},[e._v("google colab notebook"),t("OutboundLink")],1),e._v(" (jupyter notebook); you can also download the file as plain python and run it locally. At least 1 hour is needed to train the full model, but it heavily depends on the hardware available.")]),e._v(" "),t("p",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-confirms_in-fee_rate.png",alt:"graph confirm_in blocks vs fee_rate"}})]),t("div",{attrs:{align:"center"}},[e._v("Do you want to choose the fee without a model? In the last 5 weeks a ~50 sat/vbyte transaction never took more than a day to confirm and a ~10 sat/vbyte never took more than a week")]),t("br"),t("p"),e._v(" "),t("p",[e._v("As a reference, in the code we have a calculation of the bitcoin core "),t("code",[e._v("estimatesmartfee")]),e._v(" MAE"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(" and drift"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn2",id:"fnref2"}},[e._v("[2]")])]),e._v(".\nMAE is computed as "),t("code",[e._v("avg(abs(fee_rate - core_econ))")]),e._v(" when "),t("code",[e._v("core_econ")]),e._v(" is available (about 1.2M observations, sometime the value is not available when considered too old).")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("estimatesmartfee mode")]),e._v(" "),t("th",[e._v("MAE [satoshi/vbytes]")]),e._v(" "),t("th",[e._v("drift")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("economic")]),e._v(" "),t("td",[e._v("28.77")]),e._v(" "),t("td",[e._v("20.79")])]),e._v(" "),t("tr",[t("td",[e._v("conservative")]),e._v(" "),t("td",[e._v("46.49")]),e._v(" "),t("td",[e._v("44.73")])])])]),e._v(" "),t("p",[e._v("As seen from the table, the error is quite high, but the positive drift suggests "),t("code",[e._v("estimatesmartfee")]),e._v(" prefers to overestimate to avoid transactions not confirming.")]),e._v(" "),t("p",[e._v('As we said in the introduction, network traffic is correlated with time and we have the timestamp of when the transaction has been first seen, however a ML model doesn\'t like plain numbers too much, but it behaves better with "number that repeats", like categories, so we are converting the timestamp in '),t("code",[e._v("day_of_week")]),e._v(" a number from 0 to 6, and "),t("code",[e._v("hours")]),e._v(" a number from 0 to 24.")]),e._v(" "),t("h4",{attrs:{id:"splitting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#splitting"}},[e._v("#")]),e._v(" Splitting")]),e._v(" "),t("p",[e._v("The dataset is splitted in training and test data with a 80/20 proportion. As the name suggest the training part is used to train the model, the test is composed of other observations to test if the model is good with observations that has never seen (proving the model can generalize, not just memorizing the answer).")]),e._v(" "),t("p",[e._v("During the training the data is splitted again in 80/20 for training and validation respectively, validation is basically testing during training.")]),e._v(" "),t("p",[e._v("During splitting, the dataset is converted from a pandas data frame to tensorflow dataset, decreasing training times.")]),e._v(" "),t("h4",{attrs:{id:"preprocessing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#preprocessing"}},[e._v("#")]),e._v(" Preprocessing")]),e._v(" "),t("p",[e._v("The preprocessing phase is part of the model however it contains transformations without parameters trained by the model.\nThis transformations are useful because model trains better if data are in some format, and having this phase inside the model helps to avoid to prepare the data before feeding the model at prediction phase.")]),e._v(" "),t("p",[e._v("Our model performs 2 kind of preprocessing:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Normalization: model trains faster if numerical features have mean 0 and standard deviation equal to 1, so this layer is built by computing the "),t("code",[e._v("mean")]),e._v(" and "),t("code",[e._v("std")]),e._v(" from the series of a feature before training, and the model is feed with "),t("code",[e._v("(feature - mean)/std")]),e._v(". Our model normalize "),t("code",[e._v("confirms_in")]),e._v(" feature and all the buckets "),t("code",[e._v("a*")])])]),e._v(" "),t("li",[t("p",[e._v("one-hot vector: Numerical categories having a small number of different unique values like our "),t("code",[e._v("day_of_week")]),e._v(" and "),t("code",[e._v("hours")]),e._v(" could be trained better/faster by being converted in one hot vector. For example "),t("code",[e._v("day_of_week=6")]),e._v(" (Sunday) is converted in a vector "),t("code",[e._v("['0', '0', '0', '0', '0', '0', '1']")]),e._v(" while "),t("code",[e._v("day_of_week=5")]),e._v(" (Saturday) is converted in the vector "),t("code",[e._v("['0', '0', '0', '0', '0', '1', '0']")])])])]),e._v(" "),t("h4",{attrs:{id:"build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("all_features "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("concatenate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("encoded_features"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nx "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Dense"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" activation"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"relu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("all_features"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nx "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Dense"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" activation"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"relu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\noutput "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Dense"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" activation"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("clip"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nmodel "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Model"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("all_inputs"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" output"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\noptimizer "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("optimizers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Adam"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("learning_rate"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.01")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nmodel"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token builtin"}},[e._v("compile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("loss"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'mse'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n optimizer"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("optimizer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n metrics"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'mae'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'mse'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-model.png",alt:"model graph"}})]),e._v(" "),t("p",[e._v("The model is fed with the "),t("code",[e._v("encoded_features")]),e._v(" coming from the processing phase, then there are 2 layers with 64 neurons each followed by one neuron giving the "),t("code",[e._v("fee_rate")]),e._v(" as output.")]),e._v(" "),t("p",[e._v("With this configurations the model has:")]),e._v(" "),t("ul",[t("li",[e._v("Total params: "),t("code",[e._v("7,412")])]),e._v(" "),t("li",[e._v("Trainable params: "),t("code",[e._v("7,361")])]),e._v(" "),t("li",[e._v("Non-trainable params: "),t("code",[e._v("51")])])]),e._v(" "),t("p",[e._v("Non-trainable params comes from the normalization layer and are computed in the pre-processing phase (it contains, for example, the mean of a series). Trainable parameters are values initialized randomly and changed during the training phase. The trainable parameters are "),t("code",[e._v("7,361")]),e._v(", this number comes from the following, every neuron has an associated bias and a weight for every element in the inputs, thus:")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("48")]),e._v(" input_values_weights + "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" bias"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" * "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),e._v(" first_layer_neurons"),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 number"}},[e._v("64")]),e._v(" input_values_weights + "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" bias"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" * "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),e._v(" second layer neurons"),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 number"}},[e._v("64")]),e._v(" input values weights + "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" bias"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("49")]),e._v("*64+65*64+65 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("7361")]),e._v("\n")])])]),t("p",[e._v("Honestly, neural network parameters are mostly the one taken from this tensorflow "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/regression",target:"_blank",rel:"noopener noreferrer"}},[e._v("example"),t("OutboundLink")],1),e._v(", we even tried to "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/keras_tuner",target:"_blank",rel:"noopener noreferrer"}},[e._v("tune hyperparameters"),t("OutboundLink")],1),e._v(", however, we decided to follow this "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#demonstrate_overfitting",target:"_blank",rel:"noopener noreferrer"}},[e._v("advice"),t("OutboundLink")],1),e._v(": "),t("em",[e._v('"The simplest way to prevent overfitting is to start with a small model:"')]),e._v(". We hope this work will attract other data scientists to this bitcoin problem, improving the model. We also think that a longer time for the data collection is needed to capture various situations.")]),e._v(" "),t("p",[e._v("A significant part of a ML model are the activation functions, "),t("code",[e._v("relu")]),e._v(" (Rectified Linear Unit) is one of the most used lately, because it's simple and works well as we learned in this "),t("a",{attrs:{href:"https://youtu.be/aircAruvnKk?t=1035",target:"_blank",rel:"noopener noreferrer"}},[e._v("introducing neural network video"),t("OutboundLink")],1),e._v(". "),t("code",[e._v("relu")]),e._v(" it's equal to zero for negative values and equal to the input for positive values. Being non-linear allows the whole model to be non-linear.")]),e._v(" "),t("p",[e._v("For the last layer it is different: we want to enforce a minimum for the output, which is the minimum relay fee "),t("code",[e._v("1.0")]),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn3",id:"fnref3"}},[e._v("[3]")])]),e._v(". One could not simply cut the output of the model after prediction because all the training would not consider this constraint. So we need to build a custom activation function that the model training will be able to use for the "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Gradient_descent#:~:text=Gradient%20descent%20is%20a%20first,the%20direction%20of%20steepest%20descent.",target:"_blank",rel:"noopener noreferrer"}},[e._v("gradient descent"),t("OutboundLink")],1),e._v(" optimization step. Luckily this is very simple using tensorflow primitives:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("def clip(x):\n min = tf.constant(1.0)\n return tf.where(tf.less(x, min), min, x)\n")])])]),t("p",[e._v("Another important part is the optimizer, when we first read the aforementioned "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/regression",target:"_blank",rel:"noopener noreferrer"}},[e._v("example"),t("OutboundLink")],1),e._v(" the optimizer used was "),t("code",[e._v("RMSProp")]),e._v(" however the example updated lately and we noticed the optimizer changed in favor of "),t("code",[e._v("Adam")]),e._v(" which we read is the "),t("a",{attrs:{href:"https://towardsdatascience.com/adam-latest-trends-in-deep-learning-optimization-6be9a291375c",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest trend"),t("OutboundLink")],1),e._v(" in data science. We changed the model to use "),t("code",[e._v("Adam")]),e._v(" and effectively the training is faster with "),t("code",[e._v("Adam")]),e._v(" and even slightly lower error is achieved.\nAnother important parameter is the learning rate, which we set to "),t("code",[e._v("0.01")]),e._v(" after manual trials; however there might be space for improvements such as using "),t("a",{attrs:{href:"https://www.tensorflow.org/api_docs/python/tf/compat/v1/train/exponential_decay",target:"_blank",rel:"noopener noreferrer"}},[e._v("exponential decay"),t("OutboundLink")],1),e._v(", starting with an high learning rate and decreasing it through training epochs.")]),e._v(" "),t("p",[e._v('The last part of the model configuration is the loss function: the objective of the training is to find the minimum of this function. Usually for regression problem (the ones having a number as output, not a category) the most used is the Mean squared error (MSE). MSE is measured as the average of squared difference between predictions and actual observations, giving larger penalties to large difference because of the square. An interesting property is that the bigger the error the faster the changes is good at the beginning of the training, while slowing down when the model predicts better is desirable to avoid "jumping out" the local minimum.')]),e._v(" "),t("h4",{attrs:{id:"finally-the-model-training"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#finally-the-model-training"}},[e._v("#")]),e._v(" Finally, the model training")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("PATIENCE = 20\nMAX_EPOCHS = 200\n\ndef train():\n early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=PATIENCE)\n history = model.fit(train_ds, epochs=MAX_EPOCHS, validation_data=val_ds, verbose=1, callbacks=[early_stop])\n return history\n\nhistory = train()\n")])])]),t("p",[e._v("This steps is the core of the neural network, it takes a while, let's analyze the output:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("Epoch 1/200\n7559/7559 [==============================] - 34s 3ms/step - loss: 547.8023 - mae: 16.9547 - mse: 547.8023 - val_loss: 300.5965 - val_ma\ne: 11.9202 - val_mse: 300.5965\n...\nEpoch 158/200\n7559/7559 [==============================] - 31s 3ms/step - loss: 163.2548 - mae: 8.3126 - mse: 163.2548 - val_loss: 164.8296 - val_mae: 8.3402 - val_mse: 164.8296\n")])])]),t("p",[e._v("Training is done in epochs, under every epoch all the training data is iterated and model parameters updated to minimize the loss function.")]),e._v(" "),t("p",[e._v("The number "),t("code",[e._v("7559")]),e._v(" represent the number of steps. Theoretically the whole training data should be processed at once and parameters updated accordingly, however in practice this is infeasible for example for memory resource, thus the training happens in batch. In our case we have "),t("code",[e._v("1,934,999")]),e._v(" observations in the training set and our batch size is "),t("code",[e._v("256")]),e._v(", thus we have "),t("code",[e._v("1,437,841/256=7,558.58")]),e._v(" which by excess result in "),t("code",[e._v("7559")]),e._v(" steps.")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("~31s")]),e._v(" is the time it takes to process the epoch on a threadripper CPU but GPU or TPU could do better.")]),e._v(" "),t("p",[e._v("The value "),t("code",[e._v("loss")]),e._v(" is the MSE on the training data while "),t("code",[e._v("val_loss")]),e._v(" is the MSE value on the validation data. As far as we understand the separated validation data helps to detect the machine learning enemy, overfitting. Because in case of overfitting the value "),t("code",[e._v("loss")]),e._v(" continue to improve (almost indefinitely) while "),t("code",[e._v("val_loss")]),e._v(" start improving with the loss but a certain point diverge, indicating the network is memorizing the training data to improve "),t("code",[e._v("loss")]),e._v(" but in doing so losing generalizing capabilities.")]),e._v(" "),t("p",[e._v("Our model doesn't look to suffer overfitting cause "),t("code",[e._v("loss")]),e._v(" and "),t("code",[e._v("val_loss")]),e._v(" doesn't diverge during training")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-train-history.png",alt:"train history"}})]),e._v(" "),t("p",[e._v("While we told the training to do 200 epochs, the training stopped at 158 because we added an "),t("code",[e._v("early_stop")]),e._v(" call back with "),t("code",[e._v("20")]),e._v(" as "),t("code",[e._v("PATIENCE")]),e._v(", meaning that after 20 epoch and no improvement in "),t("code",[e._v("val_loss")]),e._v(" the training is halted, saving time and potentially avoiding overfitting.")]),e._v(" "),t("h2",{attrs:{id:"the-prediction-phase"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-prediction-phase"}},[e._v("#")]),e._v(" The prediction phase")]),e._v(" "),t("p",[e._v("A "),t("a",{attrs:{href:"https://github.com/RCasatta/estimate_ml_fee",target:"_blank",rel:"noopener noreferrer"}},[e._v("prediction test tool"),t("OutboundLink")],1),e._v(" is available on github. At the moment it uses a bitcoin core node to provide network data for simplicity, but it queries it only for the mempool and the last 6 blocks, so it's something that also a light-client could do"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn4",id:"fnref4"}},[e._v("[4]")])]),e._v(".")]),e._v(" "),t("p",[e._v("The following chart is probably the best visualization to evaluate the model, on the x axis there is the real fee rate while on the y axis there is the prediction, the more the points are centered on the bisection, the more the model is good.\nWe can see the model is doing quite well, the MAE is 8 which is way lower than "),t("code",[e._v("estimatesmartfee")]),e._v(". However, there are big errors some times, in particular for prediction for fast confirmation ("),t("code",[e._v("confirms_in=1 or confirms_in=2")]),e._v(") as shown by the orange points. Creating a model only for blocks target greater than 2 instead of simply remove some observations may be an option.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-true-and-predictions.png",alt:"prediction results"}})]),e._v(" "),t("p",[e._v("The following chart is instead a distribution of the errors, which for good model should resemble the normal distribution centered in 0, and it loooks like the model is respecting that.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-error-distribution.png",alt:"error distribution"}})]),e._v(" "),t("h2",{attrs:{id:"conclusion-and-future-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion-and-future-development"}},[e._v("#")]),e._v(" Conclusion and future development")]),e._v(" "),t("p",[e._v("The results have shown deep neural network are a tool capable of good bitcoin transaction fee estimations; this suggests that further ML research in this area might be promising.")]),e._v(" "),t("p",[e._v("This is just a starting point, there are many future improvements such as:")]),e._v(" "),t("ul",[t("li",[e._v("Build a separate model with full knowledge, thus for full, always-connected nodes could be interesting and improve network resource allocation with respect to current estimators.")]),e._v(" "),t("li",[e._v("Tensorflow is a huge dependency, and since it contains all the feature to build and train a model, most of the feature are not needed in the prediction phase. In fact tensorflow lite exists which is specifically created for embedded and mobile devices; the "),t("a",{attrs:{href:"https://github.com/RCasatta/estimate_ml_fee",target:"_blank",rel:"noopener noreferrer"}},[e._v("prediction test tool"),t("OutboundLink")],1),e._v(" and the final integration in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" should use it.")]),e._v(" "),t("li",[e._v("Explore other fields to improve model predictions such as:\n"),t("ul",[t("li",[e._v("A bucket array of the transactions in the last 6 blocks with known fee rates. This should in particular help estimations with almost empty mempool.")]),e._v(" "),t("li",[e._v("Transaction weight")]),e._v(" "),t("li",[e._v("Time from last block")])])]),e._v(" "),t("li",[e._v("Some fields are very important and could benefit from pre-processing expansion, for instance applying "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/structured_data/feature_columns#hashed_feature_columns",target:"_blank",rel:"noopener noreferrer"}},[e._v("hashed feature columns"),t("OutboundLink")],1),e._v(" to "),t("code",[e._v("confirms_in")]),e._v(".")]),e._v(" "),t("li",[e._v("Bitcoin logger could be improved by a merge command to unify raw logs files, reducing redundancy and consequently disk occupation.")]),e._v(" "),t("li",[e._v("The dataset could be created in multiple files to allow more parallelism and use less memory during training.")]),e._v(" "),t("li",[e._v("Saving the dataset in "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/load_data/tfrecord",target:"_blank",rel:"noopener noreferrer"}},[e._v("TFRecord format"),t("OutboundLink")],1),e._v(" instead of CSV")]),e._v(" "),t("li",[e._v("At the moment we are training the model on a threadripper CPU, training the code on GPU or even TPU will be needed to decrease training time, especially because input data will grow.")]),e._v(" "),t("li",[e._v("The "),t("a",{attrs:{href:"https://github.com/RCasatta/estimate_ml_fee",target:"_blank",rel:"noopener noreferrer"}},[e._v("prediction test tool"),t("OutboundLink")],1),e._v(" should estimate only using the p2p bitcoin network, without requiring a node. This work would be propedeutic for "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" integration")]),e._v(" "),t("li",[e._v("At the moment mempool buckets are multiple inputs "),t("code",[e._v("a*")]),e._v(" as show in the model graph; since they are related, is it possible to merge them in one TensorArray?")]),e._v(" "),t("li",[e._v("Sometimes the model does not learn and "),t("a",{attrs:{href:"https://github.com/RCasatta/bitcoin_logger/blob/master/notes.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("gets stuck"),t("OutboundLink")],1),e._v(". The reason is the "),t("code",[e._v("clip")]),e._v(" function applied in the last layer is constant for a value lower than 1. In this case, the derivative is 0 and the gradient descent doesn't know where to go. Instead of using the "),t("code",[e._v("clip")]),e._v(" function apply penalties to the loss function for values lower than 1.")]),e._v(" "),t("li",[e._v("There are issues regarding dead neurons (going to 0) or neurons with big weight, weight results should be monitored for this events, and also weight decay and L2 regularization should be explored.")]),e._v(" "),t("li",[e._v("Tune hyper-parameters technique should be re-tested.")]),e._v(" "),t("li",[e._v("Predictions should be monotonic decreasing for growing "),t("code",[e._v("confirms_in")]),e._v(" parameter; for obvious reason it doesn't make sense that an higher fee rate will result in a higher confirmation time. But since this is not enforced anywhere in the model, at the moment this could happen.")]),e._v(" "),t("li",[e._v("Since nodes with bloom filter disabled doesn't serve the mempool anymore, a model based only on last blocks should be evaluated.")])]),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("Thanks to "),t("a",{attrs:{href:"https://squarecrypto.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Square crypto"),t("OutboundLink")],1),e._v(" for sponsoring this work and thanks to the reviewers: "),t("a",{attrs:{href:"https://twitter.com/LeoComandini",target:"_blank",rel:"noopener noreferrer"}},[e._v("Leonardo Comandini"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://twitter.com/domegabri",target:"_blank",rel:"noopener noreferrer"}},[e._v("Domenico Gabriele"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://twitter.com/afilini",target:"_blank",rel:"noopener noreferrer"}},[e._v("Alekos Filini"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://twitter.com/Ferdinando1970",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ferdinando Ametrano"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("And also this tweet that remembered me "),t("a",{attrs:{href:"https://twitter.com/RCasatta",target:"_blank",rel:"noopener noreferrer"}},[e._v("I"),t("OutboundLink")],1),e._v(" had this work in my TODO list")]),e._v(" "),t("blockquote",{staticClass:"twitter-tweet"},[t("p",{attrs:{lang:"en",dir:"ltr"}},[e._v("I don't understand Machine Learning(ML), but is it horrible to use ML to predict bitcoin fees? "),t("br"),t("br"),e._v('I have heard tales of this "Deep Learning" thing where you throw a bunch of data at it and it gives you good results with high accuracy.')]),e._v("— sanket1729 (@sanket1729) "),t("a",{attrs:{href:"https://twitter.com/sanket1729/status/1336624662365822977?ref_src=twsrc%5Etfw"}},[e._v("December 9, 2020")])]),e._v(" "),t("script",{attrs:{async:"",src:"https://platform.twitter.com/widgets.js",charset:"utf-8"}}),e._v(" "),t("p",[e._v("This is the final part of the series. 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 and in "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"}},[e._v("Part 2")]),e._v(" we talked 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("MAE is Mean Absolute Error, which is the average of the series built by the absolute difference between the real value and the estimation. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn2"}},[t("p",[e._v("drift like MAE, but without the absolute value "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref2"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn3"}},[t("p",[e._v("Most node won't relay transactions with fee lower than the min relay fee, which has a default of "),t("code",[e._v("1.0")]),e._v(" "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref3"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn4"}},[t("p",[e._v("An important issue emerged after the article came out, a bitcoin core client with bloom filter disabled (default as of 0.21) doesn't serve the mempool via p2p. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref4"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{418:function(e,t,a){"use strict";a.r(t);var n=a(7),s=Object(n.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 3 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-2/"}},[e._v("Part 2")]),e._v(")")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-model"}},[e._v("The model")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#splitting"}},[e._v("Splitting")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#preprocessing"}},[e._v("Preprocessing")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#build"}},[e._v("Build")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#finally--training"}},[e._v("Finally, training")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-prediction-phase"}},[e._v("The prediction phase")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#conclusion-and-future-development"}},[e._v("Conclusion and future development")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#acknowledgements"}},[e._v("Acknowledgements")])])]),e._v(" "),t("h2",{attrs:{id:"the-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-model"}},[e._v("#")]),e._v(" The model")]),e._v(" "),t("p",[e._v("The code building and training the model with "),t("a",{attrs:{href:"https://www.tensorflow.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("tensorflow"),t("OutboundLink")],1),e._v(" is available in "),t("a",{attrs:{href:"https://colab.research.google.com/drive/1yamwh8nE4NhmGButep-pfUT-1uRKs49a?usp=sharing",target:"_blank",rel:"noopener noreferrer"}},[e._v("google colab notebook"),t("OutboundLink")],1),e._v(" (jupyter notebook); you can also download the file as plain python and run it locally. At least 1 hour is needed to train the full model, but it heavily depends on the hardware available.")]),e._v(" "),t("p",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-confirms_in-fee_rate.png",alt:"graph confirm_in blocks vs fee_rate"}})]),t("div",{attrs:{align:"center"}},[e._v("Do you want to choose the fee without a model? In the last 5 weeks a ~50 sat/vbyte transaction never took more than a day to confirm and a ~10 sat/vbyte never took more than a week")]),t("br"),t("p"),e._v(" "),t("p",[e._v("As a reference, in the code we have a calculation of the bitcoin core "),t("code",[e._v("estimatesmartfee")]),e._v(" MAE"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(" and drift"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn2",id:"fnref2"}},[e._v("[2]")])]),e._v(".\nMAE is computed as "),t("code",[e._v("avg(abs(fee_rate - core_econ))")]),e._v(" when "),t("code",[e._v("core_econ")]),e._v(" is available (about 1.2M observations, sometime the value is not available when considered too old).")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("estimatesmartfee mode")]),e._v(" "),t("th",[e._v("MAE [satoshi/vbytes]")]),e._v(" "),t("th",[e._v("drift")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("economic")]),e._v(" "),t("td",[e._v("28.77")]),e._v(" "),t("td",[e._v("20.79")])]),e._v(" "),t("tr",[t("td",[e._v("conservative")]),e._v(" "),t("td",[e._v("46.49")]),e._v(" "),t("td",[e._v("44.73")])])])]),e._v(" "),t("p",[e._v("As seen from the table, the error is quite high, but the positive drift suggests "),t("code",[e._v("estimatesmartfee")]),e._v(" prefers to overestimate to avoid transactions not confirming.")]),e._v(" "),t("p",[e._v('As we said in the introduction, network traffic is correlated with time and we have the timestamp of when the transaction has been first seen, however a ML model doesn\'t like plain numbers too much, but it behaves better with "number that repeats", like categories, so we are converting the timestamp in '),t("code",[e._v("day_of_week")]),e._v(" a number from 0 to 6, and "),t("code",[e._v("hours")]),e._v(" a number from 0 to 24.")]),e._v(" "),t("h4",{attrs:{id:"splitting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#splitting"}},[e._v("#")]),e._v(" Splitting")]),e._v(" "),t("p",[e._v("The dataset is splitted in training and test data with a 80/20 proportion. As the name suggest the training part is used to train the model, the test is composed of other observations to test if the model is good with observations that has never seen (proving the model can generalize, not just memorizing the answer).")]),e._v(" "),t("p",[e._v("During the training the data is splitted again in 80/20 for training and validation respectively, validation is basically testing during training.")]),e._v(" "),t("p",[e._v("During splitting, the dataset is converted from a pandas data frame to tensorflow dataset, decreasing training times.")]),e._v(" "),t("h4",{attrs:{id:"preprocessing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#preprocessing"}},[e._v("#")]),e._v(" Preprocessing")]),e._v(" "),t("p",[e._v("The preprocessing phase is part of the model however it contains transformations without parameters trained by the model.\nThis transformations are useful because model trains better if data are in some format, and having this phase inside the model helps to avoid to prepare the data before feeding the model at prediction phase.")]),e._v(" "),t("p",[e._v("Our model performs 2 kind of preprocessing:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Normalization: model trains faster if numerical features have mean 0 and standard deviation equal to 1, so this layer is built by computing the "),t("code",[e._v("mean")]),e._v(" and "),t("code",[e._v("std")]),e._v(" from the series of a feature before training, and the model is feed with "),t("code",[e._v("(feature - mean)/std")]),e._v(". Our model normalize "),t("code",[e._v("confirms_in")]),e._v(" feature and all the buckets "),t("code",[e._v("a*")])])]),e._v(" "),t("li",[t("p",[e._v("one-hot vector: Numerical categories having a small number of different unique values like our "),t("code",[e._v("day_of_week")]),e._v(" and "),t("code",[e._v("hours")]),e._v(" could be trained better/faster by being converted in one hot vector. For example "),t("code",[e._v("day_of_week=6")]),e._v(" (Sunday) is converted in a vector "),t("code",[e._v("['0', '0', '0', '0', '0', '0', '1']")]),e._v(" while "),t("code",[e._v("day_of_week=5")]),e._v(" (Saturday) is converted in the vector "),t("code",[e._v("['0', '0', '0', '0', '0', '1', '0']")])])])]),e._v(" "),t("h4",{attrs:{id:"build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),t("div",{staticClass:"language-python extra-class"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[e._v("all_features "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("concatenate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("encoded_features"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nx "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Dense"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" activation"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"relu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("all_features"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nx "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Dense"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" activation"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"relu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\noutput "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("layers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Dense"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" activation"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("clip"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nmodel "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("keras"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Model"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("all_inputs"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" output"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\noptimizer "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" tf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("optimizers"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Adam"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("learning_rate"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.01")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nmodel"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token builtin"}},[e._v("compile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("loss"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'mse'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n optimizer"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("optimizer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n metrics"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'mae'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'mse'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-model.png",alt:"model graph"}})]),e._v(" "),t("p",[e._v("The model is fed with the "),t("code",[e._v("encoded_features")]),e._v(" coming from the processing phase, then there are 2 layers with 64 neurons each followed by one neuron giving the "),t("code",[e._v("fee_rate")]),e._v(" as output.")]),e._v(" "),t("p",[e._v("With this configurations the model has:")]),e._v(" "),t("ul",[t("li",[e._v("Total params: "),t("code",[e._v("7,412")])]),e._v(" "),t("li",[e._v("Trainable params: "),t("code",[e._v("7,361")])]),e._v(" "),t("li",[e._v("Non-trainable params: "),t("code",[e._v("51")])])]),e._v(" "),t("p",[e._v("Non-trainable params comes from the normalization layer and are computed in the pre-processing phase (it contains, for example, the mean of a series). Trainable parameters are values initialized randomly and changed during the training phase. The trainable parameters are "),t("code",[e._v("7,361")]),e._v(", this number comes from the following, every neuron has an associated bias and a weight for every element in the inputs, thus:")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("48")]),e._v(" input_values_weights + "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" bias"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" * "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),e._v(" first_layer_neurons"),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 number"}},[e._v("64")]),e._v(" input_values_weights + "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" bias"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" * "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),e._v(" second layer neurons"),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 number"}},[e._v("64")]),e._v(" input values weights + "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" bias"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("49")]),e._v("*64+65*64+65 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("7361")]),e._v("\n")])])]),t("p",[e._v("Honestly, neural network parameters are mostly the one taken from this tensorflow "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/regression",target:"_blank",rel:"noopener noreferrer"}},[e._v("example"),t("OutboundLink")],1),e._v(", we even tried to "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/keras_tuner",target:"_blank",rel:"noopener noreferrer"}},[e._v("tune hyperparameters"),t("OutboundLink")],1),e._v(", however, we decided to follow this "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#demonstrate_overfitting",target:"_blank",rel:"noopener noreferrer"}},[e._v("advice"),t("OutboundLink")],1),e._v(": "),t("em",[e._v('"The simplest way to prevent overfitting is to start with a small model:"')]),e._v(". We hope this work will attract other data scientists to this bitcoin problem, improving the model. We also think that a longer time for the data collection is needed to capture various situations.")]),e._v(" "),t("p",[e._v("A significant part of a ML model are the activation functions, "),t("code",[e._v("relu")]),e._v(" (Rectified Linear Unit) is one of the most used lately, because it's simple and works well as we learned in this "),t("a",{attrs:{href:"https://youtu.be/aircAruvnKk?t=1035",target:"_blank",rel:"noopener noreferrer"}},[e._v("introducing neural network video"),t("OutboundLink")],1),e._v(". "),t("code",[e._v("relu")]),e._v(" it's equal to zero for negative values and equal to the input for positive values. Being non-linear allows the whole model to be non-linear.")]),e._v(" "),t("p",[e._v("For the last layer it is different: we want to enforce a minimum for the output, which is the minimum relay fee "),t("code",[e._v("1.0")]),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn3",id:"fnref3"}},[e._v("[3]")])]),e._v(". One could not simply cut the output of the model after prediction because all the training would not consider this constraint. So we need to build a custom activation function that the model training will be able to use for the "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Gradient_descent#:~:text=Gradient%20descent%20is%20a%20first,the%20direction%20of%20steepest%20descent.",target:"_blank",rel:"noopener noreferrer"}},[e._v("gradient descent"),t("OutboundLink")],1),e._v(" optimization step. Luckily this is very simple using tensorflow primitives:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("def clip(x):\n min = tf.constant(1.0)\n return tf.where(tf.less(x, min), min, x)\n")])])]),t("p",[e._v("Another important part is the optimizer, when we first read the aforementioned "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/keras/regression",target:"_blank",rel:"noopener noreferrer"}},[e._v("example"),t("OutboundLink")],1),e._v(" the optimizer used was "),t("code",[e._v("RMSProp")]),e._v(" however the example updated lately and we noticed the optimizer changed in favor of "),t("code",[e._v("Adam")]),e._v(" which we read is the "),t("a",{attrs:{href:"https://towardsdatascience.com/adam-latest-trends-in-deep-learning-optimization-6be9a291375c",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest trend"),t("OutboundLink")],1),e._v(" in data science. We changed the model to use "),t("code",[e._v("Adam")]),e._v(" and effectively the training is faster with "),t("code",[e._v("Adam")]),e._v(" and even slightly lower error is achieved.\nAnother important parameter is the learning rate, which we set to "),t("code",[e._v("0.01")]),e._v(" after manual trials; however there might be space for improvements such as using "),t("a",{attrs:{href:"https://www.tensorflow.org/api_docs/python/tf/compat/v1/train/exponential_decay",target:"_blank",rel:"noopener noreferrer"}},[e._v("exponential decay"),t("OutboundLink")],1),e._v(", starting with an high learning rate and decreasing it through training epochs.")]),e._v(" "),t("p",[e._v('The last part of the model configuration is the loss function: the objective of the training is to find the minimum of this function. Usually for regression problem (the ones having a number as output, not a category) the most used is the Mean squared error (MSE). MSE is measured as the average of squared difference between predictions and actual observations, giving larger penalties to large difference because of the square. An interesting property is that the bigger the error the faster the changes is good at the beginning of the training, while slowing down when the model predicts better is desirable to avoid "jumping out" the local minimum.')]),e._v(" "),t("h4",{attrs:{id:"finally-the-model-training"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#finally-the-model-training"}},[e._v("#")]),e._v(" Finally, the model training")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("PATIENCE = 20\nMAX_EPOCHS = 200\n\ndef train():\n early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=PATIENCE)\n history = model.fit(train_ds, epochs=MAX_EPOCHS, validation_data=val_ds, verbose=1, callbacks=[early_stop])\n return history\n\nhistory = train()\n")])])]),t("p",[e._v("This steps is the core of the neural network, it takes a while, let's analyze the output:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("Epoch 1/200\n7559/7559 [==============================] - 34s 3ms/step - loss: 547.8023 - mae: 16.9547 - mse: 547.8023 - val_loss: 300.5965 - val_ma\ne: 11.9202 - val_mse: 300.5965\n...\nEpoch 158/200\n7559/7559 [==============================] - 31s 3ms/step - loss: 163.2548 - mae: 8.3126 - mse: 163.2548 - val_loss: 164.8296 - val_mae: 8.3402 - val_mse: 164.8296\n")])])]),t("p",[e._v("Training is done in epochs, under every epoch all the training data is iterated and model parameters updated to minimize the loss function.")]),e._v(" "),t("p",[e._v("The number "),t("code",[e._v("7559")]),e._v(" represent the number of steps. Theoretically the whole training data should be processed at once and parameters updated accordingly, however in practice this is infeasible for example for memory resource, thus the training happens in batch. In our case we have "),t("code",[e._v("1,934,999")]),e._v(" observations in the training set and our batch size is "),t("code",[e._v("256")]),e._v(", thus we have "),t("code",[e._v("1,437,841/256=7,558.58")]),e._v(" which by excess result in "),t("code",[e._v("7559")]),e._v(" steps.")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("~31s")]),e._v(" is the time it takes to process the epoch on a threadripper CPU but GPU or TPU could do better.")]),e._v(" "),t("p",[e._v("The value "),t("code",[e._v("loss")]),e._v(" is the MSE on the training data while "),t("code",[e._v("val_loss")]),e._v(" is the MSE value on the validation data. As far as we understand the separated validation data helps to detect the machine learning enemy, overfitting. Because in case of overfitting the value "),t("code",[e._v("loss")]),e._v(" continue to improve (almost indefinitely) while "),t("code",[e._v("val_loss")]),e._v(" start improving with the loss but a certain point diverge, indicating the network is memorizing the training data to improve "),t("code",[e._v("loss")]),e._v(" but in doing so losing generalizing capabilities.")]),e._v(" "),t("p",[e._v("Our model doesn't look to suffer overfitting cause "),t("code",[e._v("loss")]),e._v(" and "),t("code",[e._v("val_loss")]),e._v(" doesn't diverge during training")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-train-history.png",alt:"train history"}})]),e._v(" "),t("p",[e._v("While we told the training to do 200 epochs, the training stopped at 158 because we added an "),t("code",[e._v("early_stop")]),e._v(" call back with "),t("code",[e._v("20")]),e._v(" as "),t("code",[e._v("PATIENCE")]),e._v(", meaning that after 20 epoch and no improvement in "),t("code",[e._v("val_loss")]),e._v(" the training is halted, saving time and potentially avoiding overfitting.")]),e._v(" "),t("h2",{attrs:{id:"the-prediction-phase"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-prediction-phase"}},[e._v("#")]),e._v(" The prediction phase")]),e._v(" "),t("p",[e._v("A "),t("a",{attrs:{href:"https://github.com/RCasatta/estimate_ml_fee",target:"_blank",rel:"noopener noreferrer"}},[e._v("prediction test tool"),t("OutboundLink")],1),e._v(" is available on github. At the moment it uses a bitcoin core node to provide network data for simplicity, but it queries it only for the mempool and the last 6 blocks, so it's something that also a light-client could do"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn4",id:"fnref4"}},[e._v("[4]")])]),e._v(".")]),e._v(" "),t("p",[e._v("The following chart is probably the best visualization to evaluate the model, on the x axis there is the real fee rate while on the y axis there is the prediction, the more the points are centered on the bisection, the more the model is good.\nWe can see the model is doing quite well, the MAE is 8 which is way lower than "),t("code",[e._v("estimatesmartfee")]),e._v(". However, there are big errors some times, in particular for prediction for fast confirmation ("),t("code",[e._v("confirms_in=1 or confirms_in=2")]),e._v(") as shown by the orange points. Creating a model only for blocks target greater than 2 instead of simply remove some observations may be an option.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-true-and-predictions.png",alt:"prediction results"}})]),e._v(" "),t("p",[e._v("The following chart is instead a distribution of the errors, which for good model should resemble the normal distribution centered in 0, and it loooks like the model is respecting that.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/20210125-091313-error-distribution.png",alt:"error distribution"}})]),e._v(" "),t("h2",{attrs:{id:"conclusion-and-future-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion-and-future-development"}},[e._v("#")]),e._v(" Conclusion and future development")]),e._v(" "),t("p",[e._v("The results have shown deep neural network are a tool capable of good bitcoin transaction fee estimations; this suggests that further ML research in this area might be promising.")]),e._v(" "),t("p",[e._v("This is just a starting point, there are many future improvements such as:")]),e._v(" "),t("ul",[t("li",[e._v("Build a separate model with full knowledge, thus for full, always-connected nodes could be interesting and improve network resource allocation with respect to current estimators.")]),e._v(" "),t("li",[e._v("Tensorflow is a huge dependency, and since it contains all the feature to build and train a model, most of the feature are not needed in the prediction phase. In fact tensorflow lite exists which is specifically created for embedded and mobile devices; the "),t("a",{attrs:{href:"https://github.com/RCasatta/estimate_ml_fee",target:"_blank",rel:"noopener noreferrer"}},[e._v("prediction test tool"),t("OutboundLink")],1),e._v(" and the final integration in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" should use it.")]),e._v(" "),t("li",[e._v("Explore other fields to improve model predictions such as:\n"),t("ul",[t("li",[e._v("A bucket array of the transactions in the last 6 blocks with known fee rates. This should in particular help estimations with almost empty mempool.")]),e._v(" "),t("li",[e._v("Transaction weight")]),e._v(" "),t("li",[e._v("Time from last block")])])]),e._v(" "),t("li",[e._v("Some fields are very important and could benefit from pre-processing expansion, for instance applying "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/structured_data/feature_columns#hashed_feature_columns",target:"_blank",rel:"noopener noreferrer"}},[e._v("hashed feature columns"),t("OutboundLink")],1),e._v(" to "),t("code",[e._v("confirms_in")]),e._v(".")]),e._v(" "),t("li",[e._v("Bitcoin logger could be improved by a merge command to unify raw logs files, reducing redundancy and consequently disk occupation.")]),e._v(" "),t("li",[e._v("The dataset could be created in multiple files to allow more parallelism and use less memory during training.")]),e._v(" "),t("li",[e._v("Saving the dataset in "),t("a",{attrs:{href:"https://www.tensorflow.org/tutorials/load_data/tfrecord",target:"_blank",rel:"noopener noreferrer"}},[e._v("TFRecord format"),t("OutboundLink")],1),e._v(" instead of CSV")]),e._v(" "),t("li",[e._v("At the moment we are training the model on a threadripper CPU, training the code on GPU or even TPU will be needed to decrease training time, especially because input data will grow.")]),e._v(" "),t("li",[e._v("The "),t("a",{attrs:{href:"https://github.com/RCasatta/estimate_ml_fee",target:"_blank",rel:"noopener noreferrer"}},[e._v("prediction test tool"),t("OutboundLink")],1),e._v(" should estimate only using the p2p bitcoin network, without requiring a node. This work would be propedeutic for "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" integration")]),e._v(" "),t("li",[e._v("At the moment mempool buckets are multiple inputs "),t("code",[e._v("a*")]),e._v(" as show in the model graph; since they are related, is it possible to merge them in one TensorArray?")]),e._v(" "),t("li",[e._v("Sometimes the model does not learn and "),t("a",{attrs:{href:"https://github.com/RCasatta/bitcoin_logger/blob/master/notes.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("gets stuck"),t("OutboundLink")],1),e._v(". The reason is the "),t("code",[e._v("clip")]),e._v(" function applied in the last layer is constant for a value lower than 1. In this case, the derivative is 0 and the gradient descent doesn't know where to go. Instead of using the "),t("code",[e._v("clip")]),e._v(" function apply penalties to the loss function for values lower than 1.")]),e._v(" "),t("li",[e._v("There are issues regarding dead neurons (going to 0) or neurons with big weight, weight results should be monitored for this events, and also weight decay and L2 regularization should be explored.")]),e._v(" "),t("li",[e._v("Tune hyper-parameters technique should be re-tested.")]),e._v(" "),t("li",[e._v("Predictions should be monotonic decreasing for growing "),t("code",[e._v("confirms_in")]),e._v(" parameter; for obvious reason it doesn't make sense that an higher fee rate will result in a higher confirmation time. But since this is not enforced anywhere in the model, at the moment this could happen.")]),e._v(" "),t("li",[e._v("Since nodes with bloom filter disabled doesn't serve the mempool anymore, a model based only on last blocks should be evaluated.")])]),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("Thanks to "),t("a",{attrs:{href:"https://squarecrypto.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Square crypto"),t("OutboundLink")],1),e._v(" for sponsoring this work and thanks to the reviewers: "),t("a",{attrs:{href:"https://twitter.com/LeoComandini",target:"_blank",rel:"noopener noreferrer"}},[e._v("Leonardo Comandini"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://twitter.com/domegabri",target:"_blank",rel:"noopener noreferrer"}},[e._v("Domenico Gabriele"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://twitter.com/afilini",target:"_blank",rel:"noopener noreferrer"}},[e._v("Alekos Filini"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://twitter.com/Ferdinando1970",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ferdinando Ametrano"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("And also this tweet that remembered me "),t("a",{attrs:{href:"https://twitter.com/RCasatta",target:"_blank",rel:"noopener noreferrer"}},[e._v("I"),t("OutboundLink")],1),e._v(" had this work in my TODO list")]),e._v(" "),t("blockquote",{staticClass:"twitter-tweet"},[t("p",{attrs:{lang:"en",dir:"ltr"}},[e._v("I don't understand Machine Learning(ML), but is it horrible to use ML to predict bitcoin fees? "),t("br"),t("br"),e._v('I have heard tales of this "Deep Learning" thing where you throw a bunch of data at it and it gives you good results with high accuracy.')]),e._v("— sanket1729 (@sanket1729) "),t("a",{attrs:{href:"https://twitter.com/sanket1729/status/1336624662365822977?ref_src=twsrc%5Etfw"}},[e._v("December 9, 2020")])]),e._v(" "),t("script",{attrs:{async:"",src:"https://platform.twitter.com/widgets.js",charset:"utf-8"}}),e._v(" "),t("p",[e._v("This is the final part of the series. 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 and in "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"}},[e._v("Part 2")]),e._v(" we talked 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("MAE is Mean Absolute Error, which is the average of the series built by the absolute difference between the real value and the estimation. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn2"}},[t("p",[e._v("drift like MAE, but without the absolute value "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref2"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn3"}},[t("p",[e._v("Most node won't relay transactions with fee lower than the min relay fee, which has a default of "),t("code",[e._v("1.0")]),e._v(" "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref3"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn4"}},[t("p",[e._v("An important issue emerged after the article came out, a bitcoin core client with bloom filter disabled (default as of 0.21) doesn't serve the mempool via p2p. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref4"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/62.11c91afd.js b/assets/js/62.fa08b0a4.js similarity index 99% rename from assets/js/62.11c91afd.js rename to assets/js/62.fa08b0a4.js index 122d7c8373..d841fc9123 100644 --- a/assets/js/62.11c91afd.js +++ b/assets/js/62.fa08b0a4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{418:function(e,t,s){"use strict";s.r(t);var n=s(7),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This is the first of a two-parts blog series in which I will try to explain all the changes that I made to BDK (and some of its dependencies) to make our "),t("a",{attrs:{href:"https://twitter.com/afilini/status/1459763243556163584",target:"_blank",rel:"noopener noreferrer"}},[e._v("first Taproot transaction in mainnet"),t("OutboundLink")],1),e._v(", which also\nturned out to be "),t("a",{attrs:{href:"https://twitter.com/afilini/status/1459774394054725634",target:"_blank",rel:"noopener noreferrer"}},[e._v("the first ever use of the new "),t("code",[e._v("OP_CHECKSIGADD")]),e._v(" opcode"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Hopefully this will give an insight into what kind of changes need to be made to a wallet in order to support spending "),t("code",[e._v("P2TR")]),e._v(" outputs, both with key-spend and script-spend. BDK actually delegates\nmost of the hard work to "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(", and luckily most of the Taproot code was already implemented by the time I started working on it. I only had to patch a few little bugs here and there, and it ended up\nworking flawlessly in the end.")]),e._v(" "),t("p",[e._v("In this first part I will focus on the changes made to our dependencies, "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(". In the second part I will talk about BDK itself.")]),e._v(" "),t("h2",{attrs:{id:"backstory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backstory"}},[e._v("#")]),e._v(" Backstory")]),e._v(" "),t("p",[e._v("On the evening of Thursday, November 11th I was attending our weekly "),t("a",{attrs:{href:"https://www.satoshispritz.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Satoshi Spritz"),t("OutboundLink")],1),e._v(" meetup in Milan. The activation of Taproot was right around the corner, and naturally that was the main discussion\ntopic that night. The activation was forecasted for the early afternoon of Sunday, November 14th, a little less than 72h later.")]),e._v(" "),t("p",[e._v("I began to wonder how hard it would be to patch BDK and add support for Taproot. I knew most of the work had already been done in our main dependencies, "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(", and so I decided\nto challenge myself: could I make it in time for the activation?")]),e._v(" "),t("p",[e._v('The following day I started digging into the topic. It didn\'t help that up until that time I only had a rather "high level" idea of how Taproot worked, but luckily all the BIPs were very well written and\nstraightforward to understand.')]),e._v(" "),t("p",[e._v("By Friday night (or rather, early Saturday morning) "),t("a",{attrs:{href:"https://mempool.space/signet/tx/ba0ebb350717701ca4ea109aadfbaf3058f6cd73e5ece3927ddee653de06cf5a",target:"_blank",rel:"noopener noreferrer"}},[e._v("I had Taproot key-spend working"),t("OutboundLink")],1),e._v(", which made me pretty optimistic even though the activation date was actually moving closer, now being forecasted for\nSunday "),t("em",[e._v("morning")]),e._v(".")]),e._v(" "),t("p",[e._v("After a few hours of sleep I went back to work and by early Saturday afternoon "),t("a",{attrs:{href:"https://mempool.space/signet/tx/41d7d49f9f4edffa9ca88ad6fb887fbf1ae68f9f31def267fdb3a5949f766bf5",target:"_blank",rel:"noopener noreferrer"}},[e._v("I had Taproot script-spend working as well"),t("OutboundLink")],1),e._v(". This left me a few hours to coordinate with some friends and "),t("a",{attrs:{href:"https://mempool.space/address/1Taproote7gvQGKz5g982ecSbPvqJhMUf",target:"_blank",rel:"noopener noreferrer"}},[e._v("generate a vanity address"),t("OutboundLink")],1),e._v("\nto deposit funds into temporarily, as we didn't trust sending them to Taproot addresses before the activation (as they were anyone-can-spend according to the pre-activation rules).")]),e._v(" "),t("p",[e._v("After another pretty short night, I woke up a 5:30 AM on Sunday to monitor the activation. I broadcasted our transactions shortly after 6:00 AM as the activation block was being mined. Unfortunately, the first\nthree blocks that were enforcing Taproot rules "),t("a",{attrs:{href:"https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-November/019598.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("didn't include any Taproot transaction"),t("OutboundLink")],1),e._v(", which indicates that the miners weren't actually running the new Bitcoin Core 22.0 nodes. The fourth block, mined by "),t("code",[e._v("Foundry USA")]),e._v(" "),t("a",{attrs:{href:"https://mempool.space/tx/2eb8dbaa346d4be4e82fe444c2f0be00654d8cfd8c4a9a61b11aeaab8c00b272",target:"_blank",rel:"noopener noreferrer"}},[e._v("included my transaction"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://twitter.com/achow101/status/1459760452775387136?s=20",target:"_blank",rel:"noopener noreferrer"}},[e._v("a few others"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In the end our transaction was the third Taproot script-spend in the block, but the first to use the new "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki#script-execution",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("OP_CHECKSIGADD")]),t("OutboundLink")],1),e._v(" opcode, as the two preceding it were respectively "),t("a",{attrs:{href:"https://mempool.space/tx/37777defed8717c581b4c0509329550e344bdc14ac38f71fc050096887e535c8",target:"_blank",rel:"noopener noreferrer"}},[e._v("a single-sig"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://mempool.space/tx/905ecdf95a84804b192f4dc221cfed4d77959b81ed66013a7e41a6e61e7ed530",target:"_blank",rel:"noopener noreferrer"}},[e._v("a 2-of-2 multisig"),t("OutboundLink")],1),e._v("\nscript, made with with two "),t("code",[e._v("OP_CHECKSIG(VERIFY)")]),e._v("s.")]),e._v(" "),t("p",[e._v("Now, with the context out of the way, we can begin talking about the code!")]),e._v(" "),t("h2",{attrs:{id:"rust-bitcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust-bitcoin"}},[e._v("#")]),e._v(" rust-bitcoin")]),e._v(" "),t("p",[e._v("The first dependency I had to update was "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(". Most of the taproot stuff were already merged in "),t("code",[e._v("master")]),e._v(" (altough they hadn't been released yet). One notable missing part was the support for "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0371.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP371")]),t("OutboundLink")],1),e._v(",\nwhich is an extension of "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP174")]),t("OutboundLink")],1),e._v(", aka the "),t("code",[e._v("Partially Signed Bitcoin Transaction")]),e._v(" BIP. This new BIP defines a few new fields that are required to properly handle Taproot transactions.")]),e._v(" "),t("p",[e._v("Luckily most of the work had already been done by "),t("a",{attrs:{href:"https://twitter.com/sanket1729",target:"_blank",rel:"noopener noreferrer"}},[e._v("sanket1729"),t("OutboundLink")],1),e._v(", so I forked his branch and made only few very minor changes, just to expose a structure that I will have to use later which in his code wasn't public.")]),e._v(" "),t("p",[e._v("You can find all the commits mentioned here in "),t("a",{attrs:{href:"https://github.com/afilini/rust-bitcoin/tree/taproot-testing",target:"_blank",rel:"noopener noreferrer"}},[e._v("my rust-bitcoin "),t("code",[e._v("taproot-testing")]),e._v(" branch"),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("$ git diff 187234f f830df9\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("diff --git a/src/lib.rs b/src/lib.rs\nindex 87d9c36..d5e5802 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("@@ -54,7 +54,6 @@")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_mut)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(dead_code)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_imports)]\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(missing_docs)]\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_must_use)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(broken_intra_doc_links)]\n")])]),e._v("\ndiff --git a/src/util/taproot.rs b/src/util/taproot.rs\nindex 674eeee..3d56cbc 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/util/taproot.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/util/taproot.rs")]),e._v("\n@@ -440,7 +440,7 @@ impl TaprootBuilder {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("// Internally used structure to represent the node information in taproot tree\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]\n')])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("pub(crate) struct NodeInfo {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("pub struct NodeInfo {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" /// Merkle Hash for this node\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub(crate) hash: sha256::Hash,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" /// information about leaves inside this node\n")])]),e._v("@@ -448,8 +448,12 @@ pub(crate) struct NodeInfo {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("}\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("impl NodeInfo {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn hash(&self) -> &sha256::Hash {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" &self.hash\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Create a new NodeInfo with omitted/hidden info\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn new_hidden(hash: sha256::Hash) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn new_hidden(hash: sha256::Hash) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Self {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" hash: hash,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" leaves: vec![],\n")])]),e._v("@@ -457,7 +461,7 @@ impl NodeInfo {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Create a new leaf with NodeInfo\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn new_leaf_with_ver(script: Script, ver: LeafVersion) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn new_leaf_with_ver(script: Script, ver: LeafVersion) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let leaf = LeafInfo::new(script, ver);\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Self {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" hash: leaf.hash(),\n")])]),e._v("@@ -466,7 +470,7 @@ impl NodeInfo {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Combine two NodeInfo's to create a new parent\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn combine(a: Self, b: Self) -> Result {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn combine(a: Self, b: Self) -> Result {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut all_leaves = Vec::with_capacity(a.leaves.len() + b.leaves.len());\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for mut a_leaf in a.leaves {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" a_leaf.merkle_branch.push(b.hash)?; // add hashing partner\n")])]),e._v("\n")])])]),t("p",[e._v("There isn't much to explain here: I disabled the "),t("code",[e._v("missing_docs")]),e._v(" lint so that the compiler wouldn't complain about the new public methods that aren't documented.\nThen, I added a getter for the "),t("code",[e._v("hash")]),e._v(" field of "),t("code",[e._v("NodeInfo")]),e._v(" and made the struct itself and a bunch of methods public.")]),e._v(" "),t("p",[e._v('We will use this structure later to recover the merkle root of a Taproot script tree, given one leaf and the other "hidden" branches.')]),e._v(" "),t("h2",{attrs:{id:"rust-miniscript"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust-miniscript"}},[e._v("#")]),e._v(" rust-miniscript")]),e._v(" "),t("p",[e._v("Moving on to "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(': once again, most of the work required to support Taproot had already been done, but this time I was working with very "early" prototype-like code, so I was prepared to\nmake some changes to the code to get it to work how I wanted.')]),e._v(" "),t("p",[e._v("Instead of showing one big diff I will talk about the commits individually, which I think will help making more clear what I was doing.")]),e._v(" "),t("p",[e._v("Once again, you can find all the commits referenced here in "),t("a",{attrs:{href:"https://github.com/afilini/rust-miniscript/tree/taproot",target:"_blank",rel:"noopener noreferrer"}},[e._v("my rust-miniscript "),t("code",[e._v("taproot")]),e._v(" branch"),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("$ git show 34cf15b\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 34cf15b3aac1d8c2693af1b9749b888f3f29e510\nAuthor: Alekos Filini \nDate: Fri Nov 12 12:06:35 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Fix TapTree iter depth\n")])]),e._v("\ndiff --git a/src/descriptor/tr.rs b/src/descriptor/tr.rs\nindex 79d3c05..314c7f4 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/tr.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/tr.rs")]),e._v("\n@@ -65,7 +65,7 @@ impl TapTree {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" /// Iterate over all miniscripts\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn iter(&self) -> TapTreeIter {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTreeIter { stack: vec![self] }\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTreeIter { stack: vec![(0, self)] }\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Helper function to translate keys\n")])]),e._v("@@ -262,7 +262,7 @@ pub struct TapTreeIter<'a, Pk: MiniscriptKey>\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("where\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Pk: 'a,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("{\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" stack: Vec<&'a TapTree>,\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" stack: Vec<(usize, &'a TapTree)>,\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("}\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("impl<'a, Pk> Iterator for TapTreeIter<'a, Pk>\n")])]),e._v("@@ -273,13 +273,13 @@ where\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn next(&mut self) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" while !self.stack.is_empty() {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let last = self.stack.pop().expect("Size checked above");\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let (depth, last) = self.stack.pop().expect("Size checked above");\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match &*last {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTree::Tree(l, r) => {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push(&r);\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push(&l);\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push((depth + 1, &r));\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push((depth + 1, &l));\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTree::Leaf(ref ms) => return Some((self.stack.len(), ms)),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTree::Leaf(ref ms) => return Some((depth, ms)),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" None\n")])])])])]),t("p",[t("code",[e._v("TapTreeIterator")]),e._v(" is an iterator that goes through a "),t("code",[e._v("TapTree")]),e._v(" and yields a "),t("code",[e._v("(depth, node)")]),e._v(" pair. This is then fed to "),t("a",{attrs:{href:"https://github.com/afilini/rust-miniscript/blob/taproot/src/descriptor/tr.rs#L183-L189",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("TaprootBuilder")]),t("OutboundLink")],1),e._v(", which returns an error if trying to insert nodes\nin "),t("a",{attrs:{href:"https://github.com/afilini/rust-bitcoin/blob/taproot-testing/src/util/taproot.rs#L403-L405",target:"_blank",rel:"noopener noreferrer"}},[e._v("an order that is not DFS"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("The way the depth was computed before made the builder always fail for non-trivial trees (i.e. more than 1 node).")]),e._v(" "),t("p",[e._v("Here I decided to play the safe card, and just keep track of the depth explicitly: I think there might be a way to compute the depth just knowing the "),t("code",[e._v("self.stack.len()")]),e._v(" (assuming the tree has a specific structure,\nwhich I'm not sure applies here), but anyway I didn't have much time to think about it and I just went for the \"dumb but idiot-proof\" way which ended up working fine.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show f4a3459\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit f4a3459128e37ca0c2701b8b6da064d4952296ff\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:15:52 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Switch rust-bitcoin rev\n")])]),e._v("\ndiff --git a/Cargo.toml b/Cargo.toml\nindex 12825e8..8240024 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/Cargo.toml")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/Cargo.toml")]),e._v('\n@@ -17,7 +17,7 @@ rand = ["bitcoin/rand"]\n\n'),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("[dependencies]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('# bitcoin = "0.27"\n')])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('bitcoin = {git = "https://github.com/sanket1729/rust-bitcoin", branch = "taproot_psbt"}\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('bitcoin = { git = "https://github.com/afilini/rust-bitcoin.git", branch = "taproot-testing" }\n')])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("[dependencies.serde]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('version = "1.0"\n')])])])])]),t("p",[e._v("Trivial commit, switch to "),t("a",{attrs:{href:"https://github.com/afilini/rust-bitcoin/tree/taproot-testing",target:"_blank",rel:"noopener noreferrer"}},[e._v("my fork of rust-bitcoin"),t("OutboundLink")],1),e._v(" so that I can make changes if necessary.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 0446b16\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 0446b1631cec9f7118d46f0f4c94ccd20de29f94\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:25:18 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Parse x-only keys\n")])]),e._v("\ndiff --git a/src/descriptor/key.rs b/src/descriptor/key.rs\nindex 4108d00..b7f90b5 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/key.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/key.rs")]),e._v("\n@@ -283,9 +283,9 @@ impl FromStr for DescriptorPublicKey {\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn from_str(s: &str) -> Result {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' // A "raw" public key without any origin is the least we accept.\n')])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if s.len() < 66 {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if s.len() < 64 {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" return Err(DescriptorKeyParseError(\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' "Key too short (<66 char), doesn\'t match any format",\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' "Key too short (<64 char), doesn\'t match any format",\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" ));\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n@@ -301,6 +301,14 @@ impl FromStr for DescriptorPublicKey {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" derivation_path,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" wildcard,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }))\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else if key_part.len() == 64 {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // x-only pubkey, prefix it with `02`\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let key = bitcoin::PublicKey::from_str(&format!("02{}", key_part))\n')]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' .map_err(|_| DescriptorKeyParseError("Error while parsing x-only public key"))?;\n')]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Ok(DescriptorPublicKey::SinglePub(DescriptorSinglePub {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" key,\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" origin,\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }))\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if key_part.len() >= 2\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' && !(&key_part[0..2] == "02" || &key_part[0..2] == "03" || &key_part[0..2] == "04")\n')])]),e._v("diff --git a/src/lib.rs b/src/lib.rs\nindex e168b16..3a2335e 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("@@ -95,8 +95,6 @@")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(non_snake_case)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_mut)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(dead_code)]\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_imports)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(missing_docs)]\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("pub extern crate bitcoin;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('#[cfg(feature = "serde")]\n')])])])])]),t("p",[e._v("This, I'm not really sure of: Taproot uses x-only public keys, which means that the first byte (which is usually a "),t("code",[e._v("03")]),e._v(" or a "),t("code",[e._v("02")]),e._v(") that indicates the parity of the EC point is completely dropped, and it's implicit\nthat the point is even (= "),t("code",[e._v("02")]),e._v("). Check out "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP340")]),t("OutboundLink")],1),e._v(" for a much better explanation.")]),e._v(" "),t("p",[e._v("So here when I find a string that is only 64 characters long I will assume it's an x-only pubkey, and I will parse it as a normal "),t("code",[e._v("bitcoin::PublicKey")]),e._v(" by prefixing it with "),t("code",[e._v("02")]),e._v(".")]),e._v(" "),t("p",[e._v("I guess one alternative could have been to try and parse it as a "),t("code",[e._v("schnorr::PublicKey")]),e._v(' and then "convert" it to a '),t("code",[e._v("ecdsa::PublicKey")]),e._v(" which should be supported, but once again I just wanted to get it done quickly and\nthis worked fine.")]),e._v(" "),t("p",[e._v("I also disabled the "),t("code",[e._v("unused_imports")]),e._v(" and "),t("code",[e._v("missing_docs")]),e._v(" lint so that the compiler wouldn't whine too much.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 87316ff\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 87316fffd06ab3bdf300fd1a958ddaa2789a6696\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:26:01 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Parse `tr()` descriptors\n")])]),e._v("\ndiff --git a/src/descriptor/mod.rs b/src/descriptor/mod.rs\nindex 06d98e1..4190786 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/mod.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/mod.rs")]),e._v("\n@@ -610,6 +610,7 @@ where\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("wpkh", 1) => Descriptor::Wpkh(Wpkh::from_tree(top)?),\n')]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("sh", 1) => Descriptor::Sh(Sh::from_tree(top)?),\n')]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("wsh", 1) => Descriptor::Wsh(Wsh::from_tree(top)?),\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("tr", _) => Descriptor::Tr(Tr::from_tree(top)?),\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => Descriptor::Bare(Bare::from_tree(top)?),\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" })\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("diff --git a/src/expression.rs b/src/expression.rs\nindex 1cef614..11a68d3 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/expression.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/expression.rs")]),e._v("\n@@ -100,7 +100,12 @@ impl<'a> Tree<'a> {\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" sl = &sl[n + 1..];\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" loop {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let (arg, new_sl) = Tree::from_slice_helper_round(sl, depth + 1)?;\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let (arg, new_sl) = if sl.contains('{') {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Tree::from_slice_helper_curly(sl, depth + 1)?\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Tree::from_slice_helper_round(sl, depth + 1)?\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" };\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" ret.args.push(arg);\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if new_sl.is_empty() {\n")])])])])]),t("p",[e._v("When trying to parse a descriptor (essentially turning a recursive string of "),t("code",[e._v("operator(args)")]),e._v(" into an abstract tree in memory) use a "),t("em",[e._v("curly-bracket-aware")]),e._v(" parser if there is one in the string.")]),e._v(" "),t("p",[e._v("The code to then build a "),t("code",[e._v("Tr")]),e._v(" struct given an "),t("code",[e._v("expression::Tree")]),e._v(" (and the "),t("code",[e._v("from_slice_helper_curly")]),e._v(" function) were already implemented, so it was just a matter of correctly\nbuilding the abstract tree by parsing curly brackets in descriptors.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 3055cab\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 3055cabef8bd51eda344ce501b03c533fd367b4f\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:26:30 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Fix control block creation when satisfying `Tr`\n")])]),e._v("\ndiff --git a/src/descriptor/tr.rs b/src/descriptor/tr.rs\nindex 314c7f4..8487d56 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/tr.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/tr.rs")]),e._v("\n@@ -571,17 +571,14 @@ impl DescriptorTrait for Tr {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let ver = LeafVersion::default();\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let leaf_script = (ms.encode(), ver);\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let control_block_set = spend_info\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .as_script_map()\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .get(&leaf_script)\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' .expect("Control block must exist in script map for every known leaf");\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // let control_block_set = spend_info\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // .as_script_map()\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // .get(&leaf_script)\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' // .expect("Control block must exist in script map for every known leaf");\n')]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let control_block = spend_info.control_block(&leaf_script).expect("Control block must exist in script map for every known leaf");\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" wit.push(leaf_script.0.into_bytes()); // Push the leaf script\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // There can be multiple control blocks for a (script, ver) pair\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Find the smallest one amongst those\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let control_block = control_block_set\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .iter()\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .min_by(|x, y| x.as_inner().len().cmp(&y.as_inner().len()))\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' .expect("Atleast one control must exist for a known leaf");\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" wit.push(control_block.serialize());\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Finally, save the minimum\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" min_wit = Some(wit);\n")])]),e._v("\n")])])]),t("p",[e._v("This is where things get more interesting: this section of code builds the witness to satisfy a Taproot descriptor. In case of a script-spend, we need to prove that the script we are using had been committed\ninto the public key of our "),t("code",[e._v("P2TR")]),e._v(' input. We do this by adding a "control block", that contains data about the parity of the key, the leaf version used, and the merkle path from the leaf we are using to spend\nup to the merkle root, which is committed into the public key. Once again, this is explained very well in '),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP341")]),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Before my patch the code was only getting the set of merkle paths that could lead from the root to the leaves that contain a given script. For context, the signature of "),t("code",[e._v("TaprootSpendInfo::as_script_map(&self)")]),e._v(" is:")]),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("/// Access the internal script map")]),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("as_script_map")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),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 operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("BTreeMap")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[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 class-name"}},[e._v("LeafVersion")]),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 class-name"}},[e._v("BTreeSet")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("TaprootMerkleBranch")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),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("p",[e._v('Then the code would look for the "shortest" path to that specific script, as it would save size in the final transaction (leaves that are more "deep" in the tree than others naturally have more hidden branches\nin their path to the root, and thus require a longer control block to reveal them all).')]),e._v(" "),t("p",[e._v("The issue here is that the "),t("code",[e._v("control_block")]),e._v(" variable is then serialized directly into the witness. But this is not a control block, it's just a set of merkle paths! A control block only has "),t("em",[e._v("one")]),e._v(" merkle path, and\nincludes the leaf version and the key parity bit.")]),e._v(" "),t("p",[e._v("Conveniently, the "),t("code",[e._v("TaprootSpendInfo")]),e._v(' struct also has this other method (I\'m including the implementation as well, because it shows that internally it does the same "trick" to find the shortest path):')]),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("/// Obtain a [`ControlBlock`] for particular script with the given version.")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Returns [`None`] if the script is not contained in the [`TaprootSpendInfo`]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// If there are multiple ControlBlocks possible, this returns the shortest one.")]),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("control_block")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" script_ver"),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 punctuation"}},[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 class-name"}},[e._v("LeafVersion")]),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 punctuation"}},[e._v("->")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Option")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("ControlBlock")]),t("span",{pre:!0,attrs:{class:"token operator"}},[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(" merkle_branch_set "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("script_map"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("script_ver"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),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("// Choose the smallest one amongst the multiple script maps")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" smallest "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" merkle_branch_set\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("iter")]),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(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("min_by")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token closure-params"}},[t("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[e._v("|")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" y"),t("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[e._v("|")])]),e._v(" x"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v(".0")]),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(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cmp")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),e._v("y"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v(".0")]),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(")")]),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(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("expect")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Non-empty iterator"')]),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("Some")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("ControlBlock")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n internal_key"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("internal_key"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n output_key_parity"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("output_key_parity"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n leaf_version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("LeafVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("default")]),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 merkle_branch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" smallest"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("clone")]),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 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("So to fix this code we just have to use that method instead, and we can get it done in one single line!")]),e._v(" "),t("p",[e._v('Instead of removing the old code at the time I only commented it out, because I initially thought I would still have to look for the shortest script myself, and I figured the "sorting" code would come in handy\nlater on.')]),e._v(" "),t("p",[e._v("Also, if you are an acute observer, you might have noticed that there's a bug in this last snippet of code. Feel free to think about it a little bit, then check out the "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin/pull/703",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR"),t("OutboundLink")],1),e._v(" I made\nif you wanna know the answer!")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("git show 35378ad\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 35378ad01a6f2b8161a3f36448b24d031f8aeaec\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:27:14 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Consider key-spend max satisfaction weight\n")])]),e._v("\ndiff --git a/src/descriptor/tr.rs b/src/descriptor/tr.rs\nindex 8487d56..fabf860 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/tr.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/tr.rs")]),e._v("\n@@ -593,7 +593,7 @@ impl DescriptorTrait for Tr {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn max_satisfaction_weight(&self) -> Result {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut max_wieght = None;\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut max_wieght = Some(65);\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for (depth, ms) in self.iter_scripts() {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let script_size = ms.script_size();\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let max_sat_elems = match ms.max_satisfaction_witness_elements() {\n")])])])])]),t("p",[e._v("This is a little bug in the code that tries to compute what the maximum satisfaction weight would be for a descriptor. For instance, we use this in BDK to compute how many extra sats of fees we need to pay\nin order to target a given fee rate, assuming the descriptor is satisfied with the worst (larger and most expensive) path.")]),e._v(" "),t("p",[e._v("For Taproot descriptors, it's just a matter of iterating over the leaves in the tree and pick the most expensive one... or is it? This doesn't take into account that Taproot outputs can also be spent with\nkey-spend, which means just pushing a signature to the witness. This signature is 64 bytes long when using the new "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("SIGHASH_DEFAULT")]),t("OutboundLink")],1),e._v(" sighash, or 65 otherwise. Since we are thinking about the maximum satisfaction\nweight, or the worst case possible, we naturally pick the latter.")]),e._v(" "),t("p",[e._v("Note that theoretically you could build a Taproot address \"without\" an available key-path spend (by using an unspendable Schnorr public key), but the code here in rust-miniscript doesn't take that into\naccount, as there's no way that I'm aware of to specificy in a "),t("code",[e._v("tr()")]),e._v(" descriptor that the key is unspendable. So, while theoretically here we should first check whether the key-spend path is available before\naccounting for its weight, in practice this is always true in miniscript so we just use that as our starting worst case and update it later if necessary while iterating the tree leaves.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show b4878f8\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit b4878f816e9ede11d5ed947c06e03aa988e3e26f\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:27:53 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Look for taproot stuff in psbts\n")])]),e._v("\ndiff --git a/src/psbt/mod.rs b/src/psbt/mod.rs\nindex 9a8b17d..42c6ce8 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/psbt/mod.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/psbt/mod.rs")]),e._v("\n@@ -25,13 +25,14 @@ use bitcoin;\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d};\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::secp256k1::{self, Secp256k1};\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::util::taproot::TapLeafHash;\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::Script;\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use interpreter;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use miniscript::limits::SEQUENCE_LOCKTIME_DISABLE_FLAG;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use miniscript::satisfy::{After, Older};\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use Satisfier;\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use {BitcoinECSig, Preimage32};\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use {BitcoinECSig, BitcoinSchnorrSig, Preimage32};\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use {MiniscriptKey, ToPublicKey};\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("mod finalizer;\n")])]),e._v("@@ -231,6 +232,24 @@ impl<'psbt> PsbtInputSatisfier<'psbt> {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("}\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("impl<'psbt, Pk: MiniscriptKey + ToPublicKey> Satisfier for PsbtInputSatisfier<'psbt> {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn lookup_tap_key_spend_sig(&self) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if let Some((sig, hash_ty)) = self.psbt.inputs[self.index].tap_key_sig {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Some(BitcoinSchnorrSig { sig, hash_ty })\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" None\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn lookup_tap_leaf_script_sig(&self, pk: &Pk, lh: &TapLeafHash) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let pk = pk.to_x_only_pubkey();\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if let Some((sig, hash_ty)) = self.psbt.inputs[self.index].tap_script_sigs.get(&(pk, *lh)) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Some(BitcoinSchnorrSig { sig: *sig, hash_ty: *hash_ty })\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" None\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn lookup_ec_sig(&self, pk: &Pk) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if let Some(rawsig) = self.psbt.inputs[self.index]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .partial_sigs\n")])])])])]),t("p",[e._v("This commit implements the Taproot-specific "),t("code",[e._v("Satisfier")]),e._v(" methods on "),t("code",[e._v("PsbtInputSatisfier")]),e._v(". The code to produce a valid witness (i.e. "),t("em",[e._v("satisfy")]),e._v(") a descriptor by looking for Taproot key-spend or script-spend signatures\nis already implemented, so it's just a matter of actually returning those, if they are present in a PSBT.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 80da0ba\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 80da0ba9b742b2dee23e7302e2f95a6e96b1d6ed\nAuthor: Alekos Filini \nDate: Sat Nov 13 16:54:27 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Iter keys in `MultiA`\n")])]),e._v("\ndiff --git a/src/miniscript/iter.rs b/src/miniscript/iter.rs\nindex 36c4b69..a54a371 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/miniscript/iter.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/miniscript/iter.rs")]),e._v("\n@@ -121,7 +121,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn get_leaf_pk(&self) -> Vec {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match self.node {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkK(ref key) => vec![key.clone()],\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) => keys.clone(),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys.clone(),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => vec![],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -139,7 +139,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match self.node {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkH(ref hash) => vec![hash.clone()],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkK(ref key) => vec![key.to_pubkeyhash()],\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) => keys.iter().map(Pk::to_pubkeyhash).collect(),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys.iter().map(Pk::to_pubkeyhash).collect(),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => vec![],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -155,7 +155,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match self.node {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkH(ref hash) => vec![PkPkh::HashedPubkey(hash.clone())],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkK(ref key) => vec![PkPkh::PlainPubkey(key.clone())],\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) => keys\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .into_iter()\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .map(|key| PkPkh::PlainPubkey(key.clone()))\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .collect(),\n")])]),e._v("@@ -170,7 +170,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn get_nth_pk(&self, n: usize) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match (&self.node, n) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkK(ref key), 0) => Some(key.clone()),\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) => keys.get(n).cloned(),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) | (&Terminal::MultiA(_, ref keys), _) => keys.get(n).cloned(),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => None,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -186,7 +186,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match (&self.node, n) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkH(ref hash), 0) => Some(hash.clone()),\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkK(ref key), 0) => Some(key.to_pubkeyhash()),\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) => keys.get(n).map(Pk::to_pubkeyhash),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) | (&Terminal::MultiA(_, ref keys), _) => keys.get(n).map(Pk::to_pubkeyhash),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => None,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -199,7 +199,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match (&self.node, n) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkH(ref hash), 0) => Some(PkPkh::HashedPubkey(hash.clone())),\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkK(ref key), 0) => Some(PkPkh::PlainPubkey(key.clone())),\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) => {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) | (&Terminal::MultiA(_, ref keys), _) => {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" keys.get(n).map(|key| PkPkh::PlainPubkey(key.clone()))\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => None,\n")])])])])]),t("p",[e._v("Taproot descriptors add a new miniscript operator called "),t("code",[e._v("multi_a()")]),e._v(" which behaves like "),t("code",[e._v("multi()")]),e._v(" in non-Taproot descriptors, but uses the new "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki#script-execution",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("OP_CHECKSIGADD")]),t("OutboundLink")],1),e._v(" opcode when serialized in a script.")]),e._v(" "),t("p",[e._v("When this was added, somebody forgot to update the various methods that iterate over the public keys of a descriptor to correctly return the keys contained in "),t("code",[e._v("multi_a()")]),e._v(" - essentially, it was falling back in\nthe default case used by the operators that don't contain any key, but this one does!")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 8b108c5\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 8b108c5c0bf50b66b7220746525742b71f6cd4b4\nAuthor: Alekos Filini \nDate: Sat Nov 13 17:26:53 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Fix witness generation for `MultiA`\n")])]),e._v("\ndiff --git a/src/miniscript/satisfy.rs b/src/miniscript/satisfy.rs\nindex 655436e..ab43707 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/miniscript/satisfy.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/miniscript/satisfy.rs")]),e._v("\n@@ -1264,7 +1264,7 @@ impl Satisfaction {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Collect all available signatures\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut sig_count = 0;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut sigs = vec![vec![vec![]]; keys.len()];\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for (i, pk) in keys.iter().enumerate() {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for (i, pk) in keys.iter().rev().enumerate() {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match Witness::signature::<_, _, Ctx>(stfr, pk, leaf_hash) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Witness::Stack(sig) => {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" sigs[i] = sig;\n")])])])])]),t("p",[e._v("And finally, the last little fix: the "),t("code",[e._v("multi_a()")]),e._v(" operator is satisfied by pushing to the witness either a signature (if you have one available for that specific public key) or an empty vector. The problem is,\nthey have to be in the right order to match the order of public keys in your Taproot script.")]),e._v(" "),t("p",[e._v("rust-miniscript was pushing them in reverse order, so script validation was always failing for multisigs that had more than 1 key. Adding a "),t("code",[e._v(".rev()")]),e._v(" to the iterator fixed the issue.")]),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("And that was it! We now have a fully working "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(" ready for Taproot.")]),e._v(" "),t("p",[e._v("In "),t("a",{attrs:{href:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2"}},[e._v("Part 2")]),e._v(" I will go over the code changes in BDK, but I think it's now time for you and I to take a break 😃")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{419:function(e,t,s){"use strict";s.r(t);var n=s(7),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This is the first of a two-parts blog series in which I will try to explain all the changes that I made to BDK (and some of its dependencies) to make our "),t("a",{attrs:{href:"https://twitter.com/afilini/status/1459763243556163584",target:"_blank",rel:"noopener noreferrer"}},[e._v("first Taproot transaction in mainnet"),t("OutboundLink")],1),e._v(", which also\nturned out to be "),t("a",{attrs:{href:"https://twitter.com/afilini/status/1459774394054725634",target:"_blank",rel:"noopener noreferrer"}},[e._v("the first ever use of the new "),t("code",[e._v("OP_CHECKSIGADD")]),e._v(" opcode"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Hopefully this will give an insight into what kind of changes need to be made to a wallet in order to support spending "),t("code",[e._v("P2TR")]),e._v(" outputs, both with key-spend and script-spend. BDK actually delegates\nmost of the hard work to "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(", and luckily most of the Taproot code was already implemented by the time I started working on it. I only had to patch a few little bugs here and there, and it ended up\nworking flawlessly in the end.")]),e._v(" "),t("p",[e._v("In this first part I will focus on the changes made to our dependencies, "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(". In the second part I will talk about BDK itself.")]),e._v(" "),t("h2",{attrs:{id:"backstory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backstory"}},[e._v("#")]),e._v(" Backstory")]),e._v(" "),t("p",[e._v("On the evening of Thursday, November 11th I was attending our weekly "),t("a",{attrs:{href:"https://www.satoshispritz.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Satoshi Spritz"),t("OutboundLink")],1),e._v(" meetup in Milan. The activation of Taproot was right around the corner, and naturally that was the main discussion\ntopic that night. The activation was forecasted for the early afternoon of Sunday, November 14th, a little less than 72h later.")]),e._v(" "),t("p",[e._v("I began to wonder how hard it would be to patch BDK and add support for Taproot. I knew most of the work had already been done in our main dependencies, "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(", and so I decided\nto challenge myself: could I make it in time for the activation?")]),e._v(" "),t("p",[e._v('The following day I started digging into the topic. It didn\'t help that up until that time I only had a rather "high level" idea of how Taproot worked, but luckily all the BIPs were very well written and\nstraightforward to understand.')]),e._v(" "),t("p",[e._v("By Friday night (or rather, early Saturday morning) "),t("a",{attrs:{href:"https://mempool.space/signet/tx/ba0ebb350717701ca4ea109aadfbaf3058f6cd73e5ece3927ddee653de06cf5a",target:"_blank",rel:"noopener noreferrer"}},[e._v("I had Taproot key-spend working"),t("OutboundLink")],1),e._v(", which made me pretty optimistic even though the activation date was actually moving closer, now being forecasted for\nSunday "),t("em",[e._v("morning")]),e._v(".")]),e._v(" "),t("p",[e._v("After a few hours of sleep I went back to work and by early Saturday afternoon "),t("a",{attrs:{href:"https://mempool.space/signet/tx/41d7d49f9f4edffa9ca88ad6fb887fbf1ae68f9f31def267fdb3a5949f766bf5",target:"_blank",rel:"noopener noreferrer"}},[e._v("I had Taproot script-spend working as well"),t("OutboundLink")],1),e._v(". This left me a few hours to coordinate with some friends and "),t("a",{attrs:{href:"https://mempool.space/address/1Taproote7gvQGKz5g982ecSbPvqJhMUf",target:"_blank",rel:"noopener noreferrer"}},[e._v("generate a vanity address"),t("OutboundLink")],1),e._v("\nto deposit funds into temporarily, as we didn't trust sending them to Taproot addresses before the activation (as they were anyone-can-spend according to the pre-activation rules).")]),e._v(" "),t("p",[e._v("After another pretty short night, I woke up a 5:30 AM on Sunday to monitor the activation. I broadcasted our transactions shortly after 6:00 AM as the activation block was being mined. Unfortunately, the first\nthree blocks that were enforcing Taproot rules "),t("a",{attrs:{href:"https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-November/019598.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("didn't include any Taproot transaction"),t("OutboundLink")],1),e._v(", which indicates that the miners weren't actually running the new Bitcoin Core 22.0 nodes. The fourth block, mined by "),t("code",[e._v("Foundry USA")]),e._v(" "),t("a",{attrs:{href:"https://mempool.space/tx/2eb8dbaa346d4be4e82fe444c2f0be00654d8cfd8c4a9a61b11aeaab8c00b272",target:"_blank",rel:"noopener noreferrer"}},[e._v("included my transaction"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://twitter.com/achow101/status/1459760452775387136?s=20",target:"_blank",rel:"noopener noreferrer"}},[e._v("a few others"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In the end our transaction was the third Taproot script-spend in the block, but the first to use the new "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki#script-execution",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("OP_CHECKSIGADD")]),t("OutboundLink")],1),e._v(" opcode, as the two preceding it were respectively "),t("a",{attrs:{href:"https://mempool.space/tx/37777defed8717c581b4c0509329550e344bdc14ac38f71fc050096887e535c8",target:"_blank",rel:"noopener noreferrer"}},[e._v("a single-sig"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://mempool.space/tx/905ecdf95a84804b192f4dc221cfed4d77959b81ed66013a7e41a6e61e7ed530",target:"_blank",rel:"noopener noreferrer"}},[e._v("a 2-of-2 multisig"),t("OutboundLink")],1),e._v("\nscript, made with with two "),t("code",[e._v("OP_CHECKSIG(VERIFY)")]),e._v("s.")]),e._v(" "),t("p",[e._v("Now, with the context out of the way, we can begin talking about the code!")]),e._v(" "),t("h2",{attrs:{id:"rust-bitcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust-bitcoin"}},[e._v("#")]),e._v(" rust-bitcoin")]),e._v(" "),t("p",[e._v("The first dependency I had to update was "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(". Most of the taproot stuff were already merged in "),t("code",[e._v("master")]),e._v(" (altough they hadn't been released yet). One notable missing part was the support for "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0371.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP371")]),t("OutboundLink")],1),e._v(",\nwhich is an extension of "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP174")]),t("OutboundLink")],1),e._v(", aka the "),t("code",[e._v("Partially Signed Bitcoin Transaction")]),e._v(" BIP. This new BIP defines a few new fields that are required to properly handle Taproot transactions.")]),e._v(" "),t("p",[e._v("Luckily most of the work had already been done by "),t("a",{attrs:{href:"https://twitter.com/sanket1729",target:"_blank",rel:"noopener noreferrer"}},[e._v("sanket1729"),t("OutboundLink")],1),e._v(", so I forked his branch and made only few very minor changes, just to expose a structure that I will have to use later which in his code wasn't public.")]),e._v(" "),t("p",[e._v("You can find all the commits mentioned here in "),t("a",{attrs:{href:"https://github.com/afilini/rust-bitcoin/tree/taproot-testing",target:"_blank",rel:"noopener noreferrer"}},[e._v("my rust-bitcoin "),t("code",[e._v("taproot-testing")]),e._v(" branch"),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("$ git diff 187234f f830df9\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("diff --git a/src/lib.rs b/src/lib.rs\nindex 87d9c36..d5e5802 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("@@ -54,7 +54,6 @@")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_mut)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(dead_code)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_imports)]\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(missing_docs)]\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_must_use)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(broken_intra_doc_links)]\n")])]),e._v("\ndiff --git a/src/util/taproot.rs b/src/util/taproot.rs\nindex 674eeee..3d56cbc 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/util/taproot.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/util/taproot.rs")]),e._v("\n@@ -440,7 +440,7 @@ impl TaprootBuilder {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("// Internally used structure to represent the node information in taproot tree\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]\n')])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("pub(crate) struct NodeInfo {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("pub struct NodeInfo {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" /// Merkle Hash for this node\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub(crate) hash: sha256::Hash,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" /// information about leaves inside this node\n")])]),e._v("@@ -448,8 +448,12 @@ pub(crate) struct NodeInfo {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("}\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("impl NodeInfo {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn hash(&self) -> &sha256::Hash {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" &self.hash\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Create a new NodeInfo with omitted/hidden info\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn new_hidden(hash: sha256::Hash) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn new_hidden(hash: sha256::Hash) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Self {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" hash: hash,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" leaves: vec![],\n")])]),e._v("@@ -457,7 +461,7 @@ impl NodeInfo {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Create a new leaf with NodeInfo\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn new_leaf_with_ver(script: Script, ver: LeafVersion) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn new_leaf_with_ver(script: Script, ver: LeafVersion) -> Self {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let leaf = LeafInfo::new(script, ver);\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Self {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" hash: leaf.hash(),\n")])]),e._v("@@ -466,7 +470,7 @@ impl NodeInfo {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Combine two NodeInfo's to create a new parent\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn combine(a: Self, b: Self) -> Result {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn combine(a: Self, b: Self) -> Result {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut all_leaves = Vec::with_capacity(a.leaves.len() + b.leaves.len());\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for mut a_leaf in a.leaves {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" a_leaf.merkle_branch.push(b.hash)?; // add hashing partner\n")])]),e._v("\n")])])]),t("p",[e._v("There isn't much to explain here: I disabled the "),t("code",[e._v("missing_docs")]),e._v(" lint so that the compiler wouldn't complain about the new public methods that aren't documented.\nThen, I added a getter for the "),t("code",[e._v("hash")]),e._v(" field of "),t("code",[e._v("NodeInfo")]),e._v(" and made the struct itself and a bunch of methods public.")]),e._v(" "),t("p",[e._v('We will use this structure later to recover the merkle root of a Taproot script tree, given one leaf and the other "hidden" branches.')]),e._v(" "),t("h2",{attrs:{id:"rust-miniscript"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust-miniscript"}},[e._v("#")]),e._v(" rust-miniscript")]),e._v(" "),t("p",[e._v("Moving on to "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(': once again, most of the work required to support Taproot had already been done, but this time I was working with very "early" prototype-like code, so I was prepared to\nmake some changes to the code to get it to work how I wanted.')]),e._v(" "),t("p",[e._v("Instead of showing one big diff I will talk about the commits individually, which I think will help making more clear what I was doing.")]),e._v(" "),t("p",[e._v("Once again, you can find all the commits referenced here in "),t("a",{attrs:{href:"https://github.com/afilini/rust-miniscript/tree/taproot",target:"_blank",rel:"noopener noreferrer"}},[e._v("my rust-miniscript "),t("code",[e._v("taproot")]),e._v(" branch"),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("$ git show 34cf15b\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 34cf15b3aac1d8c2693af1b9749b888f3f29e510\nAuthor: Alekos Filini \nDate: Fri Nov 12 12:06:35 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Fix TapTree iter depth\n")])]),e._v("\ndiff --git a/src/descriptor/tr.rs b/src/descriptor/tr.rs\nindex 79d3c05..314c7f4 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/tr.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/tr.rs")]),e._v("\n@@ -65,7 +65,7 @@ impl TapTree {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" /// Iterate over all miniscripts\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn iter(&self) -> TapTreeIter {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTreeIter { stack: vec![self] }\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTreeIter { stack: vec![(0, self)] }\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Helper function to translate keys\n")])]),e._v("@@ -262,7 +262,7 @@ pub struct TapTreeIter<'a, Pk: MiniscriptKey>\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("where\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Pk: 'a,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("{\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" stack: Vec<&'a TapTree>,\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" stack: Vec<(usize, &'a TapTree)>,\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("}\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("impl<'a, Pk> Iterator for TapTreeIter<'a, Pk>\n")])]),e._v("@@ -273,13 +273,13 @@ where\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn next(&mut self) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" while !self.stack.is_empty() {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let last = self.stack.pop().expect("Size checked above");\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let (depth, last) = self.stack.pop().expect("Size checked above");\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match &*last {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTree::Tree(l, r) => {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push(&r);\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push(&l);\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push((depth + 1, &r));\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" self.stack.push((depth + 1, &l));\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTree::Leaf(ref ms) => return Some((self.stack.len(), ms)),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" TapTree::Leaf(ref ms) => return Some((depth, ms)),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" None\n")])])])])]),t("p",[t("code",[e._v("TapTreeIterator")]),e._v(" is an iterator that goes through a "),t("code",[e._v("TapTree")]),e._v(" and yields a "),t("code",[e._v("(depth, node)")]),e._v(" pair. This is then fed to "),t("a",{attrs:{href:"https://github.com/afilini/rust-miniscript/blob/taproot/src/descriptor/tr.rs#L183-L189",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("TaprootBuilder")]),t("OutboundLink")],1),e._v(", which returns an error if trying to insert nodes\nin "),t("a",{attrs:{href:"https://github.com/afilini/rust-bitcoin/blob/taproot-testing/src/util/taproot.rs#L403-L405",target:"_blank",rel:"noopener noreferrer"}},[e._v("an order that is not DFS"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("The way the depth was computed before made the builder always fail for non-trivial trees (i.e. more than 1 node).")]),e._v(" "),t("p",[e._v("Here I decided to play the safe card, and just keep track of the depth explicitly: I think there might be a way to compute the depth just knowing the "),t("code",[e._v("self.stack.len()")]),e._v(" (assuming the tree has a specific structure,\nwhich I'm not sure applies here), but anyway I didn't have much time to think about it and I just went for the \"dumb but idiot-proof\" way which ended up working fine.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show f4a3459\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit f4a3459128e37ca0c2701b8b6da064d4952296ff\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:15:52 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Switch rust-bitcoin rev\n")])]),e._v("\ndiff --git a/Cargo.toml b/Cargo.toml\nindex 12825e8..8240024 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/Cargo.toml")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/Cargo.toml")]),e._v('\n@@ -17,7 +17,7 @@ rand = ["bitcoin/rand"]\n\n'),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("[dependencies]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('# bitcoin = "0.27"\n')])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('bitcoin = {git = "https://github.com/sanket1729/rust-bitcoin", branch = "taproot_psbt"}\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('bitcoin = { git = "https://github.com/afilini/rust-bitcoin.git", branch = "taproot-testing" }\n')])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("[dependencies.serde]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('version = "1.0"\n')])])])])]),t("p",[e._v("Trivial commit, switch to "),t("a",{attrs:{href:"https://github.com/afilini/rust-bitcoin/tree/taproot-testing",target:"_blank",rel:"noopener noreferrer"}},[e._v("my fork of rust-bitcoin"),t("OutboundLink")],1),e._v(" so that I can make changes if necessary.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 0446b16\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 0446b1631cec9f7118d46f0f4c94ccd20de29f94\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:25:18 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Parse x-only keys\n")])]),e._v("\ndiff --git a/src/descriptor/key.rs b/src/descriptor/key.rs\nindex 4108d00..b7f90b5 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/key.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/key.rs")]),e._v("\n@@ -283,9 +283,9 @@ impl FromStr for DescriptorPublicKey {\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn from_str(s: &str) -> Result {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' // A "raw" public key without any origin is the least we accept.\n')])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if s.len() < 66 {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if s.len() < 64 {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" return Err(DescriptorKeyParseError(\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' "Key too short (<66 char), doesn\'t match any format",\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' "Key too short (<64 char), doesn\'t match any format",\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" ));\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n@@ -301,6 +301,14 @@ impl FromStr for DescriptorPublicKey {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" derivation_path,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" wildcard,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }))\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else if key_part.len() == 64 {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // x-only pubkey, prefix it with `02`\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let key = bitcoin::PublicKey::from_str(&format!("02{}", key_part))\n')]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' .map_err(|_| DescriptorKeyParseError("Error while parsing x-only public key"))?;\n')]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Ok(DescriptorPublicKey::SinglePub(DescriptorSinglePub {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" key,\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" origin,\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }))\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if key_part.len() >= 2\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' && !(&key_part[0..2] == "02" || &key_part[0..2] == "03" || &key_part[0..2] == "04")\n')])]),e._v("diff --git a/src/lib.rs b/src/lib.rs\nindex e168b16..3a2335e 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/lib.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("@@ -95,8 +95,6 @@")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(non_snake_case)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_mut)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(dead_code)]\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(unused_imports)]\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("#![deny(missing_docs)]\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("pub extern crate bitcoin;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v('#[cfg(feature = "serde")]\n')])])])])]),t("p",[e._v("This, I'm not really sure of: Taproot uses x-only public keys, which means that the first byte (which is usually a "),t("code",[e._v("03")]),e._v(" or a "),t("code",[e._v("02")]),e._v(") that indicates the parity of the EC point is completely dropped, and it's implicit\nthat the point is even (= "),t("code",[e._v("02")]),e._v("). Check out "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP340")]),t("OutboundLink")],1),e._v(" for a much better explanation.")]),e._v(" "),t("p",[e._v("So here when I find a string that is only 64 characters long I will assume it's an x-only pubkey, and I will parse it as a normal "),t("code",[e._v("bitcoin::PublicKey")]),e._v(" by prefixing it with "),t("code",[e._v("02")]),e._v(".")]),e._v(" "),t("p",[e._v("I guess one alternative could have been to try and parse it as a "),t("code",[e._v("schnorr::PublicKey")]),e._v(' and then "convert" it to a '),t("code",[e._v("ecdsa::PublicKey")]),e._v(" which should be supported, but once again I just wanted to get it done quickly and\nthis worked fine.")]),e._v(" "),t("p",[e._v("I also disabled the "),t("code",[e._v("unused_imports")]),e._v(" and "),t("code",[e._v("missing_docs")]),e._v(" lint so that the compiler wouldn't whine too much.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 87316ff\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 87316fffd06ab3bdf300fd1a958ddaa2789a6696\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:26:01 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Parse `tr()` descriptors\n")])]),e._v("\ndiff --git a/src/descriptor/mod.rs b/src/descriptor/mod.rs\nindex 06d98e1..4190786 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/mod.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/mod.rs")]),e._v("\n@@ -610,6 +610,7 @@ where\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("wpkh", 1) => Descriptor::Wpkh(Wpkh::from_tree(top)?),\n')]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("sh", 1) => Descriptor::Sh(Sh::from_tree(top)?),\n')]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("wsh", 1) => Descriptor::Wsh(Wsh::from_tree(top)?),\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' ("tr", _) => Descriptor::Tr(Tr::from_tree(top)?),\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => Descriptor::Bare(Bare::from_tree(top)?),\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" })\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("diff --git a/src/expression.rs b/src/expression.rs\nindex 1cef614..11a68d3 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/expression.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/expression.rs")]),e._v("\n@@ -100,7 +100,12 @@ impl<'a> Tree<'a> {\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" sl = &sl[n + 1..];\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" loop {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let (arg, new_sl) = Tree::from_slice_helper_round(sl, depth + 1)?;\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let (arg, new_sl) = if sl.contains('{') {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Tree::from_slice_helper_curly(sl, depth + 1)?\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Tree::from_slice_helper_round(sl, depth + 1)?\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" };\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" ret.args.push(arg);\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if new_sl.is_empty() {\n")])])])])]),t("p",[e._v("When trying to parse a descriptor (essentially turning a recursive string of "),t("code",[e._v("operator(args)")]),e._v(" into an abstract tree in memory) use a "),t("em",[e._v("curly-bracket-aware")]),e._v(" parser if there is one in the string.")]),e._v(" "),t("p",[e._v("The code to then build a "),t("code",[e._v("Tr")]),e._v(" struct given an "),t("code",[e._v("expression::Tree")]),e._v(" (and the "),t("code",[e._v("from_slice_helper_curly")]),e._v(" function) were already implemented, so it was just a matter of correctly\nbuilding the abstract tree by parsing curly brackets in descriptors.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 3055cab\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 3055cabef8bd51eda344ce501b03c533fd367b4f\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:26:30 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Fix control block creation when satisfying `Tr`\n")])]),e._v("\ndiff --git a/src/descriptor/tr.rs b/src/descriptor/tr.rs\nindex 314c7f4..8487d56 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/tr.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/tr.rs")]),e._v("\n@@ -571,17 +571,14 @@ impl DescriptorTrait for Tr {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let ver = LeafVersion::default();\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let leaf_script = (ms.encode(), ver);\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let control_block_set = spend_info\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .as_script_map()\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .get(&leaf_script)\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' .expect("Control block must exist in script map for every known leaf");\n')])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // let control_block_set = spend_info\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // .as_script_map()\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // .get(&leaf_script)\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' // .expect("Control block must exist in script map for every known leaf");\n')]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' let control_block = spend_info.control_block(&leaf_script).expect("Control block must exist in script map for every known leaf");\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" wit.push(leaf_script.0.into_bytes()); // Push the leaf script\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // There can be multiple control blocks for a (script, ver) pair\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Find the smallest one amongst those\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let control_block = control_block_set\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .iter()\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .min_by(|x, y| x.as_inner().len().cmp(&y.as_inner().len()))\n")]),t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(' .expect("Atleast one control must exist for a known leaf");\n')])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" wit.push(control_block.serialize());\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Finally, save the minimum\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" min_wit = Some(wit);\n")])]),e._v("\n")])])]),t("p",[e._v("This is where things get more interesting: this section of code builds the witness to satisfy a Taproot descriptor. In case of a script-spend, we need to prove that the script we are using had been committed\ninto the public key of our "),t("code",[e._v("P2TR")]),e._v(' input. We do this by adding a "control block", that contains data about the parity of the key, the leaf version used, and the merkle path from the leaf we are using to spend\nup to the merkle root, which is committed into the public key. Once again, this is explained very well in '),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("BIP341")]),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Before my patch the code was only getting the set of merkle paths that could lead from the root to the leaves that contain a given script. For context, the signature of "),t("code",[e._v("TaprootSpendInfo::as_script_map(&self)")]),e._v(" is:")]),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("/// Access the internal script map")]),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("as_script_map")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),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 operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("BTreeMap")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[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 class-name"}},[e._v("LeafVersion")]),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 class-name"}},[e._v("BTreeSet")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("TaprootMerkleBranch")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),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("p",[e._v('Then the code would look for the "shortest" path to that specific script, as it would save size in the final transaction (leaves that are more "deep" in the tree than others naturally have more hidden branches\nin their path to the root, and thus require a longer control block to reveal them all).')]),e._v(" "),t("p",[e._v("The issue here is that the "),t("code",[e._v("control_block")]),e._v(" variable is then serialized directly into the witness. But this is not a control block, it's just a set of merkle paths! A control block only has "),t("em",[e._v("one")]),e._v(" merkle path, and\nincludes the leaf version and the key parity bit.")]),e._v(" "),t("p",[e._v("Conveniently, the "),t("code",[e._v("TaprootSpendInfo")]),e._v(' struct also has this other method (I\'m including the implementation as well, because it shows that internally it does the same "trick" to find the shortest path):')]),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("/// Obtain a [`ControlBlock`] for particular script with the given version.")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Returns [`None`] if the script is not contained in the [`TaprootSpendInfo`]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// If there are multiple ControlBlocks possible, this returns the shortest one.")]),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("control_block")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" script_ver"),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 punctuation"}},[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 class-name"}},[e._v("LeafVersion")]),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 punctuation"}},[e._v("->")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Option")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("ControlBlock")]),t("span",{pre:!0,attrs:{class:"token operator"}},[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(" merkle_branch_set "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("script_map"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("get")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("script_ver"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),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("// Choose the smallest one amongst the multiple script maps")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" smallest "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" merkle_branch_set\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("iter")]),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(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("min_by")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token closure-params"}},[t("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[e._v("|")]),e._v("x"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" y"),t("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[e._v("|")])]),e._v(" x"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v(".0")]),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(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cmp")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),e._v("y"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v(".0")]),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(")")]),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(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("expect")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Non-empty iterator"')]),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("Some")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("ControlBlock")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n internal_key"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("internal_key"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n output_key_parity"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("self")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("output_key_parity"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n leaf_version"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("LeafVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("default")]),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 merkle_branch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" smallest"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("clone")]),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 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("So to fix this code we just have to use that method instead, and we can get it done in one single line!")]),e._v(" "),t("p",[e._v('Instead of removing the old code at the time I only commented it out, because I initially thought I would still have to look for the shortest script myself, and I figured the "sorting" code would come in handy\nlater on.')]),e._v(" "),t("p",[e._v("Also, if you are an acute observer, you might have noticed that there's a bug in this last snippet of code. Feel free to think about it a little bit, then check out the "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin/pull/703",target:"_blank",rel:"noopener noreferrer"}},[e._v("PR"),t("OutboundLink")],1),e._v(" I made\nif you wanna know the answer!")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("git show 35378ad\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 35378ad01a6f2b8161a3f36448b24d031f8aeaec\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:27:14 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Consider key-spend max satisfaction weight\n")])]),e._v("\ndiff --git a/src/descriptor/tr.rs b/src/descriptor/tr.rs\nindex 8487d56..fabf860 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/descriptor/tr.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/descriptor/tr.rs")]),e._v("\n@@ -593,7 +593,7 @@ impl DescriptorTrait for Tr {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn max_satisfaction_weight(&self) -> Result {\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut max_wieght = None;\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut max_wieght = Some(65);\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for (depth, ms) in self.iter_scripts() {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let script_size = ms.script_size();\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let max_sat_elems = match ms.max_satisfaction_witness_elements() {\n")])])])])]),t("p",[e._v("This is a little bug in the code that tries to compute what the maximum satisfaction weight would be for a descriptor. For instance, we use this in BDK to compute how many extra sats of fees we need to pay\nin order to target a given fee rate, assuming the descriptor is satisfied with the worst (larger and most expensive) path.")]),e._v(" "),t("p",[e._v("For Taproot descriptors, it's just a matter of iterating over the leaves in the tree and pick the most expensive one... or is it? This doesn't take into account that Taproot outputs can also be spent with\nkey-spend, which means just pushing a signature to the witness. This signature is 64 bytes long when using the new "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("SIGHASH_DEFAULT")]),t("OutboundLink")],1),e._v(" sighash, or 65 otherwise. Since we are thinking about the maximum satisfaction\nweight, or the worst case possible, we naturally pick the latter.")]),e._v(" "),t("p",[e._v("Note that theoretically you could build a Taproot address \"without\" an available key-path spend (by using an unspendable Schnorr public key), but the code here in rust-miniscript doesn't take that into\naccount, as there's no way that I'm aware of to specificy in a "),t("code",[e._v("tr()")]),e._v(" descriptor that the key is unspendable. So, while theoretically here we should first check whether the key-spend path is available before\naccounting for its weight, in practice this is always true in miniscript so we just use that as our starting worst case and update it later if necessary while iterating the tree leaves.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show b4878f8\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit b4878f816e9ede11d5ed947c06e03aa988e3e26f\nAuthor: Alekos Filini \nDate: Sat Nov 13 14:27:53 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Look for taproot stuff in psbts\n")])]),e._v("\ndiff --git a/src/psbt/mod.rs b/src/psbt/mod.rs\nindex 9a8b17d..42c6ce8 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/psbt/mod.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/psbt/mod.rs")]),e._v("\n@@ -25,13 +25,14 @@ use bitcoin;\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d};\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::secp256k1::{self, Secp256k1};\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::util::taproot::TapLeafHash;\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use bitcoin::Script;\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use interpreter;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use miniscript::limits::SEQUENCE_LOCKTIME_DISABLE_FLAG;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use miniscript::satisfy::{After, Older};\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use Satisfier;\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use {BitcoinECSig, Preimage32};\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use {BitcoinECSig, BitcoinSchnorrSig, Preimage32};\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("use {MiniscriptKey, ToPublicKey};\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("mod finalizer;\n")])]),e._v("@@ -231,6 +232,24 @@ impl<'psbt> PsbtInputSatisfier<'psbt> {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("}\n")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("impl<'psbt, Pk: MiniscriptKey + ToPublicKey> Satisfier for PsbtInputSatisfier<'psbt> {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn lookup_tap_key_spend_sig(&self) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if let Some((sig, hash_ty)) = self.psbt.inputs[self.index].tap_key_sig {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Some(BitcoinSchnorrSig { sig, hash_ty })\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" None\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn lookup_tap_leaf_script_sig(&self, pk: &Pk, lh: &TapLeafHash) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let pk = pk.to_x_only_pubkey();\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if let Some((sig, hash_ty)) = self.psbt.inputs[self.index].tap_script_sigs.get(&(pk, *lh)) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Some(BitcoinSchnorrSig { sig: *sig, hash_ty: *hash_ty })\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" } else {\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" None\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" fn lookup_ec_sig(&self, pk: &Pk) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" if let Some(rawsig) = self.psbt.inputs[self.index]\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .partial_sigs\n")])])])])]),t("p",[e._v("This commit implements the Taproot-specific "),t("code",[e._v("Satisfier")]),e._v(" methods on "),t("code",[e._v("PsbtInputSatisfier")]),e._v(". The code to produce a valid witness (i.e. "),t("em",[e._v("satisfy")]),e._v(") a descriptor by looking for Taproot key-spend or script-spend signatures\nis already implemented, so it's just a matter of actually returning those, if they are present in a PSBT.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 80da0ba\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 80da0ba9b742b2dee23e7302e2f95a6e96b1d6ed\nAuthor: Alekos Filini \nDate: Sat Nov 13 16:54:27 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Iter keys in `MultiA`\n")])]),e._v("\ndiff --git a/src/miniscript/iter.rs b/src/miniscript/iter.rs\nindex 36c4b69..a54a371 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/miniscript/iter.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/miniscript/iter.rs")]),e._v("\n@@ -121,7 +121,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn get_leaf_pk(&self) -> Vec {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match self.node {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkK(ref key) => vec![key.clone()],\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) => keys.clone(),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys.clone(),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => vec![],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -139,7 +139,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match self.node {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkH(ref hash) => vec![hash.clone()],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkK(ref key) => vec![key.to_pubkeyhash()],\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) => keys.iter().map(Pk::to_pubkeyhash).collect(),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys.iter().map(Pk::to_pubkeyhash).collect(),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => vec![],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -155,7 +155,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match self.node {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkH(ref hash) => vec![PkPkh::HashedPubkey(hash.clone())],\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::PkK(ref key) => vec![PkPkh::PlainPubkey(key.clone())],\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) => keys\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .into_iter()\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .map(|key| PkPkh::PlainPubkey(key.clone()))\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" .collect(),\n")])]),e._v("@@ -170,7 +170,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" pub fn get_nth_pk(&self, n: usize) -> Option {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match (&self.node, n) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkK(ref key), 0) => Some(key.clone()),\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) => keys.get(n).cloned(),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) | (&Terminal::MultiA(_, ref keys), _) => keys.get(n).cloned(),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => None,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -186,7 +186,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match (&self.node, n) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkH(ref hash), 0) => Some(hash.clone()),\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkK(ref key), 0) => Some(key.to_pubkeyhash()),\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) => keys.get(n).map(Pk::to_pubkeyhash),\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) | (&Terminal::MultiA(_, ref keys), _) => keys.get(n).map(Pk::to_pubkeyhash),\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => None,\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")])]),e._v("@@ -199,7 +199,7 @@ impl Miniscript {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match (&self.node, n) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkH(ref hash), 0) => Some(PkPkh::HashedPubkey(hash.clone())),\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::PkK(ref key), 0) => Some(PkPkh::PlainPubkey(key.clone())),\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) => {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" (&Terminal::Multi(_, ref keys), _) | (&Terminal::MultiA(_, ref keys), _) => {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" keys.get(n).map(|key| PkPkh::PlainPubkey(key.clone()))\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" }\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" _ => None,\n")])])])])]),t("p",[e._v("Taproot descriptors add a new miniscript operator called "),t("code",[e._v("multi_a()")]),e._v(" which behaves like "),t("code",[e._v("multi()")]),e._v(" in non-Taproot descriptors, but uses the new "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki#script-execution",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("OP_CHECKSIGADD")]),t("OutboundLink")],1),e._v(" opcode when serialized in a script.")]),e._v(" "),t("p",[e._v("When this was added, somebody forgot to update the various methods that iterate over the public keys of a descriptor to correctly return the keys contained in "),t("code",[e._v("multi_a()")]),e._v(" - essentially, it was falling back in\nthe default case used by the operators that don't contain any key, but this one does!")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("$ git show 8b108c5\n")])])]),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v("commit 8b108c5c0bf50b66b7220746525742b71f6cd4b4\nAuthor: Alekos Filini \nDate: Sat Nov 13 17:26:53 2021 +0100\n\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Fix witness generation for `MultiA`\n")])]),e._v("\ndiff --git a/src/miniscript/satisfy.rs b/src/miniscript/satisfy.rs\nindex 655436e..ab43707 100644\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("--- a/src/miniscript/satisfy.rs")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token coord"}},[e._v("+++ b/src/miniscript/satisfy.rs")]),e._v("\n@@ -1264,7 +1264,7 @@ impl Satisfaction {\n"),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" // Collect all available signatures\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut sig_count = 0;\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" let mut sigs = vec![vec![vec![]]; keys.len()];\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for (i, pk) in keys.iter().enumerate() {\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" for (i, pk) in keys.iter().rev().enumerate() {\n")])]),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" match Witness::signature::<_, _, Ctx>(stfr, pk, leaf_hash) {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" Witness::Stack(sig) => {\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" sigs[i] = sig;\n")])])])])]),t("p",[e._v("And finally, the last little fix: the "),t("code",[e._v("multi_a()")]),e._v(" operator is satisfied by pushing to the witness either a signature (if you have one available for that specific public key) or an empty vector. The problem is,\nthey have to be in the right order to match the order of public keys in your Taproot script.")]),e._v(" "),t("p",[e._v("rust-miniscript was pushing them in reverse order, so script validation was always failing for multisigs that had more than 1 key. Adding a "),t("code",[e._v(".rev()")]),e._v(" to the iterator fixed the issue.")]),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("And that was it! We now have a fully working "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-bitcoin"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust-miniscript"),t("OutboundLink")],1),e._v(" ready for Taproot.")]),e._v(" "),t("p",[e._v("In "),t("a",{attrs:{href:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2"}},[e._v("Part 2")]),e._v(" I will go over the code changes in BDK, but I think it's now time for you and I to take a break 😃")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/64.e6ba5ed7.js b/assets/js/64.71ab972f.js similarity index 99% rename from assets/js/64.e6ba5ed7.js rename to assets/js/64.71ab972f.js index 5add9f39a4..43bb6b099e 100644 --- a/assets/js/64.e6ba5ed7.js +++ b/assets/js/64.71ab972f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{422: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/65.728ab52c.js b/assets/js/65.9945fc3d.js similarity index 99% rename from assets/js/65.728ab52c.js rename to assets/js/65.9945fc3d.js index 78f803fc78..3f2f9efc78 100644 --- a/assets/js/65.728ab52c.js +++ b/assets/js/65.9945fc3d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{422: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([[65],{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 diff --git a/assets/js/69.3d319207.js b/assets/js/69.8d53134f.js similarity index 99% rename from assets/js/69.3d319207.js rename to assets/js/69.8d53134f.js index 650678ff8e..23e0297fd2 100644 --- a/assets/js/69.3d319207.js +++ b/assets/js/69.8d53134f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{427: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([[69],{428: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/71.2a8871be.js b/assets/js/71.a7d69af6.js similarity index 99% rename from assets/js/71.2a8871be.js rename to assets/js/71.a7d69af6.js index b6fb81cfb6..96a82012ef 100644 --- a/assets/js/71.2a8871be.js +++ b/assets/js/71.a7d69af6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{428: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",[t._v("A new release of BDK is out: the "),s("a",{attrs:{href:"https://crates.io/crates/bdk/0.4.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.4.0")]),s("OutboundLink")],1),t._v(" release brings updated dependencies, more sanity checks and an overhauled API to build transactions.")]),t._v(" "),s("p",[t._v("You can find the full "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/5e352489a0ac9dd92002a73aa64789a9ae2f0794/CHANGELOG.md#v040---v030",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.4.0 changelog"),s("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),s("h2",{attrs:{id:"whats-new-in-v040"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v040"}},[t._v("#")]),t._v(" What's new in v0.4.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:"a-new-api-to-build-transaction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#a-new-api-to-build-transaction"}},[t._v("#")]),t._v(" A new API to build transaction")]),t._v(" "),s("p",[t._v("The star of this release is the new API designed and implemented by "),s("a",{attrs:{href:"https://github.com/llfourn",target:"_blank",rel:"noopener noreferrer"}},[t._v("@llfourn"),s("OutboundLink")],1),t._v(" that brings much more flexibility to the way we create transactions: originally the process of making a transaction involved the creation of a "),s("code",[t._v("TxBuilder")]),t._v(" which was used\nto configure "),s("em",[t._v("how")]),t._v(" the wallet should build the transaction. Things like which outputs to create, what "),s("code",[t._v("nLockTime")]),t._v(" to use, which UTXOs to spend, and much more.")]),t._v(" "),s("p",[t._v("Once fully configured, this builder was then given to the "),s("code",[t._v("Wallet")]),t._v(" itself in a "),s("code",[t._v("Wallet::create_tx()")]),t._v(" or "),s("code",[t._v("Wallet::bump_fee()")]),t._v(" call: the "),s("code",[t._v("Wallet")]),t._v(" would try to follow the "),s("em",[t._v("instructions")]),t._v(" given by the builder, but in\ncase of conflicting or straight-up wrong options it would have to fail and force the user to start over.")]),t._v(" "),s("p",[t._v("The new API maintains the concept of a "),s("em",[t._v("builder")]),t._v(", but it changes the way it's created so that it always contains a reference to the main "),s("code",[t._v("Wallet")]),t._v(" instance. What this means is that most checks can now be performed right\nwhen something is added to the builder, not at the end, allowing the user to recover from errors instead of having to start over.")]),t._v(" "),s("p",[t._v("This also opens the door to even more improvements and additions, such as a way to "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/279",target:"_blank",rel:"noopener noreferrer"}},[t._v("spend foreign utxos"),s("OutboundLink")],1),t._v(" in a transaction, or even a way to "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/280",target:"_blank",rel:"noopener noreferrer"}},[t._v("bump the fees of multiple transactions at once"),s("OutboundLink")],1),t._v(" by batching them together, which\nsaves a bit of space and money.")]),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(" 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_new_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 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("(")]),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")])])]),s("h3",{attrs:{id:"upgraded-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#upgraded-dependencies"}},[t._v("#")]),t._v(" Upgraded dependencies")]),t._v(" "),s("p",[t._v("This release also brings many updates to our dependencies, including:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("bitcoin")]),t._v(" to "),s("code",[t._v("v0.26")])]),t._v(" "),s("li",[s("code",[t._v("miniscript")]),t._v(" to "),s("code",[t._v("v5.1")])]),t._v(" "),s("li",[s("code",[t._v("electrum-client")]),t._v(" to "),s("code",[t._v("v0.6")])]),t._v(" "),s("li",[s("code",[t._v("tokio")]),t._v(" to "),s("code",[t._v("v1")])]),t._v(" "),s("li",[s("code",[t._v("reqwest")]),t._v(" to "),s("code",[t._v("v0.11")])]),t._v(" "),s("li",[s("code",[t._v("cc")]),t._v(" to "),s("code",[t._v(">= v1.0.64")])])]),t._v(" "),s("h3",{attrs:{id:"compact-filters-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compact-filters-example"}},[t._v("#")]),t._v(" Compact Filters example")]),t._v(" "),s("p",[t._v("Thanks to the upgrade to "),s("code",[t._v("bitcoin v0.26")]),t._v(" all the issues related to new networking messages in the P2P Bitcoin network have been fixed, which means that we can finally use our (experimental) compact filters "),s("code",[t._v("Blockchain")]),t._v(" with\nstandard Bitcoin Core 0.21 full nodes.")]),t._v(" "),s("p",[t._v("The following example has also been added to the repository and can be run with "),s("code",[t._v("cargo run --features=compact_filters --example compact_filters_balance")]),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("/// This will return wallet balance using compact filters")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/// Requires a synced local bitcoin node 0.21 running on testnet with blockfilterindex=1 and peerblockfilters=1")]),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("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("CompactFiltersError")]),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("env_logger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("init")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._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("info!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"start"')]),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(" num_threads "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),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(" 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 "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" peers "),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 number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("num_threads"),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("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token closure-params"}},[s("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[t._v("|")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token closure-punctuation 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 function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localhost:18333"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[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("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("mempool"),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("Testnet")]),s("span",{pre:!0,attrs:{class:"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("collect")]),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 class-name"}},[t._v("Result")]),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 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 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("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("(")]),t._v("peers"),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 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("info!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"done {:?}"')]),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(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" descriptor "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh(tpubD6NzVbkrYhZ4X2yy78HWrr1M9NT8dKeWfzNiQqDdMqqa9UmmGztGGz6TaLFGsLfdft5iu32gxq1T4eMNxExNNWzVCpf9Y6JZi5TnqoC9wJq/*)"')]),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(" database "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),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 keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[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("(")]),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("descriptor"),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("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(" database"),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(")")]),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("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("noop_progress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[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(")")]),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("info!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"balance: {}"')]),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 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 "),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("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.3.0")]),t._v(" release around a month ago, we've had "),s("code",[t._v("59")]),t._v(" new commits made by "),s("code",[t._v("8")]),t._v(" different contributors for a total of "),s("code",[t._v("2463")]),t._v(" additions and "),s("code",[t._v("1991")]),t._v(" deletions. Here's the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.3.0...v0.4.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/luckysori",target:"_blank",rel:"noopener noreferrer"}},[t._v("@luckysori"),s("OutboundLink")],1),t._v(" - Lucas Soriano")])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{427: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",[t._v("A new release of BDK is out: the "),s("a",{attrs:{href:"https://crates.io/crates/bdk/0.4.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.4.0")]),s("OutboundLink")],1),t._v(" release brings updated dependencies, more sanity checks and an overhauled API to build transactions.")]),t._v(" "),s("p",[t._v("You can find the full "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/5e352489a0ac9dd92002a73aa64789a9ae2f0794/CHANGELOG.md#v040---v030",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.4.0 changelog"),s("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),s("h2",{attrs:{id:"whats-new-in-v040"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v040"}},[t._v("#")]),t._v(" What's new in v0.4.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:"a-new-api-to-build-transaction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#a-new-api-to-build-transaction"}},[t._v("#")]),t._v(" A new API to build transaction")]),t._v(" "),s("p",[t._v("The star of this release is the new API designed and implemented by "),s("a",{attrs:{href:"https://github.com/llfourn",target:"_blank",rel:"noopener noreferrer"}},[t._v("@llfourn"),s("OutboundLink")],1),t._v(" that brings much more flexibility to the way we create transactions: originally the process of making a transaction involved the creation of a "),s("code",[t._v("TxBuilder")]),t._v(" which was used\nto configure "),s("em",[t._v("how")]),t._v(" the wallet should build the transaction. Things like which outputs to create, what "),s("code",[t._v("nLockTime")]),t._v(" to use, which UTXOs to spend, and much more.")]),t._v(" "),s("p",[t._v("Once fully configured, this builder was then given to the "),s("code",[t._v("Wallet")]),t._v(" itself in a "),s("code",[t._v("Wallet::create_tx()")]),t._v(" or "),s("code",[t._v("Wallet::bump_fee()")]),t._v(" call: the "),s("code",[t._v("Wallet")]),t._v(" would try to follow the "),s("em",[t._v("instructions")]),t._v(" given by the builder, but in\ncase of conflicting or straight-up wrong options it would have to fail and force the user to start over.")]),t._v(" "),s("p",[t._v("The new API maintains the concept of a "),s("em",[t._v("builder")]),t._v(", but it changes the way it's created so that it always contains a reference to the main "),s("code",[t._v("Wallet")]),t._v(" instance. What this means is that most checks can now be performed right\nwhen something is added to the builder, not at the end, allowing the user to recover from errors instead of having to start over.")]),t._v(" "),s("p",[t._v("This also opens the door to even more improvements and additions, such as a way to "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/279",target:"_blank",rel:"noopener noreferrer"}},[t._v("spend foreign utxos"),s("OutboundLink")],1),t._v(" in a transaction, or even a way to "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/280",target:"_blank",rel:"noopener noreferrer"}},[t._v("bump the fees of multiple transactions at once"),s("OutboundLink")],1),t._v(" by batching them together, which\nsaves a bit of space and money.")]),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(" 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_new_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 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("(")]),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")])])]),s("h3",{attrs:{id:"upgraded-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#upgraded-dependencies"}},[t._v("#")]),t._v(" Upgraded dependencies")]),t._v(" "),s("p",[t._v("This release also brings many updates to our dependencies, including:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("bitcoin")]),t._v(" to "),s("code",[t._v("v0.26")])]),t._v(" "),s("li",[s("code",[t._v("miniscript")]),t._v(" to "),s("code",[t._v("v5.1")])]),t._v(" "),s("li",[s("code",[t._v("electrum-client")]),t._v(" to "),s("code",[t._v("v0.6")])]),t._v(" "),s("li",[s("code",[t._v("tokio")]),t._v(" to "),s("code",[t._v("v1")])]),t._v(" "),s("li",[s("code",[t._v("reqwest")]),t._v(" to "),s("code",[t._v("v0.11")])]),t._v(" "),s("li",[s("code",[t._v("cc")]),t._v(" to "),s("code",[t._v(">= v1.0.64")])])]),t._v(" "),s("h3",{attrs:{id:"compact-filters-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compact-filters-example"}},[t._v("#")]),t._v(" Compact Filters example")]),t._v(" "),s("p",[t._v("Thanks to the upgrade to "),s("code",[t._v("bitcoin v0.26")]),t._v(" all the issues related to new networking messages in the P2P Bitcoin network have been fixed, which means that we can finally use our (experimental) compact filters "),s("code",[t._v("Blockchain")]),t._v(" with\nstandard Bitcoin Core 0.21 full nodes.")]),t._v(" "),s("p",[t._v("The following example has also been added to the repository and can be run with "),s("code",[t._v("cargo run --features=compact_filters --example compact_filters_balance")]),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("/// This will return wallet balance using compact filters")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/// Requires a synced local bitcoin node 0.21 running on testnet with blockfilterindex=1 and peerblockfilters=1")]),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("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("CompactFiltersError")]),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("env_logger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("init")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._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("info!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"start"')]),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(" num_threads "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),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(" 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 "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" peers "),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 number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("num_threads"),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("map")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token closure-params"}},[s("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[t._v("|")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token closure-punctuation 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 function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localhost:18333"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[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("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("mempool"),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("Testnet")]),s("span",{pre:!0,attrs:{class:"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("collect")]),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 class-name"}},[t._v("Result")]),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 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 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("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("(")]),t._v("peers"),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 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("info!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"done {:?}"')]),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(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" descriptor "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh(tpubD6NzVbkrYhZ4X2yy78HWrr1M9NT8dKeWfzNiQqDdMqqa9UmmGztGGz6TaLFGsLfdft5iu32gxq1T4eMNxExNNWzVCpf9Y6JZi5TnqoC9wJq/*)"')]),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(" database "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),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 keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[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("(")]),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("descriptor"),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("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(" database"),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(")")]),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("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("noop_progress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[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(")")]),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("info!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"balance: {}"')]),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 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 "),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("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.3.0")]),t._v(" release around a month ago, we've had "),s("code",[t._v("59")]),t._v(" new commits made by "),s("code",[t._v("8")]),t._v(" different contributors for a total of "),s("code",[t._v("2463")]),t._v(" additions and "),s("code",[t._v("1991")]),t._v(" deletions. Here's the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.3.0...v0.4.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/luckysori",target:"_blank",rel:"noopener noreferrer"}},[t._v("@luckysori"),s("OutboundLink")],1),t._v(" - Lucas Soriano")])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/72.1001d2aa.js b/assets/js/72.d0343ad9.js similarity index 98% rename from assets/js/72.1001d2aa.js rename to assets/js/72.d0343ad9.js index e69df16e8c..6afccb51f0 100644 --- a/assets/js/72.1001d2aa.js +++ b/assets/js/72.d0343ad9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{429:function(t,e,n){"use strict";n.r(e);var a=n(7),s=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.5.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.5.0")]),e("OutboundLink")],1),t._v(" is our first release licensed under Apache 2.0 and MIT, brings new features, bugfixes and some internal refactoring.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/f786f0e6241a3df47b96bbb07f1aba374bc73b2f/CHANGELOG.md#v050---v040",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.5.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v050"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v050"}},[t._v("#")]),t._v(" What's new in v0.5.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h3",{attrs:{id:"dual-licensing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dual-licensing"}},[t._v("#")]),t._v(" Dual Licensing")]),t._v(" "),e("p",[t._v("From now on BDK will be released under both Apache 2.0 and MIT, at your discretion. This change aligns our project with many other Rust crates and reiterates our commitment to a permissive licensing model.")]),t._v(" "),e("h3",{attrs:{id:"spending-foreign-utxos"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spending-foreign-utxos"}},[t._v("#")]),t._v(" Spending "),e("em",[t._v("foreign")]),t._v(" UTXOs")]),t._v(" "),e("p",[t._v("This release adds a new "),e("code",[t._v("TxBuilder")]),t._v(" method called "),e("a",{attrs:{href:"https://docs.rs/bdk/0.5.0/bdk/wallet/tx_builder/struct.TxBuilder.html#method.add_foreign_utxo",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("add_foreign_utxo()")]),e("OutboundLink")],1),t._v(", which can be used to spend UTXOs that don't belong to the "),e("code",[t._v("Wallet")]),t._v(". We think this is going to be very useful to developers working on multiparty\nprotocols like CoinJoins, Pay Join, etc.")]),t._v(" "),e("p",[t._v("It's as easy as giving the library a PSBT input and the satisfaction cost for that input:")]),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(" 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("\nbuilder\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("addr"),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("60_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("add_foreign_utxo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("foreign_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("outpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" foreign_utxo_psbt_input"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" foreign_utxo_satisfaction_weight"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n")])])]),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.4.0")]),t._v(" release around a month ago, we've had "),e("code",[t._v("54")]),t._v(" new commits made by "),e("code",[t._v("7")]),t._v(" different contributors for a total of "),e("code",[t._v("1430")]),t._v(" additions and "),e("code",[t._v("1212")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.4.0...v0.5.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/davemo88",target:"_blank",rel:"noopener noreferrer"}},[t._v("@davemo88"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{430:function(t,e,n){"use strict";n.r(e);var a=n(7),s=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.5.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.5.0")]),e("OutboundLink")],1),t._v(" is our first release licensed under Apache 2.0 and MIT, brings new features, bugfixes and some internal refactoring.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/f786f0e6241a3df47b96bbb07f1aba374bc73b2f/CHANGELOG.md#v050---v040",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.5.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v050"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v050"}},[t._v("#")]),t._v(" What's new in v0.5.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h3",{attrs:{id:"dual-licensing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dual-licensing"}},[t._v("#")]),t._v(" Dual Licensing")]),t._v(" "),e("p",[t._v("From now on BDK will be released under both Apache 2.0 and MIT, at your discretion. This change aligns our project with many other Rust crates and reiterates our commitment to a permissive licensing model.")]),t._v(" "),e("h3",{attrs:{id:"spending-foreign-utxos"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spending-foreign-utxos"}},[t._v("#")]),t._v(" Spending "),e("em",[t._v("foreign")]),t._v(" UTXOs")]),t._v(" "),e("p",[t._v("This release adds a new "),e("code",[t._v("TxBuilder")]),t._v(" method called "),e("a",{attrs:{href:"https://docs.rs/bdk/0.5.0/bdk/wallet/tx_builder/struct.TxBuilder.html#method.add_foreign_utxo",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("add_foreign_utxo()")]),e("OutboundLink")],1),t._v(", which can be used to spend UTXOs that don't belong to the "),e("code",[t._v("Wallet")]),t._v(". We think this is going to be very useful to developers working on multiparty\nprotocols like CoinJoins, Pay Join, etc.")]),t._v(" "),e("p",[t._v("It's as easy as giving the library a PSBT input and the satisfaction cost for that input:")]),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(" 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("\nbuilder\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("addr"),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("60_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("add_foreign_utxo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("foreign_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("outpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" foreign_utxo_psbt_input"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" foreign_utxo_satisfaction_weight"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n")])])]),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.4.0")]),t._v(" release around a month ago, we've had "),e("code",[t._v("54")]),t._v(" new commits made by "),e("code",[t._v("7")]),t._v(" different contributors for a total of "),e("code",[t._v("1430")]),t._v(" additions and "),e("code",[t._v("1212")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.4.0...v0.5.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/davemo88",target:"_blank",rel:"noopener noreferrer"}},[t._v("@davemo88"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/73.5decc786.js b/assets/js/73.a5e67ee7.js similarity index 99% rename from assets/js/73.5decc786.js rename to assets/js/73.a5e67ee7.js index f9e5387eec..6d82fd02ed 100644 --- a/assets/js/73.5decc786.js +++ b/assets/js/73.a5e67ee7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{430: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("A new release of BDK is out: "),e("a",{attrs:{href:"https://crates.io/crates/bdk/0.6.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.6.0")]),e("OutboundLink")],1),t._v(" brings some new API calls, renamed types and some bugfixes.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/2bddd9baedc3744cd7647176c2f31405ee7bb54a/CHANGELOG.md#v060---v051",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.6.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v060"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v060"}},[t._v("#")]),t._v(" What's new in v0.6.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h3",{attrs:{id:"a-new-way-to-generate-addresses"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-new-way-to-generate-addresses"}},[t._v("#")]),t._v(" A new way to generate addresses")]),t._v(" "),e("p",[t._v("The old "),e("code",[t._v("get_new_address()")]),t._v(" method has been upgraded into a more generic "),e("code",[t._v("get_address()")]),t._v(", which takes a "),e("a",{attrs:{href:"https://docs.rs/bdk/0.6.0/bdk/wallet/enum.AddressIndex.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("AddressIndex")]),e("OutboundLink")],1),t._v(" argument. "),e("code",[t._v("AddressIndex")]),t._v(" is defined as an enum with the following variants:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("AddressIndex::New")]),t._v(" increments the derivation index stored in the database and returns a new address. It's equivalent to the old "),e("code",[t._v("get_new_address()")]),t._v(".")]),t._v(" "),e("li",[e("code",[t._v("AddressIndex::LastUnused")]),t._v(" returns the address for the current derivation index if no usage has been detected. "),e("code",[t._v("sync()")]),t._v(" should be called to ensure the internal database is up to date.")]),t._v(" "),e("li",[e("code",[t._v("AddressIndex::Peek(index)")]),t._v(" returns the address at a given derivation index, without updating the database.")]),t._v(" "),e("li",[e("code",[t._v("AddressIndex::Reset(index)")]),t._v(" returns the address at a given derivation index, and stores that value in the database.")])]),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("// Prints the first ten addresses without updating the derivation index")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" index "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),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 number"}},[t._v("10")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address #{}: {}"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[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("get_address")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Peek")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),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(")")]),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("h3",{attrs:{id:"easier-multiparty-transaction-creation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#easier-multiparty-transaction-creation"}},[t._v("#")]),t._v(" Easier multiparty transaction creation")]),t._v(" "),e("p",[t._v("A new method called "),e("a",{attrs:{href:"https://docs.rs/bdk/0.6.0/bdk/wallet/struct.Wallet.html#method.get_psbt_input",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("get_psbt_input()")]),e("OutboundLink")],1),t._v(" has been added to the "),e("code",[t._v("Wallet")]),t._v(" structure, and it makes it very easy to get a complete PSBT input with all the required metadata for a given UTXO. This can be very convenient\nwhen working with "),e("code",[t._v("add_foreign_utxo()")]),t._v(", which was added in the previous release:")]),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("// On Alice's wallet")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" alice_utxo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LocalUtxo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),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(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" alice_psbt_input "),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("get_psbt_input")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("alice_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),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 function"}},[t._v("send_input_to_bob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("alice_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("outpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" alice_psbt_input"),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("// On Bob's wallet")]),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_bob"),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("\nbuilder\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("addr"),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("60_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("add_foreign_utxo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("alice_outpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" alice_psbt_input"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" satisfaction_weight"),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("h3",{attrs:{id:"renamed-types"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#renamed-types"}},[t._v("#")]),t._v(" Renamed types")]),t._v(" "),e("p",[t._v("To keep our coding style in line with the best practices defined by the Rust language, we've renamed some of our types and enum variants to avoid using "),e("a",{attrs:{href:"https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms",target:"_blank",rel:"noopener noreferrer"}},[t._v("upper case acronyms"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Some examples are:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("UTXO")]),t._v(" -> "),e("code",[t._v("Utxo")])]),t._v(" "),e("li",[e("code",[t._v("RBFValue")]),t._v(" -> "),e("code",[t._v("RbfValue")])]),t._v(" "),e("li",[e("code",[t._v("BIP69Lexicographic")]),t._v(" -> "),e("code",[t._v("Bip69Lexicographic")])]),t._v(" "),e("li",[e("code",[t._v("P2PKH")]),t._v(" -> "),e("code",[t._v("P2Pkh")])]),t._v(" "),e("li",[e("code",[t._v("BIP44Public")]),t._v(" -> "),e("code",[t._v("Bip44Public")])])]),t._v(" "),e("h3",{attrs:{id:"new-msrv"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#new-msrv"}},[t._v("#")]),t._v(" New MSRV")]),t._v(" "),e("p",[t._v("Due to some changes in one of our dependency, our MSRV has been bumped up from "),e("code",[t._v("1.45")]),t._v(" to "),e("code",[t._v("1.46")]),t._v(", which was released in August 2020. The last release fully supporting "),e("code",[t._v("1.45")]),t._v(" is "),e("code",[t._v("v0.5.1")]),t._v(".")]),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.5.1")]),t._v(" release around a month ago, we've had "),e("code",[t._v("37")]),t._v(" new commits made by "),e("code",[t._v("7")]),t._v(" different contributors for a total of "),e("code",[t._v("1092")]),t._v(" additions and "),e("code",[t._v("548")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.5.1...v0.6.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/da-kami",target:"_blank",rel:"noopener noreferrer"}},[t._v("@da-kami"),e("OutboundLink")],1),t._v(" - Daniel Karzel")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{429: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("A new release of BDK is out: "),e("a",{attrs:{href:"https://crates.io/crates/bdk/0.6.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.6.0")]),e("OutboundLink")],1),t._v(" brings some new API calls, renamed types and some bugfixes.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/2bddd9baedc3744cd7647176c2f31405ee7bb54a/CHANGELOG.md#v060---v051",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.6.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v060"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v060"}},[t._v("#")]),t._v(" What's new in v0.6.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h3",{attrs:{id:"a-new-way-to-generate-addresses"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-new-way-to-generate-addresses"}},[t._v("#")]),t._v(" A new way to generate addresses")]),t._v(" "),e("p",[t._v("The old "),e("code",[t._v("get_new_address()")]),t._v(" method has been upgraded into a more generic "),e("code",[t._v("get_address()")]),t._v(", which takes a "),e("a",{attrs:{href:"https://docs.rs/bdk/0.6.0/bdk/wallet/enum.AddressIndex.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("AddressIndex")]),e("OutboundLink")],1),t._v(" argument. "),e("code",[t._v("AddressIndex")]),t._v(" is defined as an enum with the following variants:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("AddressIndex::New")]),t._v(" increments the derivation index stored in the database and returns a new address. It's equivalent to the old "),e("code",[t._v("get_new_address()")]),t._v(".")]),t._v(" "),e("li",[e("code",[t._v("AddressIndex::LastUnused")]),t._v(" returns the address for the current derivation index if no usage has been detected. "),e("code",[t._v("sync()")]),t._v(" should be called to ensure the internal database is up to date.")]),t._v(" "),e("li",[e("code",[t._v("AddressIndex::Peek(index)")]),t._v(" returns the address at a given derivation index, without updating the database.")]),t._v(" "),e("li",[e("code",[t._v("AddressIndex::Reset(index)")]),t._v(" returns the address at a given derivation index, and stores that value in the database.")])]),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("// Prints the first ten addresses without updating the derivation index")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" index "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),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 number"}},[t._v("10")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address #{}: {}"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[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("get_address")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Peek")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("index"),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(")")]),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("h3",{attrs:{id:"easier-multiparty-transaction-creation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#easier-multiparty-transaction-creation"}},[t._v("#")]),t._v(" Easier multiparty transaction creation")]),t._v(" "),e("p",[t._v("A new method called "),e("a",{attrs:{href:"https://docs.rs/bdk/0.6.0/bdk/wallet/struct.Wallet.html#method.get_psbt_input",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("get_psbt_input()")]),e("OutboundLink")],1),t._v(" has been added to the "),e("code",[t._v("Wallet")]),t._v(" structure, and it makes it very easy to get a complete PSBT input with all the required metadata for a given UTXO. This can be very convenient\nwhen working with "),e("code",[t._v("add_foreign_utxo()")]),t._v(", which was added in the previous release:")]),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("// On Alice's wallet")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" alice_utxo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LocalUtxo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),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(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" alice_psbt_input "),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("get_psbt_input")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("alice_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),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 function"}},[t._v("send_input_to_bob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("alice_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("outpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" alice_psbt_input"),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("// On Bob's wallet")]),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_bob"),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("\nbuilder\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("addr"),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("60_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("add_foreign_utxo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("alice_outpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" alice_psbt_input"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" satisfaction_weight"),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("h3",{attrs:{id:"renamed-types"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#renamed-types"}},[t._v("#")]),t._v(" Renamed types")]),t._v(" "),e("p",[t._v("To keep our coding style in line with the best practices defined by the Rust language, we've renamed some of our types and enum variants to avoid using "),e("a",{attrs:{href:"https://rust-lang.github.io/rust-clippy/master/index.html#upper_case_acronyms",target:"_blank",rel:"noopener noreferrer"}},[t._v("upper case acronyms"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Some examples are:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("UTXO")]),t._v(" -> "),e("code",[t._v("Utxo")])]),t._v(" "),e("li",[e("code",[t._v("RBFValue")]),t._v(" -> "),e("code",[t._v("RbfValue")])]),t._v(" "),e("li",[e("code",[t._v("BIP69Lexicographic")]),t._v(" -> "),e("code",[t._v("Bip69Lexicographic")])]),t._v(" "),e("li",[e("code",[t._v("P2PKH")]),t._v(" -> "),e("code",[t._v("P2Pkh")])]),t._v(" "),e("li",[e("code",[t._v("BIP44Public")]),t._v(" -> "),e("code",[t._v("Bip44Public")])])]),t._v(" "),e("h3",{attrs:{id:"new-msrv"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#new-msrv"}},[t._v("#")]),t._v(" New MSRV")]),t._v(" "),e("p",[t._v("Due to some changes in one of our dependency, our MSRV has been bumped up from "),e("code",[t._v("1.45")]),t._v(" to "),e("code",[t._v("1.46")]),t._v(", which was released in August 2020. The last release fully supporting "),e("code",[t._v("1.45")]),t._v(" is "),e("code",[t._v("v0.5.1")]),t._v(".")]),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.5.1")]),t._v(" release around a month ago, we've had "),e("code",[t._v("37")]),t._v(" new commits made by "),e("code",[t._v("7")]),t._v(" different contributors for a total of "),e("code",[t._v("1092")]),t._v(" additions and "),e("code",[t._v("548")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.5.1...v0.6.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/da-kami",target:"_blank",rel:"noopener noreferrer"}},[t._v("@da-kami"),e("OutboundLink")],1),t._v(" - Daniel Karzel")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/74.14df57b0.js b/assets/js/74.838f750f.js similarity index 99% rename from assets/js/74.14df57b0.js rename to assets/js/74.838f750f.js index 4ea1185c8f..45db7aa3dd 100644 --- a/assets/js/74.14df57b0.js +++ b/assets/js/74.838f750f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{433: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([[74],{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 diff --git a/assets/js/75.7daa354a.js b/assets/js/75.4495d57e.js similarity index 99% rename from assets/js/75.7daa354a.js rename to assets/js/75.4495d57e.js index 831dbf9dcd..fc93912b90 100644 --- a/assets/js/75.7daa354a.js +++ b/assets/js/75.4495d57e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{432: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/76.66885991.js b/assets/js/76.4267798e.js similarity index 99% rename from assets/js/76.66885991.js rename to assets/js/76.4267798e.js index 5594b4af47..23ef828794 100644 --- a/assets/js/76.66885991.js +++ b/assets/js/76.4267798e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{432: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("A new release of BDK is out: "),e("a",{attrs:{href:"https://crates.io/crates/bdk/0.9.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.9.0")]),e("OutboundLink")],1),t._v(" brings support for Bitcoin Core backends, more sanity checks and bugfixes.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/7a9b691f68c41116dc7857bc0267a2e3b2eafdd3/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.9.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v090"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v090"}},[t._v("#")]),t._v(" What's new in v0.9.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h2",{attrs:{id:"bitcoin-core-blockchain-backend"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-core-blockchain-backend"}},[t._v("#")]),t._v(" Bitcoin Core "),e("code",[t._v("Blockchain")]),t._v(" Backend")]),t._v(" "),e("p",[t._v("This release finally adds support for using a Bitcoin Core node as the "),e("code",[t._v("Blockchain")]),t._v(" backend for a wallet, through the RPC. This is still considered experimental for the time being, since there are a few missing\nthings that we'd like to add, and adding those could force us to change the API a little.")]),t._v(" "),e("p",[t._v("Nonetheless, if you don't mind a breaking-change later on it's already fully functional.")]),t._v(" "),e("p",[t._v("The backend works by importing addresses in Bitcoin Core using the "),e("code",[t._v("importmulti")]),t._v(" call.")]),t._v(" "),e("p",[t._v("Using it is pretty straightforward, here's a quick example:")]),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(" config "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:18332"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),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 auth"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoincore_rpc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CookieFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/home/user/.bitcoin/.cookie"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),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 network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wallet_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wallet_name"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),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 skip_blocks"),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(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Similarly to the compact filters backend, the "),e("code",[t._v("skip_blocks")]),t._v(" field allows for starting a rescan of the blockchain at a given height rather than the genesis, saving some time. The rescan is only performed once, the\nfirst time an address is imported. Afterwards every "),e("code",[t._v("sync()")]),t._v(" call will only perform a few queries on the node and it will be much faster.")]),t._v(" "),e("h2",{attrs:{id:"updated-transactiondetails-struct"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#updated-transactiondetails-struct"}},[t._v("#")]),t._v(" Updated "),e("code",[t._v("TransactionDetails")]),t._v(" Struct")]),t._v(" "),e("p",[t._v("To better accomodate the Bitcoin Core RPC and potentially more future new backends, the "),e("a",{attrs:{href:"https://docs.rs/bdk/0.9.0/bdk/struct.TransactionDetails.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("TransactionDetails")]),e("OutboundLink")],1),t._v(" structure have been updated as follows:")]),t._v(" "),e("ul",[e("li",[t._v("The "),e("code",[t._v("fees")]),t._v(" field has been renamed to "),e("code",[t._v("fee")]),t._v(" and it has been made optional. "),e("code",[t._v("Blockchain")]),t._v(" backends can set this to "),e("code",[t._v("None")]),t._v(" when they have no way of computing the fee of a transaction")]),t._v(" "),e("li",[t._v("The "),e("code",[t._v("timestamp")]),t._v(" and "),e("code",[t._v("height")]),t._v(" fields have been merged into an optional "),e("a",{attrs:{href:"https://docs.rs/bdk/0.9.0/bdk/struct.ConfirmationTime.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("ConfirmationTime")]),e("OutboundLink")],1),t._v(" struct")])]),t._v(" "),e("h2",{attrs:{id:"verify-downloaded-txs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verify-downloaded-txs"}},[t._v("#")]),t._v(" Verify Downloaded TXs")]),t._v(" "),e("p",[t._v("This release also introduces an opt-in feature called "),e("code",[t._v("verify")]),t._v(" that can be enabled to verify the unconfirmed transactions that BDK downloads from untrusted sources like Electrum servers.")]),t._v(" "),e("p",[t._v('Verifying the transactions against the consensus rules can be an additional protection against some kind of attacks that could trick a wallet into creating wrong RBF (BIP 125) "bump" transactions. Check out '),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/352",target:"_blank",rel:"noopener noreferrer"}},[t._v("the issue"),e("OutboundLink")],1),t._v("\nfor more details.")]),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.8.0")]),t._v(" release around a month ago, we've had "),e("code",[t._v("45")]),t._v(" new commits made by "),e("code",[t._v("6")]),t._v(" different contributors for a total of "),e("code",[t._v("1336")]),t._v(" additions and "),e("code",[t._v("266")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.8.0...v0.9.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",[t._v("[@jb55][@jb55] - William Casarin")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{434: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("A new release of BDK is out: "),e("a",{attrs:{href:"https://crates.io/crates/bdk/0.9.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.9.0")]),e("OutboundLink")],1),t._v(" brings support for Bitcoin Core backends, more sanity checks and bugfixes.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/7a9b691f68c41116dc7857bc0267a2e3b2eafdd3/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.9.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v090"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v090"}},[t._v("#")]),t._v(" What's new in v0.9.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h2",{attrs:{id:"bitcoin-core-blockchain-backend"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-core-blockchain-backend"}},[t._v("#")]),t._v(" Bitcoin Core "),e("code",[t._v("Blockchain")]),t._v(" Backend")]),t._v(" "),e("p",[t._v("This release finally adds support for using a Bitcoin Core node as the "),e("code",[t._v("Blockchain")]),t._v(" backend for a wallet, through the RPC. This is still considered experimental for the time being, since there are a few missing\nthings that we'd like to add, and adding those could force us to change the API a little.")]),t._v(" "),e("p",[t._v("Nonetheless, if you don't mind a breaking-change later on it's already fully functional.")]),t._v(" "),e("p",[t._v("The backend works by importing addresses in Bitcoin Core using the "),e("code",[t._v("importmulti")]),t._v(" call.")]),t._v(" "),e("p",[t._v("Using it is pretty straightforward, here's a quick example:")]),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(" config "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:18332"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),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 auth"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoincore_rpc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CookieFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/home/user/.bitcoin/.cookie"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),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 network"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wallet_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wallet_name"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),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 skip_blocks"),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(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Similarly to the compact filters backend, the "),e("code",[t._v("skip_blocks")]),t._v(" field allows for starting a rescan of the blockchain at a given height rather than the genesis, saving some time. The rescan is only performed once, the\nfirst time an address is imported. Afterwards every "),e("code",[t._v("sync()")]),t._v(" call will only perform a few queries on the node and it will be much faster.")]),t._v(" "),e("h2",{attrs:{id:"updated-transactiondetails-struct"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#updated-transactiondetails-struct"}},[t._v("#")]),t._v(" Updated "),e("code",[t._v("TransactionDetails")]),t._v(" Struct")]),t._v(" "),e("p",[t._v("To better accomodate the Bitcoin Core RPC and potentially more future new backends, the "),e("a",{attrs:{href:"https://docs.rs/bdk/0.9.0/bdk/struct.TransactionDetails.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("TransactionDetails")]),e("OutboundLink")],1),t._v(" structure have been updated as follows:")]),t._v(" "),e("ul",[e("li",[t._v("The "),e("code",[t._v("fees")]),t._v(" field has been renamed to "),e("code",[t._v("fee")]),t._v(" and it has been made optional. "),e("code",[t._v("Blockchain")]),t._v(" backends can set this to "),e("code",[t._v("None")]),t._v(" when they have no way of computing the fee of a transaction")]),t._v(" "),e("li",[t._v("The "),e("code",[t._v("timestamp")]),t._v(" and "),e("code",[t._v("height")]),t._v(" fields have been merged into an optional "),e("a",{attrs:{href:"https://docs.rs/bdk/0.9.0/bdk/struct.ConfirmationTime.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("ConfirmationTime")]),e("OutboundLink")],1),t._v(" struct")])]),t._v(" "),e("h2",{attrs:{id:"verify-downloaded-txs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verify-downloaded-txs"}},[t._v("#")]),t._v(" Verify Downloaded TXs")]),t._v(" "),e("p",[t._v("This release also introduces an opt-in feature called "),e("code",[t._v("verify")]),t._v(" that can be enabled to verify the unconfirmed transactions that BDK downloads from untrusted sources like Electrum servers.")]),t._v(" "),e("p",[t._v('Verifying the transactions against the consensus rules can be an additional protection against some kind of attacks that could trick a wallet into creating wrong RBF (BIP 125) "bump" transactions. Check out '),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/352",target:"_blank",rel:"noopener noreferrer"}},[t._v("the issue"),e("OutboundLink")],1),t._v("\nfor more details.")]),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.8.0")]),t._v(" release around a month ago, we've had "),e("code",[t._v("45")]),t._v(" new commits made by "),e("code",[t._v("6")]),t._v(" different contributors for a total of "),e("code",[t._v("1336")]),t._v(" additions and "),e("code",[t._v("266")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.8.0...v0.9.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",[t._v("[@jb55][@jb55] - William Casarin")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/77.04fe3c48.js b/assets/js/77.9a59379f.js similarity index 99% rename from assets/js/77.04fe3c48.js rename to assets/js/77.9a59379f.js index ddb7b5e7df..ec89a58672 100644 --- a/assets/js/77.04fe3c48.js +++ b/assets/js/77.9a59379f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{434:function(e,t,o){"use strict";o.r(t);var a=o(7),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Over the past few months the work on "),t("a",{attrs:{href:"https://github.com/LLFourn/bdk_core_staging",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk_core"),t("OutboundLink")],1),e._v(" quietly continued behind the scenes, and as the time went on it started expanding beyond the scope of just improving the "),t("em",[e._v("syncing")]),e._v(" mechanism of BDK. Being a new fresh\nproject it allowed for iterating much faster, and we soon realized we could make large improvements to the general architecture of BDK to fix many of the issues and shortcomings found over time.")]),e._v(" "),t("p",[e._v("For this reason, we decided to move forward with the project and start planning the integration into BDK itself. This blog post will briefly describe the new concept for how BDK will be structured and lay down a plan\nfor the development in the next few months.")]),e._v(" "),t("h2",{attrs:{id:"goals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#goals"}},[e._v("#")]),e._v(" Goals")]),e._v(" "),t("p",[e._v("First of all, we should outline at least the main goals of BDK 1.0, ergo what we want to improve over the current state of the project.")]),e._v(" "),t("h3",{attrs:{id:"stable-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stable-api"}},[e._v("#")]),e._v(" Stable API")]),e._v(" "),t("p",[e._v("Ever since the "),t("code",[e._v("0.1.0")]),e._v(" release of BDK we've always broken the API with each release. Most of the time in minor and very contained ways, but in "),t("em",[e._v("some")]),e._v(" way nonetheless. One of the main sources of breakage have been\nthe "),t("code",[e._v("Blockchain")]),e._v(" and "),t("code",[e._v("Database")]),e._v(" traits. Those two together are used in essentially any operation a user may do on a "),t("code",[e._v("Wallet")]),e._v(", and are thus impacted by any relatively large change or new feature added to the code.")]),e._v(" "),t("p",[e._v("Want to "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/515",target:"_blank",rel:"noopener noreferrer"}},[e._v("keep track of whether a UTXO is spent"),t("OutboundLink")],1),e._v("? You need to change the "),t("code",[e._v("Database")]),e._v(" that stores this information. Want to "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/669",target:"_blank",rel:"noopener noreferrer"}},[e._v("know the timestamp of the latest block"),t("OutboundLink")],1),e._v("?\nYou need to change the "),t("code",[e._v("Blockchain")]),e._v(" trait to fetch that extra bit of information. And the list goes on and on.")]),e._v(" "),t("p",[e._v("Since making changes to these traits is always so painful for us and our downstream users, this ended up delaying or considerably slowing down the development of new features in BDK.")]),e._v(" "),t("p",[e._v("bdk_core tries to minimize the (ab)use of traits, and this will help immensely when trying to provide a stable API for our users.")]),e._v(" "),t("h3",{attrs:{id:"upstreaming-our-code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upstreaming-our-code"}},[e._v("#")]),e._v(" Upstreaming our code")]),e._v(" "),t("p",[e._v("BDK internally implements many features that could be useful to other projects as well. While working on this integration we will also try to upstream some of our code to the relevant crates, mainly "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("rust-miniscript")]),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("This has essentially three benefits:")]),e._v(" "),t("ol",[t("li",[e._v("A new set of eyes will take a look at the code, potentially spotting issues or suggesting improvements")]),e._v(" "),t("li",[e._v("This will lower the amount of code that we have to maintain ourselves")]),e._v(" "),t("li",[e._v("Other people can benefit from our code, which was previously tightly integrated into BDK and hard to re-use")])]),e._v(" "),t("h3",{attrs:{id:"partially-syncing-a-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#partially-syncing-a-wallet"}},[e._v("#")]),e._v(" Partially Syncing a Wallet")]),e._v(" "),t("p",[e._v("This single point was the main reason the bdk_core project was kickstarted, and it means giving our users the ability to incrementally sync a wallet over time instead of working in single big batches.")]),e._v(" "),t("p",[e._v("This is explained very well in the "),t("RouterLink",{attrs:{to:"/blog/bdk-core-pt1/"}},[e._v("first bdk_core post")]),e._v(", so I won't go into details here. Think of this as a much more flexible way to sync a wallet, which in turn will allow us to simplify our current implementation\nof blockchain backends like compact block filters, and also offer a better API for our users.")],1),e._v(" "),t("h3",{attrs:{id:"no-std"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#no-std"}},[e._v("#")]),e._v(" "),t("code",[e._v("no_std")])]),e._v(" "),t("p",[e._v("bdk_core is built with "),t("code",[e._v("no_std")]),e._v(" in mind since the beginning, something we've been wanting to support in BDK "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/205",target:"_blank",rel:"noopener noreferrer"}},[e._v("for a long time"),t("OutboundLink")],1),e._v('. Being more modular means the "core" module doesn\'t really need that many dependencies,\nand this really simplifies the '),t("code",[e._v("no_std")]),e._v(" work.")]),e._v(" "),t("p",[e._v("This will allow the main components of BDK to work on embedded hardware as well, making it possible to use the library as a foundation for any Bitcoin hardware device like hardware wallets.")]),e._v(" "),t("h3",{attrs:{id:"lower-msrv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lower-msrv"}},[e._v("#")]),e._v(" Lower MSRV")]),e._v(" "),t("p",[e._v("Removing many of our current dependencies from the core components of BDK will also allow us to lower our MSRV considerably, which in turn will allow BDK to compile on older distros or entirely different toolchains like\n"),t("a",{attrs:{href:"https://github.com/thepowersgang/mrustc",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("mrustc")]),t("OutboundLink")],1),e._v(", which usually don't keep up with "),t("code",[e._v("rustc")]),e._v(" in terms of language features.")]),e._v(" "),t("h2",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("Roughly speaking, after integrating bdk_core into BDK the architecture will look like this:")]),e._v(" "),t("ul",[t("li",[e._v("bdk_core: this crate will contain all the low level components of a Bitcoin wallet. For example, using this low level API it will be possible to keep track of arbitrary scripts (without the limitations"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v("\nof descriptors) or apply individual blocks to the state of the wallet")]),e._v(" "),t("li",[e._v("bdk_compat: this crate will use the components provided by bdk_core to implement a descriptor-based wallet that supports up to two "),t("em",[e._v("keychains")]),e._v(", like our current "),t("code",[e._v("Wallet")]),e._v(" implementation does. It will allow our\nusers to upgrade to BDK 1.0 with minimal changes to their code, but being a compatibility layer it will probably lack many of the advanced features that bdk_core brings to the table")]),e._v(" "),t("li",[e._v("bdk_"),t("em",[e._v("")]),e._v(": the blockchain backends like Esplora, Electrum, RPC, will be moved into individual separate crates that users can decide to include individually")])]),e._v(" "),t("h2",{attrs:{id:"timeline"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#timeline"}},[e._v("#")]),e._v(" Timeline")]),e._v(" "),t("p",[e._v("We can't provide a precise timeline because it's a big development effort and it also depends on some relatively large PRs making into upstream project. That said, here's our rough plan:")]),e._v(" "),t("ol",[t("li",[e._v("October: during this month we will work on opening a PR to integrate bdk_core into BDK")]),e._v(" "),t("li",[e._v("November: review of the PR, work on upstreaming our code to "),t("code",[e._v("rust-miniscript")])]),e._v(" "),t("li",[e._v("December: finishing touches, examples, documentation")])]),e._v(" "),t("h2",{attrs:{id:"feature-freezing-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#feature-freezing-bdk"}},[e._v("#")]),e._v(" Feature Freezing BDK")]),e._v(" "),t("p",[e._v("With our focus shifting to bdk_core we are officially "),t("em",[e._v("feature freezing")]),e._v(" BDK starting from release "),t("code",[e._v("0.23")]),e._v(" (which will be published on October 6th). This means that we won't be adding any new features to BDK until the\nintegration is completed, because it takes a lot of effort to implement and/or review them, and there's the risk that most of the code will have to be re-done or thrown away anyway when moving to bdk_core.")]),e._v(" "),t("p",[e._v("A notable exception to this rule will be the upcoming "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/770",target:"_blank",rel:"noopener noreferrer"}},[e._v("upgrade to "),t("code",[e._v("rust-bitcoin")]),e._v(" "),t("code",[e._v("0.29")]),t("OutboundLink")],1),e._v(", which is now planned for the release "),t("code",[e._v("0.24")]),e._v(" since "),t("code",[e._v("rust-miniscript")]),e._v(" "),t("code",[e._v("8.0.0")]),e._v(" hasn't been released in time for "),t("code",[e._v("0.23")]),e._v(".")]),e._v(" "),t("p",[e._v("During this feature freeze period we will keep maintaining the library, updating our dependencies, fixing bugs and making releases accordingly.")]),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("This is an exciting new development for BDK, a well needed refresh to an architecture that hasn't changed much over time, but that it's starting to show its age. This integration will open up so many new possibilities\nfor our downstream users, and it's a major step towards our goal of providing simple, yet powerful tools for Bitcoin developers 🚀.")]),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("Not every script can be expressed as descriptor "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{433:function(e,t,o){"use strict";o.r(t);var a=o(7),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Over the past few months the work on "),t("a",{attrs:{href:"https://github.com/LLFourn/bdk_core_staging",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk_core"),t("OutboundLink")],1),e._v(" quietly continued behind the scenes, and as the time went on it started expanding beyond the scope of just improving the "),t("em",[e._v("syncing")]),e._v(" mechanism of BDK. Being a new fresh\nproject it allowed for iterating much faster, and we soon realized we could make large improvements to the general architecture of BDK to fix many of the issues and shortcomings found over time.")]),e._v(" "),t("p",[e._v("For this reason, we decided to move forward with the project and start planning the integration into BDK itself. This blog post will briefly describe the new concept for how BDK will be structured and lay down a plan\nfor the development in the next few months.")]),e._v(" "),t("h2",{attrs:{id:"goals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#goals"}},[e._v("#")]),e._v(" Goals")]),e._v(" "),t("p",[e._v("First of all, we should outline at least the main goals of BDK 1.0, ergo what we want to improve over the current state of the project.")]),e._v(" "),t("h3",{attrs:{id:"stable-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stable-api"}},[e._v("#")]),e._v(" Stable API")]),e._v(" "),t("p",[e._v("Ever since the "),t("code",[e._v("0.1.0")]),e._v(" release of BDK we've always broken the API with each release. Most of the time in minor and very contained ways, but in "),t("em",[e._v("some")]),e._v(" way nonetheless. One of the main sources of breakage have been\nthe "),t("code",[e._v("Blockchain")]),e._v(" and "),t("code",[e._v("Database")]),e._v(" traits. Those two together are used in essentially any operation a user may do on a "),t("code",[e._v("Wallet")]),e._v(", and are thus impacted by any relatively large change or new feature added to the code.")]),e._v(" "),t("p",[e._v("Want to "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/515",target:"_blank",rel:"noopener noreferrer"}},[e._v("keep track of whether a UTXO is spent"),t("OutboundLink")],1),e._v("? You need to change the "),t("code",[e._v("Database")]),e._v(" that stores this information. Want to "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/669",target:"_blank",rel:"noopener noreferrer"}},[e._v("know the timestamp of the latest block"),t("OutboundLink")],1),e._v("?\nYou need to change the "),t("code",[e._v("Blockchain")]),e._v(" trait to fetch that extra bit of information. And the list goes on and on.")]),e._v(" "),t("p",[e._v("Since making changes to these traits is always so painful for us and our downstream users, this ended up delaying or considerably slowing down the development of new features in BDK.")]),e._v(" "),t("p",[e._v("bdk_core tries to minimize the (ab)use of traits, and this will help immensely when trying to provide a stable API for our users.")]),e._v(" "),t("h3",{attrs:{id:"upstreaming-our-code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upstreaming-our-code"}},[e._v("#")]),e._v(" Upstreaming our code")]),e._v(" "),t("p",[e._v("BDK internally implements many features that could be useful to other projects as well. While working on this integration we will also try to upstream some of our code to the relevant crates, mainly "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("rust-miniscript")]),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("This has essentially three benefits:")]),e._v(" "),t("ol",[t("li",[e._v("A new set of eyes will take a look at the code, potentially spotting issues or suggesting improvements")]),e._v(" "),t("li",[e._v("This will lower the amount of code that we have to maintain ourselves")]),e._v(" "),t("li",[e._v("Other people can benefit from our code, which was previously tightly integrated into BDK and hard to re-use")])]),e._v(" "),t("h3",{attrs:{id:"partially-syncing-a-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#partially-syncing-a-wallet"}},[e._v("#")]),e._v(" Partially Syncing a Wallet")]),e._v(" "),t("p",[e._v("This single point was the main reason the bdk_core project was kickstarted, and it means giving our users the ability to incrementally sync a wallet over time instead of working in single big batches.")]),e._v(" "),t("p",[e._v("This is explained very well in the "),t("RouterLink",{attrs:{to:"/blog/bdk-core-pt1/"}},[e._v("first bdk_core post")]),e._v(", so I won't go into details here. Think of this as a much more flexible way to sync a wallet, which in turn will allow us to simplify our current implementation\nof blockchain backends like compact block filters, and also offer a better API for our users.")],1),e._v(" "),t("h3",{attrs:{id:"no-std"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#no-std"}},[e._v("#")]),e._v(" "),t("code",[e._v("no_std")])]),e._v(" "),t("p",[e._v("bdk_core is built with "),t("code",[e._v("no_std")]),e._v(" in mind since the beginning, something we've been wanting to support in BDK "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/205",target:"_blank",rel:"noopener noreferrer"}},[e._v("for a long time"),t("OutboundLink")],1),e._v('. Being more modular means the "core" module doesn\'t really need that many dependencies,\nand this really simplifies the '),t("code",[e._v("no_std")]),e._v(" work.")]),e._v(" "),t("p",[e._v("This will allow the main components of BDK to work on embedded hardware as well, making it possible to use the library as a foundation for any Bitcoin hardware device like hardware wallets.")]),e._v(" "),t("h3",{attrs:{id:"lower-msrv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lower-msrv"}},[e._v("#")]),e._v(" Lower MSRV")]),e._v(" "),t("p",[e._v("Removing many of our current dependencies from the core components of BDK will also allow us to lower our MSRV considerably, which in turn will allow BDK to compile on older distros or entirely different toolchains like\n"),t("a",{attrs:{href:"https://github.com/thepowersgang/mrustc",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("mrustc")]),t("OutboundLink")],1),e._v(", which usually don't keep up with "),t("code",[e._v("rustc")]),e._v(" in terms of language features.")]),e._v(" "),t("h2",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("Roughly speaking, after integrating bdk_core into BDK the architecture will look like this:")]),e._v(" "),t("ul",[t("li",[e._v("bdk_core: this crate will contain all the low level components of a Bitcoin wallet. For example, using this low level API it will be possible to keep track of arbitrary scripts (without the limitations"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v("\nof descriptors) or apply individual blocks to the state of the wallet")]),e._v(" "),t("li",[e._v("bdk_compat: this crate will use the components provided by bdk_core to implement a descriptor-based wallet that supports up to two "),t("em",[e._v("keychains")]),e._v(", like our current "),t("code",[e._v("Wallet")]),e._v(" implementation does. It will allow our\nusers to upgrade to BDK 1.0 with minimal changes to their code, but being a compatibility layer it will probably lack many of the advanced features that bdk_core brings to the table")]),e._v(" "),t("li",[e._v("bdk_"),t("em",[e._v("")]),e._v(": the blockchain backends like Esplora, Electrum, RPC, will be moved into individual separate crates that users can decide to include individually")])]),e._v(" "),t("h2",{attrs:{id:"timeline"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#timeline"}},[e._v("#")]),e._v(" Timeline")]),e._v(" "),t("p",[e._v("We can't provide a precise timeline because it's a big development effort and it also depends on some relatively large PRs making into upstream project. That said, here's our rough plan:")]),e._v(" "),t("ol",[t("li",[e._v("October: during this month we will work on opening a PR to integrate bdk_core into BDK")]),e._v(" "),t("li",[e._v("November: review of the PR, work on upstreaming our code to "),t("code",[e._v("rust-miniscript")])]),e._v(" "),t("li",[e._v("December: finishing touches, examples, documentation")])]),e._v(" "),t("h2",{attrs:{id:"feature-freezing-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#feature-freezing-bdk"}},[e._v("#")]),e._v(" Feature Freezing BDK")]),e._v(" "),t("p",[e._v("With our focus shifting to bdk_core we are officially "),t("em",[e._v("feature freezing")]),e._v(" BDK starting from release "),t("code",[e._v("0.23")]),e._v(" (which will be published on October 6th). This means that we won't be adding any new features to BDK until the\nintegration is completed, because it takes a lot of effort to implement and/or review them, and there's the risk that most of the code will have to be re-done or thrown away anyway when moving to bdk_core.")]),e._v(" "),t("p",[e._v("A notable exception to this rule will be the upcoming "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/770",target:"_blank",rel:"noopener noreferrer"}},[e._v("upgrade to "),t("code",[e._v("rust-bitcoin")]),e._v(" "),t("code",[e._v("0.29")]),t("OutboundLink")],1),e._v(", which is now planned for the release "),t("code",[e._v("0.24")]),e._v(" since "),t("code",[e._v("rust-miniscript")]),e._v(" "),t("code",[e._v("8.0.0")]),e._v(" hasn't been released in time for "),t("code",[e._v("0.23")]),e._v(".")]),e._v(" "),t("p",[e._v("During this feature freeze period we will keep maintaining the library, updating our dependencies, fixing bugs and making releases accordingly.")]),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("This is an exciting new development for BDK, a well needed refresh to an architecture that hasn't changed much over time, but that it's starting to show its age. This integration will open up so many new possibilities\nfor our downstream users, and it's a major step towards our goal of providing simple, yet powerful tools for Bitcoin developers 🚀.")]),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("Not every script can be expressed as descriptor "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/79.0f18b068.js b/assets/js/79.d79ff7c8.js similarity index 99% rename from assets/js/79.0f18b068.js rename to assets/js/79.d79ff7c8.js index 74821af51c..31696df84e 100644 --- a/assets/js/79.0f18b068.js +++ b/assets/js/79.d79ff7c8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{437: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/80.461c8ca0.js b/assets/js/80.00db3e80.js similarity index 98% rename from assets/js/80.461c8ca0.js rename to assets/js/80.00db3e80.js index 7f661892a3..ef3a2be453 100644 --- a/assets/js/80.461c8ca0.js +++ b/assets/js/80.00db3e80.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{443: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([[80],{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 diff --git a/assets/js/81.19e974ad.js b/assets/js/81.9b9729b4.js similarity index 99% rename from assets/js/81.19e974ad.js rename to assets/js/81.9b9729b4.js index 2c091446f1..687c3f30e7 100644 --- a/assets/js/81.19e974ad.js +++ b/assets/js/81.9b9729b4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{447: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([[81],{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 diff --git a/assets/js/82.0030c9cf.js b/assets/js/82.be3040bb.js similarity index 98% rename from assets/js/82.0030c9cf.js rename to assets/js/82.be3040bb.js index d44d911d22..e91cb56509 100644 --- a/assets/js/82.0030c9cf.js +++ b/assets/js/82.be3040bb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{448: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/83.4170d6d2.js b/assets/js/83.87fb0ce4.js similarity index 99% rename from assets/js/83.4170d6d2.js rename to assets/js/83.87fb0ce4.js index 623079b472..4dc734c05f 100644 --- a/assets/js/83.4170d6d2.js +++ b/assets/js/83.87fb0ce4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{448: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("h1",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The only requirement to run the "),e("code",[t._v("bdk-cli")]),t._v(" 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 "),e("a",{attrs:{href:"https://rustup.rs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("rustup.rs"),e("OutboundLink")],1),t._v(". You can head there and\nfollow their instructions, after which you can test if everything went fine by running\n"),e("code",[t._v("cargo version")]),t._v(", which should print something like:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("cargo 1.56.0 (4ed5d137b 2021-10-04)\n")])])]),e("p",[t._v("As an alternative to installing the Rust toolchain, you can try using a\n"),e("a",{attrs:{href:"https://hub.docker.com/_/rust",target:"_blank",rel:"noopener noreferrer"}},[t._v("Docker image"),e("OutboundLink")],1),t._v(" and working inside of it, but that's meant for more\nadvanced users and won't be covered in this guide.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("At the time of writing, the project requires cargo >= 1.56.0, which is our minimum supported rust version (MSRV) as of May 2022. If you have an older version installed with rustup.rs, you can upgrade it with "),e("code",[t._v("rustup update")]),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"installing-the-bdk-cli-tool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-bdk-cli-tool"}},[t._v("#")]),t._v(" Installing the "),e("code",[t._v("bdk-cli")]),t._v(" tool")]),t._v(" "),e("p",[t._v("Once Cargo is installed, you can proceed to install the interactive "),e("code",[t._v("bdk-cli")]),t._v(" tool directly from\nthe GitHub repository, by running:")]),t._v(" "),e("p",[t._v("All features with the blocking esplora client")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/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("esplora-ureq,compiler\n")])])]),e("p",[t._v("All features with the async esplora client")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/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("esplora-reqwest,compiler\n")])])]),e("p",[t._v("Minimal install (only repl feature is on by default)")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/bdk-cli\n")])])]),e("p",[t._v("For Windows users, the default SQLite database requires extensive configuration and "),e("code",[t._v("bdk-cli")]),t._v(" will not build properly if SQLite is unconfigured. To proceed with the installation using "),e("code",[t._v("sled")]),t._v(" instead, run:")]),t._v(" "),e("p",[t._v("Disable sqlite and use sled")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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 --no-default-features "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--features")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("key-value-db,esplora-ureq,compiler\n")])])]),e("p",[t._v("This command may take a while to finish, since it will fetch and compile all the dependencies and the "),e("code",[t._v("bdk")]),t._v(" library itself.")]),t._v(" "),e("p",[t._v("Once it's done, you can check if everything went fine by running "),e("code",[t._v("bdk-cli --help")]),t._v(" which should print something like this:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("bdk-cli 0.5.0\nAlekos Filini :Riccardo Casatta :Steve Myers \nThe BDK Command Line Wallet App\n\nbdk-cli is a light weight command 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 in 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!\n\n\nUSAGE:\n bdk-cli [OPTIONS] \n\nFLAGS:\n -h, --help \n Prints help information\n\n -V, --version \n Prints version information\n\n\nOPTIONS:\n -n, --network \n Sets the network [default: testnet]\n\n\nSUBCOMMANDS:\n compile Compile a miniscript policy to an output descriptor\n help Prints this message or the help of the given subcommand(s)\n key Key Management Operations\n repl REPL command loop mode\n wallet Wallet Operations\n\n")])])]),e("p",[t._v("An example command to sync a testnet wallet to a default electrum server looks like this:")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("bdk-cli wallet "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-w")]),t._v(" example "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--descriptor")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh(tprv8ZgxMBicQKsPexGYyaFwnAsCXCjmz2FaTm6LtesyyihjbQE3gRMfXqQBXKM43DvC1UgRVv1qom1qFxNMSqVAs88qx9PhgFnfGVUdiiDf6j4/0/*)"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{447: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("h1",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("The only requirement to run the "),e("code",[t._v("bdk-cli")]),t._v(" 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 "),e("a",{attrs:{href:"https://rustup.rs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("rustup.rs"),e("OutboundLink")],1),t._v(". You can head there and\nfollow their instructions, after which you can test if everything went fine by running\n"),e("code",[t._v("cargo version")]),t._v(", which should print something like:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("cargo 1.56.0 (4ed5d137b 2021-10-04)\n")])])]),e("p",[t._v("As an alternative to installing the Rust toolchain, you can try using a\n"),e("a",{attrs:{href:"https://hub.docker.com/_/rust",target:"_blank",rel:"noopener noreferrer"}},[t._v("Docker image"),e("OutboundLink")],1),t._v(" and working inside of it, but that's meant for more\nadvanced users and won't be covered in this guide.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("At the time of writing, the project requires cargo >= 1.56.0, which is our minimum supported rust version (MSRV) as of May 2022. If you have an older version installed with rustup.rs, you can upgrade it with "),e("code",[t._v("rustup update")]),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"installing-the-bdk-cli-tool"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-bdk-cli-tool"}},[t._v("#")]),t._v(" Installing the "),e("code",[t._v("bdk-cli")]),t._v(" tool")]),t._v(" "),e("p",[t._v("Once Cargo is installed, you can proceed to install the interactive "),e("code",[t._v("bdk-cli")]),t._v(" tool directly from\nthe GitHub repository, by running:")]),t._v(" "),e("p",[t._v("All features with the blocking esplora client")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/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("esplora-ureq,compiler\n")])])]),e("p",[t._v("All features with the async esplora client")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/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("esplora-reqwest,compiler\n")])])]),e("p",[t._v("Minimal install (only repl feature is on by default)")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/bdk-cli\n")])])]),e("p",[t._v("For Windows users, the default SQLite database requires extensive configuration and "),e("code",[t._v("bdk-cli")]),t._v(" will not build properly if SQLite is unconfigured. To proceed with the installation using "),e("code",[t._v("sled")]),t._v(" instead, run:")]),t._v(" "),e("p",[t._v("Disable sqlite and use sled")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[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 --no-default-features "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--features")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("key-value-db,esplora-ureq,compiler\n")])])]),e("p",[t._v("This command may take a while to finish, since it will fetch and compile all the dependencies and the "),e("code",[t._v("bdk")]),t._v(" library itself.")]),t._v(" "),e("p",[t._v("Once it's done, you can check if everything went fine by running "),e("code",[t._v("bdk-cli --help")]),t._v(" which should print something like this:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("bdk-cli 0.5.0\nAlekos Filini :Riccardo Casatta :Steve Myers \nThe BDK Command Line Wallet App\n\nbdk-cli is a light weight command 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 in 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!\n\n\nUSAGE:\n bdk-cli [OPTIONS] \n\nFLAGS:\n -h, --help \n Prints help information\n\n -V, --version \n Prints version information\n\n\nOPTIONS:\n -n, --network \n Sets the network [default: testnet]\n\n\nSUBCOMMANDS:\n compile Compile a miniscript policy to an output descriptor\n help Prints this message or the help of the given subcommand(s)\n key Key Management Operations\n repl REPL command loop mode\n wallet Wallet Operations\n\n")])])]),e("p",[t._v("An example command to sync a testnet wallet to a default electrum server looks like this:")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("bdk-cli wallet "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-w")]),t._v(" example "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--descriptor")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh(tprv8ZgxMBicQKsPexGYyaFwnAsCXCjmz2FaTm6LtesyyihjbQE3gRMfXqQBXKM43DvC1UgRVv1qom1qFxNMSqVAs88qx9PhgFnfGVUdiiDf6j4/0/*)"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/88.2cc37ebc.js b/assets/js/88.c51bc3b5.js similarity index 99% rename from assets/js/88.2cc37ebc.js rename to assets/js/88.c51bc3b5.js index 89c3823da8..347d62e059 100644 --- a/assets/js/88.2cc37ebc.js +++ b/assets/js/88.c51bc3b5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{453:function(t,a,s){"use strict";s.r(a);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",{staticClass:"more-cases-heading"},[t._v("\n Meet the projects building with BDK\n")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{all:"All",mobile:"Mobile",desktop:"Desktop",hardware:"Hardware",web:"Web",custodial:"Custodial",exchange:"Exchange",infra:"Infrastructure"}},scopedSlots:t._u([{key:"mobile",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/stackmate-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[t._v("Stackmate")])]),t._v(" "),a("p",[t._v("A multi-purpose Bitcoin Wallet.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"exchange",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"desktop",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/anchorwatch-130.png"}})]),t._v(" "),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:"case-study-item"},[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/liana-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"hardware",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])])]},proxy:!0},{key:"custodial",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t._v("Seba Bank")])]),t._v(" "),a("p",[t._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])])])]},proxy:!0},{key:"infra",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])])])]},proxy:!0},{key:"web",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.caravanmultisig.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/caravan-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"all",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/anchorwatch-130.png"}})]),t._v(" "),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:"case-study-item"},[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.caravanmultisig.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/caravan-130.png"}})]),t._v(" "),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:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t._v("Seba Bank")])]),t._v(" "),a("p",[t._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/stackmate-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[t._v("Stackmate")])]),t._v(" "),a("p",[t._v("A multi-purpose Bitcoin Wallet.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})]),t._v(" "),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.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/liana-130.png"}})]),t._v(" "),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:"case-study-item"},[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("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.")])])])]},proxy:!0}])})],1)}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{452:function(t,a,s){"use strict";s.r(a);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",{staticClass:"more-cases-heading"},[t._v("\n Meet the projects building with BDK\n")]),t._v(" "),a("CodeSwitcher",{attrs:{languages:{all:"All",mobile:"Mobile",desktop:"Desktop",hardware:"Hardware",web:"Web",custodial:"Custodial",exchange:"Exchange",infra:"Infrastructure"}},scopedSlots:t._u([{key:"mobile",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/stackmate-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[t._v("Stackmate")])]),t._v(" "),a("p",[t._v("A multi-purpose Bitcoin Wallet.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"exchange",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"desktop",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/anchorwatch-130.png"}})]),t._v(" "),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:"case-study-item"},[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/liana-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"hardware",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])])])]},proxy:!0},{key:"custodial",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t._v("Seba Bank")])]),t._v(" "),a("p",[t._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])])])]},proxy:!0},{key:"infra",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])])])]},proxy:!0},{key:"web",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.caravanmultisig.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/caravan-130.png"}})]),t._v(" "),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.")])])])]},proxy:!0},{key:"all",fn:function(){return[a("div",{staticClass:"case-studies"},[a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/block-logo.gif"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitkey.build/",target:"_blank"}},[t._v("Bitkey")])]),t._v(" "),a("p",[t._v("Bitkey is the safe, easy way to own and manage bitcoin. It’s a mobile app, hardware device, and a set of recovery tools, for simple, secure self-custody.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/peach-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://peachbitcoin.com/",target:"_blank"}},[t._v("Peach Bitcoin")])]),t._v(" "),a("p",[t._v("Connecting Bitcoin buyers and sellers directly together. Buy or sell bitcoin peer-to-peer anywhere, at anytime.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/anchorwatch-130.png"}})]),t._v(" "),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:"case-study-item"},[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mutiny-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.mutinywallet.com/",target:"_blank"}},[t._v("Mutiny Wallet")])]),t._v(" "),a("p",[t._v("Mutiny is a self-custodial lightning wallet that runs in the browser.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/foundation-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://foundationdevices.com/",target:"_blank"}},[t._v("Envoy By Foundation")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet with powerful account management and privacy features. Use alongside your Passport hardware wallet to take true ownership of your Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/mempool-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://mempool.space/",target:"_blank"}},[t._v("mempool.space")])]),t._v(" "),a("p",[t._v("Explore the full Bitcoin ecosystem.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.caravanmultisig.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/caravan-130.png"}})]),t._v(" "),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:"case-study-item"},[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("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:"case-study-item"},[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lava-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.lava.xyz/",target:"_blank"}},[t._v("Lava")])]),t._v(" "),a("p",[t._v("The Future of Finance Available Today. Functional, safe and simple.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/ldk-node-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank"}},[t._v("LDK Node")])]),t._v(" "),a("p",[t._v("A ready-to-go Lightning node library built using LDK and BDK.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/padawan-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.goldenraven.padawanwallet",target:"_blank"}},[t._v("Padawan Wallet")])]),t._v(" "),a("p",[t._v("Padawan is a testnet-only bitcoin wallet packed with tutorials to learn how to use bitcoin on mobile.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/seba-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.seba.swiss/",target:"_blank"}},[t._v("Seba Bank")])]),t._v(" "),a("p",[t._v("From everyday banking to crypto custody and trading, get the most out of your assets with a regulated global crypto bank.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitmask-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://bitmask.app/",target:"_blank"}},[t._v("BitMask Wallet")])]),t._v(" "),a("p",[t._v("Your Gateway to DeepWeb3 on Bitcoin. A browser extension for decentralized applications on Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[a("img",{staticStyle:{"max-height":"130px"},attrs:{src:"/img/case-studies-logos/smart-vaults-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://www.smartvaults.io/",target:"_blank"}},[t._v("Smart Vaults")])]),t._v(" "),a("p",[t._v("Determine who, how, and when your Bitcoin can be accessed.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/galoy-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://galoy.io/",target:"_blank"}},[t._v("Galoy")])]),t._v(" "),a("p",[t._v("Bitcoin-native banking infrastructure for organizations.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/iris-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://play.google.com/store/apps/details?id=com.iriswallet.testnet",target:"_blank"}},[t._v("Iris Wallet")])]),t._v(" "),a("p",[t._v("Open-source wallet for Bitcoin and RGB assets.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/spotbit-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank"}},[t._v("Spotbit")])]),t._v(" "),a("p",[t._v("Spotbit is a portable API for Bitcoin price data and candles.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/stackmate-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://github.com/StackmateNetwork",target:"_blank"}},[t._v("Stackmate")])]),t._v(" "),a("p",[t._v("A multi-purpose Bitcoin Wallet.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lipa-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lipa.swiss/en",target:"_blank"}},[t._v("Lipa")])]),t._v(" "),a("p",[t._v("The Swiss app for cashless payments with Bitcoin.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/lexe-130.png"}})]),t._v(" "),a("h3",[a("a",{attrs:{href:"https://lexe.app/",target:"_blank"}},[t._v("Lexe Wallet")])]),t._v(" "),a("p",[t._v("Lexe is a self-custodial Bitcoin and Lightning wallet that can receive payments 24/7.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})]),t._v(" "),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.")])]),t._v(" "),a("div",{staticClass:"case-study-item"},[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/liana-130.png"}})]),t._v(" "),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:"case-study-item"},[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("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.")])])])]},proxy:!0}])})],1)}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/89.2a5dc28f.js b/assets/js/89.b992622e.js similarity index 99% rename from assets/js/89.2a5dc28f.js rename to assets/js/89.b992622e.js index 91fd4fcd8f..06324c716f 100644 --- a/assets/js/89.2a5dc28f.js +++ b/assets/js/89.b992622e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{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 diff --git a/assets/js/93.6b61d8cf.js b/assets/js/93.b8e7b566.js similarity index 99% rename from assets/js/93.6b61d8cf.js rename to assets/js/93.b8e7b566.js index ad619ae633..ac47811877 100644 --- a/assets/js/93.6b61d8cf.js +++ b/assets/js/93.b8e7b566.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{460:function(t,e,a){"use strict";a.r(e);var i=a(7),n=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"current-grantees-full-time"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-grantees-full-time"}},[t._v("#")]),t._v(" Current Grantees (Full-Time)")]),t._v(" "),e("h2",{attrs:{id:"thunderbiscuit"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#thunderbiscuit"}},[t._v("#")]),t._v(" thunderbiscuit")]),t._v(" "),e("p",[t._v("Thunderbiscuit is an Android engineer who's has been working on the project for over 3 years, leading the work on the language bindings for BDK. He's using BDK in production with "),e("a",{attrs:{href:"https://padawanwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Padawan Wallet"),e("OutboundLink")],1),t._v(". He's also in charge of the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-kotlin-example-wallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDK Kotlin Example Wallet"),e("OutboundLink")],1),t._v(", the sample native Android wallet for BDK, and the "),e("a",{attrs:{href:"https://bitcoindevkit.github.io/book-of-bdk/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Book of BDK"),e("OutboundLink")],1),t._v(" project, working on building walkthrough documentation for the BDK ecosystem.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/thunderB__",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1thunderat5g552cuy7umk624ct5xe4tpgwr2jcjjq2gc0567wgrqnya79l",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://thunderbiscuit.com",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/www.png"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"matthew-ramsden"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#matthew-ramsden"}},[t._v("#")]),t._v(" Matthew Ramsden")]),t._v(" "),e("p",[t._v("Matthew is an experienced iOS engineer who has picked up Rust along the way to expand his contributions to the bitcoin ecosystem. His primary focus is maintaining the bdk-ffi Rust bindings, contributing features, and ensuring the library's robustness, along with leading the development of the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/BDKSwiftExampleWallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDK Swift Example Wallet"),e("OutboundLink")],1),t._v(" which is an example iOS wallet built on BDK.")]),t._v(" "),e("p",[t._v("He also created the Lightning iOS app "),e("a",{attrs:{href:"https://github.com/reez/Monday",target:"_blank",rel:"noopener noreferrer"}},[t._v("Monday"),e("OutboundLink")],1),t._v(", the native iOS implementation of Bitcoin UI Kit "),e("a",{attrs:{href:"https://github.com/reez/BitcoinUI",target:"_blank",rel:"noopener noreferrer"}},[t._v("BitcoinUI"),e("OutboundLink")],1),t._v(", the iOS app "),e("a",{attrs:{href:"https://apps.apple.com/us/app/block-screen/id1533333210",target:"_blank",rel:"noopener noreferrer"}},[t._v("Block Screen"),e("OutboundLink")],1),t._v(", and co-organizes NashBitDevs.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/matthewramsden",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/reez",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1reezn2ctrrg736uqj7mva9lsuwv0kr5asj4vvkwxnrwlhvxf98tsq99ty4",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"valuedmammal"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#valuedmammal"}},[t._v("#")]),t._v(" ValuedMammal")]),t._v(" "),e("p",[t._v("ValuedMammal is a Rust developer and node operator whose work includes research in the areas of mempool and p2p. He's interested in bitcoin payment solutions, problems around fee estimation, and innovations in bitcoin Script. In 2021 he managed Tangerine node on the lightning network and was active in the PLEBNET community. He started contributing to BDK out of a belief that modern wallets should be built with modern tools and sought out a team that makes no compromises when it comes to quality and correctness and who share a mission to master the fundamentals while providing convenient abstractions to developers. His unorthodox path into software development came as a byproduct of his own bitcoin journey and continues to grow more fulfilling each day. As a result, his natural environment is in a terminal managing a server or database, and of course writing code. ValuedMammal studied Biological Science at university, and outside of bitcoin he's a writer and educator who likes music, travel, and foreign languages.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/valuedmammal",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/ValuedMammal",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/github-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"wei-chen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wei-chen"}},[t._v("#")]),t._v(" Wei Chen")]),t._v(" "),e("p",[t._v("Wei Chen has been contributing to BDK since late 2023 and was formerly a full stack Java developer based in Washington D.C. with ten years of experience. He was introduced to BDK as a result of Evan Lin, whom he met when taking Mandarin lessons in Taipei. The focus of his contributions will be towards assisting with the restructuring of the electrum crate, reengineering of the TxGraph data components to simplify the tracking of lineal conflicts, as well as focusing on performance optimization and the continued debugging of BDK, which includes the maintenance of the TestEnv crate. Outside of code contributions to the project, Wei Chen will be also assisting Evan Lin with various bitcoin events or workshops to improve understanding towards BDK.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://github.com/LagginTimes",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/github-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h1",{attrs:{id:"current-grantees-part-time"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-grantees-part-time"}},[t._v("#")]),t._v(" Current Grantees (Part-Time)")]),t._v(" "),e("h2",{attrs:{id:"evan-lin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#evan-lin"}},[t._v("#")]),t._v(" Evan Lin")]),t._v(" "),e("p",[t._v("Evan Lin (林志宇) is a Rust/Golang developer who has been contributing to BDK since 2022. Before working on bitcoin-related projects, his professional career started in 2017 where he led various umbrella projects for an altcoin. After discovering the importance of bitcoin, he started contributing to various projects (including BDK, Fedimint and Utreexo) and was eventually taken under the wing of and mentored by Lloyd Fournier.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/evanlinjin",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/evanlinjin",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1kysd8m44dhv7ywa75u5z7w2w0gs4t6qzhgvjp555gfknasy3krlqfxde60",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h1",{attrs:{id:"current-grantees-project-grants"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-grantees-project-grants"}},[t._v("#")]),t._v(" Current Grantees (Project Grants)")]),t._v(" "),e("h2",{attrs:{id:"nymius"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nymius"}},[t._v("#")]),t._v(" Nymius")]),t._v(" "),e("p",[t._v("Nymius is a software engineer who fell down the rabbit hole of bitcoin, privacy and open source. After contributing to other bitcoin related projects, he found BDK, where his interest for bitcoin and rust got aligned. Since then he has been contributing to the coin selection and the persistence testing module, and file store. His new challenge is implementing support for BIP 352 (Silent Payments) on BDK. At the same time he will continue his previous work and help with the maintenance of the project.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://github.com/nymius",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/github-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h1",{attrs:{id:"past-grantees"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#past-grantees"}},[t._v("#")]),t._v(" Past Grantees")]),t._v(" "),e("h2",{attrs:{id:"manuel-gatti"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manuel-gatti"}},[t._v("#")]),t._v(" Manuel Gatti")]),t._v(" "),e("p",[t._v("Manuel Gatti is a Product/Project Manager who has worked for about 3 and a half years as a functional analyst/project manager in the IT consultancy sector and for the last year as a Product Owner in a non-bitcoin-related software company. He is involved in some educational projects related to bitcoin in Italy and hosts an italian podcast about libertarian philosophy with episodes dedicated to bitcoin as a tool for freedom.")]),t._v(" "),e("p",[t._v("He has been contributing to BDK since April 2023 mostly on the project management side (holding calls, helping with triage and prioritization, updating stakeholders). Since April 2024, he has started conducting user interviews in order to get feedback on BDK usage and possible pain points with the aim to help the team with the definition and prioritization of the development activities. In May 2024 he started collaborating as a product/project manager with Wizard Sardine (users of BDK) and in particular to the development and go-to-market strategy of Liana Wallet.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/nondiremanuel",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/nondiremanuel",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub10znwkv69vus58rrqydwfzy3tuljhqn5plec84y0v2pa5n85xfwnqaft2sl",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"leonardo-souza"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#leonardo-souza"}},[t._v("#")]),t._v(" Leonardo Souza")]),t._v(" "),e("p",[t._v("Leonardo is a Software Engineer based in Brazil, previously Clojure/Java developer in a real-estate tech startup, and Rust developer in a Bitcoin on-ramp/off-ramp startup. He started contributing to BDK and Bitcoin-related FOSS projects in 2022 through his participation in Summer of Bitcoin 2022, mentored by Lloyd Fournier his work focused on a real-time block events library on top of mempool.space API. He's continued his FOSS journey in Summer of Bitcoin 2023, contributing to Fedimint, mentored by Eric Sirion working on adding Tor support on the client level, using Arti, which he's contributing since. He's been continuing his contributions to BDK focusing on improvements, enhancements for BDK 1.0, and Fedimint with focus on adding/improving it's Tor support.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/oleonardolima",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/oleonardolima",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1ez8efu9rjxu64g0lalty2ffmr2tgkzjz92rkafyfyz5463wr8ars8zls5t",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br")])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{457:function(t,e,a){"use strict";a.r(e);var i=a(7),n=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"current-grantees-full-time"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-grantees-full-time"}},[t._v("#")]),t._v(" Current Grantees (Full-Time)")]),t._v(" "),e("h2",{attrs:{id:"thunderbiscuit"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#thunderbiscuit"}},[t._v("#")]),t._v(" thunderbiscuit")]),t._v(" "),e("p",[t._v("Thunderbiscuit is an Android engineer who's has been working on the project for over 3 years, leading the work on the language bindings for BDK. He's using BDK in production with "),e("a",{attrs:{href:"https://padawanwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Padawan Wallet"),e("OutboundLink")],1),t._v(". He's also in charge of the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-kotlin-example-wallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDK Kotlin Example Wallet"),e("OutboundLink")],1),t._v(", the sample native Android wallet for BDK, and the "),e("a",{attrs:{href:"https://bitcoindevkit.github.io/book-of-bdk/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Book of BDK"),e("OutboundLink")],1),t._v(" project, working on building walkthrough documentation for the BDK ecosystem.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/thunderB__",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1thunderat5g552cuy7umk624ct5xe4tpgwr2jcjjq2gc0567wgrqnya79l",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://thunderbiscuit.com",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/www.png"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"matthew-ramsden"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#matthew-ramsden"}},[t._v("#")]),t._v(" Matthew Ramsden")]),t._v(" "),e("p",[t._v("Matthew is an experienced iOS engineer who has picked up Rust along the way to expand his contributions to the bitcoin ecosystem. His primary focus is maintaining the bdk-ffi Rust bindings, contributing features, and ensuring the library's robustness, along with leading the development of the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/BDKSwiftExampleWallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDK Swift Example Wallet"),e("OutboundLink")],1),t._v(" which is an example iOS wallet built on BDK.")]),t._v(" "),e("p",[t._v("He also created the Lightning iOS app "),e("a",{attrs:{href:"https://github.com/reez/Monday",target:"_blank",rel:"noopener noreferrer"}},[t._v("Monday"),e("OutboundLink")],1),t._v(", the native iOS implementation of Bitcoin UI Kit "),e("a",{attrs:{href:"https://github.com/reez/BitcoinUI",target:"_blank",rel:"noopener noreferrer"}},[t._v("BitcoinUI"),e("OutboundLink")],1),t._v(", the iOS app "),e("a",{attrs:{href:"https://apps.apple.com/us/app/block-screen/id1533333210",target:"_blank",rel:"noopener noreferrer"}},[t._v("Block Screen"),e("OutboundLink")],1),t._v(", and co-organizes NashBitDevs.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/matthewramsden",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/reez",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1reezn2ctrrg736uqj7mva9lsuwv0kr5asj4vvkwxnrwlhvxf98tsq99ty4",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"valuedmammal"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#valuedmammal"}},[t._v("#")]),t._v(" ValuedMammal")]),t._v(" "),e("p",[t._v("ValuedMammal is a Rust developer and node operator whose work includes research in the areas of mempool and p2p. He's interested in bitcoin payment solutions, problems around fee estimation, and innovations in bitcoin Script. In 2021 he managed Tangerine node on the lightning network and was active in the PLEBNET community. He started contributing to BDK out of a belief that modern wallets should be built with modern tools and sought out a team that makes no compromises when it comes to quality and correctness and who share a mission to master the fundamentals while providing convenient abstractions to developers. His unorthodox path into software development came as a byproduct of his own bitcoin journey and continues to grow more fulfilling each day. As a result, his natural environment is in a terminal managing a server or database, and of course writing code. ValuedMammal studied Biological Science at university, and outside of bitcoin he's a writer and educator who likes music, travel, and foreign languages.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/valuedmammal",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/ValuedMammal",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/github-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"wei-chen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wei-chen"}},[t._v("#")]),t._v(" Wei Chen")]),t._v(" "),e("p",[t._v("Wei Chen has been contributing to BDK since late 2023 and was formerly a full stack Java developer based in Washington D.C. with ten years of experience. He was introduced to BDK as a result of Evan Lin, whom he met when taking Mandarin lessons in Taipei. The focus of his contributions will be towards assisting with the restructuring of the electrum crate, reengineering of the TxGraph data components to simplify the tracking of lineal conflicts, as well as focusing on performance optimization and the continued debugging of BDK, which includes the maintenance of the TestEnv crate. Outside of code contributions to the project, Wei Chen will be also assisting Evan Lin with various bitcoin events or workshops to improve understanding towards BDK.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://github.com/LagginTimes",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/github-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h1",{attrs:{id:"current-grantees-part-time"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-grantees-part-time"}},[t._v("#")]),t._v(" Current Grantees (Part-Time)")]),t._v(" "),e("h2",{attrs:{id:"evan-lin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#evan-lin"}},[t._v("#")]),t._v(" Evan Lin")]),t._v(" "),e("p",[t._v("Evan Lin (林志宇) is a Rust/Golang developer who has been contributing to BDK since 2022. Before working on bitcoin-related projects, his professional career started in 2017 where he led various umbrella projects for an altcoin. After discovering the importance of bitcoin, he started contributing to various projects (including BDK, Fedimint and Utreexo) and was eventually taken under the wing of and mentored by Lloyd Fournier.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/evanlinjin",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/evanlinjin",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1kysd8m44dhv7ywa75u5z7w2w0gs4t6qzhgvjp555gfknasy3krlqfxde60",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h1",{attrs:{id:"current-grantees-project-grants"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-grantees-project-grants"}},[t._v("#")]),t._v(" Current Grantees (Project Grants)")]),t._v(" "),e("h2",{attrs:{id:"nymius"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nymius"}},[t._v("#")]),t._v(" Nymius")]),t._v(" "),e("p",[t._v("Nymius is a software engineer who fell down the rabbit hole of bitcoin, privacy and open source. After contributing to other bitcoin related projects, he found BDK, where his interest for bitcoin and rust got aligned. Since then he has been contributing to the coin selection and the persistence testing module, and file store. His new challenge is implementing support for BIP 352 (Silent Payments) on BDK. At the same time he will continue his previous work and help with the maintenance of the project.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://github.com/nymius",target:"_blank"}},[e("img",{staticStyle:{width:"24px"},attrs:{src:"/img/github-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h1",{attrs:{id:"past-grantees"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#past-grantees"}},[t._v("#")]),t._v(" Past Grantees")]),t._v(" "),e("h2",{attrs:{id:"manuel-gatti"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manuel-gatti"}},[t._v("#")]),t._v(" Manuel Gatti")]),t._v(" "),e("p",[t._v("Manuel Gatti is a Product/Project Manager who has worked for about 3 and a half years as a functional analyst/project manager in the IT consultancy sector and for the last year as a Product Owner in a non-bitcoin-related software company. He is involved in some educational projects related to bitcoin in Italy and hosts an italian podcast about libertarian philosophy with episodes dedicated to bitcoin as a tool for freedom.")]),t._v(" "),e("p",[t._v("He has been contributing to BDK since April 2023 mostly on the project management side (holding calls, helping with triage and prioritization, updating stakeholders). Since April 2024, he has started conducting user interviews in order to get feedback on BDK usage and possible pain points with the aim to help the team with the definition and prioritization of the development activities. In May 2024 he started collaborating as a product/project manager with Wizard Sardine (users of BDK) and in particular to the development and go-to-market strategy of Liana Wallet.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/nondiremanuel",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/nondiremanuel",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub10znwkv69vus58rrqydwfzy3tuljhqn5plec84y0v2pa5n85xfwnqaft2sl",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br"),t._v(" "),e("h2",{attrs:{id:"leonardo-souza"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#leonardo-souza"}},[t._v("#")]),t._v(" Leonardo Souza")]),t._v(" "),e("p",[t._v("Leonardo is a Software Engineer based in Brazil, previously Clojure/Java developer in a real-estate tech startup, and Rust developer in a Bitcoin on-ramp/off-ramp startup. He started contributing to BDK and Bitcoin-related FOSS projects in 2022 through his participation in Summer of Bitcoin 2022, mentored by Lloyd Fournier his work focused on a real-time block events library on top of mempool.space API. He's continued his FOSS journey in Summer of Bitcoin 2023, contributing to Fedimint, mentored by Eric Sirion working on adding Tor support on the client level, using Arti, which he's contributing since. He's been continuing his contributions to BDK focusing on improvements, enhancements for BDK 1.0, and Fedimint with focus on adding/improving it's Tor support.")]),t._v(" "),e("div",[e("a",{attrs:{href:"https://twitter.com/oleonardolima",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/twitter-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://github.com/oleonardolima",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/github-icon.svg"}})]),t._v(" "),e("a",{attrs:{href:"https://njump.me/npub1ez8efu9rjxu64g0lalty2ffmr2tgkzjz92rkafyfyz5463wr8ars8zls5t",target:"_blank"}},[e("img",{staticStyle:{width:"24px",margin:"0 12px 0 0"},attrs:{src:"/img/nostr-icon.svg"}})])]),t._v(" "),e("br")])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/94.849a677d.js b/assets/js/94.78a1ba7f.js similarity index 98% rename from assets/js/94.849a677d.js rename to assets/js/94.78a1ba7f.js index d5df035860..59fa8ee303 100644 --- a/assets/js/94.849a677d.js +++ b/assets/js/94.78a1ba7f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{458: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/95.8216e261.js b/assets/js/95.ebd18d46.js similarity index 90% rename from assets/js/95.8216e261.js rename to assets/js/95.ebd18d46.js index 89abb17fa2..85f84a381a 100644 --- a/assets/js/95.8216e261.js +++ b/assets/js/95.ebd18d46.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{458: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([[95],{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/96.68e5ddd3.js b/assets/js/96.0c8acd6e.js similarity index 96% rename from assets/js/96.68e5ddd3.js rename to assets/js/96.0c8acd6e.js index 5f952db101..4153ac2b53 100644 --- a/assets/js/96.68e5ddd3.js +++ b/assets/js/96.0c8acd6e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{459:function(t,a,r){"use strict";r.r(a);var s=r(7),e=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"members"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#members"}},[t._v("#")]),t._v(" Members")]),t._v(" "),a("p",[t._v("The Bitcoin Dev Kit project is proudly supported by the Bitcoin Dev Kit Foundation and its members.")]),t._v(" "),a("div",{staticStyle:{"text-align":"left","margin-bottom":"2rem"}},[a("a",{staticStyle:{display:"inline-block","background-color":"var(--docs-primary-dark)",color:"var(--docs-dark)",padding:"10px 20px","text-decoration":"none","border-radius":"5px","font-weight":"bold"},attrs:{href:"/foundation/become-a-member"}},[t._v("Become A Member")])]),t._v(" "),a("h2",{attrs:{id:"platinum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#platinum"}},[t._v("#")]),t._v(" Platinum")]),t._v(" "),a("div",{staticClass:"members"},[a("div",{staticClass:"row"},[a("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[a("img",{attrs:{src:"/img/spiral.svg",alt:"Spiral"}}),t._v("\n Spiral\n ")])])]),t._v(" "),a("br"),t._v(" "),a("h2",{attrs:{id:"gold"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gold"}},[t._v("#")]),t._v(" Gold")]),t._v(" "),a("div",{staticClass:"members"},[a("div",{staticClass:"row"},[a("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"nofollow noopener"}},[a("img",{attrs:{src:"/img/opensats.png",alt:"OpenSats"}}),t._v("\n OpenSats\n ")])])]),t._v(" "),a("br"),t._v(" "),a("h2",{attrs:{id:"silver"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#silver"}},[t._v("#")]),t._v(" Silver")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{461:function(t,a,r){"use strict";r.r(a);var s=r(7),e=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"members"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#members"}},[t._v("#")]),t._v(" Members")]),t._v(" "),a("p",[t._v("The Bitcoin Dev Kit project is proudly supported by the Bitcoin Dev Kit Foundation and its members.")]),t._v(" "),a("div",{staticStyle:{"text-align":"left","margin-bottom":"2rem"}},[a("a",{staticStyle:{display:"inline-block","background-color":"var(--docs-primary-dark)",color:"var(--docs-dark)",padding:"10px 20px","text-decoration":"none","border-radius":"5px","font-weight":"bold"},attrs:{href:"/foundation/become-a-member"}},[t._v("Become A Member")])]),t._v(" "),a("h2",{attrs:{id:"platinum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#platinum"}},[t._v("#")]),t._v(" Platinum")]),t._v(" "),a("div",{staticClass:"members"},[a("div",{staticClass:"row"},[a("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[a("img",{attrs:{src:"/img/spiral.svg",alt:"Spiral"}}),t._v("\n Spiral\n ")])])]),t._v(" "),a("br"),t._v(" "),a("h2",{attrs:{id:"gold"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gold"}},[t._v("#")]),t._v(" Gold")]),t._v(" "),a("div",{staticClass:"members"},[a("div",{staticClass:"row"},[a("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"nofollow noopener"}},[a("img",{attrs:{src:"/img/opensats.png",alt:"OpenSats"}}),t._v("\n OpenSats\n ")])])]),t._v(" "),a("br"),t._v(" "),a("h2",{attrs:{id:"silver"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#silver"}},[t._v("#")]),t._v(" Silver")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/97.f04434d0.js b/assets/js/97.fb69d1bc.js similarity index 98% rename from assets/js/97.f04434d0.js rename to assets/js/97.fb69d1bc.js index 6755f8b2e2..abef19aacd 100644 --- a/assets/js/97.f04434d0.js +++ b/assets/js/97.fb69d1bc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{461:function(t,r,a){"use strict";a.r(r);var s=a(7),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"supporters"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#supporters"}},[t._v("#")]),t._v(" Supporters")]),t._v(" "),r("p",[t._v("The Bitcoin Dev Kit project is proudly supported by a number of organizations. If you'd like to become a supporter\nplease reach out at: "),r("a",{attrs:{href:"mailto:hello@bitcoindevkit.org"}},[t._v("hello@bitcoindevkit.org")])]),t._v(" "),r("h1",{attrs:{id:"2024"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2024"}},[t._v("#")]),t._v(" 2024")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/opensats.png",alt:"OpenSats"}}),t._v("\n OpenSats\n ")]),t._v(" "),r("a",{attrs:{href:"https://vinteum.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/vinteum.jpg",alt:"Vinteum"}}),t._v("\n Vinteum\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2023"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2023"}},[t._v("#")]),t._v(" 2023")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/opensats.png",alt:"OpenSats"}}),t._v("\n OpenSats\n ")]),t._v(" "),r("a",{attrs:{href:"https://twitter.com/btrust_builders",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/btrust.jpg",alt:"Btrust"}}),t._v("\n ₿trust\n ")]),t._v(" "),r("a",{attrs:{href:"https://vinteum.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/vinteum.jpg",alt:"Vinteum"}}),t._v("\n Vinteum\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2022"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2022"}},[t._v("#")]),t._v(" 2022")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://brink.dev/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/brink.png",alt:"Sponsor Brink"}}),t._v("\n Brink\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2021"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2021"}},[t._v("#")]),t._v(" 2021")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://brink.dev/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/brink.png",alt:"Sponsor Brink"}}),t._v("\n Brink\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2020"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2020"}},[t._v("#")]),t._v(" 2020")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://www.bitfinex.com/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/bitfinex.svg",alt:"Sponsor Bitfinex"}}),t._v("\n Bitfinex\n ")]),t._v(" "),r("a",{attrs:{href:"https://tether.to/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/tether.png",alt:"Sponsor Tether"}}),t._v("\n Tether\n ")]),t._v(" "),r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://brink.dev/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/brink.png",alt:"Sponsor Brink"}}),t._v("\n Brink\n ")])])])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{460:function(t,r,a){"use strict";a.r(r);var s=a(7),n=Object(s.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"supporters"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#supporters"}},[t._v("#")]),t._v(" Supporters")]),t._v(" "),r("p",[t._v("The Bitcoin Dev Kit project is proudly supported by a number of organizations. If you'd like to become a supporter\nplease reach out at: "),r("a",{attrs:{href:"mailto:hello@bitcoindevkit.org"}},[t._v("hello@bitcoindevkit.org")])]),t._v(" "),r("h1",{attrs:{id:"2024"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2024"}},[t._v("#")]),t._v(" 2024")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/opensats.png",alt:"OpenSats"}}),t._v("\n OpenSats\n ")]),t._v(" "),r("a",{attrs:{href:"https://vinteum.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/vinteum.jpg",alt:"Vinteum"}}),t._v("\n Vinteum\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2023"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2023"}},[t._v("#")]),t._v(" 2023")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/opensats.png",alt:"OpenSats"}}),t._v("\n OpenSats\n ")]),t._v(" "),r("a",{attrs:{href:"https://twitter.com/btrust_builders",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/btrust.jpg",alt:"Btrust"}}),t._v("\n ₿trust\n ")]),t._v(" "),r("a",{attrs:{href:"https://vinteum.org/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/vinteum.jpg",alt:"Vinteum"}}),t._v("\n Vinteum\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2022"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2022"}},[t._v("#")]),t._v(" 2022")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://brink.dev/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/brink.png",alt:"Sponsor Brink"}}),t._v("\n Brink\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2021"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2021"}},[t._v("#")]),t._v(" 2021")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://brink.dev/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/brink.png",alt:"Sponsor Brink"}}),t._v("\n Brink\n ")])])]),t._v(" "),r("br"),t._v(" "),r("h1",{attrs:{id:"2020"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#2020"}},[t._v("#")]),t._v(" 2020")]),t._v(" "),r("div",{staticClass:"supporters"},[r("div",{staticClass:"row"},[r("a",{attrs:{href:"https://www.bitfinex.com/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/bitfinex.svg",alt:"Sponsor Bitfinex"}}),t._v("\n Bitfinex\n ")]),t._v(" "),r("a",{attrs:{href:"https://tether.to/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/tether.png",alt:"Sponsor Tether"}}),t._v("\n Tether\n ")]),t._v(" "),r("a",{attrs:{href:"https://spiral.xyz/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/spiral.svg",alt:"Sponsor Spiral"}}),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://brink.dev/",target:"_blank",rel:"nofollow noopener"}},[r("img",{attrs:{src:"/img/brink.png",alt:"Sponsor Brink"}}),t._v("\n Brink\n ")])])])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/app.11c7ee54.js b/assets/js/app.e3182fb9.js similarity index 50% rename from assets/js/app.11c7ee54.js rename to assets/js/app.e3182fb9.js index 6b37171922..d69313a6ea 100644 --- a/assets/js/app.11c7ee54.js +++ b/assets/js/app.e3182fb9.js @@ -1,16 +1,16 @@ -(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
'};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]/;t.exports=function(t){var e,n=""+t,o=i.exec(n);if(!o)return n;var r="",a=0,c=0;for(a=o.index;a=e||n<0||f&&t-s>=r}function k(){var t=g();if(w(t))return _(t);c=setTimeout(k,function(t){var n=e-(t-l);return f?u(n,r-(t-s)):n}(t))}function _(t){return c=void 0,v&&i?b(t):(i=o=void 0,a)}function B(){var t=g(),n=w(t);if(i=arguments,o=this,l=t,n){if(void 0===c)return y(l);if(f)return c=setTimeout(k,e),b(l)}return void 0===c&&(c=setTimeout(k,e)),a}return e=m(e)||0,h(n)&&(p=!!n.leading,r=(f="maxWait"in n)?d(m(n.maxWait)||0,e):r,v="trailing"in n?!!n.trailing:v),B.cancel=function(){void 0!==c&&clearTimeout(c),s=0,i=l=o=c=void 0},B.flush=function(){return void 0===c?a:_(g())},B}},function(t,e,n){var i;"undefined"!=typeof self&&self,i=function(){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=7)}([function(t,e,n){t.exports=!n(6)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e,n,i,o){var r,a=t=t||{},c=typeof t.default;"object"!==c&&"function"!==c||(r=t,a=t.default);var l,s="function"==typeof a?a.options:a;if(e&&(s.render=e.render,s.staticRenderFns=e.staticRenderFns),i&&(s._scopeId=i),o?(l=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),n&&n.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(o)},s._ssrRegister=l):n&&(l=n),l){var p=s.functional,d=p?s.render:s.beforeCreate;p?s.render=function(t,e){return l.call(e),d(t,e)}:s.beforeCreate=d?[].concat(d,l):[l]}return{esModule:r,exports:a,options:s}}},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(t,e,n){var i=n(23),o=n(24),r=n(26),a=Object.defineProperty;e.f=n(0)?Object.defineProperty:function(t,e,n){if(i(t),e=r(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var i,o,r;o=[e,n(8),n(11)],void 0===(r="function"==typeof(i=function(t,e,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Tabs=t.Tab=void 0;var i=r(e),o=r(n);function r(t){return t&&t.__esModule?t:{default:t}}t.default={install:function(t){t.component("tab",i.default),t.component("tabs",o.default)}},t.Tab=i.default,t.Tabs=o.default})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i=n(2)(n(9),n(10),null,null,null);t.exports=i.exports},function(t,e,n){var i,o,r;o=[e],void 0===(r="function"==typeof(i=function(t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={props:{id:{default:null},name:{required:!0},prefix:{default:""},suffix:{default:""},isDisabled:{default:!1}},data:function(){return{isActive:!1,isVisible:!0}},computed:{header:function(){return this.prefix+this.name+this.suffix},computedId:function(){return this.id?this.id:this.name.toLowerCase().replace(/ /g,"-")},hash:function(){return this.isDisabled?"#":"#"+this.computedId}}}})?i.apply(e,o):i)||(t.exports=r)},function(t,e){t.exports={render:function(){var t=this.$createElement;return(this._self._c||t)("section",{directives:[{name:"show",rawName:"v-show",value:this.isActive,expression:"isActive"}],staticClass:"tabs-component-panel",attrs:{"aria-hidden":!this.isActive,id:this.computedId,role:"tabpanel"}},[this._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var i=n(2)(n(12),n(29),null,null,null);t.exports=i.exports},function(t,e,n){var i,o,r;o=[e,n(13)],void 0===(r="function"==typeof(i=function(t,e){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=(n=e)&&n.__esModule?n:{default:n};t.default={props:{cacheLifetime:{default:5},options:{type:Object,required:!1,default:function(){return{useUrlFragment:!0,defaultTabHash:null}}}},data:function(){return{tabs:[],activeTabHash:"",activeTabIndex:0,lastActiveTabHash:""}},computed:{storageKey:function(){return"vue-tabs-component.cache."+window.location.host+window.location.pathname}},created:function(){this.tabs=this.$children},mounted:function(){var t=this;if(window.addEventListener("hashchange",(function(){return t.selectTab(window.location.hash)})),this.findTab(window.location.hash))this.selectTab(window.location.hash);else{var e=i.default.get(this.storageKey);this.findTab(e)?this.selectTab(e):null!==this.options.defaultTabHash&&this.findTab("#"+this.options.defaultTabHash)?this.selectTab("#"+this.options.defaultTabHash):this.tabs.length&&this.selectTab(this.tabs[0].hash)}},methods:{findTab:function(t){return this.tabs.find((function(e){return e.hash===t}))},selectTab:function(t,e){e&&!this.options.useUrlFragment&&e.preventDefault();var n=this.findTab(t);n&&(n.isDisabled?e.preventDefault():this.lastActiveTabHash!==n.hash?(this.tabs.forEach((function(t){t.isActive=t.hash===n.hash})),this.$emit("changed",{tab:n}),this.activeTabHash=n.hash,this.activeTabIndex=this.getTabIndex(t),this.lastActiveTabHash=this.activeTabHash=n.hash,i.default.set(this.storageKey,n.hash,this.cacheLifetime)):this.$emit("clicked",{tab:n}))},setTabVisible:function(t,e){var n=this.findTab(t);n&&(n.isVisible=e,n.isActive&&(n.isActive=e,this.tabs.every((function(t,e,n){return!t.isVisible||(t.isActive=!0,!1)}))))},getTabIndex:function(t){var e=this.findTab(t);return this.tabs.indexOf(e)},getTabHash:function(t){var e=this,n=this.tabs.find((function(n){return e.tabs.indexOf(n)===t}));if(n)return n.hash},getActiveTab:function(){return this.findTab(this.activeTabHash)},getActiveTabIndex:function(){return this.getTabIndex(this.activeTabHash)}}}})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i,o,r;o=[e,n(14),n(15)],void 0===(r="function"==typeof(i=function(t,e,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=r(e),o=r(n);function r(t){return t&&t.__esModule?t:{default:t}}var a=function(){function t(){(0,i.default)(this,t)}return(0,o.default)(t,[{key:"get",value:function(t){var e=JSON.parse(localStorage.getItem(t));return e?new Date(e.expires)=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},e.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},e.enable(i())},function(t,e,n){"use strict";var i=n(1),o=n(15),r=n(99),a=n(34);t.exports=function(t,e,n,c){c||(c={});var l=c.enumerable,s=void 0!==c.name?c.name:e;if(i(n)&&r(n,s,c),c.global)l?t[e]=n:a(e,n);else{try{c.unsafe?t[e]&&(l=!0):delete t[e]}catch(t){}l?t[e]=n:o.f(t,e,{value:n,enumerable:!1,configurable:!c.nonConfigurable,writable:!c.nonWritable})}return t}},function(t,e,n){"use strict";var i=n(147),o=String;t.exports=function(t){if("Symbol"===i(t))throw new TypeError("Cannot convert a Symbol value to a string");return o(t)}},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){"use strict";var i=n(2),o=n(3),r=n(1),a=n(9),c=n(5),l=n(121).CONFIGURABLE,s=n(122),p=n(123),d=p.enforce,u=p.get,g=String,h=Object.defineProperty,m=i("".slice),f=i("".replace),v=i([].join),b=c&&!o((function(){return 8!==h((function(){}),"length",{value:8}).length})),y=String(String).split("String"),w=t.exports=function(t,e,n){"Symbol("===m(g(e),0,7)&&(e="["+f(g(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!a(t,"name")||l&&t.name!==e)&&(c?h(t,"name",{value:e,configurable:!0}):t.name=e),b&&n&&a(n,"arity")&&t.length!==n.arity&&h(t,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?c&&h(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var i=d(t);return a(i,"source")||(i.source=v(y,"string"==typeof e?e:"")),t};Function.prototype.toString=w((function(){return r(this)&&u(this).source||s(this)}),"toString")},function(t,e,n){"use strict";var i=n(25),o=n(0),r=n(139),a=n(140),c=o.WebAssembly,l=7!==new Error("e",{cause:7}).cause,s=function(t,e){var n={};n[t]=a(t,e,l),i({global:!0,constructor:!0,arity:1,forced:l},n)},p=function(t,e){if(c&&c[t]){var n={};n[t]=a("WebAssembly."+t,e,l),i({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:l},n)}};s("Error",(function(t){return function(e){return r(t,this,arguments)}})),s("EvalError",(function(t){return function(e){return r(t,this,arguments)}})),s("RangeError",(function(t){return function(e){return r(t,this,arguments)}})),s("ReferenceError",(function(t){return function(e){return r(t,this,arguments)}})),s("SyntaxError",(function(t){return function(e){return r(t,this,arguments)}})),s("TypeError",(function(t){return function(e){return r(t,this,arguments)}})),s("URIError",(function(t){return function(e){return r(t,this,arguments)}})),p("CompileError",(function(t){return function(e){return r(t,this,arguments)}})),p("LinkError",(function(t){return function(e){return r(t,this,arguments)}})),p("RuntimeError",(function(t){return function(e){return r(t,this,arguments)}}))},function(t,e,n){var i=n(161),o=n(211),r=n(24),a=n(4),c=n(220);t.exports=function(t){return"function"==typeof t?t:null==t?r:"object"==typeof t?a(t)?o(t[0],t[1]):i(t):c(t)}},function(t,e,n){var i=n(48),o=n(4);t.exports=function(t,e,n){var r=e(t);return o(t)?r:i(r,n(t))}},function(t,e,n){var i=n(198),o=n(104),r=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,c=a?function(t){return null==t?[]:(t=Object(t),i(a(t),(function(e){return r.call(t,e)})))}:o;t.exports=c},function(t,e){t.exports=function(){return[]}},function(t,e,n){var i=n(199),o=n(38),r=n(4),a=n(81),c=n(50),l=n(83),s=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=r(t),p=!n&&o(t),d=!n&&!p&&a(t),u=!n&&!p&&!d&&l(t),g=n||p||d||u,h=g?i(t.length,String):[],m=h.length;for(var f in t)!e&&!s.call(t,f)||g&&("length"==f||d&&("offset"==f||"parent"==f)||u&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||c(f,m))||h.push(f);return h}},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){var i=n(52);t.exports=function(t,e,n){var o=null==t?void 0:i(t,e);return void 0===o?n:o}},function(t,e){t.exports=function(t,e){for(var n=-1,i=null==t?0:t.length,o=Array(i);++ns;)o(i,n=e[s++])&&(~a(p,n)||l(p,n));return p}},function(t,e,n){"use strict";var i=n(29),o=n(130),r=n(37),a=function(t){return function(e,n,a){var c=i(e),l=r(c);if(0===l)return!t&&-1;var s,p=o(a,l);if(t&&n!=n){for(;l>p;)if((s=c[p++])!=s)return!0}else for(;l>p;p++)if((t||p in c)&&c[p]===n)return t||p||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){"use strict";var i=n(70),o=Math.max,r=Math.min;t.exports=function(t,e){var n=i(t);return n<0?o(n+e,0):r(n,e)}},function(t,e,n){"use strict";var i=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?o:i)(e)}},function(t,e,n){"use strict";var i=n(70),o=Math.min;t.exports=function(t){var e=i(t);return e>0?o(e,9007199254740991):0}},function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},function(t,e,n){"use strict";var i=n(3),o=n(1),r=/#|\.prototype\./,a=function(t,e){var n=l[c(t)];return n===p||n!==s&&(o(e)?i(e):!!e)},c=a.normalize=function(t){return String(t).replace(r,".").toLowerCase()},l=a.data={},s=a.NATIVE="N",p=a.POLYFILL="P";t.exports=a},function(t,e,n){"use strict";var i=n(31),o=n(35),r=n(55),a=n(37),c=TypeError,l="Reduce of empty array with no initial value",s=function(t){return function(e,n,s,p){var d=o(e),u=r(d),g=a(d);if(i(n),0===g&&s<2)throw new c(l);var h=t?g-1:0,m=t?-1:1;if(s<2)for(;;){if(h in u){p=u[h],h+=m;break}if(h+=m,t?h<0:g<=h)throw new c(l)}for(;t?h>=0:g>h;h+=m)h in u&&(p=n(p,u[h],h,d));return p}};t.exports={left:s(!1),right:s(!0)}},function(t,e,n){"use strict";var i=n(3);t.exports=function(t,e){var n=[][t];return!!n&&i((function(){n.call(null,e||function(){return 1},1)}))}},function(t,e,n){"use strict";var i=n(0),o=n(17);t.exports="process"===o(i.process)},function(t,e,n){"use strict";var i=n(27),o=Function.prototype,r=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(i?a.bind(r):function(){return a.apply(r,arguments)})},function(t,e,n){"use strict";var i=n(30),o=n(9),r=n(13),a=n(60),c=n(71),l=n(69),s=n(144),p=n(145),d=n(146),u=n(149),g=n(150),h=n(5),m=n(65);t.exports=function(t,e,n,f){var v=f?2:1,b=t.split("."),y=b[b.length-1],w=i.apply(null,b);if(w){var k=w.prototype;if(!m&&o(k,"cause")&&delete k.cause,!n)return w;var _=i("Error"),B=e((function(t,e){var n=d(f?e:t,void 0),i=f?new w(t):new w;return void 0!==n&&r(i,"message",n),g(i,B,i.stack,2),this&&a(k,this)&&p(i,this,B),arguments.length>v&&u(i,arguments[v]),i}));if(B.prototype=k,"Error"!==y?c?c(B,_):l(B,_,{name:!0}):h&&"stackTraceLimit"in w&&(s(B,w,"stackTraceLimit"),s(B,w,"prepareStackTrace")),l(B,w),!m)try{k.name!==y&&r(k,"name",y),k.constructor=B}catch(t){}return B}}},function(t,e,n){"use strict";var i=n(2),o=n(31);t.exports=function(t,e,n){try{return i(o(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(t){}}},function(t,e,n){"use strict";var i=n(143),o=String,r=TypeError;t.exports=function(t){if(i(t))return t;throw new r("Can't set "+o(t)+" as a prototype")}},function(t,e,n){"use strict";var i=n(8);t.exports=function(t){return i(t)||null===t}},function(t,e,n){"use strict";var i=n(15).f;t.exports=function(t,e,n){n in t||i(t,n,{configurable:!0,get:function(){return e[n]},set:function(t){e[n]=t}})}},function(t,e,n){"use strict";var i=n(1),o=n(8),r=n(71);t.exports=function(t,e,n){var a,c;return r&&i(a=e.constructor)&&a!==n&&o(c=a.prototype)&&c!==n.prototype&&r(t,c),t}},function(t,e,n){"use strict";var i=n(97);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:i(t)}},function(t,e,n){"use strict";var i=n(148),o=n(1),r=n(17),a=n(32)("toStringTag"),c=Object,l="Arguments"===r(function(){return arguments}());t.exports=i?r:function(t){var e,n,i;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=c(t),a))?n:l?r(e):"Object"===(i=r(e))&&o(e.callee)?"Arguments":i}},function(t,e,n){"use strict";var i={};i[n(32)("toStringTag")]="z",t.exports="[object z]"===String(i)},function(t,e,n){"use strict";var i=n(8),o=n(13);t.exports=function(t,e){i(e)&&"cause"in e&&o(t,"cause",e.cause)}},function(t,e,n){"use strict";var i=n(13),o=n(151),r=n(152),a=Error.captureStackTrace;t.exports=function(t,e,n,c){r&&(a?a(t,e):i(t,"stack",o(n,c)))}},function(t,e,n){"use strict";var i=n(2),o=Error,r=i("".replace),a=String(new o("zxcasd").stack),c=/\n\s*at [^:]*:[^\n]*/,l=c.test(a);t.exports=function(t,e){if(l&&"string"==typeof t&&!o.prepareStackTrace)for(;e--;)t=r(t,c,"");return t}},function(t,e,n){"use strict";var i=n(3),o=n(28);t.exports=!i((function(){var t=new Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},function(t,e,n){"use strict";var i=n(5),o=n(154),r=TypeError,a=Object.getOwnPropertyDescriptor,c=i&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=c?function(t,e){if(o(t)&&!a(t,"length").writable)throw new r("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},function(t,e,n){"use strict";var i=n(17);t.exports=Array.isArray||function(t){return"Array"===i(t)}},function(t,e,n){"use strict";var i=TypeError;t.exports=function(t){if(t>9007199254740991)throw i("Maximum allowed index exceeded");return t}},function(t,e,n){var i=n(48),o=n(157);t.exports=function t(e,n,r,a,c){var l=-1,s=e.length;for(r||(r=o),c||(c=[]);++l0&&r(p)?n>1?t(p,n-1,r,a,c):i(c,p):a||(c[c.length]=p)}return c}},function(t,e,n){var i=n(14),o=n(38),r=n(4),a=i?i.isConcatSpreadable:void 0;t.exports=function(t){return r(t)||o(t)||!!(a&&t&&t[a])}},function(t,e,n){var i=n(12),o=n(11);t.exports=function(t){return o(t)&&"[object Arguments]"==i(t)}},function(t,e,n){var i=n(14),o=Object.prototype,r=o.hasOwnProperty,a=o.toString,c=i?i.toStringTag:void 0;t.exports=function(t){var e=r.call(t,c),n=t[c];try{t[c]=void 0;var i=!0}catch(t){}var o=a.call(t);return i&&(e?t[c]=n:delete t[c]),o}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var i=n(162),o=n(210),r=n(86);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?r(e[0][0],e[0][1]):function(n){return n===t||i(n,t,e)}}},function(t,e,n){var i=n(73),o=n(76);t.exports=function(t,e,n,r){var a=n.length,c=a,l=!r;if(null==t)return!c;for(t=Object(t);a--;){var s=n[a];if(l&&s[2]?s[1]!==t[s[0]]:!(s[0]in t))return!1}for(;++a-1}},function(t,e,n){var i=n(19);t.exports=function(t,e){var n=this.__data__,o=i(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var i=n(18);t.exports=function(){this.__data__=new i,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var i=n(18),o=n(39),r=n(40);t.exports=function(t,e){var n=this.__data__;if(n instanceof i){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new r(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var i=n(74),o=n(174),r=n(23),a=n(75),c=/^\[object .+?Constructor\]$/,l=Function.prototype,s=Object.prototype,p=l.toString,d=s.hasOwnProperty,u=RegExp("^"+p.call(d).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!r(t)||o(t))&&(i(t)?u:c).test(a(t))}},function(t,e,n){var i,o=n(175),r=(i=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+i:"";t.exports=function(t){return!!r&&r in t}},function(t,e,n){var i=n(6)["__core-js_shared__"];t.exports=i},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var i=n(178),o=n(18),r=n(39);t.exports=function(){this.size=0,this.__data__={hash:new i,map:new(r||o),string:new i}}},function(t,e,n){var i=n(179),o=n(180),r=n(181),a=n(182),c=n(183);function l(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var i=n(78),o=n(231),r=n(236),a=n(79),c=n(237),l=n(41);t.exports=function(t,e,n){var s=-1,p=o,d=t.length,u=!0,g=[],h=g;if(n)u=!1,p=r;else if(d>=200){var m=e?null:c(t);if(m)return l(m);u=!1,p=a,h=new i}else h=e?[]:g;t:for(;++s-1}},function(t,e,n){var i=n(233),o=n(234),r=n(235);t.exports=function(t,e,n){return e==e?r(t,e,n):i(t,o,n)}},function(t,e){t.exports=function(t,e,n,i){for(var o=t.length,r=n+(i?1:-1);i?r--:++r0)return function(t){if((t=String(t)).length>100)return;var e=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(!e)return;var a=parseFloat(e[1]);switch((e[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"days":case"day":case"d":return a*r;case"hours":case"hour":case"hrs":case"hr":case"h":return a*o;case"minutes":case"minute":case"mins":case"min":case"m":return a*i;case"seconds":case"second":case"secs":case"sec":case"s":return a*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}(t);if("number"===l&&!1===isNaN(t))return e.long?a(c=t,r,"day")||a(c,o,"hour")||a(c,i,"minute")||a(c,n,"second")||c+" ms":function(t){if(t>=r)return Math.round(t/r)+"d";if(t>=o)return Math.round(t/o)+"h";if(t>=i)return Math.round(t/i)+"m";if(t>=n)return Math.round(t/n)+"s";return t+"ms"}(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},function(t,e,n){"use strict";n(89)},function(t,e,n){"use strict";n(90)},function(t,e,n){"use strict";n.r(e); + */var i=/["'&<>]/;t.exports=function(t){var e,n=""+t,o=i.exec(n);if(!o)return n;var r="",a=0,c=0;for(a=o.index;a=e||n<0||f&&t-s>=r}function k(){var t=g();if(w(t))return _(t);c=setTimeout(k,function(t){var n=e-(t-l);return f?u(n,r-(t-s)):n}(t))}function _(t){return c=void 0,v&&i?b(t):(i=o=void 0,a)}function B(){var t=g(),n=w(t);if(i=arguments,o=this,l=t,n){if(void 0===c)return y(l);if(f)return c=setTimeout(k,e),b(l)}return void 0===c&&(c=setTimeout(k,e)),a}return e=m(e)||0,h(n)&&(p=!!n.leading,r=(f="maxWait"in n)?d(m(n.maxWait)||0,e):r,v="trailing"in n?!!n.trailing:v),B.cancel=function(){void 0!==c&&clearTimeout(c),s=0,i=l=o=c=void 0},B.flush=function(){return void 0===c?a:_(g())},B}},function(t,e,n){var i;"undefined"!=typeof self&&self,i=function(){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=7)}([function(t,e,n){t.exports=!n(6)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e,n,i,o){var r,a=t=t||{},c=typeof t.default;"object"!==c&&"function"!==c||(r=t,a=t.default);var l,s="function"==typeof a?a.options:a;if(e&&(s.render=e.render,s.staticRenderFns=e.staticRenderFns),i&&(s._scopeId=i),o?(l=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),n&&n.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(o)},s._ssrRegister=l):n&&(l=n),l){var p=s.functional,d=p?s.render:s.beforeCreate;p?s.render=function(t,e){return l.call(e),d(t,e)}:s.beforeCreate=d?[].concat(d,l):[l]}return{esModule:r,exports:a,options:s}}},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(t,e,n){var i=n(23),o=n(24),r=n(26),a=Object.defineProperty;e.f=n(0)?Object.defineProperty:function(t,e,n){if(i(t),e=r(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var i,o,r;o=[e,n(8),n(11)],void 0===(r="function"==typeof(i=function(t,e,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Tabs=t.Tab=void 0;var i=r(e),o=r(n);function r(t){return t&&t.__esModule?t:{default:t}}t.default={install:function(t){t.component("tab",i.default),t.component("tabs",o.default)}},t.Tab=i.default,t.Tabs=o.default})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i=n(2)(n(9),n(10),null,null,null);t.exports=i.exports},function(t,e,n){var i,o,r;o=[e],void 0===(r="function"==typeof(i=function(t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={props:{id:{default:null},name:{required:!0},prefix:{default:""},suffix:{default:""},isDisabled:{default:!1}},data:function(){return{isActive:!1,isVisible:!0}},computed:{header:function(){return this.prefix+this.name+this.suffix},computedId:function(){return this.id?this.id:this.name.toLowerCase().replace(/ /g,"-")},hash:function(){return this.isDisabled?"#":"#"+this.computedId}}}})?i.apply(e,o):i)||(t.exports=r)},function(t,e){t.exports={render:function(){var t=this.$createElement;return(this._self._c||t)("section",{directives:[{name:"show",rawName:"v-show",value:this.isActive,expression:"isActive"}],staticClass:"tabs-component-panel",attrs:{"aria-hidden":!this.isActive,id:this.computedId,role:"tabpanel"}},[this._t("default")],2)},staticRenderFns:[]}},function(t,e,n){var i=n(2)(n(12),n(29),null,null,null);t.exports=i.exports},function(t,e,n){var i,o,r;o=[e,n(13)],void 0===(r="function"==typeof(i=function(t,e){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=(n=e)&&n.__esModule?n:{default:n};t.default={props:{cacheLifetime:{default:5},options:{type:Object,required:!1,default:function(){return{useUrlFragment:!0,defaultTabHash:null}}}},data:function(){return{tabs:[],activeTabHash:"",activeTabIndex:0,lastActiveTabHash:""}},computed:{storageKey:function(){return"vue-tabs-component.cache."+window.location.host+window.location.pathname}},created:function(){this.tabs=this.$children},mounted:function(){var t=this;if(window.addEventListener("hashchange",(function(){return t.selectTab(window.location.hash)})),this.findTab(window.location.hash))this.selectTab(window.location.hash);else{var e=i.default.get(this.storageKey);this.findTab(e)?this.selectTab(e):null!==this.options.defaultTabHash&&this.findTab("#"+this.options.defaultTabHash)?this.selectTab("#"+this.options.defaultTabHash):this.tabs.length&&this.selectTab(this.tabs[0].hash)}},methods:{findTab:function(t){return this.tabs.find((function(e){return e.hash===t}))},selectTab:function(t,e){e&&!this.options.useUrlFragment&&e.preventDefault();var n=this.findTab(t);n&&(n.isDisabled?e.preventDefault():this.lastActiveTabHash!==n.hash?(this.tabs.forEach((function(t){t.isActive=t.hash===n.hash})),this.$emit("changed",{tab:n}),this.activeTabHash=n.hash,this.activeTabIndex=this.getTabIndex(t),this.lastActiveTabHash=this.activeTabHash=n.hash,i.default.set(this.storageKey,n.hash,this.cacheLifetime)):this.$emit("clicked",{tab:n}))},setTabVisible:function(t,e){var n=this.findTab(t);n&&(n.isVisible=e,n.isActive&&(n.isActive=e,this.tabs.every((function(t,e,n){return!t.isVisible||(t.isActive=!0,!1)}))))},getTabIndex:function(t){var e=this.findTab(t);return this.tabs.indexOf(e)},getTabHash:function(t){var e=this,n=this.tabs.find((function(n){return e.tabs.indexOf(n)===t}));if(n)return n.hash},getActiveTab:function(){return this.findTab(this.activeTabHash)},getActiveTabIndex:function(){return this.getTabIndex(this.activeTabHash)}}}})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i,o,r;o=[e,n(14),n(15)],void 0===(r="function"==typeof(i=function(t,e,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=r(e),o=r(n);function r(t){return t&&t.__esModule?t:{default:t}}var a=function(){function t(){(0,i.default)(this,t)}return(0,o.default)(t,[{key:"get",value:function(t){var e=JSON.parse(localStorage.getItem(t));return e?new Date(e.expires)=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},e.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},e.enable(i())},function(t,e,n){"use strict";var i=n(1),o=n(15),r=n(99),a=n(34);t.exports=function(t,e,n,c){c||(c={});var l=c.enumerable,s=void 0!==c.name?c.name:e;if(i(n)&&r(n,s,c),c.global)l?t[e]=n:a(e,n);else{try{c.unsafe?t[e]&&(l=!0):delete t[e]}catch(t){}l?t[e]=n:o.f(t,e,{value:n,enumerable:!1,configurable:!c.nonConfigurable,writable:!c.nonWritable})}return t}},function(t,e,n){"use strict";var i=n(147),o=String;t.exports=function(t){if("Symbol"===i(t))throw new TypeError("Cannot convert a Symbol value to a string");return o(t)}},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){"use strict";var i=n(2),o=n(3),r=n(1),a=n(9),c=n(5),l=n(121).CONFIGURABLE,s=n(122),p=n(123),d=p.enforce,u=p.get,g=String,h=Object.defineProperty,m=i("".slice),f=i("".replace),v=i([].join),b=c&&!o((function(){return 8!==h((function(){}),"length",{value:8}).length})),y=String(String).split("String"),w=t.exports=function(t,e,n){"Symbol("===m(g(e),0,7)&&(e="["+f(g(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!a(t,"name")||l&&t.name!==e)&&(c?h(t,"name",{value:e,configurable:!0}):t.name=e),b&&n&&a(n,"arity")&&t.length!==n.arity&&h(t,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?c&&h(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var i=d(t);return a(i,"source")||(i.source=v(y,"string"==typeof e?e:"")),t};Function.prototype.toString=w((function(){return r(this)&&u(this).source||s(this)}),"toString")},function(t,e,n){"use strict";var i=n(25),o=n(0),r=n(139),a=n(140),c=o.WebAssembly,l=7!==new Error("e",{cause:7}).cause,s=function(t,e){var n={};n[t]=a(t,e,l),i({global:!0,constructor:!0,arity:1,forced:l},n)},p=function(t,e){if(c&&c[t]){var n={};n[t]=a("WebAssembly."+t,e,l),i({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:l},n)}};s("Error",(function(t){return function(e){return r(t,this,arguments)}})),s("EvalError",(function(t){return function(e){return r(t,this,arguments)}})),s("RangeError",(function(t){return function(e){return r(t,this,arguments)}})),s("ReferenceError",(function(t){return function(e){return r(t,this,arguments)}})),s("SyntaxError",(function(t){return function(e){return r(t,this,arguments)}})),s("TypeError",(function(t){return function(e){return r(t,this,arguments)}})),s("URIError",(function(t){return function(e){return r(t,this,arguments)}})),p("CompileError",(function(t){return function(e){return r(t,this,arguments)}})),p("LinkError",(function(t){return function(e){return r(t,this,arguments)}})),p("RuntimeError",(function(t){return function(e){return r(t,this,arguments)}}))},function(t,e,n){var i=n(161),o=n(211),r=n(24),a=n(4),c=n(220);t.exports=function(t){return"function"==typeof t?t:null==t?r:"object"==typeof t?a(t)?o(t[0],t[1]):i(t):c(t)}},function(t,e,n){var i=n(48),o=n(4);t.exports=function(t,e,n){var r=e(t);return o(t)?r:i(r,n(t))}},function(t,e,n){var i=n(198),o=n(104),r=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,c=a?function(t){return null==t?[]:(t=Object(t),i(a(t),(function(e){return r.call(t,e)})))}:o;t.exports=c},function(t,e){t.exports=function(){return[]}},function(t,e,n){var i=n(199),o=n(38),r=n(4),a=n(81),c=n(50),l=n(83),s=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=r(t),p=!n&&o(t),d=!n&&!p&&a(t),u=!n&&!p&&!d&&l(t),g=n||p||d||u,h=g?i(t.length,String):[],m=h.length;for(var f in t)!e&&!s.call(t,f)||g&&("length"==f||d&&("offset"==f||"parent"==f)||u&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||c(f,m))||h.push(f);return h}},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){var i=n(52);t.exports=function(t,e,n){var o=null==t?void 0:i(t,e);return void 0===o?n:o}},function(t,e){t.exports=function(t,e){for(var n=-1,i=null==t?0:t.length,o=Array(i);++ns;)o(i,n=e[s++])&&(~a(p,n)||l(p,n));return p}},function(t,e,n){"use strict";var i=n(29),o=n(130),r=n(37),a=function(t){return function(e,n,a){var c=i(e),l=r(c);if(0===l)return!t&&-1;var s,p=o(a,l);if(t&&n!=n){for(;l>p;)if((s=c[p++])!=s)return!0}else for(;l>p;p++)if((t||p in c)&&c[p]===n)return t||p||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){"use strict";var i=n(70),o=Math.max,r=Math.min;t.exports=function(t,e){var n=i(t);return n<0?o(n+e,0):r(n,e)}},function(t,e,n){"use strict";var i=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?o:i)(e)}},function(t,e,n){"use strict";var i=n(70),o=Math.min;t.exports=function(t){var e=i(t);return e>0?o(e,9007199254740991):0}},function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},function(t,e,n){"use strict";var i=n(3),o=n(1),r=/#|\.prototype\./,a=function(t,e){var n=l[c(t)];return n===p||n!==s&&(o(e)?i(e):!!e)},c=a.normalize=function(t){return String(t).replace(r,".").toLowerCase()},l=a.data={},s=a.NATIVE="N",p=a.POLYFILL="P";t.exports=a},function(t,e,n){"use strict";var i=n(31),o=n(35),r=n(55),a=n(37),c=TypeError,l="Reduce of empty array with no initial value",s=function(t){return function(e,n,s,p){var d=o(e),u=r(d),g=a(d);if(i(n),0===g&&s<2)throw new c(l);var h=t?g-1:0,m=t?-1:1;if(s<2)for(;;){if(h in u){p=u[h],h+=m;break}if(h+=m,t?h<0:g<=h)throw new c(l)}for(;t?h>=0:g>h;h+=m)h in u&&(p=n(p,u[h],h,d));return p}};t.exports={left:s(!1),right:s(!0)}},function(t,e,n){"use strict";var i=n(3);t.exports=function(t,e){var n=[][t];return!!n&&i((function(){n.call(null,e||function(){return 1},1)}))}},function(t,e,n){"use strict";var i=n(0),o=n(17);t.exports="process"===o(i.process)},function(t,e,n){"use strict";var i=n(27),o=Function.prototype,r=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(i?a.bind(r):function(){return a.apply(r,arguments)})},function(t,e,n){"use strict";var i=n(30),o=n(9),r=n(13),a=n(60),c=n(71),l=n(69),s=n(144),p=n(145),d=n(146),u=n(149),g=n(150),h=n(5),m=n(65);t.exports=function(t,e,n,f){var v=f?2:1,b=t.split("."),y=b[b.length-1],w=i.apply(null,b);if(w){var k=w.prototype;if(!m&&o(k,"cause")&&delete k.cause,!n)return w;var _=i("Error"),B=e((function(t,e){var n=d(f?e:t,void 0),i=f?new w(t):new w;return void 0!==n&&r(i,"message",n),g(i,B,i.stack,2),this&&a(k,this)&&p(i,this,B),arguments.length>v&&u(i,arguments[v]),i}));if(B.prototype=k,"Error"!==y?c?c(B,_):l(B,_,{name:!0}):h&&"stackTraceLimit"in w&&(s(B,w,"stackTraceLimit"),s(B,w,"prepareStackTrace")),l(B,w),!m)try{k.name!==y&&r(k,"name",y),k.constructor=B}catch(t){}return B}}},function(t,e,n){"use strict";var i=n(2),o=n(31);t.exports=function(t,e,n){try{return i(o(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(t){}}},function(t,e,n){"use strict";var i=n(143),o=String,r=TypeError;t.exports=function(t){if(i(t))return t;throw new r("Can't set "+o(t)+" as a prototype")}},function(t,e,n){"use strict";var i=n(8);t.exports=function(t){return i(t)||null===t}},function(t,e,n){"use strict";var i=n(15).f;t.exports=function(t,e,n){n in t||i(t,n,{configurable:!0,get:function(){return e[n]},set:function(t){e[n]=t}})}},function(t,e,n){"use strict";var i=n(1),o=n(8),r=n(71);t.exports=function(t,e,n){var a,c;return r&&i(a=e.constructor)&&a!==n&&o(c=a.prototype)&&c!==n.prototype&&r(t,c),t}},function(t,e,n){"use strict";var i=n(97);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:i(t)}},function(t,e,n){"use strict";var i=n(148),o=n(1),r=n(17),a=n(32)("toStringTag"),c=Object,l="Arguments"===r(function(){return arguments}());t.exports=i?r:function(t){var e,n,i;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=c(t),a))?n:l?r(e):"Object"===(i=r(e))&&o(e.callee)?"Arguments":i}},function(t,e,n){"use strict";var i={};i[n(32)("toStringTag")]="z",t.exports="[object z]"===String(i)},function(t,e,n){"use strict";var i=n(8),o=n(13);t.exports=function(t,e){i(e)&&"cause"in e&&o(t,"cause",e.cause)}},function(t,e,n){"use strict";var i=n(13),o=n(151),r=n(152),a=Error.captureStackTrace;t.exports=function(t,e,n,c){r&&(a?a(t,e):i(t,"stack",o(n,c)))}},function(t,e,n){"use strict";var i=n(2),o=Error,r=i("".replace),a=String(new o("zxcasd").stack),c=/\n\s*at [^:]*:[^\n]*/,l=c.test(a);t.exports=function(t,e){if(l&&"string"==typeof t&&!o.prepareStackTrace)for(;e--;)t=r(t,c,"");return t}},function(t,e,n){"use strict";var i=n(3),o=n(28);t.exports=!i((function(){var t=new Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},function(t,e,n){"use strict";var i=n(5),o=n(154),r=TypeError,a=Object.getOwnPropertyDescriptor,c=i&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=c?function(t,e){if(o(t)&&!a(t,"length").writable)throw new r("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},function(t,e,n){"use strict";var i=n(17);t.exports=Array.isArray||function(t){return"Array"===i(t)}},function(t,e,n){"use strict";var i=TypeError;t.exports=function(t){if(t>9007199254740991)throw i("Maximum allowed index exceeded");return t}},function(t,e,n){var i=n(48),o=n(157);t.exports=function t(e,n,r,a,c){var l=-1,s=e.length;for(r||(r=o),c||(c=[]);++l0&&r(p)?n>1?t(p,n-1,r,a,c):i(c,p):a||(c[c.length]=p)}return c}},function(t,e,n){var i=n(14),o=n(38),r=n(4),a=i?i.isConcatSpreadable:void 0;t.exports=function(t){return r(t)||o(t)||!!(a&&t&&t[a])}},function(t,e,n){var i=n(12),o=n(11);t.exports=function(t){return o(t)&&"[object Arguments]"==i(t)}},function(t,e,n){var i=n(14),o=Object.prototype,r=o.hasOwnProperty,a=o.toString,c=i?i.toStringTag:void 0;t.exports=function(t){var e=r.call(t,c),n=t[c];try{t[c]=void 0;var i=!0}catch(t){}var o=a.call(t);return i&&(e?t[c]=n:delete t[c]),o}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var i=n(162),o=n(210),r=n(86);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?r(e[0][0],e[0][1]):function(n){return n===t||i(n,t,e)}}},function(t,e,n){var i=n(73),o=n(76);t.exports=function(t,e,n,r){var a=n.length,c=a,l=!r;if(null==t)return!c;for(t=Object(t);a--;){var s=n[a];if(l&&s[2]?s[1]!==t[s[0]]:!(s[0]in t))return!1}for(;++a-1}},function(t,e,n){var i=n(19);t.exports=function(t,e){var n=this.__data__,o=i(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var i=n(18);t.exports=function(){this.__data__=new i,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var i=n(18),o=n(39),r=n(40);t.exports=function(t,e){var n=this.__data__;if(n instanceof i){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new r(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var i=n(74),o=n(174),r=n(23),a=n(75),c=/^\[object .+?Constructor\]$/,l=Function.prototype,s=Object.prototype,p=l.toString,d=s.hasOwnProperty,u=RegExp("^"+p.call(d).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!r(t)||o(t))&&(i(t)?u:c).test(a(t))}},function(t,e,n){var i,o=n(175),r=(i=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+i:"";t.exports=function(t){return!!r&&r in t}},function(t,e,n){var i=n(6)["__core-js_shared__"];t.exports=i},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var i=n(178),o=n(18),r=n(39);t.exports=function(){this.size=0,this.__data__={hash:new i,map:new(r||o),string:new i}}},function(t,e,n){var i=n(179),o=n(180),r=n(181),a=n(182),c=n(183);function l(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var i=n(78),o=n(231),r=n(236),a=n(79),c=n(237),l=n(41);t.exports=function(t,e,n){var s=-1,p=o,d=t.length,u=!0,g=[],h=g;if(n)u=!1,p=r;else if(d>=200){var m=e?null:c(t);if(m)return l(m);u=!1,p=a,h=new i}else h=e?[]:g;t:for(;++s-1}},function(t,e,n){var i=n(233),o=n(234),r=n(235);t.exports=function(t,e,n){return e==e?r(t,e,n):i(t,o,n)}},function(t,e){t.exports=function(t,e,n,i){for(var o=t.length,r=n+(i?1:-1);i?r--:++r0)return function(t){if((t=String(t)).length>100)return;var e=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(!e)return;var a=parseFloat(e[1]);switch((e[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"days":case"day":case"d":return a*r;case"hours":case"hour":case"hrs":case"hr":case"h":return a*o;case"minutes":case"minute":case"mins":case"min":case"m":return a*i;case"seconds":case"second":case"secs":case"sec":case"s":return a*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}(t);if("number"===l&&!1===isNaN(t))return e.long?a(c=t,r,"day")||a(c,o,"hour")||a(c,i,"minute")||a(c,n,"second")||c+" ms":function(t){if(t>=r)return Math.round(t/r)+"d";if(t>=o)return Math.round(t/o)+"h";if(t>=i)return Math.round(t/i)+"m";if(t>=n)return Math.round(t/n)+"s";return t+"ms"}(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},function(t,e,n){"use strict";n(89)},function(t,e,n){"use strict";n(90)},function(t,e,n){"use strict";n.r(e); /*! * Vue.js v2.7.16 * (c) 2014-2023 Evan You * Released under the MIT License. */ -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,K=D((function(t){return t.replace(x,(function(t,e){return e?e.toUpperCase():""}))})),P=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 A(t,e){e=e||0;for(var n=t.length-e,i=new Array(n);n--;)i[n]=t[n+e];return i}function C(t,e){for(var n in e)t[n]=e[n];return t}function F(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;Ct(t,"$attrs",r&&r.attrs||i,null,!0),Ct(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){Ct(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?A(n):n;for(var i=A(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:C,mergeOptions:On,defineReactive:Ct},t.set=Ft,t.delete=Et,t.nextTick=Ie,t.observable=function(t){return At(t),t},t.options=Object.create(null),N.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,C(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=A(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=Ae&&!(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=C({},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?C(t.staticStyle,e):e}function to(t){return Array.isArray(t)?F(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&&C(e,ho(t.name||"v")),C(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=Ko(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 Po(t,e){for(;t.length1}function Fo(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 K(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[K(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=C({},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=C({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())},C(Vn.options.directives,zo),C(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 Ka(t){return function(e,n,i){var o=!1,r=0,a=null;Pa(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 Pa(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 Aa=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 Ca(t,e,n,i){var o=Pa(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 Fa(t,e){if(e)return function(){return t.apply(e,arguments)}}Aa.prototype.listen=function(t){this.cb=t},Aa.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Aa.prototype.onError=function(t){this.errorCbs.push(t)},Aa.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)}))))}))},Aa.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}(Aa);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}(Aa);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}(Aa),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-bac76d8e":()=>n.e(49).then(n.bind(null,401)),"v-609f26f9":()=>n.e(48).then(n.bind(null,402)),"v-7c0c45f9":()=>n.e(51).then(n.bind(null,403)),"v-62ca00fb":()=>n.e(50).then(n.bind(null,404)),"v-8bd632d6":()=>n.e(52).then(n.bind(null,405)),"v-0f4d5d15":()=>n.e(53).then(n.bind(null,406)),"v-2cebe183":()=>n.e(34).then(n.bind(null,407)),"v-3eaa044d":()=>n.e(31).then(n.bind(null,408)),"v-353b78e1":()=>n.e(54).then(n.bind(null,409)),"v-3875825f":()=>n.e(55).then(n.bind(null,410)),"v-07ff1843":()=>n.e(56).then(n.bind(null,411)),"v-c6756cce":()=>n.e(58).then(n.bind(null,412)),"v-9504490e":()=>n.e(57).then(n.bind(null,413)),"v-56536559":()=>n.e(19).then(n.bind(null,414)),"v-f58ec8f2":()=>n.e(21).then(n.bind(null,415)),"v-015729b9":()=>n.e(59).then(n.bind(null,416)),"v-2c605799":()=>n.e(60).then(n.bind(null,417)),"v-9145467a":()=>n.e(62).then(n.bind(null,418)),"v-57698579":()=>n.e(61).then(n.bind(null,419)),"v-2cf72b39":()=>n.e(63).then(n.bind(null,420)),"v-11d64359":()=>n.e(64).then(n.bind(null,421)),"v-5d749fce":()=>n.e(65).then(n.bind(null,422)),"v-ab5ba3ce":()=>n.e(66).then(n.bind(null,423)),"v-d0375c8e":()=>n.e(67).then(n.bind(null,424)),"v-10852eea":()=>n.e(68).then(n.bind(null,425)),"v-05df4999":()=>n.e(70).then(n.bind(null,426)),"v-edd5570e":()=>n.e(69).then(n.bind(null,427)),"v-faad828e":()=>n.e(71).then(n.bind(null,428)),"v-0119984e":()=>n.e(72).then(n.bind(null,429)),"v-7c3d28f9":()=>n.e(73).then(n.bind(null,430)),"v-75d11339":()=>n.e(75).then(n.bind(null,431)),"v-1ac9ef4e":()=>n.e(76).then(n.bind(null,432)),"v-0df1c3ce":()=>n.e(74).then(n.bind(null,433)),"v-55969f39":()=>n.e(77).then(n.bind(null,434)),"v-8534b9c2":()=>n.e(78).then(n.bind(null,435)),"v-aeb70fce":()=>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-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-4dc135e3":()=>n.e(80).then(n.bind(null,443)),"v-17019aeb":()=>Promise.all([n.e(0),n.e(42)]).then(n.bind(null,444)),"v-a7c24c4e":()=>Promise.all([n.e(0),n.e(41)]).then(n.bind(null,445)),"v-f611a14e":()=>n.e(82).then(n.bind(null,446)),"v-7a315e41":()=>n.e(81).then(n.bind(null,447)),"v-3acb6e6a":()=>n.e(83).then(n.bind(null,448)),"v-0b3b65ea":()=>n.e(85).then(n.bind(null,449)),"v-496cb7f9":()=>n.e(84).then(n.bind(null,395)),"v-a76bccee":()=>n.e(86).then(n.bind(null,450)),"v-05d01c19":()=>n.e(87).then(n.bind(null,451)),"v-a9236c10":()=>n.e(89).then(n.bind(null,452)),"v-11bf335e":()=>n.e(88).then(n.bind(null,453)),"v-29f9f21c":()=>n.e(90).then(n.bind(null,454)),"v-3750297a":()=>n.e(91).then(n.bind(null,455)),"v-71ef7c85":()=>n.e(92).then(n.bind(null,456)),"v-08589c4e":()=>n.e(94).then(n.bind(null,457)),"v-c152529c":()=>n.e(95).then(n.bind(null,458)),"v-4a4b61eb":()=>n.e(96).then(n.bind(null,459)),"v-105750ce":()=>n.e(93).then(n.bind(null,460)),"v-50aa6d4e":()=>n.e(97).then(n.bind(null,461)),"v-4bcdac39":()=>n.e(98).then(n.bind(null,462))};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),Kc={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})}},Pc={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)(Pc,(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,Kc,{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)}}}]),Ac={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"}}},Cc=Object(Sc.a)(Ac,(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.")}}(Cc,"mixins",Oc);const Fc=[{name:"v-330a32a2",path:"/",component:Cc,beforeEnter:(t,e,n)=>{dc("Layout","v-330a32a2").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-2c450c3f",path:"/blog/_2023-q4-update/",component:Cc,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:Cc,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-bac76d8e",path:"/blog/_2024-q3-rfp-rust-maintainer/",component:Cc,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-609f26f9",path:"/blog/_2024-q2-update/",component:Cc,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-7c0c45f9",path:"/blog/bitcoin-core-rpc-demo/",component:Cc,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-62ca00fb",path:"/blog/_2024-q3-update/",component:Cc,beforeEnter:(t,e,n)=>{dc("Post","v-62ca00fb").then(n)}},{path:"/blog/_2024-q3-update/index.html",redirect:"/blog/_2024-q3-update/"},{path:"/_blog/2024_q3_update.html",redirect:"/blog/_2024-q3-update/"},{name:"v-8bd632d6",path:"/blog/bdk-cli-basics-multisig-2of3/",component:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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-015729b9",path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",component:Cc,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:Cc,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-9145467a",path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/",component:Cc,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-57698579",path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",component:Cc,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-2cf72b39",path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/",component:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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-0df1c3ce",path:"/blog/2021/05/release-v0.7.0/",component:Cc,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-55969f39",path:"/blog/road-to-bdk-1/",component:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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-4dc135e3",path:"/blog/why-bindings/",component:Cc,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-17019aeb",path:"/adoption/web/",component:Cc,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-a7c24c4e",path:"/adoption/mobile/",component:Cc,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-f611a14e",path:"/bdk-cli/concept/",component:Cc,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:Cc,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-3acb6e6a",path:"/bdk-cli/installation/",component:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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-a9236c10",path:"/descriptors/",component:Cc,beforeEnter:(t,e,n)=>{dc("Layout","v-a9236c10").then(n)}},{path:"/descriptors/index.html",redirect:"/descriptors/"},{name:"v-11bf335e",path:"/case-studies/",component:Cc,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:Cc,beforeEnter:(t,e,n)=>{dc("Layout","v-29f9f21c").then(n)}},{path:"/examples/index.html",redirect:"/examples/"},{name:"v-3750297a",path:"/foundation/about/",component:Cc,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:Cc,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-08589c4e",path:"/foundation/grants/",component:Cc,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-c152529c",path:"/foundation/",component:Cc,beforeEnter:(t,e,n)=>{dc("Layout","v-c152529c").then(n)}},{path:"/foundation/index.html",redirect:"/foundation/"},{name:"v-4a4b61eb",path:"/foundation/members/",component:Cc,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-105750ce",path:"/foundation/grantees/",component:Cc,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-50aa6d4e",path:"/foundation/supporters/",component:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc,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:Cc}],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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{title:"2024 Q3 Update: What Have We Been Up To?",frontmatter:{title:"2024 Q3 Update: What Have We Been Up To?",description:"2024 Q3 Update on the Bitcoin Dev Kit Project",authors:["thunderbiscuit"],date:"2024-11-07",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-11-07T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2024 Q3 Update: What Have We Been Up To?"},{property:"og:description",content:"2024 Q3 Update on the Bitcoin Dev Kit Project"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q3_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2024 Q3 Update: What Have We Been Up To?"},{name:"twitter:description",content:"2024 Q3 Update on the Bitcoin Dev Kit Project"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q3_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_q3_update.html",relativePath:"_blog/2024_q3_update.md",key:"v-62ca00fb",path:"/blog/_2024-q3-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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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:"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:"Evan Lin",slug:"evan-lin"},{level:2,title:"Nymius",slug:"nymius"},{level:2,title:"Manuel Gatti",slug:"manuel-gatti"},{level:2,title:"Leonardo Souza",slug:"leonardo-souza"}],codeSwitcherOptions:{},lastUpdated:"11/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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/28/2024, 10:52:18 AM",lastUpdatedTimestamp:1732791138e3},{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:"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:"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:"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(99).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-bac76d8e","v-609f26f9","v-7c0c45f9","v-62ca00fb","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","v-62ca00fb"]},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-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-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-05df4999","v-edd5570e","v-faad828e","v-0119984e","v-7c3d28f9","v-75d11339","v-1ac9ef4e","v-0df1c3ce"]},"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-75d11339","v-1ac9ef4e","v-0df1c3ce"]}},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-62ca00fb","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"]},"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-015729b9","v-2c605799","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-75d11339","v-1ac9ef4e","v-0df1c3ce","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,39]}],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,13]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"project",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/project/",interval:[0,4]}],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:"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,5]}],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:"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 +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-5e744cf7":()=>n.e(47).then(n.bind(null,399)),"v-2c450c3f":()=>n.e(46).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-62ca00fb":()=>n.e(50).then(n.bind(null,403)),"v-8bd632d6":()=>n.e(52).then(n.bind(null,404)),"v-0f4d5d15":()=>n.e(53).then(n.bind(null,405)),"v-7c0c45f9":()=>n.e(51).then(n.bind(null,406)),"v-3eaa044d":()=>n.e(31).then(n.bind(null,407)),"v-353b78e1":()=>n.e(54).then(n.bind(null,408)),"v-2cebe183":()=>n.e(34).then(n.bind(null,409)),"v-3875825f":()=>n.e(55).then(n.bind(null,410)),"v-07ff1843":()=>n.e(56).then(n.bind(null,411)),"v-9504490e":()=>n.e(57).then(n.bind(null,412)),"v-c6756cce":()=>n.e(58).then(n.bind(null,413)),"v-56536559":()=>n.e(19).then(n.bind(null,414)),"v-015729b9":()=>n.e(59).then(n.bind(null,415)),"v-2c605799":()=>n.e(60).then(n.bind(null,416)),"v-f58ec8f2":()=>n.e(21).then(n.bind(null,417)),"v-57698579":()=>n.e(61).then(n.bind(null,418)),"v-9145467a":()=>n.e(62).then(n.bind(null,419)),"v-2cf72b39":()=>n.e(63).then(n.bind(null,420)),"v-5d749fce":()=>n.e(65).then(n.bind(null,421)),"v-11d64359":()=>n.e(64).then(n.bind(null,422)),"v-ab5ba3ce":()=>n.e(66).then(n.bind(null,423)),"v-d0375c8e":()=>n.e(67).then(n.bind(null,424)),"v-10852eea":()=>n.e(68).then(n.bind(null,425)),"v-05df4999":()=>n.e(70).then(n.bind(null,426)),"v-faad828e":()=>n.e(71).then(n.bind(null,427)),"v-edd5570e":()=>n.e(69).then(n.bind(null,428)),"v-7c3d28f9":()=>n.e(73).then(n.bind(null,429)),"v-0119984e":()=>n.e(72).then(n.bind(null,430)),"v-0df1c3ce":()=>n.e(74).then(n.bind(null,431)),"v-75d11339":()=>n.e(75).then(n.bind(null,432)),"v-55969f39":()=>n.e(77).then(n.bind(null,433)),"v-1ac9ef4e":()=>n.e(76).then(n.bind(null,434)),"v-8534b9c2":()=>n.e(78).then(n.bind(null,435)),"v-4dc135e3":()=>n.e(80).then(n.bind(null,436)),"v-aeb70fce":()=>n.e(79).then(n.bind(null,437)),"v-30c0037b":()=>Promise.all([n.e(0),n.e(36)]).then(n.bind(null,438)),"v-4d760891":()=>Promise.all([n.e(0),n.e(35)]).then(n.bind(null,439)),"v-4bb7844a":()=>Promise.all([n.e(0),n.e(37)]).then(n.bind(null,440)),"v-b936290e":()=>Promise.all([n.e(0),n.e(38)]).then(n.bind(null,441)),"v-7afdbb4e":()=>Promise.all([n.e(0),n.e(39)]).then(n.bind(null,442)),"v-4e0b610e":()=>Promise.all([n.e(0),n.e(40)]).then(n.bind(null,443)),"v-a7c24c4e":()=>Promise.all([n.e(0),n.e(41)]).then(n.bind(null,444)),"v-17019aeb":()=>Promise.all([n.e(0),n.e(42)]).then(n.bind(null,445)),"v-7a315e41":()=>n.e(81).then(n.bind(null,446)),"v-3acb6e6a":()=>n.e(83).then(n.bind(null,447)),"v-f611a14e":()=>n.e(82).then(n.bind(null,448)),"v-496cb7f9":()=>n.e(84).then(n.bind(null,395)),"v-0b3b65ea":()=>n.e(85).then(n.bind(null,449)),"v-a76bccee":()=>n.e(86).then(n.bind(null,450)),"v-05d01c19":()=>n.e(87).then(n.bind(null,451)),"v-11bf335e":()=>n.e(88).then(n.bind(null,452)),"v-a9236c10":()=>n.e(89).then(n.bind(null,453)),"v-29f9f21c":()=>n.e(90).then(n.bind(null,454)),"v-3750297a":()=>n.e(91).then(n.bind(null,455)),"v-71ef7c85":()=>n.e(92).then(n.bind(null,456)),"v-105750ce":()=>n.e(93).then(n.bind(null,457)),"v-08589c4e":()=>n.e(94).then(n.bind(null,458)),"v-c152529c":()=>n.e(95).then(n.bind(null,459)),"v-50aa6d4e":()=>n.e(97).then(n.bind(null,460)),"v-4a4b61eb":()=>n.e(96).then(n.bind(null,461)),"v-4bcdac39":()=>n.e(98).then(n.bind(null,462))};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-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-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-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-62ca00fb",path:"/blog/_2024-q3-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-62ca00fb").then(n)}},{path:"/blog/_2024-q3-update/index.html",redirect:"/blog/_2024-q3-update/"},{path:"/_blog/2024_q3_update.html",redirect:"/blog/_2024-q3-update/"},{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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{title:"2024 Q3 Update: What Have We Been Up To?",frontmatter:{title:"2024 Q3 Update: What Have We Been Up To?",description:"2024 Q3 Update on the Bitcoin Dev Kit Project",authors:["thunderbiscuit"],date:"2024-11-07",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-11-07T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2024 Q3 Update: What Have We Been Up To?"},{property:"og:description",content:"2024 Q3 Update on the Bitcoin Dev Kit Project"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q3_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2024 Q3 Update: What Have We Been Up To?"},{name:"twitter:description",content:"2024 Q3 Update on the Bitcoin Dev Kit Project"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q3_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_q3_update.html",relativePath:"_blog/2024_q3_update.md",key:"v-62ca00fb",path:"/blog/_2024-q3-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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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:"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:"Evan Lin",slug:"evan-lin"},{level:2,title:"Nymius",slug:"nymius"},{level:2,title:"Manuel Gatti",slug:"manuel-gatti"},{level:2,title:"Leonardo Souza",slug:"leonardo-souza"}],codeSwitcherOptions:{},lastUpdated:"11/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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/29/2024, 1:53:50 PM",lastUpdatedTimestamp:173288843e4},{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:"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:"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-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:"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:"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:"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:"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:"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:"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(99).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-5e744cf7","v-2c450c3f","v-609f26f9","v-bac76d8e","v-62ca00fb","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-5e744cf7","v-2c450c3f","v-609f26f9","v-62ca00fb"]},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"]},basics:{key:"basics",scope:"tags",path:"/blog/tags/basics/",pageKeys:["v-0f4d5d15"]},novice:{key:"novice",scope:"tags",path:"/blog/tags/novice/",pageKeys:["v-0f4d5d15"]},"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-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"]},architecture:{key:"architecture",scope:"tags",path:"/blog/tags/architecture/",pageKeys:["v-2cebe183","v-55969f39"]},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-c6756cce","v-56536559","v-f58ec8f2","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"]},"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-faad828e","v-edd5570e","v-7c3d28f9","v-0119984e","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-faad828e","v-edd5570e","v-7c3d28f9","v-0119984e","v-0df1c3ce","v-75d11339","v-1ac9ef4e"]}},author:{"Steve Myers":{key:"Steve Myers",scope:"author",path:"/blog/author/Steve Myers/",pageKeys:["v-5e744cf7","v-2c450c3f","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-62ca00fb","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"]},"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"]},"Lloyd Fournier":{key:"Lloyd Fournier",scope:"author",path:"/blog/author/Lloyd Fournier/",pageKeys:["v-2cebe183"]},"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-05df4999","v-faad828e","v-edd5570e","v-7c3d28f9","v-0119984e","v-0df1c3ce","v-75d11339","v-55969f39","v-1ac9ef4e"]},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,39]}],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,13]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"project",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/project/",interval:[0,4]}],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:"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:"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-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:"architecture",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/architecture/",interval:[0,2]}],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:"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,5]}],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:"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:"Lloyd Fournier",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Lloyd Fournier/",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 diff --git a/bdk-cli/compiler/index.html b/bdk-cli/compiler/index.html index 39a6d09654..8519b0d595 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.

Last Updated: 11/28/2024, 10:52:18 AM
Last Updated: 11/29/2024, 1:53:50 PM
- + diff --git a/bdk-cli/concept/index.html b/bdk-cli/concept/index.html index deb587761e..f37ce693ab 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!

    Last Updated: 11/28/2024, 10:52:18 AM
    Last Updated: 11/29/2024, 1:53:50 PM
    - + diff --git a/bdk-cli/installation/index.html b/bdk-cli/installation/index.html index 5ee41b12c1..ad4c8f03ad 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
    -
    Last Updated: 11/28/2024, 10:52:18 AM
    Last Updated: 11/29/2024, 1:53:50 PM
    - + diff --git a/bdk-cli/interface/index.html b/bdk-cli/interface/index.html index b853cc016d..4c6150f351 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.

    Last Updated: 11/28/2024, 10:52:18 AM

    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.

    Last Updated: 11/29/2024, 1:53:50 PM
    - + diff --git a/bdk-cli/introduction/index.html b/bdk-cli/introduction/index.html index 66cb315d53..6b551668ed 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.

    Last Updated: 11/28/2024, 10:52:18 AM
    - + diff --git a/bdk-cli/playground/index.html b/bdk-cli/playground/index.html index b686267f72..b1bbd2c374 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

    Last Updated: 11/28/2024, 10:52:18 AM
    - + diff --git a/bdk-cli/regtest/index.html b/bdk-cli/regtest/index.html index 02b55384d8..f7cf2ddb58 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.

    Last Updated: 11/28/2024, 10:52:18 AM

    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.

    Last Updated: 11/29/2024, 1:53:50 PM
    - + diff --git a/blog/2020/12/hello-world/index.html b/blog/2020/12/hello-world/index.html index fd85406025..d9918ebda1 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!

    Last Updated: 11/28/2024, 10:52:18 AM
    - + diff --git a/blog/2020/12/release-v0.2.0/index.html b/blog/2020/12/release-v0.2.0/index.html index 2e25228773..014be0b161 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:

    Last Updated: 11/28/2024, 10:52:18 AM
    - + diff --git a/blog/tags/bitcoin-cli/index.html b/blog/tags/bitcoin-cli/index.html index 9d709ba619..ca7a55f91d 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 f9837d0407..ff1c0b584e 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 7bcfc9cfba..289e0b04ed 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 09da37311f..868133a9d5 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 a0c3dfd8c1..02904ab7e7 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 00791bf409..12873895b0 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 bbd387cac6..03e5c3c86f 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 5368ae50d3..7d0c4bd76b 100644 --- a/blog/tags/fee/index.html +++ b/blog/tags/fee/index.html @@ -25,7 +25,7 @@ - + @@ -103,6 +103,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/getting started/index.html b/blog/tags/getting started/index.html index 2724f71e53..66c545e2d8 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 69a7f41491..05b6c6ecc3 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 a810a48b1e..2f949316f1 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 616aa9c609..9234ba0296 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 e4f056e36f..81cbcd40b4 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -25,7 +25,7 @@ - + @@ -49,7 +49,7 @@ Blog GitHub - (opens new window)

    Tags

    - + diff --git a/blog/tags/miniscript/index.html b/blog/tags/miniscript/index.html index 5016fc5d89..46979e4a53 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 6581f53ef5..b439c66e5f 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 5c36287d91..714edabe5e 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 e7ed45f11b..a77906d739 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 a57a6c489d..f41f0ac45f 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 20fec5ebfb..2555c33d5d 100644 --- a/blog/tags/project/index.html +++ b/blog/tags/project/index.html @@ -25,7 +25,7 @@ - + @@ -114,6 +114,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/release/index.html b/blog/tags/release/index.html index 554cac1d79..f1537a63a7 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 493e0a8079..feea287519 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 59c4c6291b..68d31f0971 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 428784ba34..7ef30d90f4 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 d6613612d2..49324c3220 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 4aa69e6606..28c119f844 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 afbfef7b36..984aacaaf1 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 3cd7bd39ac..816f31b27b 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 fc37f7b79b..d9e6201042 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 61990ff4a6..8a0e2df9f6 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 82f8ed5829..18443bdd41 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 31ab8b8693..f1d0b4fa3f 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 4d37382e53..945af428a4 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 b846d6d87a..bc399283a9 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 b2e64a5664..92cdcb626f 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 38a5f64c51..6ecef1bc3e 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 @@ -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 = 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 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 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 = 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 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 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 = 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 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 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 = 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 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 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 f5a14df6d7..f77258645c 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 an object with a well-defined format. Read more
    §

    impl Decodable for Vec<BlockHash>

    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 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>

    §

    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>

    §

    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<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 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 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.

    @@ -4085,12 +4085,12 @@
    §Examples< let [a, b]: [_; 2] = v.try_into().unwrap(); assert_eq!(a, b' '); assert_eq!(b, b'd');
    -
    §

    type Error = Vec<T, A>

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

    impl TryFrom<Vec<TapNodeHash>> for TaprootMerkleBranch

    §

    fn try_from( +

    §

    type Error = Vec<T, A>

    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

    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<u8>> for PushBytesBuf

    §

    type Error = PushBytesError

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

    fn try_from( +

    §

    type Error = TaprootError

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

    impl TryFrom<Vec<u8>> for PushBytesBuf

    §

    type Error = PushBytesError

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

    fn try_from( vec: Vec<u8> ) -> Result<PushBytesBuf, <PushBytesBuf as TryFrom<Vec<u8>>>::Error>

    Performs the conversion.
    §

    impl Write for Vec<u8>

    §

    fn write(&mut self, buf: &[u8]) -> Result<usize, Error>

    Writes buf into this writer, returning how many bytes were written.
    §

    fn flush(&mut self) -> Result<(), Error>

    Flushes this output stream, ensuring that all intermediately buffered contents reach their destination.
    §

    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

    Attempts to write an entire buffer into this writer.
    1.0.0 · source§

    impl<A> Write for Vec<u8, A>
    where 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 5da828087e..dbc1613bd1 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,7 +9,7 @@

    §

    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 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 74d959a440..0a0a2c5e7d 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 @@ -6,11 +6,11 @@ &self, previous_filter_header: &FilterHeader ) -> FilterHeader

    Computes the filter header from a filter hash and previous filter header.

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for FilterHash

    §

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

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

    impl AsRef<[u8; 32]> for FilterHash

    §

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

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

    impl Borrow<[u8]> for FilterHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for FilterHash

    §

    fn clone(&self) -> FilterHash

    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 FilterHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for FilterHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for FilterHash

    §

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

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

    impl AsRef<[u8; 32]> for FilterHash

    §

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

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

    impl Borrow<[u8]> for FilterHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for FilterHash

    §

    fn clone(&self) -> FilterHash

    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 FilterHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for FilterHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<FilterHash, 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 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/bip158/struct.FilterHeader.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHeader.html index 564028d1e3..18a3428265 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHeader.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHeader.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 FilterHeader

    §

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

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

    impl Display for FilterHeader

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Encodable for 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 From<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    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 FromStr for FilterHeader

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for FilterHeader

    §

    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<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    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 FromStr for FilterHeader

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for FilterHeader

    §

    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.ChildNumber.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.ChildNumber.html index db9e8b1b74..eda99a5509 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.ChildNumber.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.ChildNumber.html @@ -20,7 +20,7 @@

    Trait Implementations§

    §

    impl AsRef<[ChildNumber]> for ChildNumber

    §

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

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

    impl Clone for ChildNumber

    §

    fn clone(&self) -> ChildNumber

    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 ChildNumber

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ChildNumber

    §

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

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

    impl Display for ChildNumber

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<ChildNumber> for u32

    §

    fn from(cnum: ChildNumber) -> u32

    Converts to this type from the input type.
    §

    impl From<u32> for ChildNumber

    §

    fn from(number: u32) -> ChildNumber

    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 ChildNumber

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<ChildNumber> for u32

    §

    fn from(cnum: ChildNumber) -> u32

    Converts to this type from the input type.
    §

    impl From<u32> for ChildNumber

    §

    fn from(number: u32) -> ChildNumber

    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 ChildNumber

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(inp: &str) -> Result<ChildNumber, Error>

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

    impl Hash for ChildNumber

    §

    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/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.Error.html index 6aa0088b2e..dcc505baaf 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(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 +

    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 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 5b4adf09d1..746d0e55f0 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,7 +6,7 @@

    §

    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 +

    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, 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 2d676cb3d4..26b0cdf4c0 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 7858ee2da8..0d5999cc98 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 dc3e8050fe..c7f77ad6a7 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 27113c38e8..dc997e0491 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.Block.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.Block.html index def4d31723..0c7691d48d 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.Block.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.Block.html @@ -36,7 +36,7 @@

    Result<Block, <__D as Deserializer<'de>>::Error>
    where __D: Deserializer<'de>,

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

    impl Encodable for Block

    §

    fn consensus_encode<R>(&self, r: &mut R) -> Result<usize, Error>
    where - R: 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<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl PartialEq for Block

    §

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

    This method tests for self and other values to be equal, and is used + R: 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<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl PartialEq for Block

    §

    fn eq(&self, other: &Block) -> 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 Serialize for Block

    §

    fn serialize<__S>( &self, 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 dae36f4709..2cb0ef1e4d 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 @@ -2,11 +2,11 @@

    Implementations§

    §

    impl BlockHash

    pub fn from_raw_hash(inner: Hash) -> BlockHash

    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 BlockHash

    §

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

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

    impl AsRef<[u8; 32]> for BlockHash

    §

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

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

    impl Borrow<[u8]> for BlockHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for BlockHash

    §

    fn clone(&self) -> BlockHash

    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 BlockHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for BlockHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for BlockHash

    §

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

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

    impl AsRef<[u8; 32]> for BlockHash

    §

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

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

    impl Borrow<[u8]> for BlockHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for BlockHash

    §

    fn clone(&self) -> BlockHash

    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 BlockHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for BlockHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<BlockHash, 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 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.WitnessCommitment.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.WitnessCommitment.html index 355283f92c..2d963ca2c2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.WitnessCommitment.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.WitnessCommitment.html @@ -2,10 +2,10 @@

    Implementations§

    §

    impl WitnessCommitment

    pub fn from_raw_hash(inner: Hash) -> WitnessCommitment

    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 WitnessCommitment

    §

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

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

    impl AsRef<[u8; 32]> for WitnessCommitment

    §

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

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

    impl Borrow<[u8]> for WitnessCommitment

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WitnessCommitment

    §

    fn clone(&self) -> WitnessCommitment

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WitnessCommitment

    §

    fn deserialize<D>( +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WitnessCommitment

    §

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

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

    impl AsRef<[u8; 32]> for WitnessCommitment

    §

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

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

    impl Borrow<[u8]> for WitnessCommitment

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WitnessCommitment

    §

    fn clone(&self) -> WitnessCommitment

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WitnessCommitment

    §

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

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

    impl Display for WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    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 FromStr for WitnessCommitment

    §

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    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 FromStr for WitnessCommitment

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessCommitment

    §

    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/blockdata/constants/struct.ChainHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/constants/struct.ChainHash.html index 3419d096f5..8ac1c0b7f4 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 @@ -35,9 +35,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 [u8]> for ChainHash

    §

    type Error = TryFromSliceError

    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 [u8]> for ChainHash

    §

    type Error = TryFromSliceError

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

    fn try_from( data: &'a [u8] -) -> Result<ChainHash, <ChainHash as TryFrom<&'a [u8]>>::Error>

    Performs the conversion.
    §

    impl TryFrom<ChainHash> for Network

    §

    type Error = UnknownChainHashError

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

    fn try_from( +) -> Result<ChainHash, <ChainHash as TryFrom<&'a [u8]>>::Error>

    Performs the conversion.
    §

    impl TryFrom<ChainHash> for Network

    §

    type Error = UnknownChainHashError

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

    fn try_from( chain_hash: ChainHash ) -> Result<Network, <Network as TryFrom<ChainHash>>::Error>

    Performs the conversion.
    §

    impl UpperHex for ChainHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Copy for ChainHash

    §

    impl Eq for ChainHash

    §

    impl StructuralPartialEq for ChainHash

    Auto Trait Implementations§

    §

    impl Freeze for ChainHash

    §

    impl RefUnwindSafe for ChainHash

    §

    impl Send for ChainHash

    §

    impl Sync for ChainHash

    §

    impl Unpin for ChainHash

    §

    impl UnwindSafe for ChainHash

    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/locktime/absolute/enum.LockTime.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/absolute/enum.LockTime.html index f9cdac9ecf..dd2a6bfae8 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 4007961ea1..6922118c07 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/opcodes/struct.Opcode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/opcodes/struct.Opcode.html index 6516c33218..3fa6ecd82b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/opcodes/struct.Opcode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/opcodes/struct.Opcode.html @@ -9,7 +9,7 @@ in contexts where only pushes are supposed to be allowed.

    Implementations§

    §

    impl Opcode

    pub fn classify(self, ctx: ClassifyContext) -> Class

    Classifies an Opcode into a broad class.

    pub const fn to_u8(self) -> u8

    Encodes Opcode as a byte.

    -

    Trait Implementations§

    §

    impl Clone for Opcode

    §

    fn clone(&self) -> Opcode

    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 Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl From<u8> for Opcode

    §

    fn from(b: u8) -> Opcode

    Converts to this type from the input type.
    §

    impl PartialEq for Opcode

    §

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

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

    Trait Implementations§

    §

    impl Clone for Opcode

    §

    fn clone(&self) -> Opcode

    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 Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl From<u8> for Opcode

    §

    fn from(b: u8) -> Opcode

    Converts to this type from the input type.
    §

    impl PartialEq for Opcode

    §

    fn eq(&self, other: &Opcode) -> 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 Serialize for Opcode

    §

    fn serialize<S>( &self, 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 1b594d6a7a..eb987c621f 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( +

    §

    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 5e1e5d1967..eff2473c38 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 daaded112e..230c657887 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,33 +148,33 @@
    §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( &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(&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(&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 @@ -183,12 +183,12 @@
    §Returns
    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 <= +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 <= 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 <= +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 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 a32205bc69..8de0528f30 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 @@ -193,23 +193,23 @@

    §Returns
    ) -> 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 -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 + 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 for ScriptBuf

    §

    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<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 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 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 <= +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>( 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 60fa59679a..89b9d854d5 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 @@ -3,7 +3,7 @@

    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 + 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 e71a708372..45fa15abb2 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 @@ -3,7 +3,7 @@

    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 + 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 54ca43071d..6eb28e0ea6 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.FromStrError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.FromStrError.html index 8a00b1ade9..c87858c312 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.FromStrError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.FromStrError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error parsing WitnessVersion from a string.

    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.
    §

    Unparsable(ParseIntError)

    Unable to parse integer from string.

    §

    Invalid(TryFromError)

    String contained an invalid witness version number.

    -

    Trait Implementations§

    §

    impl Clone for FromStrError

    §

    fn clone(&self) -> FromStrError

    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 FromStrError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for FromStrError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for FromStrError

    §

    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 FromStrError

    §

    fn from(never: Infallible) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for FromStrError

    §

    fn from(e: ParseIntError) -> FromStrError

    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 PartialEq for FromStrError

    §

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

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

    Trait Implementations§

    §

    impl Clone for FromStrError

    §

    fn clone(&self) -> FromStrError

    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 FromStrError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for FromStrError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for FromStrError

    §

    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 FromStrError

    §

    fn from(never: Infallible) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for FromStrError

    §

    fn from(e: ParseIntError) -> FromStrError

    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 PartialEq for FromStrError

    §

    fn eq(&self, other: &FromStrError) -> 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 FromStrError

    §

    impl StructuralPartialEq for FromStrError

    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/enum.WitnessVersion.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.WitnessVersion.html index f144dc6435..1963fce335 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.WitnessVersion.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.WitnessVersion.html @@ -44,7 +44,7 @@ into a byte since the conversion requires context (bitcoin script or just a version number).

    pub fn to_fe(self) -> Fe32

    Converts this witness version to a GF32 field element.

    Trait Implementations§

    §

    impl Clone for WitnessVersion

    §

    fn clone(&self) -> WitnessVersion

    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 WitnessVersion

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for WitnessVersion

    Prints WitnessVersion number (from 0 to 16) as integer, without any prefix or suffix.

    -
    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<WitnessVersion> for Fe32

    §

    fn from(version: WitnessVersion) -> Fe32

    Converts to this type from the input type.
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl FromStr for WitnessVersion

    §

    type Err = FromStrError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessVersion

    §

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

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

    Formats the value using the given formatter. Read more

    §

    impl From<WitnessVersion> for Fe32

    §

    fn from(version: WitnessVersion) -> Fe32

    Converts to this type from the input type.
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl FromStr for WitnessVersion

    §

    type Err = FromStrError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessVersion

    §

    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 WitnessVersion

    §

    fn cmp(&self, other: &WitnessVersion) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -54,13 +54,13 @@ 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 WitnessVersion

    §

    fn partial_cmp(&self, other: &WitnessVersion) -> 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 TryFrom<Fe32> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( +operator. Read more

    §

    impl TryFrom<Fe32> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( value: Fe32 ) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Fe32>>::Error>

    Performs the conversion.
    §

    impl<'a> TryFrom<Instruction<'a>> for WitnessVersion

    §

    type Error = TryFromInstructionError

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

    fn try_from( instruction: Instruction<'_> ) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Instruction<'a>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Opcode> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( opcode: Opcode -) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Opcode>>::Error>

    Performs the conversion.
    §

    impl TryFrom<u8> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( +) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Opcode>>::Error>

    Performs the conversion.
    §

    impl TryFrom<u8> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( no: u8 ) -> Result<WitnessVersion, <WitnessVersion as TryFrom<u8>>::Error>

    Performs the conversion.
    §

    impl Copy for WitnessVersion

    §

    impl Eq for WitnessVersion

    §

    impl StructuralPartialEq for WitnessVersion

    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 0aa8a365d1..0a65879ccd 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 d9bb7d8f05..3164c097bb 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 a0a1ca9347..59420568fb 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 af1b393af2..2fc07ef43e 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 @@ -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 ba54460366..14cd27cf48 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 6e61fafc90..7b1d73e84e 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 @@ -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 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 124456461b..b3f78ab5d0 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 @@ -2,11 +2,11 @@

    Implementations§

    §

    impl Wtxid

    pub fn from_raw_hash(inner: Hash) -> Wtxid

    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 Wtxid

    §

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

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

    impl AsRef<[u8; 32]> for Wtxid

    §

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

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

    impl Borrow<[u8]> for Wtxid

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Wtxid

    §

    fn clone(&self) -> Wtxid

    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 Wtxid

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Wtxid

    Trait Implementations§

    §

    impl AsRef<[u8]> for Wtxid

    §

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

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

    impl AsRef<[u8; 32]> for Wtxid

    §

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

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

    impl Borrow<[u8]> for Wtxid

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Wtxid

    §

    fn clone(&self) -> Wtxid

    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 Wtxid

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Wtxid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Wtxid, 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 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 2264f10d8b..6cafc85cb6 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/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/enum.Error.html index 6c12ee6d6a..690699f32f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/enum.Error.html @@ -22,7 +22,7 @@

    §

    NonMinimalVarInt

    VarInt was encoded in a non-minimal way.

    §

    ParseFailed(&'static str)

    Parsing error.

    §

    UnsupportedSegwitFlag(u8)

    Unsupported Segwit flag.

    -

    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(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<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(error: 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/consensus/encode/struct.VarInt.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/struct.VarInt.html index 8d45bf0475..fd0e5eccc9 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: 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 54f9b30e93..a054d65ad4 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 4db040fee9..44757a84fb 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 66dcb14728..10d2a5ff2b 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/ecdsa/struct.SerializedSignature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/struct.SerializedSignature.html index 3b71ad062f..6d42140ba4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/struct.SerializedSignature.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/struct.SerializedSignature.html @@ -2395,7 +2395,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 AsMut<[u8]> for SerializedSignature

    §

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

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

    impl AsRef<[u8]> for SerializedSignature

    §

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

    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 Borrow<[u8]> for SerializedSignature

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for SerializedSignature

    §

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

    Mutably 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) -> &<SerializedSignature as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for SerializedSignature

    §

    fn deref_mut(&mut self) -> &mut <SerializedSignature as Deref>::Target

    Mutably 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 Hash for SerializedSignature

    §

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

    Trait Implementations§

    §

    impl AsMut<[u8]> for SerializedSignature

    §

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

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

    impl AsRef<[u8]> for SerializedSignature

    §

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

    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 Borrow<[u8]> for SerializedSignature

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for SerializedSignature

    §

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

    Mutably 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) -> &<SerializedSignature as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for SerializedSignature

    §

    fn deref_mut(&mut self) -> &mut <SerializedSignature as Deref>::Target

    Mutably 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 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 LowerHex for SerializedSignature

    §

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

    Formats the value using the given formatter. Read more
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> 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/enum.EcdsaSighashType.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.EcdsaSighashType.html index 5ed4725379..fe6fc4eaf5 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 d946ab6856..e82645a99c 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.WitnessVersion.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.WitnessVersion.html index 31d2a1612f..f3d1032aee 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.WitnessVersion.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.WitnessVersion.html @@ -44,7 +44,7 @@ into a byte since the conversion requires context (bitcoin script or just a version number).

    pub fn to_fe(self) -> Fe32

    Converts this witness version to a GF32 field element.

    Trait Implementations§

    §

    impl Clone for WitnessVersion

    §

    fn clone(&self) -> WitnessVersion

    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 WitnessVersion

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for WitnessVersion

    Prints WitnessVersion number (from 0 to 16) as integer, without any prefix or suffix.

    -
    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<WitnessVersion> for Fe32

    §

    fn from(version: WitnessVersion) -> Fe32

    Converts to this type from the input type.
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl FromStr for WitnessVersion

    §

    type Err = FromStrError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessVersion

    §

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

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

    Formats the value using the given formatter. Read more

    §

    impl From<WitnessVersion> for Fe32

    §

    fn from(version: WitnessVersion) -> Fe32

    Converts to this type from the input type.
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl FromStr for WitnessVersion

    §

    type Err = FromStrError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessVersion

    §

    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 WitnessVersion

    §

    fn cmp(&self, other: &WitnessVersion) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -54,13 +54,13 @@ 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 WitnessVersion

    §

    fn partial_cmp(&self, other: &WitnessVersion) -> 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 TryFrom<Fe32> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( +operator. Read more

    §

    impl TryFrom<Fe32> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( value: Fe32 ) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Fe32>>::Error>

    Performs the conversion.
    §

    impl<'a> TryFrom<Instruction<'a>> for WitnessVersion

    §

    type Error = TryFromInstructionError

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

    fn try_from( instruction: Instruction<'_> ) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Instruction<'a>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Opcode> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( opcode: Opcode -) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Opcode>>::Error>

    Performs the conversion.
    §

    impl TryFrom<u8> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( +) -> Result<WitnessVersion, <WitnessVersion as TryFrom<Opcode>>::Error>

    Performs the conversion.
    §

    impl TryFrom<u8> for WitnessVersion

    §

    type Error = TryFromError

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

    fn try_from( no: u8 ) -> Result<WitnessVersion, <WitnessVersion as TryFrom<u8>>::Error>

    Performs the conversion.
    §

    impl Copy for WitnessVersion

    §

    impl Eq for WitnessVersion

    §

    impl StructuralPartialEq for WitnessVersion

    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/error/enum.PrefixedHexError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.PrefixedHexError.html index 277b8e2372..6e3ab71f91 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.PrefixedHexError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.PrefixedHexError.html @@ -5,7 +5,7 @@ a type that can be created infallibly from an integer.

    Variants§

    §

    MissingPrefix(MissingPrefixError)

    Hex string is missing prefix.

    §

    ParseInt(ParseIntError)

    Error parsing integer from hex string.

    -

    Trait Implementations§

    §

    impl Clone for PrefixedHexError

    §

    fn clone(&self) -> PrefixedHexError

    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 PrefixedHexError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for PrefixedHexError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for PrefixedHexError

    §

    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<MissingPrefixError> for PrefixedHexError

    §

    fn from(e: MissingPrefixError) -> PrefixedHexError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for PrefixedHexError

    §

    fn from(e: ParseIntError) -> PrefixedHexError

    Converts to this type from the input type.
    §

    impl PartialEq for PrefixedHexError

    §

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

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

    Trait Implementations§

    §

    impl Clone for PrefixedHexError

    §

    fn clone(&self) -> PrefixedHexError

    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 PrefixedHexError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for PrefixedHexError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for PrefixedHexError

    §

    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<MissingPrefixError> for PrefixedHexError

    §

    fn from(e: MissingPrefixError) -> PrefixedHexError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for PrefixedHexError

    §

    fn from(e: ParseIntError) -> PrefixedHexError

    Converts to this type from the input type.
    §

    impl PartialEq for PrefixedHexError

    §

    fn eq(&self, other: &PrefixedHexError) -> 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 PrefixedHexError

    §

    impl StructuralPartialEq for PrefixedHexError

    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/error/struct.ParseIntError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/struct.ParseIntError.html index 08e6ec5df4..94e4e0f35b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/struct.ParseIntError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/struct.ParseIntError.html @@ -6,7 +6,7 @@ in a performance-critical application you may want to box it or throw away the context by converting to core type.

    Implementations§

    §

    impl ParseIntError

    pub fn input(&self) -> &str

    Returns the input that was attempted to be parsed.

    -

    Trait Implementations§

    §

    impl AsRef<ParseIntError> for ParseIntError

    §

    fn as_ref(&self) -> &ParseIntError

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

    impl Clone for ParseIntError

    §

    fn clone(&self) -> ParseIntError

    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 ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseIntError

    §

    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<ParseIntError> for FromStrError

    §

    fn from(e: ParseIntError) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for ParseIntError

    §

    fn from(value: ParseIntError) -> ParseIntError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for PrefixedHexError

    §

    fn from(e: ParseIntError) -> PrefixedHexError

    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 ParseIntError

    §

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

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

    Trait Implementations§

    §

    impl AsRef<ParseIntError> for ParseIntError

    §

    fn as_ref(&self) -> &ParseIntError

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

    impl Clone for ParseIntError

    §

    fn clone(&self) -> ParseIntError

    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 ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseIntError

    §

    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<ParseIntError> for FromStrError

    §

    fn from(e: ParseIntError) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for ParseIntError

    §

    fn from(value: ParseIntError) -> ParseIntError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for PrefixedHexError

    §

    fn from(e: ParseIntError) -> PrefixedHexError

    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 ParseIntError

    §

    fn eq(&self, other: &ParseIntError) -> 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 ParseIntError

    §

    impl StructuralPartialEq for ParseIntError

    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 be0a89f723..ba64538900 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 @@ -2,11 +2,11 @@

    Implementations§

    §

    impl BlockHash

    pub fn from_raw_hash(inner: Hash) -> BlockHash

    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 BlockHash

    §

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

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

    impl AsRef<[u8; 32]> for BlockHash

    §

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

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

    impl Borrow<[u8]> for BlockHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for BlockHash

    §

    fn clone(&self) -> BlockHash

    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 BlockHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for BlockHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for BlockHash

    §

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

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

    impl AsRef<[u8; 32]> for BlockHash

    §

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

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

    impl Borrow<[u8]> for BlockHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for BlockHash

    §

    fn clone(&self) -> BlockHash

    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 BlockHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for BlockHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<BlockHash, 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 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 6948c999e1..a837b5a1e3 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 @@ -6,11 +6,11 @@ &self, previous_filter_header: &FilterHeader ) -> FilterHeader

    Computes the filter header from a filter hash and previous filter header.

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for FilterHash

    §

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

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

    impl AsRef<[u8; 32]> for FilterHash

    §

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

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

    impl Borrow<[u8]> for FilterHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for FilterHash

    §

    fn clone(&self) -> FilterHash

    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 FilterHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for FilterHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for FilterHash

    §

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

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

    impl AsRef<[u8; 32]> for FilterHash

    §

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

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

    impl Borrow<[u8]> for FilterHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for FilterHash

    §

    fn clone(&self) -> FilterHash

    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 FilterHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for FilterHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<FilterHash, 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 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.FilterHeader.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHeader.html index 433c2f01a2..f37101f6aa 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHeader.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHeader.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 FilterHeader

    §

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

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

    impl Display for FilterHeader

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Encodable for 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 From<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    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 FromStr for FilterHeader

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for FilterHeader

    §

    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<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    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 FromStr for FilterHeader

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for FilterHeader

    §

    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.Txid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Txid.html index 726745b07a..3e1ed22c08 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 @@ -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 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.WitnessCommitment.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.WitnessCommitment.html index 88fc0ab0e2..18b3dcc38f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.WitnessCommitment.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.WitnessCommitment.html @@ -2,10 +2,10 @@

    Implementations§

    §

    impl WitnessCommitment

    pub fn from_raw_hash(inner: Hash) -> WitnessCommitment

    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 WitnessCommitment

    §

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

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

    impl AsRef<[u8; 32]> for WitnessCommitment

    §

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

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

    impl Borrow<[u8]> for WitnessCommitment

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WitnessCommitment

    §

    fn clone(&self) -> WitnessCommitment

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WitnessCommitment

    §

    fn deserialize<D>( +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WitnessCommitment

    §

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

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

    impl AsRef<[u8; 32]> for WitnessCommitment

    §

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

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

    impl Borrow<[u8]> for WitnessCommitment

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WitnessCommitment

    §

    fn clone(&self) -> WitnessCommitment

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WitnessCommitment

    §

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

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

    impl Display for WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    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 FromStr for WitnessCommitment

    §

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    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 FromStr for WitnessCommitment

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessCommitment

    §

    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/hash_types/struct.Wtxid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Wtxid.html index f660c1c014..0079d71df3 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 @@ -2,11 +2,11 @@

    Implementations§

    §

    impl Wtxid

    pub fn from_raw_hash(inner: Hash) -> Wtxid

    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 Wtxid

    §

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

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

    impl AsRef<[u8; 32]> for Wtxid

    §

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

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

    impl Borrow<[u8]> for Wtxid

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Wtxid

    §

    fn clone(&self) -> Wtxid

    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 Wtxid

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Wtxid

    Trait Implementations§

    §

    impl AsRef<[u8]> for Wtxid

    §

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

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

    impl AsRef<[u8; 32]> for Wtxid

    §

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

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

    impl Borrow<[u8]> for Wtxid

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Wtxid

    §

    fn clone(&self) -> Wtxid

    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 Wtxid

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Wtxid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Wtxid, 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 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 5c4ede8aa6..97349871c6 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/serde/de/trait.Deserialize.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/de/trait.Deserialize.html index d754731bbe..492c187ba6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/de/trait.Deserialize.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/de/trait.Deserialize.html @@ -299,11 +299,11 @@

    §Lifetime

    Pk: FromStrKey,
    §

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

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where + D: Deserializer<'de>,

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where Pk: FromStrKey,

    §

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

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where + D: Deserializer<'de>,

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where Pk: FromStrKey,

    §

    fn deserialize<D>( deserializer: D ) -> Result<Policy<Pk>, <D as Deserializer<'de>>::Error>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/trait.Deserialize.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/trait.Deserialize.html index 1bd62dc53f..f5eb3aba2f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/trait.Deserialize.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/serde/trait.Deserialize.html @@ -299,11 +299,11 @@

    §Lifetime

    Pk: FromStrKey,

    §

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

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where + D: Deserializer<'de>,

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where Pk: FromStrKey,

    §

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

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where + D: Deserializer<'de>,

    §

    impl<'de, Pk> Deserialize<'de> for Policy<Pk>
    where Pk: FromStrKey,

    §

    fn deserialize<D>( deserializer: D ) -> Result<Policy<Pk>, <D as Deserializer<'de>>::Error>
    where 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 d204013d1a..601d0e70ba 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 679f217527..f93507dfdc 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 fddd512375..bba60fa787 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 1a14ba8b0a..f669d5f98b 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(io: 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(error: 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(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(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 11b287edfa..1c04e378e9 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/enum.Parity.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.Parity.html index b07ac33e53..112b7859dd 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.Parity.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.Parity.html @@ -18,8 +18,8 @@
    §

    type Output = Parity

    The resulting type after applying the ^ operator.
    §

    fn bitxor(self, rhs: Parity) -> <Parity as BitXor>::Output

    Performs the ^ operation. Read more

    §

    impl Clone for Parity

    §

    fn clone(&self) -> Parity

    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 Parity

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Parity

    The parity is deserialized as u8 - 0 for even, 1 for odd.

    §

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

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

    impl From<Parity> for i32

    The conversion returns 0 for even parity and 1 for odd.

    -
    §

    fn from(parity: Parity) -> i32

    Converts to this type from the input type.
    §

    impl From<Parity> for u8

    The conversion returns 0 for even parity and 1 for odd.

    -
    §

    fn from(parity: Parity) -> u8

    Converts to this type from the input type.
    §

    impl Hash for Parity

    §

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

    fn from(parity: Parity) -> i32

    Converts to this type from the input type.

    §

    impl From<Parity> for u8

    The conversion returns 0 for even parity and 1 for odd.

    +
    §

    fn from(parity: Parity) -> u8

    Converts to this type from the input type.
    §

    impl Hash for Parity

    §

    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 Parity

    §

    fn cmp(&self, other: &Parity) -> 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/enum.ParseCompressedPublicKeyError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.ParseCompressedPublicKeyError.html index 31c911f08b..5490f3e7d6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.ParseCompressedPublicKeyError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.ParseCompressedPublicKeyError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error returned when parsing a CompressedPublicKey from a string.

    Variants§

    §

    Secp256k1(Error)

    Secp256k1 Error.

    §

    Hex(HexToArrayError)

    hex to array conversion error.

    -

    Trait Implementations§

    §

    impl Clone for ParseCompressedPublicKeyError

    §

    fn clone(&self) -> ParseCompressedPublicKeyError

    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 ParseCompressedPublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseCompressedPublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseCompressedPublicKeyError

    §

    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 ParseCompressedPublicKeyError

    §

    fn from(e: Error) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl From<HexToArrayError> for ParseCompressedPublicKeyError

    §

    fn from(e: HexToArrayError) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParseCompressedPublicKeyError

    §

    fn from(never: Infallible) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl PartialEq for ParseCompressedPublicKeyError

    §

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

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

    Trait Implementations§

    §

    impl Clone for ParseCompressedPublicKeyError

    §

    fn clone(&self) -> ParseCompressedPublicKeyError

    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 ParseCompressedPublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseCompressedPublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseCompressedPublicKeyError

    §

    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 ParseCompressedPublicKeyError

    §

    fn from(e: Error) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl From<HexToArrayError> for ParseCompressedPublicKeyError

    §

    fn from(e: HexToArrayError) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParseCompressedPublicKeyError

    §

    fn from(never: Infallible) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl PartialEq for ParseCompressedPublicKeyError

    §

    fn eq(&self, other: &ParseCompressedPublicKeyError) -> 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 ParseCompressedPublicKeyError

    §

    impl StructuralPartialEq for ParseCompressedPublicKeyError

    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.ParsePublicKeyError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.ParsePublicKeyError.html index d5328a6049..fcc7aae254 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.ParsePublicKeyError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.ParsePublicKeyError.html @@ -6,7 +6,7 @@

    Variants§

    §

    Encoding(FromSliceError)

    Error originated while parsing string.

    §

    InvalidChar(u8)

    Hex decoding error.

    §

    InvalidHexLength(usize)

    PublicKey hex should be 66 or 130 digits long.

    -

    Trait Implementations§

    §

    impl Clone for ParsePublicKeyError

    §

    fn clone(&self) -> ParsePublicKeyError

    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 ParsePublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParsePublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParsePublicKeyError

    §

    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<FromSliceError> for ParsePublicKeyError

    §

    fn from(e: FromSliceError) -> ParsePublicKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParsePublicKeyError

    §

    fn from(never: Infallible) -> ParsePublicKeyError

    Converts to this type from the input type.
    §

    impl PartialEq for ParsePublicKeyError

    §

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

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

    Trait Implementations§

    §

    impl Clone for ParsePublicKeyError

    §

    fn clone(&self) -> ParsePublicKeyError

    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 ParsePublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParsePublicKeyError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParsePublicKeyError

    §

    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<FromSliceError> for ParsePublicKeyError

    §

    fn from(e: FromSliceError) -> ParsePublicKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParsePublicKeyError

    §

    fn from(never: Infallible) -> ParsePublicKeyError

    Converts to this type from the input type.
    §

    impl PartialEq for ParsePublicKeyError

    §

    fn eq(&self, other: &ParsePublicKeyError) -> 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 ParsePublicKeyError

    §

    impl StructuralPartialEq for ParsePublicKeyError

    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 ab6171dbaa..8a7811010f 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 52c0825ec2..b40e169dc5 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 fcc1ab3a9c..8be91fb542 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 @@ -3,7 +3,7 @@

    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 + 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 72b7ffcc0e..e13e684399 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.WPubkeyHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.WPubkeyHash.html index 4ad5a4653b..aedf65f432 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 @@ -3,7 +3,7 @@

    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 + 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 b13b728095..71cf10f54e 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 1b2f2a4c08..fa556b4641 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 e4cb2385e0..fbcae262b2 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 ed67963b27..ebc70c016d 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/p2p/struct.ServiceFlags.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.ServiceFlags.html index 8df7fda902..f64adcc582 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.ServiceFlags.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.ServiceFlags.html @@ -27,7 +27,7 @@

    Trait Implementations§

    §

    impl BitOr for ServiceFlags

    §

    type Output = ServiceFlags

    The resulting type after applying the | operator.
    §

    fn bitor(self, rhs: ServiceFlags) -> ServiceFlags

    Performs the | operation. Read more
    §

    impl BitOrAssign for ServiceFlags

    §

    fn bitor_assign(&mut self, rhs: ServiceFlags)

    Performs the |= operation. Read more
    §

    impl BitXor for ServiceFlags

    §

    type Output = ServiceFlags

    The resulting type after applying the ^ operator.
    §

    fn bitxor(self, rhs: ServiceFlags) -> ServiceFlags

    Performs the ^ operation. Read more
    §

    impl BitXorAssign for ServiceFlags

    §

    fn bitxor_assign(&mut self, rhs: ServiceFlags)

    Performs the ^= operation. Read more
    §

    impl Clone for ServiceFlags

    §

    fn clone(&self) -> ServiceFlags

    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 ServiceFlags

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ServiceFlags

    §

    fn consensus_decode<R>(r: &mut R) -> Result<ServiceFlags, 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 ServiceFlags

    §

    fn default() -> ServiceFlags

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

    impl Display for ServiceFlags

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Encodable for ServiceFlags

    §

    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<ServiceFlags> for u64

    §

    fn from(flags: ServiceFlags) -> u64

    Converts to this type from the input type.
    §

    impl From<u64> for ServiceFlags

    §

    fn from(f: u64) -> ServiceFlags

    Converts to this type from the input type.
    §

    impl Hash for ServiceFlags

    §

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

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

    impl From<ServiceFlags> for u64

    §

    fn from(flags: ServiceFlags) -> u64

    Converts to this type from the input type.
    §

    impl From<u64> for ServiceFlags

    §

    fn from(f: u64) -> ServiceFlags

    Converts to this type from the input type.
    §

    impl Hash for ServiceFlags

    §

    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 ServiceFlags

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Ord for ServiceFlags

    §

    fn cmp(&self, other: &ServiceFlags) -> 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/parse/struct.ParseIntError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/parse/struct.ParseIntError.html index 60e6b69121..940f6a15aa 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/parse/struct.ParseIntError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/parse/struct.ParseIntError.html @@ -6,7 +6,7 @@ in a performance-critical application you may want to box it or throw away the context by converting to core type.

    Implementations§

    §

    impl ParseIntError

    pub fn input(&self) -> &str

    Returns the input that was attempted to be parsed.

    -

    Trait Implementations§

    §

    impl AsRef<ParseIntError> for ParseIntError

    §

    fn as_ref(&self) -> &ParseIntError

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

    impl Clone for ParseIntError

    §

    fn clone(&self) -> ParseIntError

    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 ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseIntError

    §

    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<ParseIntError> for FromStrError

    §

    fn from(e: ParseIntError) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for ParseIntError

    §

    fn from(value: ParseIntError) -> ParseIntError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for PrefixedHexError

    §

    fn from(e: ParseIntError) -> PrefixedHexError

    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 ParseIntError

    §

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

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

    Trait Implementations§

    §

    impl AsRef<ParseIntError> for ParseIntError

    §

    fn as_ref(&self) -> &ParseIntError

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

    impl Clone for ParseIntError

    §

    fn clone(&self) -> ParseIntError

    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 ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseIntError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseIntError

    §

    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<ParseIntError> for FromStrError

    §

    fn from(e: ParseIntError) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for ParseIntError

    §

    fn from(value: ParseIntError) -> ParseIntError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for PrefixedHexError

    §

    fn from(e: ParseIntError) -> PrefixedHexError

    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 ParseIntError

    §

    fn eq(&self, other: &ParseIntError) -> 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 ParseIntError

    §

    impl StructuralPartialEq for ParseIntError

    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.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.Error.html index e76e1b50af..dd16fa29c7 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 e4174da198..82ad8109e6 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/trait.GetKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/trait.GetKey.html index 77a71a7194..9892a54637 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/trait.GetKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/trait.GetKey.html @@ -42,4 +42,4 @@
    §Returns
    key_request: KeyRequest, secp: &Secp256k1<C> ) -> Result<Option<PrivateKey>, <HashSet<Xpriv> as GetKey>::Error>
    where - C: Signing,

    Implementors§

    \ No newline at end of file + C: Signing,

    Implementors§

    \ No newline at end of file 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 a8dc216326..d62caac5d4 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,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,

    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 + 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 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 >= +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 = 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 cf0501dfaa..034036d1bb 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,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,

    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 + 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 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 >= +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 = 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 098c67c260..8348bd0584 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,8 +34,8 @@

    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

    -
    §

    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 + 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, 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 @@ -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§

    §

    impl Freeze for Signature

    §

    impl RefUnwindSafe for Signature

    §

    impl Send for Signature

    §

    impl Sync for Signature

    §

    impl Unpin for Signature

    §

    impl UnwindSafe for Signature

    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 ce454cfa89..cfe65e22f2 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/enum.Parity.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Parity.html index 6767c18f41..38bcc6e9f5 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Parity.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Parity.html @@ -18,8 +18,8 @@
    §

    type Output = Parity

    The resulting type after applying the ^ operator.
    §

    fn bitxor(self, rhs: Parity) -> <Parity as BitXor>::Output

    Performs the ^ operation. Read more

    §

    impl Clone for Parity

    §

    fn clone(&self) -> Parity

    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 Parity

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Parity

    The parity is deserialized as u8 - 0 for even, 1 for odd.

    §

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

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

    impl From<Parity> for i32

    The conversion returns 0 for even parity and 1 for odd.

    -
    §

    fn from(parity: Parity) -> i32

    Converts to this type from the input type.
    §

    impl From<Parity> for u8

    The conversion returns 0 for even parity and 1 for odd.

    -
    §

    fn from(parity: Parity) -> u8

    Converts to this type from the input type.
    §

    impl Hash for Parity

    §

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

    fn from(parity: Parity) -> i32

    Converts to this type from the input type.

    §

    impl From<Parity> for u8

    The conversion returns 0 for even parity and 1 for odd.

    +
    §

    fn from(parity: Parity) -> u8

    Converts to this type from the input type.
    §

    impl Hash for Parity

    §

    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 Parity

    §

    fn cmp(&self, other: &Parity) -> 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/rand/distributions/struct.Standard.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/struct.Standard.html index cd342ba8a9..20bccf3ef6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/struct.Standard.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/struct.Standard.html @@ -79,531 +79,531 @@

    Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 31]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 31]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 31]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 30]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 30]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 30]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 29]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 29]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 29]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 28]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 28]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 28]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 27]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 27]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 27]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 26]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 26]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 26]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 25]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 25]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 25]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 24]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 24]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 24]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 23]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 23]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 23]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 22]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 22]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 22]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 21]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 21]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 21]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 20]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 20]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 20]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 19]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 19]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 19]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 18]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 18]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 18]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 17]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 17]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 17]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 16]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 16]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 16]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 15]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 15]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 15]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 14]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 14]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 14]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 13]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 13]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 13]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 12]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 12]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 12]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 11]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 11]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 11]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 10]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 10]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 10]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 9]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 9]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 9]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 8]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 8]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 8]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 7]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 7]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 7]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 6]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 6]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 6]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 5]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 5]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 5]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 4]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 4]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 4]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 3]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 3]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 3]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 2]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 2]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 2]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<[T; 1]> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 1]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 1]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl<T> Distribution<[T; 0]> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 0]
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl<T> Distribution<[T; 0]> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> [T; 0]
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<()> for Standard

    source§

    fn sample<R>(&self, _: &mut R)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<()> for Standard

    source§

    fn sample<R>(&self, _: &mut R)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A> Distribution<(A,)> for Standard
    where - Standard: Distribution<A>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A,)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<A>,

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A,)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B> Distribution<(A, B)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C> Distribution<(A, B, C)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D> Distribution<(A, B, C, D)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E> Distribution<(A, B, C, D, E)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F> Distribution<(A, B, C, D, E, F)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F, G> Distribution<(A, B, C, D, E, F, G)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F, G, H> Distribution<(A, B, C, D, E, F, G, H)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F, G, H, I> Distribution<(A, B, C, D, E, F, G, H, I)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F, G, H, I, J> Distribution<(A, B, C, D, E, F, G, H, I, J)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F, G, H, I, J, K> Distribution<(A, B, C, D, E, F, G, H, I, J, K)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J, K)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J, K)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<A, B, C, D, E, F, G, H, I, J, K, L> Distribution<(A, B, C, D, E, F, G, H, I, J, K, L)> for Standard

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J, K, L)
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>

    source§

    fn sample<R>(&self, _rng: &mut R) -> (A, B, C, D, E, F, G, H, I, J, K, L)
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<NonZero<u128>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u128>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<NonZero<u128>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u128>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<NonZero<u16>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u16>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<NonZero<u16>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u16>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<NonZero<u32>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u32>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<NonZero<u32>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u32>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<NonZero<u64>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u64>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<NonZero<u64>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u64>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<NonZero<u8>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u8>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<NonZero<u8>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<u8>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<NonZero<usize>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<usize>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<NonZero<usize>> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> NonZero<usize>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<Option<T>> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, rng: &mut R) -> Option<T>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, rng: &mut R) -> Option<T>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl<T> Distribution<Wrapping<T>> for Standard
    where - Standard: Distribution<T>,

    source§

    fn sample<R>(&self, rng: &mut R) -> Wrapping<T>
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where + Standard: Distribution<T>,

    source§

    fn sample<R>(&self, rng: &mut R) -> Wrapping<T>
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<bool> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> bool
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<bool> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> bool
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<char> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> char
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<char> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> char
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<f32> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> f32
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<f32> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> f32
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<f64> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> f64
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<f64> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> f64
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<i128> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i128
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<i128> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i128
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<i16> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i16
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<i16> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i16
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<i32> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i32
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<i32> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i32
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<i64> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i64
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<i64> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i64
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<i8> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i8
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<i8> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> i8
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<isize> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> isize
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<isize> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> isize
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<u128> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u128
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<u128> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u128
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<u16> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u16
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<u16> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u16
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<u32> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u32
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<u32> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u32
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<u64> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u64
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<u64> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u64
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<u8> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u8
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<u8> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> u8
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self -through the closure F Read more
    source§

    impl Distribution<usize> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> usize
    where - R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where +through the closure F Read more

    source§

    impl Distribution<usize> for Standard

    source§

    fn sample<R>(&self, rng: &mut R) -> usize
    where + R: Rng + ?Sized,

    Generate a random value of T, using rng as the source of randomness.
    source§

    fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T>
    where R: Rng, Self: Sized,

    Create an iterator that generates random values of T, using rng as -the source of randomness. Read more
    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where +the source of randomness. Read more

    source§

    fn map<F, S>(self, func: F) -> DistMap<Self, F, T, S>
    where F: Fn(T) -> S, Self: Sized,

    Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
    source§

    impl Copy for Standard

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformFloat.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformFloat.html index 087f464b15..327c48228c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformFloat.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformFloat.html @@ -14,13 +14,13 @@

    Debug,

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl<X> PartialEq for UniformFloat<X>
    where X: PartialEq,

    source§

    fn eq(&self, other: &UniformFloat<X>) -> 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 UniformSampler for UniformFloat<f32>

    §

    type X = f32

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f32>
    where +sufficient, and should not be overridden without very good reason.

    source§

    impl UniformSampler for UniformFloat<f32>

    §

    type X = f32

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f32>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f32>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f32>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformFloat<f32> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformFloat<f32> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformFloat<f32> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -28,17 +28,17 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformFloat<f32> as UniformSampler>::X>, B2: SampleBorrow<<UniformFloat<f32> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>(low: B1, high: B2, rng: &mut R) -> Self::X
    where +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>(low: B1, high: B2, rng: &mut R) -> Self::X
    where R: Rng + ?Sized, B1: SampleBorrow<Self::X>, B2: SampleBorrow<Self::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformFloat<f64>

    §

    type X = f64

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f64>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformFloat<f64>

    §

    type X = f64

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f64>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f64>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformFloat<f64>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformFloat<f64> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformFloat<f64> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformFloat<f64> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -46,7 +46,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformFloat<f64> as UniformSampler>::X>, B2: SampleBorrow<<UniformFloat<f64> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>(low: B1, high: B2, rng: &mut R) -> Self::X
    where +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>(low: B1, high: B2, rng: &mut R) -> Self::X
    where R: Rng + ?Sized, B1: SampleBorrow<Self::X>, B2: SampleBorrow<Self::X>,

    Sample a single value uniformly from a range with inclusive lower bound diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformInt.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformInt.html index 3cb066da56..567cae100e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformInt.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/distributions/uniform/struct.UniformInt.html @@ -29,13 +29,13 @@

    Debug,

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl<X> PartialEq for UniformInt<X>
    where X: PartialEq,

    source§

    fn eq(&self, other: &UniformInt<X>) -> 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 UniformSampler for UniformInt<i128>

    §

    type X = i128

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i128>
    where +sufficient, and should not be overridden without very good reason.

    source§

    impl UniformSampler for UniformInt<i128>

    §

    type X = i128

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i128>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i128>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i128>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i128> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<i128> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i128> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -43,7 +43,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i128> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i128> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -51,13 +51,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i128> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i128> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<i16>

    §

    type X = i16

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i16>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<i16>

    §

    type X = i16

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i16>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i16>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i16>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i16> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<i16> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i16> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -65,7 +65,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i16> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i16> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -73,13 +73,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i16> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i16> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<i32>

    §

    type X = i32

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i32>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<i32>

    §

    type X = i32

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i32>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i32>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i32>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i32> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<i32> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i32> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -87,7 +87,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i32> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i32> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -95,13 +95,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i32> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i32> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<i64>

    §

    type X = i64

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i64>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<i64>

    §

    type X = i64

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i64>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i64>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<i64>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i64> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<i64> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<i64> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -109,7 +109,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i64> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i64> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -139,13 +139,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<i8> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<i8> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<isize>

    §

    type X = isize

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<isize>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<isize>

    §

    type X = isize

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<isize>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<isize>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<isize>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<isize> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<isize> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<isize> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -153,7 +153,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<isize> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<isize> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -161,13 +161,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<isize> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<isize> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<u128>

    §

    type X = u128

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u128>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<u128>

    §

    type X = u128

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u128>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u128>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u128>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u128> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<u128> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u128> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -175,7 +175,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u128> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u128> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -183,13 +183,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u128> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u128> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<u16>

    §

    type X = u16

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u16>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<u16>

    §

    type X = u16

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u16>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u16>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u16>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u16> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<u16> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u16> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -197,7 +197,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u16> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u16> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -205,13 +205,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u16> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u16> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<u32>

    §

    type X = u32

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u32>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<u32>

    §

    type X = u32

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u32>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u32>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u32>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u32> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<u32> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u32> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -219,7 +219,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u32> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u32> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -227,13 +227,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u32> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u32> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<u64>

    §

    type X = u64

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u64>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<u64>

    §

    type X = u64

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u64>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u64>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u64>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u64> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<u64> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u64> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -241,7 +241,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u64> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u64> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -249,13 +249,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u64> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u64> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<u8>

    §

    type X = u8

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u8>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<u8>

    §

    type X = u8

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u8>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u8>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<u8>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u8> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<u8> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<u8> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -263,7 +263,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u8> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u8> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -271,13 +271,13 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<u8> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<u8> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and inclusive upper bound [low, high]. Read more
    source§

    impl UniformSampler for UniformInt<usize>

    §

    type X = usize

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<usize>
    where +and inclusive upper bound [low, high]. Read more

    source§

    impl UniformSampler for UniformInt<usize>

    §

    type X = usize

    The type sampled by this implementation.
    source§

    fn new<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<usize>

    Construct self, with inclusive lower bound and exclusive upper bound -[low, high). Read more
    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<usize>
    where +[low, high). Read more

    source§

    fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> UniformInt<usize>

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<usize> as UniformSampler>::X
    where - R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( + B2: SampleBorrow<<UniformInt<usize> as UniformSampler>::X>,

    Construct self, with inclusive bounds [low, high]. Read more
    source§

    fn sample<R>(&self, rng: &mut R) -> <UniformInt<usize> as UniformSampler>::X
    where + R: Rng + ?Sized,

    Sample a value.
    source§

    fn sample_single<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R @@ -285,7 +285,7 @@

    Rng + ?Sized, B1: SampleBorrow<<UniformInt<usize> as UniformSampler>::X>, B2: SampleBorrow<<UniformInt<usize> as UniformSampler>::X>,

    Sample a single value uniformly from a range with inclusive lower bound -and exclusive upper bound [low, high). Read more
    source§

    fn sample_single_inclusive<R, B1, B2>( +and exclusive upper bound [low, high). Read more

    source§

    fn sample_single_inclusive<R, B1, B2>( low_b: B1, high_b: B2, rng: &mut R diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/struct.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/struct.Error.html index 6181c954d2..57399c9a3b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/struct.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/rand/struct.Error.html @@ -29,7 +29,7 @@

    If this Error was constructed via From<NonZeroU32>, then this method will return this NonZeroU32 code (for no_std this is always the case). Otherwise, this method will return None.

    -

    Trait Implementations§

    source§

    impl Debug for Error

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for Error

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for Error

    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 Error

    source§

    fn from(error: Error) -> Error

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(error: Error) -> Error

    Converts to this type from the input type.
    source§

    impl From<NonZero<u32>> for Error

    source§

    fn from(code: NonZero<u32>) -> 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§

    source§

    impl Debug for Error

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for Error

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for Error

    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 Error

    source§

    fn from(error: Error) -> Error

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(error: Error) -> Error

    Converts to this type from the input type.
    source§

    impl From<NonZero<u32>> for Error

    source§

    fn from(code: NonZero<u32>) -> 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/secp256k1/struct.Keypair.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Keypair.html index 6b0a8e5f1f..015b34f920 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 9b1c36abbf..3ea82805ca 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 4ff4a6e0d8..98e18d745b 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,7 +101,7 @@
    §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 __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/struct.SecretKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.SecretKey.html index 45cb720605..6a91cf4aa4 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 82e4ce0138..3803526c4e 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 8486887209..b7859e9334 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 a24f95a80a..57aca8ea27 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 570536f9c3..84c1c97eb8 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 5433088c28..c161149b56 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.TaprootError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TaprootError.html index 135dacf878..d82d21e2a1 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 99568e59bd..7abb66b372 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 @@ -2,10 +2,10 @@

    Implementations§

    §

    impl LegacySighash

    pub fn from_raw_hash(inner: Hash) -> LegacySighash

    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 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>( +

    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 96cdcc63e1..76762b6196 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 @@ -2,10 +2,10 @@

    Implementations§

    §

    impl SegwitV0Sighash

    pub fn from_raw_hash(inner: Hash) -> SegwitV0Sighash

    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 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>( +

    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 5076c85df4..ed38492833 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 @@ -4,7 +4,7 @@

    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 + 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/sign_message/enum.MessageSignatureError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sign_message/enum.MessageSignatureError.html index 7319a23f09..5f6cde80b7 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sign_message/enum.MessageSignatureError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sign_message/enum.MessageSignatureError.html @@ -8,7 +8,7 @@
    §

    InvalidEncoding(Error)

    The signature is invalidly constructed.

    §

    InvalidBase64

    Invalid base64 encoding.

    §

    UnsupportedAddressType(AddressType)

    Unsupported Address Type

    -

    Trait Implementations§

    §

    impl Clone for MessageSignatureError

    §

    fn clone(&self) -> MessageSignatureError

    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 MessageSignatureError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for MessageSignatureError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for MessageSignatureError

    §

    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 MessageSignatureError

    §

    fn from(e: Error) -> MessageSignatureError

    Converts to this type from the input type.
    §

    impl From<Infallible> for MessageSignatureError

    §

    fn from(never: Infallible) -> MessageSignatureError

    Converts to this type from the input type.
    §

    impl PartialEq for MessageSignatureError

    §

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

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

    Trait Implementations§

    §

    impl Clone for MessageSignatureError

    §

    fn clone(&self) -> MessageSignatureError

    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 MessageSignatureError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for MessageSignatureError

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Error for MessageSignatureError

    §

    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 MessageSignatureError

    §

    fn from(e: Error) -> MessageSignatureError

    Converts to this type from the input type.
    §

    impl From<Infallible> for MessageSignatureError

    §

    fn from(never: Infallible) -> MessageSignatureError

    Converts to this type from the input type.
    §

    impl PartialEq for MessageSignatureError

    §

    fn eq(&self, other: &MessageSignatureError) -> 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 MessageSignatureError

    §

    impl StructuralPartialEq for MessageSignatureError

    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/struct.Block.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Block.html index 218e242673..e631ab56aa 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Block.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Block.html @@ -36,7 +36,7 @@

    Result<Block, <__D as Deserializer<'de>>::Error>
    where __D: Deserializer<'de>,

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

    impl Encodable for Block

    §

    fn consensus_encode<R>(&self, r: &mut R) -> Result<usize, Error>
    where - R: 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<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl PartialEq for Block

    §

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

    This method tests for self and other values to be equal, and is used + R: 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<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl PartialEq for Block

    §

    fn eq(&self, other: &Block) -> 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 Serialize for Block

    §

    fn serialize<__S>( &self, 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 212dc4f75a..b889c51026 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 @@ -2,11 +2,11 @@

    Implementations§

    §

    impl BlockHash

    pub fn from_raw_hash(inner: Hash) -> BlockHash

    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 BlockHash

    §

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

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

    impl AsRef<[u8; 32]> for BlockHash

    §

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

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

    impl Borrow<[u8]> for BlockHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for BlockHash

    §

    fn clone(&self) -> BlockHash

    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 BlockHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for BlockHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for BlockHash

    §

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

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

    impl AsRef<[u8; 32]> for BlockHash

    §

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

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

    impl Borrow<[u8]> for BlockHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for BlockHash

    §

    fn clone(&self) -> BlockHash

    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 BlockHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for BlockHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<BlockHash, 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 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 8a5d26ac0d..4a00a6c850 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 931626ac64..7ba954238f 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 @@ -6,11 +6,11 @@ &self, previous_filter_header: &FilterHeader ) -> FilterHeader

    Computes the filter header from a filter hash and previous filter header.

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for FilterHash

    §

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

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

    impl AsRef<[u8; 32]> for FilterHash

    §

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

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

    impl Borrow<[u8]> for FilterHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for FilterHash

    §

    fn clone(&self) -> FilterHash

    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 FilterHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for FilterHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for FilterHash

    §

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

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

    impl AsRef<[u8; 32]> for FilterHash

    §

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

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

    impl Borrow<[u8]> for FilterHash

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for FilterHash

    §

    fn clone(&self) -> FilterHash

    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 FilterHash

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for FilterHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<FilterHash, 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 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.FilterHeader.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHeader.html index d331520df7..73d6ec4aa2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHeader.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHeader.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 FilterHeader

    §

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

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

    impl Display for FilterHeader

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Encodable for 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 From<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    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 FromStr for FilterHeader

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for FilterHeader

    §

    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<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    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 FromStr for FilterHeader

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for FilterHeader

    §

    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 32bc70fc0d..6d82f98dd1 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 @@ -2,10 +2,10 @@

    Implementations§

    §

    impl LegacySighash

    pub fn from_raw_hash(inner: Hash) -> LegacySighash

    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 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>( +

    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.Opcode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Opcode.html index a48933f49f..10a5c80e3c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Opcode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Opcode.html @@ -9,7 +9,7 @@ in contexts where only pushes are supposed to be allowed.

    Implementations§

    §

    impl Opcode

    pub fn classify(self, ctx: ClassifyContext) -> Class

    Classifies an Opcode into a broad class.

    pub const fn to_u8(self) -> u8

    Encodes Opcode as a byte.

    -

    Trait Implementations§

    §

    impl Clone for Opcode

    §

    fn clone(&self) -> Opcode

    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 Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl From<u8> for Opcode

    §

    fn from(b: u8) -> Opcode

    Converts to this type from the input type.
    §

    impl PartialEq for Opcode

    §

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

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

    Trait Implementations§

    §

    impl Clone for Opcode

    §

    fn clone(&self) -> Opcode

    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 Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Display for Opcode

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<WitnessVersion> for Opcode

    §

    fn from(version: WitnessVersion) -> Opcode

    Converts to this type from the input type.
    §

    impl From<u8> for Opcode

    §

    fn from(b: u8) -> Opcode

    Converts to this type from the input type.
    §

    impl PartialEq for Opcode

    §

    fn eq(&self, other: &Opcode) -> 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 Serialize for Opcode

    §

    fn serialize<S>( &self, 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 2cdf9f160c..68ec809d70 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 @@ -3,7 +3,7 @@

    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 + 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 4b1acdb879..a60fa976d7 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 56f2bff7e8..2777f3531e 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,33 +148,33 @@
    §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( &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(&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(&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 @@ -183,12 +183,12 @@
    §Returns
    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 <= +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 <= 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 <= +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 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 5b47dfc6ac..e68b33fe08 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 @@ -193,23 +193,23 @@

    §Returns
    ) -> 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 -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 + 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 for ScriptBuf

    §

    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<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 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 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 <= +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>( 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 96ebcb3442..a64964482c 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 @@ -3,7 +3,7 @@

    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 + 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 8b020f46b3..726469d7b6 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 @@ -2,10 +2,10 @@

    Implementations§

    §

    impl SegwitV0Sighash

    pub fn from_raw_hash(inner: Hash) -> SegwitV0Sighash

    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 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>( +

    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 a091ca98d6..7774afb559 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 @@ -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§

    §

    impl Freeze for Sequence

    §

    impl RefUnwindSafe for Sequence

    §

    impl Send for Sequence

    §

    impl Sync for Sequence

    §

    impl Unpin for Sequence

    §

    impl UnwindSafe for Sequence

    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§

    §

    impl Freeze for Sequence

    §

    impl RefUnwindSafe for Sequence

    §

    impl Send for Sequence

    §

    impl Sync for Sequence

    §

    impl Unpin for Sequence

    §

    impl UnwindSafe for Sequence

    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 9a13e2b19b..a122f92fd9 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 c846b57888..57cd9c5b17 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 da2b9d3810..4201e849c0 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 @@ -4,7 +4,7 @@

    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 + 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.Transaction.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Transaction.html index 11ec05bb08..a3e76a57be 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.Txid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Txid.html index 94e637acca..59acd70213 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 @@ -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 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 c531dfb59a..a8bdf23e9c 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: 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 6e5193b82e..628c0e40fa 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 @@ -3,7 +3,7 @@

    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 + 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 03fa1d4733..fdc662c3e0 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 @@ -3,7 +3,7 @@

    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 + 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 b7bad8cb3f..ce667f885a 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.WitnessCommitment.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WitnessCommitment.html index 0eab8aec97..8f759801e9 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WitnessCommitment.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WitnessCommitment.html @@ -2,10 +2,10 @@

    Implementations§

    §

    impl WitnessCommitment

    pub fn from_raw_hash(inner: Hash) -> WitnessCommitment

    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 WitnessCommitment

    §

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

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

    impl AsRef<[u8; 32]> for WitnessCommitment

    §

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

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

    impl Borrow<[u8]> for WitnessCommitment

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WitnessCommitment

    §

    fn clone(&self) -> WitnessCommitment

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WitnessCommitment

    §

    fn deserialize<D>( +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WitnessCommitment

    §

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

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

    impl AsRef<[u8; 32]> for WitnessCommitment

    §

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

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

    impl Borrow<[u8]> for WitnessCommitment

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WitnessCommitment

    §

    fn clone(&self) -> WitnessCommitment

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WitnessCommitment

    §

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

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

    impl Display for WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    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 FromStr for WitnessCommitment

    §

    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 WitnessCommitment

    §

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

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    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 FromStr for WitnessCommitment

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

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

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

    impl Hash for WitnessCommitment

    §

    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.Wtxid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Wtxid.html index 34adf3b8d9..a182c4c15e 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 @@ -2,11 +2,11 @@

    Implementations§

    §

    impl Wtxid

    pub fn from_raw_hash(inner: Hash) -> Wtxid

    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 Wtxid

    §

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

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

    impl AsRef<[u8; 32]> for Wtxid

    §

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

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

    impl Borrow<[u8]> for Wtxid

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Wtxid

    §

    fn clone(&self) -> Wtxid

    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 Wtxid

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Wtxid

    Trait Implementations§

    §

    impl AsRef<[u8]> for Wtxid

    §

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

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

    impl AsRef<[u8; 32]> for Wtxid

    §

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

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

    impl Borrow<[u8]> for Wtxid

    §

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

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Wtxid

    §

    fn clone(&self) -> Wtxid

    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 Wtxid

    §

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

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Wtxid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Wtxid, 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 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 e78e7499b0..7d8b23167b 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 b07e1d67b4..be3196c528 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/merkle_branch/struct.TaprootMerkleBranch.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/merkle_branch/struct.TaprootMerkleBranch.html index add2612142..75975ac154 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,7 +2407,7 @@
    §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 @@ -2426,17 +2426,17 @@
    §Examples< ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<&[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<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
    +
    §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§

    §

    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/bitcoin/taproot/serialized_signature/struct.SerializedSignature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/serialized_signature/struct.SerializedSignature.html index c0111af77c..2c974ae1f1 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 @@ -1108,21 +1108,21 @@
    §ExamplesSized,

    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 + 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<SerializedSignature> for [u8]

    §

    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 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 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§

    §

    impl Freeze for SerializedSignature

    §

    impl RefUnwindSafe for SerializedSignature

    §

    impl Send for SerializedSignature

    §

    impl Sync for SerializedSignature

    §

    impl Unpin for SerializedSignature

    §

    impl UnwindSafe for SerializedSignature

    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 8db33259cc..15ec1022ac 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 @@ -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§

    §

    impl Freeze for Signature

    §

    impl RefUnwindSafe for Signature

    §

    impl Send for Signature

    §

    impl Sync for Signature

    §

    impl Unpin for Signature

    §

    impl UnwindSafe for Signature

    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 932bc4944d..4b0d2bbb8f 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 19d2d1ea65..c6f7f5ef10 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.TaprootBuilder.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootBuilder.html index 26ec27b544..5ad2d1ac5b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootBuilder.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootBuilder.html @@ -70,15 +70,15 @@
    §Errors:
    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 TaprootBuilder

    §

    fn partial_cmp(&self, other: &TaprootBuilder) -> 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 TryFrom<TaprootBuilder> for NodeInfo

    §

    type Error = IncompleteBuilderError

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

    fn try_from( +operator. Read more

    §

    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 TryFrom<TaprootBuilder> for TapTree

    §

    fn try_from( +) -> Result<NodeInfo, <NodeInfo as TryFrom<TaprootBuilder>>::Error>

    Performs the conversion.
    §

    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

    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 TaprootBuilder

    §

    impl StructuralPartialEq for TaprootBuilder

    Auto Trait Implementations§

    §

    impl Freeze for TaprootBuilder

    §

    impl RefUnwindSafe for TaprootBuilder

    §

    impl Send for TaprootBuilder

    §

    impl Sync for TaprootBuilder

    §

    impl Unpin for TaprootBuilder

    §

    impl UnwindSafe for TaprootBuilder

    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 TaprootBuilder

    §

    impl StructuralPartialEq for TaprootBuilder

    Auto Trait Implementations§

    §

    impl Freeze for TaprootBuilder

    §

    impl RefUnwindSafe for TaprootBuilder

    §

    impl Send for TaprootBuilder

    §

    impl Sync for TaprootBuilder

    §

    impl Unpin for TaprootBuilder

    §

    impl UnwindSafe for TaprootBuilder

    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.TaprootMerkleBranch.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootMerkleBranch.html index 5a9e3df180..252412248c 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,7 +2407,7 @@
    §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 @@ -2426,17 +2426,17 @@
    §Examples< ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<&[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<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
    +
    §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/local_chain/struct.AlterCheckPointError.html b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.AlterCheckPointError.html index 2b01363d26..57be708bbc 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.AlterCheckPointError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.AlterCheckPointError.html @@ -6,7 +6,7 @@

    Fields§

    §height: u32

    The checkpoint’s height.

    §original_hash: BlockHash

    The original checkpoint’s block hash which cannot be replaced/removed.

    §update_hash: Option<BlockHash>

    The attempted update to the original_block hash.

    -

    Trait Implementations§

    source§

    impl Clone for AlterCheckPointError

    source§

    fn clone(&self) -> AlterCheckPointError

    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 AlterCheckPointError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for AlterCheckPointError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for AlterCheckPointError

    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 AlterCheckPointError

    source§

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

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

    Trait Implementations§

    source§

    impl Clone for AlterCheckPointError

    source§

    fn clone(&self) -> AlterCheckPointError

    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 AlterCheckPointError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for AlterCheckPointError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for AlterCheckPointError

    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 AlterCheckPointError

    source§

    fn eq(&self, other: &AlterCheckPointError) -> 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 AlterCheckPointError

    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.CannotConnectError.html b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.CannotConnectError.html index 741f3491e9..40081c7ae9 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.CannotConnectError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.CannotConnectError.html @@ -2,7 +2,7 @@ pub try_include_height: u32, }
    Expand description

    Occurs when an update does not have a common checkpoint with the original chain.

    Fields§

    §try_include_height: u32

    The suggested checkpoint to include to connect the two chains.

    -

    Trait Implementations§

    source§

    impl Clone for CannotConnectError

    source§

    fn clone(&self) -> CannotConnectError

    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 CannotConnectError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for CannotConnectError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for CannotConnectError

    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 CannotConnectError

    source§

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

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

    Trait Implementations§

    source§

    impl Clone for CannotConnectError

    source§

    fn clone(&self) -> CannotConnectError

    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 CannotConnectError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for CannotConnectError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for CannotConnectError

    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 CannotConnectError

    source§

    fn eq(&self, other: &CannotConnectError) -> 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 CannotConnectError

    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.MissingGenesisError.html b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.MissingGenesisError.html index df07b6fc4d..4b013596d5 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.MissingGenesisError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.MissingGenesisError.html @@ -1,5 +1,5 @@ MissingGenesisError in bdk_chain::local_chain - Rust

    Struct bdk_chain::local_chain::MissingGenesisError

    source ·
    pub struct MissingGenesisError;
    Expand description

    An error which occurs when a LocalChain is constructed without a genesis checkpoint.

    -

    Trait Implementations§

    source§

    impl Clone for MissingGenesisError

    source§

    fn clone(&self) -> MissingGenesisError

    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 MissingGenesisError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for MissingGenesisError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for MissingGenesisError

    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 MissingGenesisError

    source§

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

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

    Trait Implementations§

    source§

    impl Clone for MissingGenesisError

    source§

    fn clone(&self) -> MissingGenesisError

    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 MissingGenesisError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for MissingGenesisError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for MissingGenesisError

    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 MissingGenesisError

    source§

    fn eq(&self, other: &MissingGenesisError) -> 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 MissingGenesisError

    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/struct.DescriptorId.html b/docs-rs/bdk/nightly/latest/bdk_chain/struct.DescriptorId.html index d98ed17e76..a72dbfae11 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,8 +24,8 @@ &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 - 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§

    Blanket Implementations§

    source§

    impl<T> Any for T
    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§

    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/struct.Impl.html b/docs-rs/bdk/nightly/latest/bdk_chain/struct.Impl.html index d5f81073ed..4f557fadb8 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/struct.TxUpdate.html b/docs-rs/bdk/nightly/latest/bdk_chain/struct.TxUpdate.html index b56db4b3a1..2eaf7a4230 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/struct.TxUpdate.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/struct.TxUpdate.html @@ -23,7 +23,7 @@

    pub fn extend(&mut self, other: TxUpdate<A>)

    Extend this update with other.

    Trait Implementations§

    §

    impl<A> Clone for TxUpdate<A>
    where A: Clone,

    §

    fn clone(&self) -> TxUpdate<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
    §

    impl<A> Debug for TxUpdate<A>
    where - A: Debug,

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<A> Default for TxUpdate<A>

    §

    fn default() -> TxUpdate<A>

    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.

    Auto Trait Implementations§

    §

    impl<A> Freeze for TxUpdate<A>

    §

    impl<A> RefUnwindSafe for TxUpdate<A>
    where + A: Debug,

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<A> Default for TxUpdate<A>

    §

    fn default() -> TxUpdate<A>

    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.

    Auto Trait Implementations§

    §

    impl<A> Freeze for TxUpdate<A>

    §

    impl<A> RefUnwindSafe for TxUpdate<A>
    where A: RefUnwindSafe,

    §

    impl<A> Send for TxUpdate<A>
    where A: Send,

    §

    impl<A> Sync for TxUpdate<A>
    where A: Sync,

    §

    impl<A> Unpin for TxUpdate<A>

    §

    impl<A> UnwindSafe for TxUpdate<A>
    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 1d46393eae..8d0b1e1319 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 7e7c4d269f..190a843762 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_chain/tx_graph/struct.TxUpdate.html b/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxUpdate.html index 2849027ef9..1076de73e8 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxUpdate.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxUpdate.html @@ -23,7 +23,7 @@

    pub fn extend(&mut self, other: TxUpdate<A>)

    Extend this update with other.

    Trait Implementations§

    §

    impl<A> Clone for TxUpdate<A>
    where A: Clone,

    §

    fn clone(&self) -> TxUpdate<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
    §

    impl<A> Debug for TxUpdate<A>
    where - A: Debug,

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<A> Default for TxUpdate<A>

    §

    fn default() -> TxUpdate<A>

    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.

    Auto Trait Implementations§

    §

    impl<A> Freeze for TxUpdate<A>

    §

    impl<A> RefUnwindSafe for TxUpdate<A>
    where + A: Debug,

    §

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

    Formats the value using the given formatter. Read more
    §

    impl<A> Default for TxUpdate<A>

    §

    fn default() -> TxUpdate<A>

    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.

    Auto Trait Implementations§

    §

    impl<A> Freeze for TxUpdate<A>

    §

    impl<A> RefUnwindSafe for TxUpdate<A>
    where A: RefUnwindSafe,

    §

    impl<A> Send for TxUpdate<A>
    where A: Send,

    §

    impl<A> Sync for TxUpdate<A>
    where A: Sync,

    §

    impl<A> Unpin for TxUpdate<A>

    §

    impl<A> UnwindSafe for TxUpdate<A>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_core/spk_client/enum.SyncItem.html b/docs-rs/bdk/nightly/latest/bdk_core/spk_client/enum.SyncItem.html index 34c67837de..6d0722fc0b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_core/spk_client/enum.SyncItem.html +++ b/docs-rs/bdk/nightly/latest/bdk_core/spk_client/enum.SyncItem.html @@ -6,7 +6,7 @@

    Variants§

    §

    Spk(I, &'i Script)

    Script pubkey sync item.

    §

    Txid(Txid)

    Txid sync item.

    §

    OutPoint(OutPoint)

    Outpoint sync item.

    -

    Trait Implementations§

    source§

    impl<'i, I: Clone> Clone for SyncItem<'i, I>

    source§

    fn clone(&self) -> SyncItem<'i, I>

    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<'i, I: Debug> Debug for SyncItem<'i, I>

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl<'i, I: Debug + Any> Display for SyncItem<'i, I>

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl<'i, I: Hash> Hash for SyncItem<'i, I>

    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 +

    Trait Implementations§

    source§

    impl<'i, I: Clone> Clone for SyncItem<'i, I>

    source§

    fn clone(&self) -> SyncItem<'i, I>

    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<'i, I: Debug> Debug for SyncItem<'i, I>

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl<'i, I: Debug + Any> Display for SyncItem<'i, I>

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl<'i, I: Hash> Hash for SyncItem<'i, I>

    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, I: Ord> Ord for SyncItem<'i, I>

    source§

    fn cmp(&self, other: &SyncItem<'i, I>) -> 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_wallet/descriptor/enum.Descriptor.html b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/enum.Descriptor.html index b06bbc4a40..1dc25fae05 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 @@ -257,10 +257,10 @@
    §Errors
    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: 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: 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: 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 66d77d66e2..04b8ad5d39 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/enum.AddForeignUtxoError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddForeignUtxoError.html index e1f47a923c..6f657e9ca7 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddForeignUtxoError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddForeignUtxoError.html @@ -11,7 +11,7 @@

    §foreign_utxo: OutPoint

    Foreign UTXO outpoint

    §

    InvalidOutpoint(OutPoint)

    Requested outpoint doesn’t exist in the tx (vout greater than available outputs)

    §

    MissingUtxo

    Foreign utxo missing witness_utxo or non_witness_utxo

    -

    Trait Implementations§

    source§

    impl Debug for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddForeignUtxoError

    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 AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddForeignUtxoError

    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.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.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/enum.LoadError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.LoadError.html index 3eb7fcf401..92e03db739 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.LoadError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.LoadError.html @@ -10,7 +10,7 @@
    §

    MissingGenesis

    Data loaded from persistence is missing genesis hash.

    §

    MissingDescriptor(KeychainKind)

    Data loaded from persistence is missing descriptor.

    §

    Mismatch(LoadMismatch)

    Data loaded is unexpected.

    -

    Trait Implementations§

    source§

    impl Debug for LoadError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for LoadError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for LoadError

    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<LoadMismatch> for LoadError

    source§

    fn from(mismatch: LoadMismatch) -> Self

    Converts to this type from the input type.
    source§

    impl PartialEq for LoadError

    source§

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

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

    Trait Implementations§

    source§

    impl Debug for LoadError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for LoadError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for LoadError

    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<LoadMismatch> for LoadError

    source§

    fn from(mismatch: LoadMismatch) -> Self

    Converts to this type from the input type.
    source§

    impl PartialEq for LoadError

    source§

    fn eq(&self, other: &LoadError) -> 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 LoadError

    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/error/enum.CreateTxError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.CreateTxError.html index 50cdc6a015..c5445b0a20 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 33741dd35f..5269ade0cb 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.KeyError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.KeyError.html index 7b4db73560..9d481f175b 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 a96f84265f..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/enum.SignerError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/signer/enum.SignerError.html index 031e031dfb..02d4e31a2b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/signer/enum.SignerError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/signer/enum.SignerError.html @@ -35,7 +35,7 @@
    §

    External(String)

    To be used only by external libraries implementing InputSigner or TransactionSigner, so that they can return their own custom errors, without having to modify SignerError in BDK.

    -

    Trait Implementations§

    source§

    impl Debug for SignerError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for SignerError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for SignerError

    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 Freeze for SignerError

    §

    impl RefUnwindSafe for SignerError

    §

    impl Send for SignerError

    §

    impl Sync for SignerError

    §

    impl Unpin for SignerError

    §

    impl UnwindSafe for SignerError

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for SignerError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for SignerError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for SignerError

    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 Freeze for SignerError

    §

    impl RefUnwindSafe for SignerError

    §

    impl Send for SignerError

    §

    impl Sync for SignerError

    §

    impl Unpin for SignerError

    §

    impl UnwindSafe for SignerError

    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/signer/struct.SignerWrapper.html b/docs-rs/bdk/nightly/latest/bdk_wallet/signer/struct.SignerWrapper.html index 17089d1fd8..3506320926 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,24 +1,24 @@ 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, sign_options: &SignOptions, secp: &Secp256k1<All> -) -> Result<(), SignerError>

    Sign a single psbt input
    source§

    impl InputSigner for SignerWrapper<DescriptorXKey<Xpriv>>

    source§

    fn sign_input( +) -> Result<(), SignerError>

    Sign a single psbt input
    source§

    impl InputSigner for SignerWrapper<DescriptorXKey<Xpriv>>

    source§

    fn sign_input( &self, psbt: &mut Psbt, 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, sign_options: &SignOptions, secp: &Secp256k1<All> -) -> Result<(), SignerError>

    Sign a single psbt input
    source§

    impl SignerCommon for SignerWrapper<DescriptorMultiXKey<Xpriv>>

    source§

    fn id(&self, secp: &Secp256k1<All>) -> SignerId

    Return the SignerId for this signer Read more
    source§

    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey>

    Return the secret key for the signer Read more
    source§

    impl SignerCommon for SignerWrapper<DescriptorXKey<Xpriv>>

    source§

    fn id(&self, secp: &Secp256k1<All>) -> SignerId

    Return the SignerId for this signer Read more
    source§

    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey>

    Return the secret key for the signer Read more
    source§

    impl SignerCommon for SignerWrapper<PrivateKey>

    source§

    fn id(&self, secp: &Secp256k1<All>) -> SignerId

    Return the SignerId for this signer Read more
    source§

    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey>

    Return the secret key for the signer Read more

    Auto Trait Implementations§

    §

    impl<S> Freeze for SignerWrapper<S>
    where +) -> Result<(), SignerError>

    Sign a single psbt input
    source§

    impl SignerCommon for SignerWrapper<DescriptorMultiXKey<Xpriv>>

    source§

    fn id(&self, secp: &Secp256k1<All>) -> SignerId

    Return the SignerId for this signer Read more
    source§

    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey>

    Return the secret key for the signer Read more
    source§

    impl SignerCommon for SignerWrapper<DescriptorXKey<Xpriv>>

    source§

    fn id(&self, secp: &Secp256k1<All>) -> SignerId

    Return the SignerId for this signer Read more
    source§

    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey>

    Return the secret key for the signer Read more
    source§

    impl SignerCommon for SignerWrapper<PrivateKey>

    source§

    fn id(&self, secp: &Secp256k1<All>) -> SignerId

    Return the SignerId for this signer Read more
    source§

    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey>

    Return the secret key for the signer Read more

    Auto Trait Implementations§

    §

    impl<S> Freeze for SignerWrapper<S>
    where S: Freeze,

    §

    impl<S> RefUnwindSafe for SignerWrapper<S>
    where S: RefUnwindSafe,

    §

    impl<S> Send for SignerWrapper<S>
    where S: Send,

    §

    impl<S> Sync for SignerWrapper<S>
    where 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 ba034cf7e6..b042302629 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 66ef340e3e..5b7215521a 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(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.

    + __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.

    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/tx_builder/enum.AddForeignUtxoError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddForeignUtxoError.html index 1b573f7baf..38c2dbe537 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddForeignUtxoError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddForeignUtxoError.html @@ -11,7 +11,7 @@

    §foreign_utxo: OutPoint

    Foreign UTXO outpoint

    §

    InvalidOutpoint(OutPoint)

    Requested outpoint doesn’t exist in the tx (vout greater than available outputs)

    §

    MissingUtxo

    Foreign utxo missing witness_utxo or non_witness_utxo

    -

    Trait Implementations§

    source§

    impl Debug for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddForeignUtxoError

    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 Freeze for AddForeignUtxoError

    §

    impl RefUnwindSafe for AddForeignUtxoError

    §

    impl Send for AddForeignUtxoError

    §

    impl Sync for AddForeignUtxoError

    §

    impl Unpin for AddForeignUtxoError

    §

    impl UnwindSafe for AddForeignUtxoError

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddForeignUtxoError

    source§

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

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddForeignUtxoError

    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 Freeze for AddForeignUtxoError

    §

    impl RefUnwindSafe for AddForeignUtxoError

    §

    impl Send for AddForeignUtxoError

    §

    impl Sync for AddForeignUtxoError

    §

    impl Unpin for AddForeignUtxoError

    §

    impl UnwindSafe for AddForeignUtxoError

    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_cli/enum.CoinSelectionAlgo.html b/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html index c496a04158..d55044123d 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/search-index.js b/docs-rs/bdk/nightly/latest/search-index.js index 1c75eb9dc8..d0b8965515 100644 --- a/docs-rs/bdk/nightly/latest/search-index.js +++ b/docs-rs/bdk/nightly/latest/search-index.js @@ -1,14 +1,14 @@ 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":"KFSFFKGFFFPKFRFFIEEIKFEFFPNNMNNONNNNDEONOONNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNONOONCCNNNNNNNNNNNNNNNNNNNNNMNNMNONECNMENNNNNNONNNNNNNNDCODNNNNNOCENNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOOOONNNNNNNNNNNNNONNNNNNNNNNNNNFGPPPPFTTPPPFFPFFTTPGTTGFFFGFTTTTTTTTTTTTTTTTTTTPPFPPPTPGGPPPPTTTTFFPPPPPPFFFFPPTTPFFFFFFPPPPPFFFFFFGFFFPPPPFFFFFPPPPPPPPPPPPPPPPPFTFFFFFFFGFFFFTTTTTTNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNONNNNNNCNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNNNNNNOOCNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNCONONNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNCNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOFGGPPPGTPFPFGPFPGGKPFPPPPGPPPGPPPFPFPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOPPPGPFPFPFPFGGFPFPPPPPFPPPKGFPPPPPPPPGPPFPNNNNMNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNKKCCMMMMMMMHCHHHHCHHHPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRGPRGGKPPPPPPCNNNNNNNNNNNNMHNHHHNNNHCHNHHHNNHCNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNCFSSSPSPGPSSPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNKRKRFGKFFPPPNNNNNNNNNNNNNNMNNNNNMNNMNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFSSSSSSSSSSRRKMNNNNNNNFNNNNNNNNNNNNFFKNNNNMNNNNNNNNNNNNNNNNNNNNNNNNFFGFPFFFPNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONONNNNNNNNNONNNNNONONNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNFFFFFGFFFFPPNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPFGFFGIIIIFPPKPFPPPPIPPPPFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNOOOOOONNNOOOOOONNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOFFCCCCCCCCCPPGFFFTPPTTTFPPGFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNONNNNNONNNNNNNNNNNNNNNONNNNNONNNNNTSFSSSSSSSTSSTSSTTTSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNFCCPFFSGTTTTFFTPFTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFFGTTTTTFPFTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGPPPJJJJJFPPPPPPCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSFFPGGFFPPPFPFFKFFFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCHGPPSSFNNNNNNNNNNNNNNNNNNNPGPPFGPPPPPPPPPPPPPPPPPPGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFTFFTTTTTGFTPFFFFPFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNOONNONHHOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNOOONNNNNNNOSFFFNNNNNNNNNNNNNTPKGKTPFTKTTTTPKONOOOONNNNNNNNMHHNMMMMMMMMMMCNNNNNNNNNNNNNOOONOCOOOMMMMMMMMMMOCHNNNNNNNNNNNFKPKGGPPSPPPPKPFKNNNNNNNNNNNNMNNHHHMMMMMMMMMMNNNNNNNNNNNNNNNNNNNMMMMMMMMMMHHNNNNNNNNNNNNNNNNNOOOOJFJJJJJOOOOOOOOOOOOOKKRRKRFRKFNNNNNNMMNNMNCNNMNNNNNNNNNKFFFFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPPFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNPFPFPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFTRTRFKKFFTRMMQCNMMMNCNQQCMMMCQCCCCCQCCCCMHFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGRKRKIGGFPPFPPPFPNMNNNNNNNNNNNNNNCNNNNNNNNNNNCNNNNNNNNNNNNNNNCNNNNNNNNNQNNNNNNNNNNNMNNNQNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQFNNNNNNNNNNNNNNNNNRFFKNMNNNNNNNNNNNNQNNNQNNNNNNNNNNNNNNNGGPPFPFPFNNNNNNNONNNNONNNNNNNRKGGPPPPMRKRKNMMNNNNFFFNNNONONNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKYKRRRKYRRRRRRRKNNNCMMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMQNNCMMMMMMNMMMMMMMMMMMMMMMMNMMMMMMMPPPKKKKRPKKRRRRRKPFKPKPPPPPKPKPPPGPPPRRRKKNNNNNNNNNMNNMMNMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMNNNMNMNNNNNNNNNMNNNNNNMNMNNNMNMNNNNMNNNNNNNMNNMNNCNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKRRRRRRRRFRRRRRRRRKKRKRKRKRKRKRKRKKNNNNNNMNNNNNNNNNNMMMMMMMNNNNNNNNNNNNNNMMMMMMNNNMMMMMMNNNNNMMMMMNMMMMMMMMMMMMNMMMMMMMMNNNNNNNNNCTKNMNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPKPPPFPFGFPPPPPPPPKIFFPFPPKPNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNHHNNQNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNPFPPGGPPFPFPPPPFPGGGFFFFPPPFKRRFFFIIKFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPFGPPPPPFPPNNNNNHHNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNPPGGFPPPPPFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHFTTTTFTTTTSFTTFTTTFTNCONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCCCCNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGFFPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNOOOONONNNNNNNNNNNPPPPPPPPPFFPPPPPPPPPPPPPPSSPPGPPPFPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOPPPFFGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNOONNNNNNNNNNNNOONNNOOPGFFPPNNNNNNNNNNNNNNNNNNNNONNNNNNNNNOONNNNNNONNNNNNNNNNNNONNNNNNFFFFNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNONNNNNNNNONNNNONNNNFFFFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPPPPFGFNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONOOOOOOOONNNNNNNNNNNNOONNNFNNNNNNNNNNNNNNNNNNNNSSSSSSSSHFFFPPPPPPPPPPGRGPKGPGFPPPPPPPPPPPPPPPPPGPPPPPPPPPPPPPPFGPPFPGFPPPPPPPPPGGIGIPPPPPPPPPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNOOONNNNNNNNNNNNNOONNNNOOOOCOOOCNNNOONNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNONNNNNNNNNNNNNOOOOOOOOOOOOOOOOOFFFINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNONNNONNNNNNNNNNNNNNOONNNGFKTGPTPPPFPPPPPPPPFTFPTPGKFFFFGFKKKGFFTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCMNNNNNNNNNCCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCQNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSFNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNPPFGFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKFIFIFIPPPPFSSSSSIFFPPPPRFMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQQNNNNNNNNNNNNNNNNNNHNNNNNCHHHHHHJHHHHHHHHHHHHHHHHHHHJHHHHHHHHHHHJHHHHHJJJHHHHHHHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNHHHHHNNNNNFTNNNNIIIIGNNNNNNNNINNNNNNNNNNTRTRFKKFFTRMNMNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNMNNNNNQQNNNNNMNNNNNMNMNNNQNQMNNNNNNNNNNNNNNNNNNNNTKFKTKKRKNNNCNMNNNNNNNMNNNNNNNMMCHNNCNNNCNNHNMNMNNNNPFFGFFKKPPPFFFFPFGFMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNCKKKRFFFFFKRMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPGFCKFNNNNNNNNNNKKRKKKRKKFFMNMNNMMNMMNMNNMNNNNNMMMHMNNNNMHNMFFFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNRKFKNNMNMNNMMNMMNNCNNNNNMMNNNNNNGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPFGPGPGPPPPPFPFFPPPPPPGGPGPFPFFFPPFPFGPPPFPPFFGGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNSPPPFGPNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNOHNNNNNNNNNNNNNNFPPPFPGPPGPPPPPPPPFFGFPPPPFFPGPFSSSSSSSFGFFFPFFFFGGFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONCNNONNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNONNNNRKMMMMMCCFSPKGPFTTKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNMNNNMNNNNNNNNNNNNNNNNNNNNMNNNOOOOFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGTPFFFFPFFTNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNONNNNNNSHFFFPPGFFFFPNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNNNTGFFPPTTTFFFFFNNNOOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNONOOOONNNNNNNNNNNNNNNNNN","n":["Anchor","AnchorImpl","BIP32_MAX_INDEX","Balance","BlockId","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","FullScanResponse","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResponse","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"],[356,"bdk_chain::bitcoin"],[2756,"bdk_chain::bitcoin::address"],[3027,"bdk_chain::bitcoin::address::AddressData"],[3030,"bdk_chain::bitcoin::address::error"],[3052,"bdk_chain::bitcoin::amount"],[3113,"bdk_chain::bitcoin::amount::serde"],[3124,"bdk_chain::bitcoin::amount::serde::as_btc"],[3127,"bdk_chain::bitcoin::amount::serde::as_btc::opt"],[3129,"bdk_chain::bitcoin::amount::serde::as_sat"],[3132,"bdk_chain::bitcoin::amount::serde::as_sat::opt"],[3134,"bdk_chain::bitcoin::base58"],[3503,"bdk_chain::bitcoin::base58::error"],[3546,"bdk_chain::bitcoin::base64"],[3636,"bdk_chain::bitcoin::base64::alphabet"],[3680,"bdk_chain::bitcoin::base64::display"],[3692,"bdk_chain::bitcoin::base64::engine"],[3774,"bdk_chain::bitcoin::base64::engine::general_purpose"],[3782,"bdk_chain::bitcoin::base64::prelude"],[3797,"bdk_chain::bitcoin::base64::read"],[3810,"bdk_chain::bitcoin::base64::write"],[3842,"bdk_chain::bitcoin::bip152"],[4032,"bdk_chain::bitcoin::bip158"],[4146,"bdk_chain::bitcoin::bip32"],[4492,"bdk_chain::bitcoin::bip32::ChildNumber"],[4494,"bdk_chain::bitcoin::blockdata"],[4505,"bdk_chain::bitcoin::blockdata::block"],[4625,"bdk_chain::bitcoin::blockdata::constants"],[4693,"bdk_chain::bitcoin::blockdata::fee_rate"],[4694,"bdk_chain::bitcoin::blockdata::locktime"],[4696,"bdk_chain::bitcoin::blockdata::locktime::absolute"],[4882,"bdk_chain::bitcoin::blockdata::locktime::relative"],[5092,"bdk_chain::bitcoin::blockdata::opcodes"],[5143,"bdk_chain::bitcoin::blockdata::opcodes::all"],[5399,"bdk_chain::bitcoin::blockdata::script"],[5953,"bdk_chain::bitcoin::blockdata::script::witness_program"],[5978,"bdk_chain::bitcoin::blockdata::script::witness_version"],[6062,"bdk_chain::bitcoin::blockdata::transaction"],[6222,"bdk_chain::bitcoin::blockdata::weight"],[6224,"bdk_chain::bitcoin::blockdata::witness"],[6239,"bdk_chain::bitcoin::consensus"],[6330,"bdk_chain::bitcoin::consensus::encode"],[6423,"bdk_chain::bitcoin::consensus::encode::Error"],[6427,"bdk_chain::bitcoin::consensus::params"],[6447,"bdk_chain::bitcoin::consensus::serde"],[6482,"bdk_chain::bitcoin::consensus::serde::hex"],[6560,"bdk_chain::bitcoin::ecdsa"],[6647,"bdk_chain::bitcoin::error"],[6730,"bdk_chain::bitcoin::hash_types"],[6738,"bdk_chain::bitcoin::hashes"],[6779,"bdk_chain::bitcoin::hashes::cmp"],[6780,"bdk_chain::bitcoin::hashes::hash160"],[6825,"bdk_chain::bitcoin::hashes::hex"],[6989,"bdk_chain::bitcoin::hashes::hex::buf_encoder"],[7007,"bdk_chain::bitcoin::hashes::hex::display"],[7045,"bdk_chain::bitcoin::hashes::hex::error"],[7074,"bdk_chain::bitcoin::hashes::hex::parse"],[7083,"bdk_chain::bitcoin::hashes::hex::prelude"],[7094,"bdk_chain::bitcoin::hashes::hmac"],[7107,"bdk_chain::bitcoin::hashes::ripemd160"],[7178,"bdk_chain::bitcoin::hashes::serde"],[7265,"bdk_chain::bitcoin::hashes::serde::de"],[7449,"bdk_chain::bitcoin::hashes::serde::de::value"],[8772,"bdk_chain::bitcoin::hashes::serde::ser"],[8901,"bdk_chain::bitcoin::hashes::serde_macros"],[8902,"bdk_chain::bitcoin::hashes::serde_macros::serde_details"],[8907,"bdk_chain::bitcoin::hashes::sha1"],[8977,"bdk_chain::bitcoin::hashes::sha256"],[9091,"bdk_chain::bitcoin::hashes::sha256d"],[9144,"bdk_chain::bitcoin::hashes::sha256t"],[9191,"bdk_chain::bitcoin::hashes::sha384"],[9247,"bdk_chain::bitcoin::hashes::sha512"],[9317,"bdk_chain::bitcoin::hashes::sha512_256"],[9373,"bdk_chain::bitcoin::hashes::siphash24"],[9465,"bdk_chain::bitcoin::io"],[9713,"bdk_chain::bitcoin::key"],[10083,"bdk_chain::bitcoin::merkle_tree"],[10141,"bdk_chain::bitcoin::network"],[10189,"bdk_chain::bitcoin::network::as_core_arg"],[10191,"bdk_chain::bitcoin::p2p"],[10349,"bdk_chain::bitcoin::p2p::address"],[10404,"bdk_chain::bitcoin::p2p::message"],[10531,"bdk_chain::bitcoin::p2p::message::NetworkMessage"],[10533,"bdk_chain::bitcoin::p2p::message_blockdata"],[10609,"bdk_chain::bitcoin::p2p::message_blockdata::Inventory"],[10611,"bdk_chain::bitcoin::p2p::message_bloom"],[10675,"bdk_chain::bitcoin::p2p::message_compact_blocks"],[10768,"bdk_chain::bitcoin::p2p::message_filter"],[10900,"bdk_chain::bitcoin::p2p::message_network"],[10978,"bdk_chain::bitcoin::parse"],[10999,"bdk_chain::bitcoin::policy"],[11008,"bdk_chain::bitcoin::pow"],[11011,"bdk_chain::bitcoin::psbt"],[11389,"bdk_chain::bitcoin::psbt::Error"],[11394,"bdk_chain::bitcoin::psbt::ExtractTxError"],[11398,"bdk_chain::bitcoin::psbt::IndexOutOfBoundsError"],[11402,"bdk_chain::bitcoin::psbt::raw"],[11473,"bdk_chain::bitcoin::secp256k1"],[11827,"bdk_chain::bitcoin::secp256k1::constants"],[11843,"bdk_chain::bitcoin::secp256k1::ecdh"],[11874,"bdk_chain::bitcoin::secp256k1::ecdsa"],[11996,"bdk_chain::bitcoin::secp256k1::ecdsa::serialized_signature"],[12018,"bdk_chain::bitcoin::secp256k1::ellswift"],[12093,"bdk_chain::bitcoin::secp256k1::ffi"],[12339,"bdk_chain::bitcoin::secp256k1::ffi::recovery"],[12371,"bdk_chain::bitcoin::secp256k1::ffi::types"],[12401,"bdk_chain::bitcoin::secp256k1::hashes"],[12515,"bdk_chain::bitcoin::secp256k1::rand"],[12567,"bdk_chain::bitcoin::secp256k1::rand::distributions"],[12842,"bdk_chain::bitcoin::secp256k1::rand::distributions::uniform"],[12985,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted"],[12992,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted::alias_method"],[13004,"bdk_chain::bitcoin::secp256k1::rand::prelude"],[13048,"bdk_chain::bitcoin::secp256k1::rand::rngs"],[13111,"bdk_chain::bitcoin::secp256k1::rand::rngs::adapter"],[13159,"bdk_chain::bitcoin::secp256k1::rand::rngs::mock"],[13180,"bdk_chain::bitcoin::secp256k1::rand::seq"],[13212,"bdk_chain::bitcoin::secp256k1::rand::seq::index"],[13269,"bdk_chain::bitcoin::secp256k1::scalar"],[13289,"bdk_chain::bitcoin::secp256k1::schnorr"],[13320,"bdk_chain::bitcoin::sighash"],[13669,"bdk_chain::bitcoin::sign_message"],[13724,"bdk_chain::bitcoin::taproot"],[14363,"bdk_chain::bitcoin::taproot::merkle_branch"],[14389,"bdk_chain::bitcoin::taproot::serialized_signature"],[14444,"bdk_chain::indexed_tx_graph"],[14495,"bdk_chain::indexer"],[14504,"bdk_chain::indexer::keychain_txout"],[14607,"bdk_chain::indexer::keychain_txout::InsertDescriptorError"],[14611,"bdk_chain::indexer::spk_txout"],[14648,"bdk_chain::local_chain"],[14780,"bdk_chain::rusqlite_impl"],[14782,"bdk_chain::spk_client"],[14928,"bdk_chain::tx_graph"],[15113,"bdk_chain::balance"],[15114,"bdk_chain::descriptor_ext"],[15115,"bdk_chain::tx_data_traits"],[15116,"bdk_core::block_id"],[15117,"bitcoin_hashes::sha256"],[15118,"bdk_core::checkpoint"],[15119,"bdk_core::tx_update"],[15120,"core::clone"],[15121,"bdk_chain::chain_data"],[15122,"bdk_chain::spk_iter"],[15123,"core::cmp"],[15124,"rusqlite::types::value_ref"],[15125,"bitcoin::blockdata::script::owned"],[15126,"rusqlite::types::from_sql"],[15127,"bitcoin::blockdata::block"],[15128,"miniscript::descriptor::key"],[15129,"miniscript::descriptor"],[15130,"bitcoin::blockdata::transaction"],[15131,"bitcoin::network"],[15132,"bitcoin_units::amount"],[15133,"serde::de"],[15134,"core::option"],[15135,"core::borrow"],[15136,"core::result"],[15137,"core::iter::traits::collect"],[15138,"core::fmt"],[15139,"bitcoin_hashes"],[15140,"bdk_chain::chain_oracle"],[15141,"core::hash"],[15142,"core::slice::index"],[15143,"fallible_iterator"],[15144,"core::iter::traits::iterator"],[15145,"bdk_core::merge"],[15146,"core::ops::function"],[15147,"core::ops::range"],[15148,"serde::ser"],[15149,"rusqlite::types::to_sql"],[15150,"rusqlite"],[15151,"alloc::string"],[15152,"core::any"],[15153,"bitcoin_units::weight"],[15154,"bitcoin::pow"],[15155,"secp256k1::key"],[15156,"secp256k1"],[15157,"secp256k1::scalar"],[15158,"secp256k1::context"],[15159,"bitcoin::address"],[15160,"bitcoin::bip158"],[15161,"bitcoin::bip32"],[15162,"bitcoin::blockdata::script"],[15163,"bitcoin::crypto::key"],[15164,"bitcoin::crypto::sighash"],[15165,"bitcoin::taproot"],[15166,"bitcoin::blockdata::script::borrowed"],[15167,"secp256k1_sys"],[15168,"bitcoin_hashes::sha256d"],[15169,"bitcoin_hashes::hash160"],[15170,"bitcoin_hashes::sha256t"],[15171,"bitcoin::blockdata::script::push_bytes::primitive"],[15172,"bitcoin::consensus::params"],[15173,"bitcoin::blockdata::script::builder"],[15174,"bitcoin::blockdata::constants"],[15175,"bitcoin::blockdata::locktime::absolute"],[15176,"bitcoin::blockdata::locktime::relative"],[15177,"bitcoin_units::fee_rate"],[15178,"bitcoin::blockdata::opcodes"],[15179,"bitcoin::blockdata::witness"],[15180,"bitcoin::blockdata::script::witness_program"],[15181,"bitcoin::blockdata::script::witness_version"],[15182,"bitcoin::consensus::encode"],[15183,"bitcoin::merkle_tree::block"],[15184,"bitcoin::psbt"],[15185,"bitcoin::psbt::error"],[15186,"bitcoin_io"],[15187,"core::marker"],[15188,"bitcoin_io::error"],[15189,"bitcoin_units::amount::serde::private"],[15190,"core::convert"],[15191,"bitcoin::blockdata::script::instruction"],[15192,"miniscript::psbt"],[15193,"alloc::vec"],[15194,"alloc::borrow"],[15195,"miniscript::primitives::relative_locktime"],[15196,"hex_conservative::error"],[15197,"bitcoin::error"],[15198,"bitcoin::p2p"],[15199,"bitcoin::address::error"],[15200,"bitcoin_units::locktime::relative"],[15201,"miniscript::miniscript::decode"],[15202,"alloc::boxed"],[15203,"bitcoin_units::locktime::absolute"],[15204,"bitcoin::crypto::taproot"],[15205,"bitcoin::crypto::ecdsa"],[15206,"alloc::collections::btree::map"],[15207,"bech32::primitives::gf32"],[15208,"miniscript::miniscript::hash256"],[15209,"bitcoin_hashes::ripemd160"],[15210,"secp256k1::schnorr"],[15211,"bech32::segwit"],[15212,"base58ck::error"],[15213,"bitcoin_units::amount::serde"],[15214,"core::alloc"],[15215,"std::ffi::os_str"],[15216,"std::path"],[15217,"bitcoin::p2p::address"],[15218,"bitcoin::bip152"],[15219,"bitcoin::p2p::message_blockdata"],[15220,"alloc::vec::drain"],[15221,"serde_json::value"],[15222,"alloc::vec::extract_if"],[15223,"std::io::error"],[15224,"alloc::collections::binary_heap"],[15225,"alloc::collections::vec_deque"],[15226,"alloc::ffi::c_str"],[15227,"bitcoin::taproot::merkle_branch"],[15228,"miniscript::plan"],[15229,"serde::de::value"],[15230,"core::str::pattern"],[15231,"core::mem::maybe_uninit"],[15232,"alloc::vec::splice"],[15233,"core::net::socket_addr"],[15234,"alloc::vec::into_iter"],[15235,"rusqlite::error"],[15236,"alloc::collections"],[15237,"std::io"],[15238,"base64::encode"],[15239,"base64::decode"],[15240,"base64::engine"],[15241,"base64::alphabet"],[15242,"base64::display"],[15243,"base64::engine::general_purpose"],[15244,"base64::read::decoder"],[15245,"base64::write::encoder_string_writer"],[15246,"base64::write::encoder"],[15247,"miniscript::primitives::absolute_locktime"],[15248,"bitcoin::blockdata::script::push_bytes::error"],[15249,"bitcoin::blockdata::script::push_bytes"],[15250,"bitcoin_units::parse"],[15251,"bitcoin::consensus"],[15252,"bitcoin::consensus::serde"],[15253,"bitcoin::consensus::serde::hex"],[15254,"core::slice::iter"],[15255,"secp256k1::ecdsa"],[15256,"hex_conservative::parse"],[15257,"hex_conservative::display"],[15258,"hex_conservative"],[15259,"hex_conservative::iter"],[15260,"core::iter::traits::exact_size"],[15261,"core::iter::traits::double_ended"],[15262,"core::iter::traits::marker"],[15263,"hex_conservative::buf_encoder"],[15264,"serde::de::ignored_any"],[15265,"core::error"],[15266,"serde::ser::impossible"],[15267,"bitcoin_hashes::serde_macros::serde_details"],[15268,"bitcoin_hashes::sha1"],[15269,"bitcoin_hashes::sha384"],[15270,"bitcoin_hashes::sha512"],[15271,"bitcoin_hashes::sha512_256"],[15272,"bitcoin_hashes::siphash24"],[15273,"bitcoin_io::bridge"],[15274,"core::ptr::non_null"],[15275,"secp256k1::context::alloc_only"],[15276,"secp256k1::secret"],[15277,"core::mem::manually_drop"],[15278,"rand::rng"],[15279,"secp256k1_sys::types"],[15280,"secp256k1::ecdsa::recovery"],[15281,"rand_core"],[15282,"bitcoin::p2p::message"],[15283,"bitcoin::p2p::message_bloom"],[15284,"bitcoin::p2p::message_compact_blocks"],[15285,"bitcoin::p2p::message_filter"],[15286,"bitcoin::p2p::message_network"],[15287,"core::num::error"],[15288,"bitcoin::psbt::map::output"],[15289,"bitcoin::psbt::map::input"],[15290,"bitcoin::psbt::display_from_str"],[15291,"bitcoin::psbt::raw"],[15292,"secp256k1::ellswift"],[15293,"secp256k1::ecdh"],[15294,"secp256k1_sys::recovery"],[15295,"secp256k1::ecdsa::serialized_signature"],[15296,"secp256k1::ecdsa::serialized_signature::into_iter"],[15297,"core::ffi"],[15298,"bitcoin_hashes::hmac"],[15299,"core::str::traits"],[15300,"rand_core::error"],[15301,"core::num::nonzero"],[15302,"getrandom::error"],[15303,"core::default"],[15304,"rand::distributions::uniform"],[15305,"rand::distributions::distribution"],[15306,"rand::rngs::thread"],[15307,"rand::distributions::other"],[15308,"rand::distributions"],[15309,"rand::distributions::bernoulli"],[15310,"rand::distributions::float"],[15311,"rand::distributions::slice"],[15312,"rand::distributions::weighted_index"],[15313,"core::ops::arith"],[15314,"core::num::wrapping"],[15315,"core::time"],[15316,"rand::distributions::weighted::alias_method"],[15317,"rand::seq"],[15318,"rand_core::os"],[15319,"rand::rngs::std"],[15320,"rand::rngs::adapter::reseeding"],[15321,"rand_core::block"],[15322,"rand::rngs::adapter::read"],[15323,"rand::rngs::mock"],[15324,"core::ops::index"],[15325,"rand::seq::index"],[15326,"bitcoin::sign_message::message_signing"],[15327,"alloc::collections::btree::set"],[15328,"bitcoin::taproot::serialized_signature"],[15329,"bitcoin::taproot::serialized_signature::into_iter"],[15330,"alloc::sync"],[15331,"rusqlite::transaction"],[15332,"bdk_core"],[15333,"bdk_core::spk_client"],[15334,"std::collections::hash::set"],[15335,"bitcoin"],[15336,"bitcoin::crypto"],[15337,"bitcoin_units::amount::serde::as_btc"],[15338,"bitcoin_units::amount::serde::as_btc::opt"],[15339,"bitcoin_units::amount::serde::as_sat"],[15340,"bitcoin_units::amount::serde::as_sat::opt"],[15341,"base58ck"],[15342,"base64"],[15343,"bitcoin::blockdata"],[15344,"bitcoin::blockdata::locktime"],[15345,"bitcoin::blockdata::opcodes::all"],[15346,"bitcoin_hashes::cmp"],[15347,"serde_derive"],[15348,"serde"],[15349,"bitcoin_hashes::serde_macros"],[15350,"bitcoin::merkle_tree"],[15351,"bitcoin::network::as_core_arg"],[15352,"bitcoin::policy"],[15353,"secp256k1::constants"],[15354,"rand"],[15355,"rand::distributions::weighted"],[15356,"rand::rngs"],[15357,"bitcoin::sign_message"]],"i":[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,30,0,0,134,0,0,150,129,144,0,127,127,0,0,0,0,0,0,32,78,129,79,127,148,148,148,148,148,79,32,78,31,32,78,129,79,79,147,135,0,134,134,134,139,134,0,0,144,145,144,145,32,78,32,78,0,0,88,88,88,88,88,134,0,0,0,0,135,30,134,32,134,0,0,0,0,0,0,30,144,145,144,145,0,0,0,0,0,0,0,0,0,0,147,30,30,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,32,78,129,79,127,148,78,32,78,79,80,32,78,79,81,0,87,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,0,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,81,106,106,23,23,106,81,81,23,81,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,89,89,90,90,91,91,26,26,92,92,93,93,94,94,106,106,23,23,95,95,95,96,96,96,29,29,97,97,98,98,98,99,99,99,100,100,101,101,102,102,30,103,103,104,104,105,105,23,87,87,87,104,119,31,0,0,0,120,120,0,134,32,78,129,81,79,88,135,87,89,89,90,90,91,91,26,26,92,92,93,93,94,94,120,130,106,23,23,136,137,95,95,96,96,29,29,97,97,138,119,127,139,31,133,140,141,98,98,99,99,142,143,100,100,101,101,110,102,102,144,145,146,147,30,80,148,149,150,112,103,103,113,104,104,114,105,105,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,106,23,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,106,23,106,30,127,120,127,127,120,78,32,78,79,32,78,129,79,32,78,129,79,129,32,78,32,78,79,130,133,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,106,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,100,101,110,102,144,147,30,80,148,149,112,103,113,104,114,105,81,120,150,141,143,120,31,31,120,31,0,32,89,90,26,92,93,120,29,97,138,127,139,133,140,146,149,103,120,23,119,139,31,32,89,90,26,92,93,120,106,23,29,97,138,119,127,139,31,133,140,146,149,103,106,106,81,32,78,23,138,119,127,133,110,149,112,113,114,23,23,32,78,32,78,32,129,81,79,87,89,90,91,26,92,93,94,120,106,23,95,96,29,97,138,119,127,139,31,133,141,98,99,142,143,100,101,102,144,145,30,80,148,149,150,150,103,104,105,150,148,148,32,78,32,78,32,32,78,79,79,32,78,79,106,0,127,119,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,110,102,112,103,113,104,114,105,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,106,106,23,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,81,134,134,32,32,78,78,129,129,81,81,79,79,88,88,135,135,87,87,89,89,90,90,91,91,26,26,92,92,93,93,94,94,120,120,130,130,106,106,23,23,136,136,137,137,95,95,96,96,29,29,97,97,138,138,119,119,127,127,139,139,31,31,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,30,30,80,80,148,148,149,149,150,150,112,112,103,103,113,113,104,104,114,114,105,105,0,23,150,146,150,150,150,150,150,129,129,89,150,150,150,150,150,150,150,150,106,134,134,32,32,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,26,26,26,26,92,92,92,92,93,93,93,93,94,94,94,94,120,130,130,106,106,106,106,23,23,23,23,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,31,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,30,30,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,32,78,143,134,32,78,129,81,81,81,81,81,81,79,88,135,135,87,89,89,90,90,91,91,91,91,26,26,26,26,26,26,92,92,92,93,93,93,94,94,120,130,130,130,23,23,23,23,23,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,31,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,30,80,148,148,149,150,112,103,103,103,113,104,104,104,104,104,114,105,105,105,105,127,80,148,146,32,78,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,23,106,30,148,127,145,149,144,30,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,32,78,149,146,127,23,127,80,148,149,32,23,105,81,79,80,148,30,149,104,79,141,142,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,32,78,129,129,129,87,103,104,127,127,81,81,89,90,91,26,92,93,94,95,96,29,97,133,141,141,98,99,142,143,100,101,102,103,104,105,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,145,134,32,78,129,81,79,88,87,89,90,91,26,92,93,94,137,95,96,29,97,138,127,141,98,99,142,143,100,101,102,144,145,30,150,103,104,105,32,78,32,78,127,80,148,149,150,79,79,79,143,79,87,79,79,143,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,106,23,136,137,95,96,29,97,138,119,127,139,31,133,141,98,99,142,100,101,110,102,144,145,147,30,80,148,149,150,112,103,113,104,114,105,0,120,146,89,90,91,26,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,31,150,106,106,106,106,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,23,23,133,106,31,31,106,133,31,127,127,31,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,31,80,30,87,148,148,148,0,148,148,106,139,106,139,32,78,129,79,79,32,78,79,78,0,143,106,23,136,138,133,141,143,23,23,23,23,23,23,23,23,141,143,23,133,31,138,31,150,0,106,87,87,87,87,87,87,136,133,87,136,87,136,133,106,23,141,142,87,136,30,0,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,106,106,23,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,100,101,110,102,144,147,30,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,23,23,23,23,141,142,106,32,78,32,78,87,23,23,79,23,87,106,87,139,31,119,133,119,119,32,78,32,78,32,78,32,78,32,129,81,81,79,87,89,90,91,26,92,93,94,120,130,106,23,95,96,29,97,138,119,127,139,31,133,141,98,99,142,143,100,101,102,144,145,30,80,148,149,150,150,103,104,105,150,150,0,150,150,150,0,78,139,133,140,150,32,78,79,80,32,78,79,32,78,79,79,81,0,133,133,133,106,87,106,80,148,32,78,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,141,142,143,148,149,127,30,137,32,78,81,141,81,141,106,79,80,148,137,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,106,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,106,106,106,81,141,87,89,90,91,26,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,127,81,141,32,78,129,129,129,105,81,141,32,141,134,32,78,129,81,79,88,87,89,90,91,26,92,93,94,130,106,23,137,95,96,29,97,138,127,141,98,99,142,143,100,101,102,144,145,30,80,148,150,103,104,105,32,78,32,78,80,145,130,78,79,79,133,143,148,79,81,31,120,119,31,134,32,32,78,78,129,129,129,129,81,79,79,79,79,88,135,87,89,90,91,26,92,93,94,120,130,23,136,137,137,137,137,137,95,96,29,97,138,119,127,127,127,127,139,31,133,140,141,98,99,142,142,143,100,101,110,102,144,145,146,147,30,30,30,80,148,149,150,112,103,113,104,114,105,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,81,31,31,120,31,138,146,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,106,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,32,78,32,78,32,78,150,78,150,150,150,139,81,141,142,136,31,150,138,31,134,32,78,129,81,79,88,135,87,89,90,91,26,92,93,94,120,130,23,136,137,95,96,29,97,138,119,127,139,31,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,120,139,31,23,119,87,120,133,106,141,142,141,142,106,31,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,279,280,279,280,279,280,279,280,279,280,279,279,280,280,279,279,280,280,279,280,279,279,280,280,279,280,279,280,279,280,279,280,279,280,279,280,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,266,268,268,327,329,325,266,268,268,268,326,327,328,329,325,266,268,268,268,326,327,328,329,268,325,266,268,326,327,328,329,325,266,268,326,327,328,329,266,268,326,327,329,266,268,326,327,329,326,329,266,268,326,327,329,268,268,325,266,268,326,327,328,329,325,325,266,266,268,268,326,326,327,327,328,328,329,329,325,325,266,268,268,268,268,326,327,328,328,329,325,325,266,268,268,268,326,327,328,329,326,268,329,268,266,268,326,327,329,326,266,268,327,325,266,268,326,327,328,329,268,268,326,266,268,326,327,329,326,268,326,325,328,268,325,266,268,326,327,328,329,325,268,328,329,325,266,268,268,326,327,328,329,325,266,268,326,327,328,329,266,325,266,268,326,327,328,329,325,266,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,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,283,115,283,283,115,115,283,122,209,208,123,122,165,209,208,115,283,283,358,359,123,122,165,209,208,115,283,283,358,359,283,283,122,165,209,208,283,358,359,122,165,209,208,283,358,359,115,283,122,283,283,283,115,122,165,115,283,358,359,122,122,165,165,115,115,283,283,358,358,359,359,283,122,122,165,209,208,115,283,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,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,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,358,359,359,359,115,283,115,115,115,115,115,115,115,115,361,358,123,122,165,209,208,283,358,359,122,123,209,208,123,209,208,122,122,115,283,122,115,283,122,283,123,209,208,123,123,208,123,165,115,283,283,283,165,122,122,122,122,122,122,122,122,0,0,0,283,283,165,123,209,208,358,359,122,165,209,208,115,283,358,359,122,358,359,123,209,208,283,123,122,165,209,208,115,115,283,283,358,359,123,122,165,209,208,283,358,359,123,122,165,209,208,115,283,358,359,123,122,165,209,208,283,358,359,283,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,248,362,363,248,362,363,248,362,363,248,362,363,248,362,362,363,363,248,248,362,362,363,363,248,248,362,362,362,362,363,363,363,248,362,363,248,248,362,363,362,363,248,362,363,248,362,363,248,362,363,248,362,363,248,362,363,248,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,31,365,234,235,366,367,368,367,366,31,368,367,31,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,31,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,30,147,0,0,0,30,30,147,30,30,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,264,186,186,186,186,525,525,525,525,264,525,186,186,186,526,527,264,525,186,186,186,526,527,264,525,186,526,527,264,525,186,526,527,525,186,264,525,186,264,525,186,525,264,525,186,526,527,264,264,525,525,186,186,526,526,527,527,264,525,525,525,525,186,186,186,186,526,526,527,527,264,525,525,186,186,526,527,186,186,186,525,264,525,186,264,525,186,526,527,0,0,0,0,0,0,264,525,186,264,525,264,264,526,527,186,264,525,186,526,527,264,525,186,526,527,525,264,525,186,526,527,264,525,186,526,527,264,525,186,526,527,264,525,186,526,527,0,0,0,528,528,528,528,528,528,528,265,264,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,264,265,264,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,267,267,267,0,0,0,267,267,267,267,267,267,533,534,267,533,534,267,533,534,267,533,534,267,267,533,534,533,534,267,533,534,267,533,534,267,267,533,533,534,534,267,533,534,267,533,534,267,267,533,534,533,534,267,533,534,267,533,534,267,533,534,267,533,534,267,533,534,267,533,534,533,534,267,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,287,287,287,657,287,667,666,217,658,287,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,667,666,217,658,287,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,287,178,655,662,657,177,663,219,664,190,662,178,287,219,287,655,177,287,287,217,287,661,662,657,219,190,287,219,217,658,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,217,658,658,287,287,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,287,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,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,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,287,178,655,661,662,657,177,663,219,664,190,178,219,667,666,217,658,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,659,667,666,287,667,666,287,287,287,660,661,287,287,655,177,177,662,177,219,287,0,177,663,219,178,655,177,662,178,662,177,667,666,667,666,662,177,661,178,178,219,217,287,178,655,662,657,177,663,219,664,190,661,177,663,661,178,217,217,287,287,661,662,657,219,219,190,217,0,217,217,219,667,666,658,659,660,656,665,178,664,190,217,658,287,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,287,287,287,287,178,655,659,660,661,661,661,662,662,657,177,663,219,664,190,656,665,667,666,217,658,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,655,655,667,666,217,658,287,178,655,659,660,661,662,657,177,663,219,664,190,656,665,219,663,667,666,217,658,287,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}}}{}{}}0000000000200{{{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`{{Ch{Cf}}}}}}}}{Bl{{Cb{{C`{Cj}}}}}}{Bl{{Cb{{C`{d}}}}}}{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{{Ch{Cf}}}}}}{{{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{Cd}}}}}j}1{{{Ff{DfCd}}}j}{Bbj}3{Bbl}4{{{Fh{c}}}{{Aj{c}}}{}}5{c{{C`{c}}}{}}6{Fjc{}}07{c{{Db{c}}}{}}88888{nd}9{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}}}Cd}{{{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{{Ch{Cf}}}}}}{{ce}{{Bd{c}}}{{Dj{{Ch{Cf}}}}}{{Hh{Df}}}}{{{h{AhHb}}}Dh}{{{h{Ah{Bd{c}}}}}{{Dh{e}}}{{Dj{{Ch{Cf}}}}}{}}{{{h{Ah{Bd{c}}}}Hj}{{Dh{e}}}{{Dj{{Ch{Cf}}}}}{}}`{{{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`{Cl}}}}}{{Id{Ib}}}}{{{h{{C`{Cn}}}}}{{Id{Ib}}}}{{{h{{C`{Cd}}}}}{{Id{Ib}}}}{{{h{{C`{Cj}}}}}{{Id{Ib}}}}{{{h{{C`{D`}}}}}{{Id{Ib}}}}{{{h{{C`{{Ch{Cf}}}}}}}{{Id{Ib}}}}{{{h{{C`{Bn}}}}}{{Id{Ib}}}}{{{h{{C`{d}}}}}{{Id{Ib}}}}{{{h{{Db{c}}}}}{{Id{Ib}}}{fI`}}{{{h{c}}}If{}}0{{{h{b}}}D`}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0`1{c{{Dn{e}}}{}{}}0000000000000000000000000`````{{{h{c}}}Ij{}}000000000000`{ce{}{}}000000000000``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{IlIl}{{D`D`}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhD`}}D`}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}{{}Cd}{{}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{Cd}}}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{AhMd}}}}{{{h{AhMd}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBn}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBn}}}{{h{AhMd}}}}2{{{h{AhJb}}}}{{{h{AhJb}}}Mf}2{{{h{Jb}}}Mf}{{{h{Kb}}}{{h{Mh}}}}{{{h{Kd}}}{{h{Mh}}}}{{{h{Kf}}}{{h{Mj}}}}{{{h{Cd}}}{{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{{Ab{A`}}}}}}{{{h{Kf}}}{{h{{Ad{A`}}}}}}{{{h{Cd}}}{{h{{Ad{A`}}}}}}{{{h{Cd}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ad{A`}}}}}}{{{h{Kh}}}{{h{{Ab{A`}}}}}}{{{h{Kj}}}{{h{{Ad{A`}}}}}}{{{h{Kj}}}{{h{{Ab{A`}}}}}}{{{h{Kl}}}{{h{{Ab{A`}}}}}}{{{h{Kl}}}{{h{{Ad{A`}}}}}}{{{h{Md}}}{{h{{Ad{A`}}}}}}{{{h{Md}}}{{h{Md}}}}{{{h{Bn}}}{{h{Md}}}}{{{h{Bn}}}{{h{{Ad{A`}}}}}}{{{h{Kn}}}{{h{{Ab{A`}}}}}}{{{h{Kn}}}{{h{Nf}}}}{{{h{Kn}}}{{h{{Ad{A`}}}}}}{{{h{L`}}}{{h{{Ad{A`}}}}}}{{{h{L`}}}{{h{Nf}}}}{{{h{L`}}}{{h{{Ab{A`}}}}}}{{{h{Cj}}}{{h{{Ad{A`}}}}}}{{{h{Cj}}}{{h{{Ab{A`}}}}}}{{{h{Lb}}}{{h{{Ad{A`}}}}}}{{{h{Lb}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{Nf}}}}{{{h{Ld}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{{Ad{A`}}}}}}{{{h{Lf}}}{{h{{Ab{A`}}}}}}{{{h{Lf}}}{{h{{Ad{A`}}}}}}{{{h{Lf}}}{{h{Nf}}}}{{{h{Lh}}}{{h{{Ab{A`}}}}}}{{{h{Lh}}}{{h{{Ad{A`}}}}}}{{{h{Lj}}}{{h{{Ab{A`}}}}}}{{{h{Lj}}}{{h{{Ad{A`}}}}}}{{{h{Ll}}}{{h{{Ad{A`}}}}}}{{{h{Ll}}}{{h{{Ab{A`}}}}}}{{{h{Cl}}}{{h{Nh}}}}{{{h{Ln}}}{{h{{Ad{A`}}}}}}{{{h{Ln}}}{{h{{Ab{A`}}}}}}{{{h{M`}}}{{h{{Ad{A`}}}}}}{{{h{M`}}}{{h{{Ab{A`}}}}}}{{{h{Mb}}}{{h{{Ad{A`}}}}}}{{{h{Mb}}}{{h{{Ab{A`}}}}}}{{{h{Bn}}}{{h{Md}}}}{{{h{{Jn{c}}}}}{{h{{Jn{Nj}}}}}Nl}{{{Jn{Nj}}}Jn}{{{h{{Jn{Nj}}}}}{{h{Jn}}}}{{{Ab{A`}}}M`}{{{h{Nn}}}Hj}{{{h{Cn}}}Hj}```{{{h{O`}}}{{Dn{EdOb}}}}{{{h{O`}}}Cd}`{{{h{c}}}{{h{e}}}{}{}}00000000{{{h{Kb}}}{{h{{Ad{A`}}}}}}11{{{h{Kd}}}{{h{{Ad{A`}}}}}}{{{h{Kf}}}{{h{{Ad{A`}}}}}}33{{{h{Cd}}}{{h{{Ad{A`}}}}}}4{{{h{Kh}}}{{h{{Ad{A`}}}}}}5{{{h{Kj}}}{{h{{Ad{A`}}}}}}6{{{h{Kl}}}{{h{{Ad{A`}}}}}}7777{{{h{Bn}}}{{h{Md}}}}888{{{h{Kn}}}{{h{{Ad{A`}}}}}}{{{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}}}{}{}}0{{{h{Ll}}}{{h{{Ad{A`}}}}}}11111111111{{{h{Ln}}}{{h{{Ad{A`}}}}}}22{{{h{M`}}}{{h{{Ad{A`}}}}}}33{{{h{Mb}}}{{h{{Ad{A`}}}}}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000000000000000{{{h{AhBn}}}{{h{AhMd}}}}1111111111111111111111111111111111111{{}Od}0{{{h{Md}}}Of}{ClOh}{{{h{c}}Oj}Ef{}}{{{h{O`}}}Ef}{{{h{c}}Ol}Ef{}}{{{h{On}}Ol}Ef}2{Il{{Dh{Il}}}}{{D`D`}{{Dh{D`}}}}{{IlIl}{{Dh{Il}}}}{{InIn}{{Dh{In}}}}{{D`Ed}{{Dh{D`}}}}{{IlA@`}{{Dh{Il}}}}{{A@bEd}{{Dh{A@b}}}}{{InEd}{{Dh{In}}}}3210{{A@bIn}{{Dh{D`}}}}43765{{A@dA@f}A@h}{{{h{AhA@j}}}Bf}{{{h{A@l}}}A@l}{{{h{D`}}}D`}{{{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{Cd}}}Cd}{{{h{Kh}}}Kh}{{{h{Kj}}}Kj}{{{h{Kl}}}Kl}{{{h{O`}}}O`}{{{h{A@d}}}A@d}{{{h{Bn}}}Bn}{{{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{Cn}}}Cn}{{{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{Cl}}}Cl}{{{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{D`}}{h{D`}}}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{Cd}}{h{Cd}}}Bh}{{{h{Kh}}{h{Kh}}}Bh}{{{h{Kj}}{h{Kj}}}Bh}{{{h{Kl}}{h{Kl}}}Bh}{{{h{Md}}{h{Md}}}Bh}{{{h{Bn}}{h{Bn}}}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{Cn}}{h{Cn}}}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{Cl}}{h{Cl}}}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{Cn}}}}}}{{{h{AhABl}}ABl}{{Dn{BfABn}}}}``{{{h{O`}}}{{Dh{Kh}}}}{{{h{Cn}}}Mh}{{{h{Cn}}}Cj}{{{h{Kj}}{h{{Ad{A`}}}}}Kl}{{{h{Cn}}}Lb}`{{{h{Ahc}}}{{Dn{D`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{CdAC`}}}{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{BnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{NnAC`}}}{ACbACd}}7{{{h{Ahc}}}{{Dn{CnAC`}}}{ACbACd}}{{{h{D`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Cd}}{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{Bn}}{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{Cn}}{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}{{}D`}{{}Il}{{}Bn}{{}AAd}{{}Nn}{{}On}{{}A@j}{{}Ml}{{}ABj}{{}N`}{{}Nb}{{}Nd}{{{h{Bn}}}h}{{{h{AhBn}}}{{h{Ah}}}}{{cACl}{{Dn{D`}}}E`}{{cACl}{{Dn{Il}}}E`}10{c{{Dn{D`}}}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{Cd}}}E`}{c{{Dn{Kh}}}E`}{c{{Dn{Kj}}}E`}{c{{Dn{Kl}}}E`}{c{{Dn{O`}}}E`}{c{{Dn{{h{Md}}}}}E`}{c{{Dn{Bn}}}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{Cn}}}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{Cl}}}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}{D`ADf}{IlADf}{{D`A@l}ADf}{{IlA@l}ADf}{{D`In}}{{D`Ed}}{{IlA@`}}{{InIn}}{{InEd}}{{{h{AhD`}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{{{h{Md}}}D`}`{{{h{On}}}Ef}{{{h{Nn}}}Ef}{{}}00000000000000{{}ADh}1010101{{{h{A@l}}{h{A@l}}}Ef}{{{h{D`}}{h{D`}}}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{Cd}}{h{Cd}}}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{Bn}}}Ef}{{{h{Bn}}{h{Bn}}}Ef}{{{h{Bn}}{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{On}}{h{On}}}Ef}{{{h{AAf}}{h{AAf}}}Ef}{{{h{Cn}}{h{Cn}}}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{Cl}}{h{Cl}}}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{AhBn}}c}Bf{{El{}{{Ej{ADj}}}}}}{{{h{ABl}}{h{{Jd{c}}}}}{{Dn{CnADl}}}Jl}{{{h{ABd}}{h{Ah{ADn{Cj}}}}{h{Ah{ADn{Df}}}}}{{Dn{BfAE`}}}}{ABl{{Dn{CnAEb}}}}0{ABlCn}{{ABlA@b}{{Dn{CnAEb}}}}{{{h{ABl}}}{{Dn{D`ABn}}}}{{A@bEd}{{Dh{D`}}}}{{A@bIn}{{Dh{D`}}}}{{{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{D`}}{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}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{Jn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Nl}{{{h{Kb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kd}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Cd}}{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{Bn}}{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{Cn}}{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{Cl}}{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`}}}}{{D`{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{Il{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{{h{AAn}}{h{AhAEd}}}{{Dn{BfF`}}}}{cc{}}0000{AAlJb}{AAjJb}{ACjJb}{AEfJb}{MfJb}55{ClA@n}66{MhKb}7{MhKd}8{{{h{AEh}}}Kf}{MjKf}{AEhKf};;{{{h{Fl}}}Cd}{FlCd}{{{h{O`}}}Cd}{O`Cd}{MhCd}{CjKh}{MhKh}{cc{}}{LbKj}1{MhKj}2{MhKl}3{AAbA@d}4{A`A@d}{{{h{Md}}}Bn}{JnBn}{{{AEj{Md}}}Bn}{{{ADn{A`}}}Bn}9999{MjKn}{BnKn}{{{h{Md}}}Kn}{{{h{Bn}}}Kn}{{{h{Md}}}L`}{BnL`}{{{h{Bn}}}L`}{nL`}{cc{}}{MhCj}{{{h{Cn}}}Cj}2{CnCj}{{{h{Cn}}}Lb}{MhLb}{CnLb}666{OlOn}{AElOn}888{{{h{{Ad{{ADn{A`}}}}}}}A@j}9{{{h{{Ad{{h{{Ad{A`}}}}}}}}}A@j}{{{ADn{{ADn{A`}}}}}A@j}{{{ADn{{h{{Ad{A`}}}}}}}A@j}<{HjAAh}{EdAAh}{AEnAAh}{A`AAh}{DfAAh}{AAlAAj}{cc{}}{AEfAAj}{AAlLd}{AAjLd}{MjLd}{{{h{AAj}}}Ld}{{{h{AAl}}}Ld}6{{{h{AAl}}}Lf}{MjLf}8{AAlLf}99{MhLh}:{MhLj};;;{{{Mn{Ml}}}Ll}<{ABbAB`}=={ClABf}>>>{ABjABh}????{AF`Ln}{cc{}}{{{Mn{N`}}}Ln}11{{{Mn{Nb}}}M`}{LnM`}{{{h{AFb}}}M`}{AFbM`}5{{{Mn{Nd}}}Mb}{AFdMb}7{{{h{AFd}}}Mb}{AEnOn}{{{Ab{A`}}}J`}{{{Ab{A`}}}ABh}{{{h{O`}}c}ABd{{AFf{{h{Cj}}}{{Hd{Ef}}}}}}{ADd{{Dn{D`AFh}}}}{ADd{{Dn{IlAFh}}}}{{}Kb}{{}Kd}{{}Kf}{{}Cd}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{{h{{Ad{A`}}}}}{{h{Md}}}}{{{ADn{A`}}}Bn}{{{h{Ah{Ad{A`}}}}}{{h{AhMd}}}}{Oh{{Dh{Cl}}}}{ABjABh}{DfOn}{DfABb}{DfABj}{A`{{Dn{AB`AFj}}}}{{{h{G`}}}{{Dn{ClAFl}}}}{{}Kb}{{}Kd}{{}Kf}{{}Cd}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{ADdA@l}{{Dn{D`AFh}}}}{{ADdA@l}{{Dn{IlAFh}}}}{{FlFlc}ABj{{ADb{Nh}}}}{{{h{Fl}}{h{{Ad{Cj}}}}c}ABd{{AFf{{h{Cj}}}{{Hd{Ef}}}}}}{AEnOn}{{{h{G`}}}{{Dn{BnAFn}}}}{{{h{G`}}}{{Dn{OnAG`}}}}{{{h{G`}}}{{Dn{J`AG`}}}}{{{h{G`}}}{{Dn{ABhAG`}}}}{{{h{G`}}}{{Dn{ABjAG`}}}}{EdD`}{cBn{{El{}{{Ej{ADj}}}}}}{{Jb{Dh{M`}}}Mb}{{{h{AGb}}}{{Ff{JbJh}}}}{Ed{{Dh{In}}}}{{{Ab{A`}}}J`}{{{Ab{A`}}}ABh}{AGd{{Dh{Cl}}}}{{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}{MhCd}{MhKh}{MhKj}{MhKl}{MjKn}{nL`}{MhCj}{MhLb}{MjLd}{MjLf}{MhLh}{MhLj}{{{Mn{Ml}}}Ll}{{{Mn{N`}}}Ln}{{{Mn{Nb}}}M`}{{{Mn{Nd}}}Mb}{EdD`}{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{{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{CdFn}}}}{{{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{AAjAHb}}}}{{{h{{Ad{A`}}}}}{{Dn{AAjAH`}}}}{{{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{CdFn}}}}{{{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{D`}}}}{{{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{Cd}}}}{{{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{Cl}}}}{{{h{G`}}}{{Dn{ABl}}}}{{{h{G`}}}{{Dn{Ln}}}}{{{h{G`}}}{{Dn{M`}}}}{{{h{G`}}}{{Dn{Mb}}}}{{{h{G`}}A@l}{{Dn{D`AFh}}}}{{{h{G`}}A@l}{{Dn{IlAFh}}}}{{{h{G`}}}{{Dn{D`AHn}}}}{{{h{G`}}}{{Dn{IlAHn}}}}{{{h{G`}}}{{Dn{OnAI`}}}}{{{h{G`}}}{{Dn{J`AI`}}}}{{{h{G`}}}{{Dn{ABhAI`}}}}{{{h{G`}}}{{Dn{ABjAI`}}}}{Cn{{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{D`}}{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{Cd}}{h{Ahc}}}BfGf}{{{h{Kh}}{h{Ahc}}}BfGf}{{{h{Kj}}{h{Ahc}}}BfGf}{{{h{Kl}}{h{Ahc}}}BfGf}{{{h{Md}}{h{Ahc}}}BfGf}{{{h{Bn}}{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{Cn}}{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{Cl}}{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{Cd}}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{Hj}}}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}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}}AIn}{{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{Bn{{AJd{Md}}}}{Bn{{ADn{A`}}}}{{{h{A@j}}}}{{{AJd{Md}}}Bn}{{{h{Cn}}AJfAJh}Ef}{{{h{Cn}}}Ef}{{{h{Md}}}Ef}{{{h{A@j}}}Ef}2{{{h{On}}}Ef}03{{{h{ABf}}}Ef}{{{h{ABh}}Cd}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}}}}Cl}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}{ClAGd}{{{h{Jn}}{h{Md}}}Ef}{{{h{ABh}}}ABh}{{{h{ABh}}c}ABh{{ADb{Nh}}}}1`11{{{h{Md}}}D`}{BnAAf}{{{h{Md}}A@b}D`}{{BnA@b}AAf}{{D`Ed}}{{IlA@`}}{{A@bIn}}{{InEd}}{{InA@b}}{{{h{AhD`}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{Il}``{{}{{h{Md}}}}{{}Bn}{{AAb{h{{Ad{A`}}}}}{{Dn{AA`AJl}}}}{{CjDf}AAd}{{}A@j}{cAAj{{AHd{AEf}}}}{{AJnc}AAn{{AHd{ABf}}}}{cBn{{ADb{Nf}}}}{{{h{AAj}}}Bn}{{{h{Ld}}}Bn}{{{h{Kn}}}Bn}{{{h{{Jd{c}}}}Jb{Dh{M`}}}BnJl}{ACjBn}{{{h{Lf}}}Bn}{{{h{L`}}}Bn}98{{{h{AA`}}}Bn}{{{h{A@j}}Hj}{{Dh{{h{{Ad{A`}}}}}}}}{{{h{Cn}}}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{Bn}}}}{LfBn}{{{h{AAj}}}{{Dn{BnAGh}}}}{{{h{AAl}}}Bn}{{{h{Md}}c}Jn{{AHd{A@n}}}}{{{h{Md}}}AA`}{Cl{{h{Nh}}}}`{{{h{D`}}{h{D`}}}{{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{Cd}}{h{Cd}}}{{Dh{Bh}}}}{{{h{Kh}}{h{Kh}}}{{Dh{Bh}}}}{{{h{Kj}}{h{Kj}}}{{Dh{Bh}}}}{{{h{Kl}}{h{Kl}}}{{Dh{Bh}}}}{{{h{Md}}{h{Bn}}}{{Dh{Bh}}}}{{{h{Md}}{h{Md}}}{{Dh{Bh}}}}{{{h{Bn}}{h{Bn}}}{{Dh{Bh}}}}{{{h{Bn}}{h{Md}}}{{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{Cn}}{h{Cn}}}{{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{Cl}}{h{Cl}}}{{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{BnAGl}}}}}}}}}{}}{{{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{AhBn}}ADj}Bf}0{{{h{AhBn}}A@d}Bf}{{{h{AhBn}}c}Bf{{ADb{Nf}}}}{{{h{Ahc}}}{{Dn{AAjACf}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAlACf}}}{ACbACd}}{{{h{Md}}}{{Dh{{h{Md}}}}}}{{D`Ed}D`}{{IlA@`}Il}{{{h{AhD`}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{Jn{Nj}}Cl}{{Dn{JnAHh}}}}{{{h{AhBn}}Hj}Bf}0{In{{Dh{In}}}}{{{h{AhBn}}}Bf}{{{h{Jn}}}{{Dh{Kn}}}}{{{h{Md}}}Kn}{{{h{Jn}}}Bn}`{{{h{Cn}}}{{`{{Gn{}{{Ej{Hj}}}}}}}}`{{{h{A@j}}}{{Dh{{h{{Ad{A`}}}}}}}}{{{h{Nn}}}In}`{{D`cACl}DnHn}{{IlcACl}DnHn}101010{{{h{D`}}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{Cd}}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{Bn}}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{Cn}}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{Cl}}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{Cn}}}}{{{h{ABl}}Hj{h{Ah{AKj{c}}}}{Dh{Ln}}}{{Dn{AL`ALb}}}{{Dj{Cn}}}}{{{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}}}}{{D`D`}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhD`}}D`}Bf}{{{h{AhIl}}Il}Bf}{{{h{AhIn}}In}Bf}{cD`{{Gn{}{{Ej{D`}}}}}}{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{{Ad{A`}}}}}}}}0{{{h{A@j}}}{{Dh{{h{Md}}}}}}{{{h{Md}}}Ln}{{{h{Jn}}}ALh}{{{h{Md}}}If}{J`{{Ab{A`}}}}{ABh{{Ab{A`}}}}{D`ADd}{IlADd}{Kb}{Kd}{Kf}{Cd}{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}{OnDf}{Cl{{h{G`}}}}{AAbALj}{{D`A@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}}}Bn}{{{h{Md}}{h{{Jd{c}}}}Jb}BnJl}1{{{h{Jb}}}AAj}{{{h{AAj}}}AAj}{{{h{Jn}}}If}{KbMh}{KdMh}{KfMj}{CdMh}{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{D`Ed}{IlA@`}{A@bEd}00{MbJf}{{{h{n}}}n}0{D`{{Dn{IlAM`}}}}{AAjAMb}{{{h{c}}}If{}}00000000000000000000000000000000000000000{{D`A@l}If}{{IlA@l}If}10{J`ABh}{ABbDf}{A@dA`}{Il{{Dn{D`AM`}}}}{InEd}0{{{h{A@j}}}{{ADn{{ADn{A`}}}}}}{AAnIf}{ABhJ`}3{{{h{Jb}}}Jb}{{{h{Cn}}c}Hj{{Hf{{h{AAd}}}{{Hd{{Dh{AAf}}}}}}}}{{{h{O`}}}Hj}{{{h{Nn}}}Hj}{{{h{Cn}}}Hj}{c{{Dn{e}}}{}{}}{Il{{Dn{D`}}}}1{D`{{Dn{Il}}}}2{If{{Dn{A@b}}}}{{{h{G`}}}{{Dn{A@b}}}}4{{{AJd{G`}}}{{Dn{A@b}}}}5{If{{Dn{In}}}}{{{h{G`}}}{{Dn{In}}}}7{{{AJd{G`}}}{{Dn{In}}}}88888888888888{ADj{{Dn{AAb}}}}{A@d{{Dn{AAb}}}}{ALj{{Dn{AAb}}}}{A`{{Dn{AAb}}}}<<<<<<<<{If{{Dn{On}}}}{{{h{G`}}}{{Dn{On}}}}{{{AJd{G`}}}{{Dn{On}}}}???????{AAj{{Dn{AAl}}}}{c{{Dn{e}}}{}{}}000000000{AGd{{Dn{Cl}}}}1{Oh{{Dn{Cl}}}}222222222222222222222222222222222222222222222222222222222222222222{{{h{Jb}}{h{{Jd{c}}}}{h{Jb}}JhJf}EfJl}{{{h{Cn}}Hj}{{Dn{{h{Nn}}AMd}}}}{{{h{Cn}}Hj}{{Dn{{h{AAf}}AMf}}}}`{{{h{Cn}}}Cj}``{{{h{c}}}Ij{}}00000000000000000000000000000000000000000000000000000000{ACl{{h{G`}}}}0{{D`D`}D`}{{IlIl}Il}10`{IlD`}`{{{h{AhABl}}Hj{h{{Ch{AMh}}}}}{{Dn{BfAMj}}}}{{{h{AhABl}}Hj{h{{Ch{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{Cn}}}Hj}{ce{}{}}0000000000000000000000000000000000000000000000000000000{{{h{O`}}}In}{{{h{AAf}}}In}{{{h{Cn}}}In}{HjBn}`{{{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{Cn}}}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{ANnAK`}2{AObAHh}{ANjAHh}{ANfAHh}{AOdAHh}{AO`AHh}{ANbAHh}8{ANhAHh}{AJlAHh}{ANdAHh}{ANnAHh}<<<<<<<<{{{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{}}{ANnAFh}{AM`AFh}{AOlAFh}{AOnAFh}{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{{Ad{A`}}}}}}{{{h{{ADn{A`}}}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ad{c}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}}{{h{Ah{ADn{ce}}}}}{}B@f}{{{h{AhIf}}}{{h{AhG`}}}}{{{h{Ah{ADn{ce}}}}}{}{}B@f}31{{{h{AhIf}}}{{h{Ah{ADn{A`}}}}}}{{{h{{ADn{ce}}}}}{}{}B@f}{{{h{{ADn{ce}}}}}{{h{{Ad{c}}}}}{}B@f}{{{h{{ADn{ce}}}}}{{h{{ADn{ce}}}}}{}B@f}{{{h{If}}}{{h{B@h}}}}{{{h{If}}}{{h{B@j}}}};{{{h{If}}}{{h{G`}}}}40{{{h{c}}}{{h{e}}}{}{}}05010{{{h{Ahc}}}{{h{Ahe}}}{}{}}00<: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{AAh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Fl}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{Ff{DfBA`}}}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Cd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ed}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ln}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAf}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{ADn{A`}}}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Nn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Cn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAf}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{A`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAh}}AC`}}}{ACbACd}}{{{h{{ADn{Cd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{ADn{A`}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{Ff{DfBA`}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Nn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{A`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ln}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ed}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Fl}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Cn}}}}{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{{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{{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{Ah{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{If}}{h{If}}}Ef}{{{h{If}}{h{{AEj{G`}}}}}Ef}{{{h{If}}{h{{h{G`}}}}}Ef}{{{h{If}}{h{G`}}}Ef}{{{h{If}}{h{BBd}}}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{{AJd{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{BBh}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{If}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{AEj{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{BBh}}}}}}{{{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}}If}Bf}{{{h{AhIf}}BBh}Bf}{{{h{AhIf}}{h{G`}}}Bf}{{{h{AhIf}}{AEj{G`}}}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`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}{BC`AOd}{ANnAOd}{cc{}}{B@lAOd}1{{{BCb{ce}}}{{ADn{ce}}}{}B@f}{{{BCd{ce}}}{{ADn{ce}}}{}B@f}{{{h{Ah{Ad{c}}}}}{{ADn{c}}}Al}{BCf{{ADn{A`}}}}{{{Ab{c}}}{{ADn{c}}}{}}{If{{ADn{A`}}}}7{{{h{{Ad{c}}}}}{{ADn{c}}}Al}{{{AJd{{Ad{c}}e}}}{{ADn{ce}}}{}B@f}{BCh{{ADn{A`}}}}{BCj{{ADn{BCl}}}}{{{h{Ah{Ab{c}}}}}{{ADn{c}}}Al}{Bn{{ADn{A`}}}}{{{h{G`}}}{{ADn{A`}}}}{{{AEj{{Ad{c}}}}}{{ADn{c}}}{}}{{{h{{Ab{c}}}}}{{ADn{c}}}Al}{BCn{{ADn{M`}}}}{cc{}}{{{h{G`}}}If}{{{AEj{G`}}}If}{BBhIf}{{{h{If}}}If}{{{AJd{G`}}}If}{{{h{AhG`}}}If}{{{h{G`}}}{{Dn{{ADn{A`}}}}}}{e{{ADn{c}}}{}{{El{}{{Ej{c}}}}}}{cIf{{El{}{{Ej{{AEj{G`}}}}}}}}{cIf{{El{}{{Ej{{AJd{G`}}}}}}}}{cIf{{El{}{{Ej{{h{G`}}}}}}}}{cIf{{El{}{{Ej{{h{BBh}}}}}}}}{cIf{{El{}{{Ej{If}}}}}}{cIf{{El{}{{Ej{BBh}}}}}}{{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{Cf}}}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}{{{ADn{ce}}}{}{}B@f}{{{h{Ah{ADn{ce}}}}}{}{}B@f}{{{h{{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{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{{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ab{c}}}}}Ef{}{{Eh{c}}}B@f}{{{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{{ADn{ci}}}}}Ef{}{{Eh{c}}}B@fB@f}?{{{h{If}}{h{{AEj{G`}}}}}Ef}{{{h{If}}{h{{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{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`}}}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{ADn{A`c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}B@f}{{{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{BBn}}}BBn}{{{h{BC`}}}BC`}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{BBn}}{h{BBn}}}Ef}{{{h{BC`}}{h{BC`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BBn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BC`}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{{{h{BBn}}}{{Ff{DfDf}}}}{ce{}{}}0{{{h{BC`}}}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{}}00{BFbBFd}{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{Ab{A`}}}}}}{{{h{AhBAh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBAh}}}A`}{{{h{BAh}}}A`}{{{h{BAd}}}{{h{Cn}}}}5{{{h{BAh}}}{{h{{Ad{A`}}}}}}``{{{h{c}}}{{h{e}}}{}{}}07100000{{{h{Ahc}}}{{h{Ahe}}}{}{}}06700000{{{h{Fl}}Ed}{{Ff{EdEd}}}}{{{h{BHj}}}BHj}{{{h{BAd}}}BAd}{{{h{BAh}}}BAh}{{{h{BHl}}}BHl}{{{h{BHn}}}BHn}{{{h{BI`}}}BI`}{{{h{BIb}}}BIb}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{BAd}}{h{BAd}}}Bh}{{{h{BAh}}{h{BAh}}}Bh}{{{h{BHl}}{h{BHl}}}Bh}{{{h{BHn}}{h{BHn}}}Bh}{{{h{BIb}}{h{BIb}}}Bh}{{{h{Ahc}}}{{Dn{BAdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BAhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BIbAC`}}}{ACbACd}}20{{{h{BAd}}{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{BAd}}{h{BAd}}}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{BAd}}{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`}}}}{ANnBHj}{cc{}}0{{{Ab{A`}}}BAh}{{{h{{Ab{A`}}}}}BAh}22222{{{h{O`}}EdDf{h{{Ad{Hj}}}}}{{Dn{BHlBHj}}}}{{{h{G`}}}{{Dn{BAhBId}}}}{{{h{BHn}}{h{O`}}}{{Dn{BIbBI`}}}}{{{h{G`}}}{{Dn{BAh}}}}{{{h{BAd}}{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{BAd}}{h{BAd}}}{{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}1{ANnBIj}2{ce{}{}}0000000{{{h{BJ`}}{h{Ahc}}e}{{Dn{EfBIj}}}{ACbACd}Gn}{{{h{BJb}}{h{Ahc}}e}{{Dn{EfBIj}}}{ACbACd}Gn}{{{h{BIl}}{h{Cd}}c}{{Dn{EfBIj}}}Gn}210{{{h{Ahc}}{h{O`}}}{{BIf{c}}}ACh}{{{h{Cd}}}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{Ab{A`}}}}}}{{{h{AhBJf}}}{{h{Ah{Ad{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`}9{{{h{BJf}}}{{h{{Ad{A`}}}}}}9{{{h{BJh}}}{{h{{Ad{A`}}}}}}{{{h{BCl}}}{{h{{Ad{BCl}}}}}}{{{h{BCj}}}{{h{{Ad{BCl}}}}}}{{{h{c}}}{{h{e}}}{}{}}40>=03000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0=<:;0000000{{}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{{{h{{Ab{A`}}}}}BJh}{{{Ab{A`}}}BJh}444{DfBCl}5{{{h{{Ad{BCl}}}}}BCj}{{{ADn{BCl}}}BCj}{BJnBDf}8{AOdBDf}{ANnBDf}{JjBDf};{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}}}Cd}{{{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{}}0{ANnOb}11{ANnBKf}{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{CdBKf}}}}`>>>>{{{h{Fl}}}J`}````````````````````{{{h{Oh}}}{{h{{Ab{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhOh}}}A`}{{{h{Oh}}}A`}4{{{h{Oh}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}165{{{h{Ahc}}}{{h{Ahe}}}{}{}}5{{{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{}}{{{h{{Ab{A`}}}}}Oh}{{{Ab{A`}}}Oh}{CdOh}{{{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}}}}{ClOh}<```````````````````{{{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}1{BKnBKj}22{AJfOj}3{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{BnAGl}}}}}}}}}{}}{{{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{{{h{G`}}}{{Dn{AJf}}}}{c{{Dn{e}}}{}{}}{If{{Dn{AJf}}}}{{{AJd{G`}}}{{Dn{AJf}}}}22{{{h{G`}}}{{Dn{AJh}}}}{If{{Dn{AJh}}}}{{{AJd{G`}}}{{Dn{AJh}}}}55{If{{Dn{Oj}}}}{{{AJd{G`}}}{{Dn{Oj}}}}7{{{h{G`}}}{{Dn{Oj}}}}888888{{{h{c}}}Ij{}}00000{ce{}{}}00000`````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{c}}Oj}Ef{}}{{{h{Ol}}Ol}Ef}{{{h{c}}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{cc{}}{AEnBLb}11{BLbOl}{BLdOl}{AElOl}4444{AEnBLd}{AEnOl}{Df{{Dn{OlBLf}}}}61{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{BnAGl}}}}}}}}}{}}{{{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}}}}{{{AJd{G`}}}{{Dn{BLb}}}}{c{{Dn{e}}}{}{}}0{{{h{G`}}}{{Dn{BLd}}}}{{{AJd{G`}}}{{Dn{BLd}}}}{If{{Dn{BLd}}}}3{On{{Dn{OlBLf}}}}44444444444{{{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{AhBCf}}}{{h{AhNf}}}}10{{{h{BCf}}}{{h{Nf}}}}{{{h{Nf}}}{{h{Nf}}}}51{{{h{Od}}}{{h{Md}}}}{{{h{AJb}}}{{h{Md}}}}{{{h{AJ`}}}{{h{Md}}}}{{{h{c}}}{{h{e}}}{}{}}000000500{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000700{{{h{BCf}}}Hj}{{{h{AhBCf}}}Bf}{{{h{Od}}}Od}{{{h{ADj}}}ADj}{{{h{AJb}}}AJb}{{{h{AJ`}}}AJ`}{{{h{BCf}}}BCf}{{{h{BLl}}}BLl}{{{h{BLn}}}BLn}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{Nf}}{h{Nf}}}Bh}{{{h{BCf}}{h{BCf}}}Bh}{{}Od}{{}BCf}{{{h{BCf}}}h}{{{h{AhBCf}}}{{h{Ah}}}}{{}{{h{Nf}}}}{{{h{Od}}{h{Od}}}Ef}{{{h{ADj}}{h{ADj}}}Ef}{{{h{Nf}}{h{Nf}}}Ef}{{{h{BCf}}{h{BCf}}}Ef}{{{h{BLl}}{h{BLl}}}Ef}{{{h{BLn}}{h{BLn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000{{{h{AhBCf}}{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{BCf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BLl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{{{ADn{A`}}}Od}111{{{h{Ah{Ab{A`}}}}}{{h{AhNf}}}}0{{{h{{Ab{A`}}}}}{{h{Nf}}}}0100110001110011100010110010100001100011110001001010101001010111100010101001101101101011101000101100001101000111011000101111001010110000001111111010110{{{Ab{A`}}}BCf}0{{{h{{Ab{A`}}}}}BCf}0{LfBCf}112121211121112211111221111112212222211212121162111111112212112222122112221122222212211122221212221122121121222212222211212111121112{L`BCf}332223322{LdBCf}4444343{KnBCf}5459{BM`BLn}:{ANnBLn}{{{h{Nf}}{h{Ahc}}}BfGf}{{{h{BCf}}{h{Ahc}}}BfGf}{{{h{Nf}}{AIb{Hj}}}h}{{{h{Nf}}{AId{Hj}}}h}{{{h{Nf}}{AIf{Hj}}}h}{{{h{Nf}}{Ff{{AIl{Hj}}{AIl{Hj}}}}}h}{{{h{Nf}}{AIj{Hj}}}h}{{{h{Nf}}AIn}h}{{{h{Nf}}Hj}h}{{{h{Nf}}{AIh{Hj}}}h}{{{h{BMb}}}Hj}{{{h{BLl}}}Hj}{ce{}{}}0000000{Od{{ADn{A`}}}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}00222{OdBn}{{{h{Od}}}Ef}{{{h{Nf}}}Ef}{{{h{BCf}}}Ef}{{{h{Od}}}Hj}{{{h{Nf}}}Hj}{{{h{BCf}}}Hj}{{}Od}{{}BCf}{{{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{BCf}}{h{BCf}}}{{Dh{Bh}}}}{{{h{AhBCf}}}{{Dh{A`}}}}{{{h{AhBCf}}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{{Ad{A`}}}}}Ef}{{{h{{Ad{A`}}}}}{{Dn{A@`BLn}}}}0{{{h{AhBCf}}Hj}A`}{{{h{AhBCf}}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{BCf}}}}3333333333{{{h{c}}}Ij{}}00000000{ce{}{}}0000000{HjBCf}``{{{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{ANnAJl}{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{AO`}}}AO`}>>>{{{h{BMd}}{h{BMd}}}Ef}{{{h{BMf}}{h{BMf}}}Ef}{{{h{AO`}}{h{AO`}}}Ef}??????{{{h{BMd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AO`}}{h{AhEn}}}{{Dn{BfF`}}}}0?{AO`BMd}{BMhBMd}{ANnBMd}{AO`BMf}{ANnBMf}{cc{}}0???{{{h{AO`}}}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@bInD`}{{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`}}}}{ANnBMj}{cc{}}{BMlAMd}1{BMlAMf}2222{{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{cc{}}{{{h{Cl}}}{{h{Nh}}}}{ClNh}{{{h{Cl}}}Nh}{Cl{{h{Nh}}}}{ANn{{BNh{c}}}{}}5{ce{}{}}0{{{BNh{c}}}eBNjBDh}```5`````{{{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`}}}}{cc{}}{ACfAC`}{ANnAC`}{BObBO`}33{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}}}{}{}}020{{{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{ANnC@d}{JjC@d}{AHfC@d}3{AFnC@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@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{cc{}}{BMhAG`}{C@jAG`}2{C@lAI`}{BMhAI`}44{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{{Ab{A`}}}}}}{{{h{Mj}}}{{h{{Ad{A`}}}}}}0{{{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{KnMj}{KfMj}{cc{}}{LdMj}{LfMj}{{}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{}}00{CBfAFn}{BObAFn}22{CBhBId}{CBfBId}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{BfBBl}}}}{{{h{AhCCl}}}{{Dn{BfACf}}}}{{{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{HjACf}}}}{{{h{AhCCl}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}````````````````{{{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}}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{{Ad{A`}}}}}{{Dn{CKjFn}}}}{{{h{CKj}}c}DnHn}``{{}CKl}{{{h{CKl}}}h}{{{h{CKl}}}{{h{{Ab{A`}}}}}}{{{h{CKl}}}{{h{{Ad{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{{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{BfACf}}}}{{{h{AhCKn}}}{{Dn{BfBBl}}}}{{{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}}}{}{}}010{{{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{BfACf}}}}{{{h{AhADh}}}{{Dn{BfBBl}}}}{{{h{n}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CL`}}{h{AhEn}}}{{Dn{BfF`}}}}000{L`n}{dn}{cc{}}00{{}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{{Ad{A`}}}}}}{{{h{Mh}}}{{h{{Ab{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{KhMh}{LhMh}{cc{}}{LbMh}{CdMh}{LjMh}{KlMh}{KdMh}{ALlMh}{KbMh}{CjMh}{KjMh}{{}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{M`{{Mn{Nb}}}}{Ln{{Mn{N`}}}}{Mb{{Mn{Nd}}}}{cc{}}{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{{Ab{A`}}}}}}{{{h{CLd}}}{{h{{Ad{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}0{{{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`}}}}}}{{{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{{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{HjBBl}}}}{{{h{AhCLj}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}``{{}CLl}{{{h{CLl}}}h}{{{h{CLl}}}{{h{{Ad{A`}}}}}}{{{h{CLl}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}20{{{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{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{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{HjACf}}}}{{{h{AhCMd}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}```````````````````````````````{{{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`}}}}BBl}}}ACn}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ad{A`}}}}ACf}}}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{}}0000{CMfACf}{BBlACf}2{ANnCMf}3{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{BfBBl}}}BH`}{{{h{Ah{CMh{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfACf}}}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{HjACf}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}BHf}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}ACh}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}ACh}{{{h{AhCNb}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{AhCNb}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{BfBBl}}}BHf}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}ACh}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{BfBBl}}}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{}}{CNhAGb}111{CNhACj}22{ANnAHb}{JjAHb}4{JjAHl}{ANnAHl}{AOdAHl}{CNlAHl}{CNnAHl}9{AHbAHj}{ANnAHj};{JjCNj}{BIdCNj}={ANnCNj}>>>{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}}c}DnHn}{{{h{ACj}}}{{Ab{A`}}}}{{{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}}}{}{}}00{BB`{{Dn{Jh}}}}{A`{{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{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{ANnAE`}{{{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{Cl}}}E`}{{{h{Cl}}c}DnHn}````````````````````{{{h{AhDAj}}DAj}DAj}``{{{h{AhAGd}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhAGd}}}{{h{Ah{Ad{A`}}}}}}{{{h{AGd}}}{{h{{Ad{A`}}}}}}{{{h{AGd}}}{{h{{Ab{A`}}}}}}{{DAjDAj}DAj}{{{h{AhDAj}}DAj}Bf}10{{{h{c}}}{{h{e}}}{}{}}003400{{{h{Ahc}}}{{h{Ahe}}}{}{}}067000{{{h{BA`}}}BA`}{{{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{BA`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DAjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AGdAC`}}}{ACbACd}}{{{h{BA`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DAj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AGd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}DAj}{{{h{BA`}}{h{BA`}}}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{BA`}}{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}1{ClAGd}22{{{Ab{A`}}}AGd}{cAGd{{ADb{Nh}}}}{{{h{G`}}}{{Dn{AGd}}}}{{DAjDAj}Ef}{{{h{BA`}}{h{Ahc}}}BfGf}{{{h{DAj}}{h{Ahc}}}BfGf}{{{h{AGd}}{h{Ahc}}}BfGf}{ce{}{}}0000``````{{{h{BEf}}DAj}BA`}{{{h{DAj}}{h{DAj}}}{{Dh{Bh}}}}{{{h{AGd}}{h{AGd}}}{{Dh{Bh}}}}`{{{h{AhDAj}}DAj}DAj}`{{{h{BA`}}}{{Dn{BEfACf}}}}{{{h{DAl}}}{{Dh{{h{AOf}}}}}}{{{h{DAn}}}{{Dh{{h{AOf}}}}}}{AGd{{Ab{A`}}}}{{{h{c}}}e{}{}}0000{{{h{BA`}}}{{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{}}07{If{{Dn{DBb}}}}{c{{Dn{e}}}{}{}}{{{AJd{G`}}}{{Dn{DBb}}}}111{{{h{G`}}}{{Dn{DBbDBd}}}}2222{{{h{c}}}Ij{}}000;;;;`````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BAf}}}BAf}{{{h{DBj}}}DBj}{{{h{DBl}}}DBl}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{BAf}}{h{BAf}}}Bh}{{{h{Ahc}}}{{Dn{BAfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBlAC`}}}{ACbACd}}10{{{h{BAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAf}}{h{BAf}}}Ef}{{{h{DBj}}{h{DBj}}}Ef}{{{h{DBl}}{h{DBl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{BAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{{h{BAf}}{h{Ahc}}}BfGf}{ce{}{}}00``{{{h{BAf}}}{{Dh{{Ab{A`}}}}}}{{{ADn{Cd}}Cd}DBj}{{{ADn{Cd}}Cd}DBl}{{{h{BAf}}{h{BAf}}}{{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@`BA`BA`EdIfBB`}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}{cc{}}{ANnABn}{FnABn}{ACfABn}3333{BDfDEb}{ANnDEb}55{ANnAKn}{DF`AKn}{DEhAKn}{DFbAKn}9{ANnAEb}:{ANnDEh};;{ANnDEn}{ABbDEj}={AB`DEj}>{{{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{{Ch{AMh}}}}}{{Dn{{Ch{AAj}}DFd}}}}{{{h{AhDEl}}{h{{Ch{AMh}}}}}{{Dn{{Ch{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`}{AGbAJn}2{{{h{AGb}}}AJn}{{{h{AGb}}}AEf}{DFnAEf}5{AGbAEf}66{AJnJf}{cAKlDG`}{LjAKl}{LlAKl}{LhAKl};;{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`}}}}}}{{{h{c}}}{{h{e}}}{}{}}1{{{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}}}{}{}}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{{Ad{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}33{DGjC@h}{{{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{{Ad{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{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}}}}{AIh{Hj}}}{{h{{Ad{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIf{Hj}}}{{h{{Ad{A`}}}}}CAb}{{{h{{DIb{c}}}}AIn}{{h{{Ad{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIj{Hj}}}{{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{HjACf}}}CAb}{{{h{Ah{DId{c}}}}{h{{Ad{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{Ad{A`}}}}}Bf}{{{h{DIh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{DIj{Df}}}DIh}{DJ`DIh}{cc{}}{{}{{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{D`}}}{}}{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{}}000000000{{{AIb{c}}}{{DLh{c}}}DJj}{{{AIh{c}}}{{DLh{c}}}DJj}22{{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}}}CF`{D@hACd}}{{{h{DKn}}{h{Ahc}}}ADd{D@hACd}}{{{h{DL`}}{h{Ahc}}}ADd{D@hACd}}{{{h{DL`}}{h{Ahc}}}CF`{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}}}{{Ab{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}BAn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}222{{{h{DKh}}{h{Ahc}}}Ed{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAg}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}BBb{D@hACd}}{{{h{DKh}}{h{Ahc}}}AD`{D@hACd}}6{{{h{DKh}}{h{Ahc}}}BB`{D@hACd}}7777{{{h{DKh}}{h{Ahc}}}{{Ff{egi}}}{D@hACd}{}{}{}}88{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAe}}}{D@hACd}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}Ef{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{A`}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}A@`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAa}}}{D@hACd}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAi}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}ADd{D@hACd}}?{{{h{DKh}}{h{Ahc}}}A`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ab{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}Df{D@hACd}}{{{h{DKh}}{h{Ahc}}}Bf{D@hACd}}2{{{h{DKh}}{h{Ahc}}}{{Ff{eg}}}{D@hACd}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikm}}}{D@hACd}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{DIj{Df}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{AD`}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}BBh{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAc}}}{D@hACd}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CKd{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAiAk}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CFb{D@hACd}};;;{{{h{DKh}}{h{Ahc}}}{{DIj{Ed}}}{D@hACd}}<<<{{{h{DKh}}{h{Ahc}}}{{Ff{egikmo}}}{D@hACd}{}{}{}{}{}{}}={{{h{DKh}}{h{Ahc}}}{{DIj{Hj}}}{D@hACd}}>>{{{h{DKh}}{h{Ahc}}}{{Ff{e}}}{D@hACd}{}}?{{{h{DKh}}{h{Ahc}}}AEn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ab{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}CF`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egik}}}{D@hACd}{}{}{}{}}2{{{h{DKh}}{h{Ahc}}}{{DMb{e}}}{D@hACd}{}}3333{{{h{DKh}}{h{Ahc}}}Hj{D@hACd}}444{{{h{DKh}}{h{Ahc}}}{{DIj{AEn}}}{D@hACd}}{{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{Ed}}}DM`DM`}{{ce}{{DMf{Df}}}DM`DM`}{{ce}{{DMf{CKd}}}DM`DM`}{{ce}{{DMf{A`}}}DM`DM`}{{ce}{{DMf{AEn}}}DM`DM`}{{ce}{{DMf{CFb}}}DM`DM`}{{ce}{{DMf{AD`}}}DM`DM`}{{ce}{{DMf{BAn}}}DM`DM`}{{ce}{{DMf{A@`}}}DM`DM`}{{ce}{{DMf{BB`}}}DM`DM`}{{ce}{{DMf{Hj}}}DM`DM`}{{ce}{{DMf{BBb}}}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}}}}={{ce}{{DMf{Ed}}}DM`DM`}6{{ce}{{DMf{Df}}}DM`DM`}8<>9=:{{ce}{{DMf{CKd}}}DM`DM`}<7564{{{h{{DN`{}{{DMn{c}}}}}}{h{Ahe}}}c{}{D@hACd}}{{{h{{DMf{CFb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Ed}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AD`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A@`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BAn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Hj}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AEn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CKd}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Df}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BB`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BBb}}}}{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`}}}}{{{ADn{Hj}}}DOn}{cc{}}{{{ADn{Df}}}DOn}11{{{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{Cn}}}}{{{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`}}}Fb}{{{h{{EAd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CB`}{cc{}}00000{ANnE@l}11111{E@jDF`}{ANnDF`}{E@hDF`}{E@lDF`}{AMdDF`}6{ANnDFb}{AMdDFb}888{ANnEAb}{ANn{{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{Cn}}}}{{{EAf{c}}}{{Dn{Efc}}}{}}{{{h{AF`}}}Ln}{{{h{{AKj{c}}}}{h{Ahe}}Hj{h{Md}}g}{{EAf{{EAd{AMd}}}}}{{Dj{Cn}}}{AChACd}{{AHd{Df}}}}{{{h{{AKj{c}}}}Hj{h{Md}}Df}{{Dn{LhAMd}}}{{Dj{Cn}}}}{{{EAf{c}}g}{{EAf{e}}}{}{}{{BDn{c}{{Hd{e}}}}}}{c{{AKj{c}}}{{Dj{Cn}}}}{{{h{Md}}AGl}AF`}{{{h{{Ad{A`}}}}}{{Dn{E@dEAb}}}}`{{{h{Ah{AKj{c}}}}Hj{h{Md}}D`ABb}{{Dn{LjDFb}}}{{Dj{Cn}}}}{{{h{Ah{AKj{c}}}}Hj{h{Md}}D`ABb}{{Dn{LjAMd}}}{{Dj{Cn}}}}{{{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}}D`ABb}{{Dn{Bf{EAd{AMd}}}}}{{Dj{Cn}}}{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{Cn}}}{AChACd}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}AB`}{{Dn{LlDF`}}}{{Dj{Cn}}}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}gAB`}{{Dn{LlDF`}}}{{Dj{Cn}}}{{Dj{AAf}}}{{AHd{Ln}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}{Dh{E@d}}{Dh{{Ff{LnDf}}}}AB`}{{Dn{LlDF`}}}{{Dj{Cn}}}{{Dj{AAf}}}}{{{h{c}}}e{}{}}000000000000{{{h{c}}}If{}}0000000000{{{h{{AKj{c}}}}}{{h{Cn}}}{{Dj{Cn}}}}{c{{Dn{e}}}{}{}}0000000000000000000000000000000{{{h{c}}}Ij{}}000000000000000`{ce{}{}}000000000000000{{{h{Md}}}AF`}{{{h{Ah{AKj{c}}}}Hj}{{Dh{{h{AhA@j}}}}}{{EAh{Cn}}}}```````{{{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{cc{}}{JjEAj}{ANnEAj}2{{{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`Bn}{{Dn{EAnEB`}}}}{{EAnA`BnAGl}{{Dn{EAnEB`}}}}{{{h{EBb}}}{{Dh{{h{M`}}}}}}{{{h{BCn}}}{{h{{Ad{M`}}}}}}{{{h{AhBCn}}}{{h{Ah{Ad{M`}}}}}}1{{{h{EBb}}}{{Dh{{Ff{{h{Md}}AGl}}}}}}2{{{h{c}}}{{h{e}}}{}{}}0003000000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0003000000000000000{{{h{AKb}}}AKb}{{{h{EBd}}}EBd}{{{h{BCn}}}BCn}{{{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{BCn}}{h{BCn}}}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{BnAGl}}}}}{{Dh{AKf}}}}{{{h{{Ad{A`}}}}}{{Dn{BCnECb}}}}{{{h{{Ad{A`}}}}}{{Dn{AKfECb}}}}{{}BCn}{{}EAn}{{{h{AFb}}}A`}{{{h{BCn}}}h}{{{h{AhBCn}}}{{h{Ah}}}}{c{{Dn{AKb}}}E`}{c{{Dn{BCn}}}E`}{c{{Dn{EBj}}}E`}{c{{Dn{EBl}}}E`}{c{{Dn{EBb}}}E`}{c{{Dn{AKf}}}E`}{c{{Dn{AGl}}}E`}{{{h{BCn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKb}}{h{AKb}}}Ef}{{{h{EBd}}{h{EBd}}}Ef}{{{h{BCn}}{h{BCn}}}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{BCn}}{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{}}000{JjEBd}{ANnEBd}{AFjEBd}{{{Ab{M`}}}BCn}000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444{ANnEBf}{ANnEBh}666{EBjEBl}777777{ANnEB`}88{ANnECb}{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{BCn}}{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{BCn{{ADn{M`}}}}33{BCn}{{{h{BCn}}}}{{{h{AhBCn}}}}{EBhEBl}{EBjEBl}5{{{h{BCn}}}Ef}{{{h{EAn}}}Ef}{{{h{AFb}}}{{h{EBb}}}}{{{h{AFb}}}{{Dh{Ln}}}}{{{h{EBl}}}ECd}{{{h{AFb}}}{{Dh{AGl}}}}`{{{h{BCn}}}Hj}`{{{h{AFb}}}{{h{BCn}}}}{{{h{EBn}}}{{h{BCn}}}}`{{{h{AFd}}}{{Dh{M`}}}}{{}EAn}{M`AFb}{M`EBl}{{{h{{Jd{c}}}}Jb{Dh{M`}}}AFdJl}{{BnAGl}EBl}{{BnAGl}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{BCn}}{h{BCn}}}{{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{BnAGl}}{ECh{BCn}}}}}}}}{{{h{AKb}}c}DnHn}{AKbECj}{{{h{BCn}}}{{ADn{A`}}}}{{{h{BCn}}c}DnHn}{{{h{EBj}}c}DnHn}{{{h{EBl}}c}DnHn}{{{h{EBb}}c}DnHn}{{{h{AKf}}c}DnHn}{{{h{AKf}}}{{ADn{A`}}}}{{{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}}}{}{}}0{{{h{ECj}}}{{Dn{AKb}}}}{ECj{{Dn{AKb}}}}222{{{AJd{{Ad{M`}}}}}{{Dn{BCn}}}}{{{h{{Ad{M`}}}}}{{Dn{BCn}}}}{{{ADn{M`}}}{{Dn{BCn}}}}5555{EAn{{Dn{EBj}}}}{EBl{{Dn{EBj}}}}77{EAn{{Dn{EBl}}}}888888888888888888888888888{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{DfBn}}}}}}}}{c{{Dn{EAnEB`}}}{{El{}{{Ej{{Ff{DfBn}}}}}}}}``{{{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`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}0{{{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}}}}}}{{{h{ECj}}}}{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{Cn}}}}}{{El{}{{Ej{c}}}}}{{El{}{{Ej{{Ff{gi}}}}}}}}{{{h{Ah{ED`{ce}}}}i}{{EDb{c}}}fEDd{{AHd{{EDf{Cn}}}}}{{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{Cn}}}}}}{{{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{Cn}}}c{}}{{{h{Ah{EDd{}{{EDl{c}}}}}}AAd{h{AAf}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}{h{Cn}}}Ef{}}````````````{{{h{{EDn{c}}}}}{{AKh{c{Bd{{Ch{Cf}}}}}}}{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{{Ch{Cf}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}Bn}{{Dh{{h{{Ff{cDf}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{Cn}}}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{Ch{Cf}}}{{Dn{Ef{EE`{c}}}}}{AlBjFb}}{ce{}{}}00{{{h{EDj}}}Ef}{{{h{{EDn{c}}}}{h{Cn}}}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{{Ch{Cf}}}}}}}}}}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{Cn}}e}Il{AlBjFb}{{Hh{c}}}}{Df{{EDn{c}}}{}}{{{h{{EDn{c}}}}c}{{Dh{{Ff{DfEf}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}c}{{Dh{{Ff{{EEd{Bn}}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{Bn}}}}EDj}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{{AKh{cDf}}}}}EDj{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Bn}}}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}e}{{`{{Gn{}{{Ej{{EEf{cBn}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{EEh{h{{EDn{c}}}}e}EEh{}{{Hh{c}}}}{{{h{{EDn{c}}}}{h{Cn}}e}{{Ff{D`D`}}}{AlBjFb}{{Hh{c}}}}{{{h{EDj}}c}DnHn}{{{h{{EDn{c}}}}cDf}{{Dh{Bn}}}{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{{Ch{Cf}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Bn}}}}}}Al}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{EEf{cBn}}}}}}Al}}}{AlBjFb}}{{EEh{h{{EDn{c}}}}}EEh{}}{ce{}{}}00`````{{{h{{EEl{c}}}}}{{h{{AKh{cBn}}}}}{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}}}}Bn}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{Cn}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}e{AlBjFb}{}}{{{h{{EEl{c}}}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}cBn}Ef{AlBjFb}}>{{{h{{EEl{c}}}}{h{Cn}}}Ef{AlBjFb}}0{{{h{{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{{EEl{c}}}}{h{Cn}}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{Cn}}}{{ECh{c}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{{EEl{c}}}}{h{Cn}}e}{{Ff{D`D`}}}{AlBjFb}{{Hh{c}}}}{{{h{{EEl{c}}}}{h{c}}}{{Dh{Bn}}}{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}}Bn}}}}}}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{Cd}}}}}}}}}}11111{{{AKh{DfCd}}}{{Dn{EEnEFb}}}}{EF`{{Dn{EEnEFb}}}}{Cd{{Ff{EEnEF`}}}}{cEF`{{El{}{{Ej{{Ff{DfCd}}}}}}}}4{{{h{EEb}}}{{Id{EF`}}}}{Af{{Dn{EEnEFb}}}}{{{h{EEn}}}Cd}{{{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}}}{}}1{{{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{DfBn}}}}}}}}}{BjAl}}1{{{h{{EG`{c}}}}}{{ADn{c}}}{BjAl}}`{{{h{Ah{EFl{c}}}}}{{Dh{AAd}}}{}}{{{h{Ah{EFl{c}}}}}{{Dh{Bn}}}{}}{{{h{Ah{EG`{c}}}}c}{{Dh{{Ff{DfBn}}}}}{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{Bn}}}}}}`{{{EFn{c}}cg}{{EFn{c}}}Bj{{Gn{}{{Ej{{Ff{DfBn}}}}}}EGl}{{El{}{{EGn{e}}}}}}{{{EFn{c}}{h{{EDn{c}}}}}{{EFn{c}}}{AlBjFb}}`{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{{Ff{cBn}}}}}}}}{{{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{ANn}}}}}Al{{El{}{{Ej{{Ff{gAAd}}}}}}}{{Hf{{h{g}}Bn}{{Hd{Ef}}}}}}{{{h{Ah{Fh{c}}}}g}{{EDh{c}}}{AlBj}{{AHd{{EDf{Cn}}}}}{{El{}{{Ej{{Ff{eEd}}}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{{Fh{c}}}}{h{Cn}}}{{Dn{D`EH`}}}{}}`{c{{Dh{D`}}}{}}{c{{Dh{Il}}}{}}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{Cn}}}{{`{{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{ANn}}}}}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{Cn}}c}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{e}}jCj}{{Dh{{An{{h{c}}}}}}}f{{Gd{}{{Gb{ANn}}}}}}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dh{{Ff{{An{{h{c}}}}Cj}}}}}f{{Gd{}{{Gb{ANn}}}}}}{{{h{{Fh{c}}}}Cj}{{Dh{{EDf{Cn}}}}}{}}{{{h{{Fh{c}}}}Cj}{{Dh{{EHb{{EDf{Cn}}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{Cn}}}}}}{{{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{Cn}}c}}}}}}}}}f{{Gd{}{{Gb{ANn}}}}}}{{{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{Cn}}}}}{AlBj}}{{{h{Ah{EHf{cg}}}}}{{Dh{i}}}{}{}{{Hf{Hj{EDf{Cn}}}{{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}}Bn}{{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{Cn}}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{Cn}}c}}}}}}}}}{}}{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{{Fh{c}}}}ei}{{EHf{ci}}}{AlBj}{{AHd{{EDf{Cn}}}}}{}{{Hf{Hj{EDf{Cn}}}{{Hd{{Dh{g}}}}}}}}{{{h{{Fh{c}}}}{h{Cn}}g}{{EHh{cg}}}{}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}}{{{h{{Fh{c}}}}Cjg}{{EHh{cg}}}{AlBj}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}}","D":"AEIjABDl","p":[[5,"Balance",0,15113],[5,"DescriptorId",0,15114],[10,"Anchor",0,15115],[1,"reference"],[5,"BlockId",0,15116],[5,"ConfirmationBlockTime",0,15116],[5,"Hash",8977,15117],[1,"u8"],[1,"array"],[1,"slice"],[5,"CheckPoint",0,15118],[0,"mut"],[5,"TxUpdate",0,15119],[10,"Clone",15120],[6,"ChainPosition",0,15121],[5,"FullTxOut",0,15121],[5,"TxPosInBlock",0,15115],[5,"SpkIterator",0,15122],[1,"unit"],[6,"Ordering",15123],[10,"Ord",15123],[6,"ValueRef",15124],[5,"ScriptBuf",356,15125],[5,"Impl",0],[8,"FromSqlResult",15126],[5,"BlockHash",356,15127],[6,"DescriptorPublicKey",15128],[6,"Descriptor",15129],[5,"Txid",356,15130],[6,"Network",356,15131],[5,"Transaction",356,15130],[5,"Amount",356,15132],[5,"AnchorImpl",0],[10,"DeserializeOwned",7265,15133],[1,"u32"],[6,"Option",15134],[10,"Borrow",15135],[10,"DescriptorExt",0,15114],[6,"Result",15136],[10,"Deserializer",7178,15133],[10,"Deserialize",7178,15133],[1,"u64"],[1,"bool"],[10,"PartialEq",15123],[17,"Item"],[10,"IntoIterator",15137],[5,"Formatter",15138],[5,"Error",15138],[10,"Debug",15138],[8,"Result",15138],[1,"tuple"],[5,"TxGraph",14928],[1,"never"],[5,"Header",4505,15127],[5,"FromSliceError",12401,15139],[1,"str"],[17,"Error"],[10,"ChainOracle",0,15140],[10,"Hasher",15141],[10,"Hash",15141],[10,"SliceIndex",15142],[5,"IntoFallible",15143],[10,"Iterator",15144],[10,"Merge",0,15145],[5,"CheckPointIter",0,15118],[17,"Output"],[10,"FnMut",15146],[10,"RangeBounds",15147],[1,"usize"],[10,"PartialOrd",15123],[10,"Serializer",7178,15148],[10,"Serialize",7178,15148],[6,"ToSqlOutput",15149],[8,"Result",15150],[5,"String",3134,15151],[5,"Convert",15143],[5,"TypeId",15152],[5,"SignedAmount",356,15132],[5,"Weight",356,15153],[5,"Work",356,15154],[5,"XOnlyPublicKey",356,15155],[5,"Secp256k1",9713,15156],[5,"Scalar",11473,15157],[6,"Parity",9713,15155],[6,"Error",11473,15156],[10,"Verification",9713,15158],[5,"Address",356,15159],[6,"AddressType",356,15159],[5,"FilterHash",356,15160],[5,"FilterHeader",356,15160],[5,"XKeyIdentifier",356,15161],[5,"TxMerkleNode",356,15127],[5,"WitnessMerkleNode",356,15127],[5,"WitnessCommitment",356,15127],[5,"ScriptHash",356,15162],[5,"WScriptHash",356,15162],[5,"Wtxid",356,15130],[5,"PubkeyHash",356,15163],[5,"WPubkeyHash",356,15163],[5,"LegacySighash",356,15164],[5,"SegwitV0Sighash",356,15164],[5,"TapSighash",356,15164],[5,"TapLeafHash",356,15165],[5,"TapNodeHash",356,15165],[5,"TapTweakHash",356,15165],[5,"Script",356,15166],[5,"XOnlyPublicKey",12093,15167],[5,"Hash",9091,15168],[5,"Hash",6780,15169],[5,"TapSighashTag",356,15164],[5,"Hash",9144,15170],[5,"TapLeafTag",356,15165],[5,"TapBranchTag",356,15165],[5,"TapTweakTag",356,15165],[5,"PushBytes",5399,15171],[5,"Params",6239,15172],[6,"NetworkUnchecked",2756,15159],[10,"NetworkValidation",2756,15159],[5,"TxIn",356,15130],[5,"Block",356,15127],[6,"Bip34Error",4505,15127],[5,"Builder",5399,15173],[5,"Bytes",5399,15166],[5,"ChainHash",4625,15174],[6,"LockTime",4696,15175],[6,"LockTime",4882,15176],[5,"Sequence",356,15130],[1,"i64"],[5,"FeeRate",356,15177],[5,"Opcode",356,15178],[6,"ClassifyContext",5092,15178],[6,"Class",5092,15178],[5,"Witness",356,15179],[6,"Denomination",356,15132],[6,"KnownHrp",356,15159],[5,"WitnessProgram",356,15180],[6,"WitnessVersion",356,15181],[5,"OutPoint",356,15130],[5,"TxOut",356,15130],[5,"VarInt",356,15182],[5,"PublicKey",356,15163],[5,"CompressedPublicKey",356,15163],[5,"PrivateKey",356,15163],[6,"TapSighashType",356,15164],[6,"EcdsaSighashType",356,15164],[5,"MerkleBlock",356,15183],[6,"NetworkKind",356,15131],[5,"Target",356,15154],[5,"CompactTarget",356,15154],[5,"Psbt",356,15184],[6,"Error",11011,15185],[6,"Error",6330,15182],[10,"Read",9465,15186],[10,"Sized",15187],[5,"Error",9465,15188],[10,"Write",9465,15186],[5,"TweakedPublicKey",9713,15163],[5,"Token",15189],[10,"BufRead",9465,15186],[1,"u128"],[10,"AsRef",15190],[1,"f64"],[5,"Display",3052,15132],[5,"HashEngine",8977,15117],[6,"Instruction",5399,15191],[6,"Error",15192],[5,"Vec",3134,15193],[6,"MerkleBlockError",10083,15183],[6,"ExtractTxError",11011,15184],[10,"Write",15138],[5,"PublicKey",11473,15155],[5,"Xpub",4146,15161],[6,"Cow",15194],[5,"RelLockTime",15195],[1,"u16"],[5,"ScriptPath",13320,15164],[5,"LeafNode",13724,15165],[5,"TaprootSpendInfo",13724,15165],[10,"Fn",15146],[6,"ParseAmountError",3052,15132],[5,"InvalidSighashTypeError",13320,15164],[5,"ParseNetworkError",10141,15131],[6,"HexToBytesError",6825,15196],[6,"PrefixedHexError",6647,15197],[5,"Keypair",9713,15155],[5,"Magic",10191,15198],[10,"Signing",11473,15158],[5,"UncompressedPublicKeyError",9713,15163],[6,"FromScriptError",2756,15199],[6,"LeafVersion",13724,15165],[5,"TimeOverflowError",4882,15200],[6,"KeyParseError",15201],[6,"FromSliceError",9713,15163],[10,"Into",15190],[5,"NonStandardSighashTypeError",13320,15164],[6,"ParseError",2756,15199],[6,"ParsePublicKeyError",9713,15163],[6,"FromWifError",9713,15163],[6,"ParseError",15132],[6,"UnprefixedHexError",6647,15197],[5,"RangeInclusive",15147],[5,"RangeToInclusive",15147],[5,"RangeFrom",15147],[5,"Range",15147],[5,"RangeTo",15147],[6,"Bound",15147],[5,"RangeFull",15147],[5,"InstructionIndices",5399,15191],[5,"Instructions",5399,15191],[5,"Box",15202],[5,"Height",4696,15203],[5,"Time",4696,15203],[5,"Iter",6224,15179],[6,"Error",5953,15180],[5,"SecretKey",11473,15155],[6,"P2shError",2756,15199],[5,"Signature",13724,15204],[5,"Signature",6560,15205],[5,"ControlBlock",13724,15165],[5,"BTreeMap",15206],[5,"SighashCache",13320,15164],[5,"Message",11473,15156],[6,"SignError",11011,15184],[6,"PsbtSighashMsg",15192],[6,"SighashError",15192],[6,"SigningKeys",11011,15184],[10,"GetKey",11011,15184],[6,"AddressData",2756,15159],[5,"Fe32",15207],[5,"Hash",15208],[5,"Hash",7107,15209],[5,"OutOfRangeError",15132],[5,"SortKey",9713,15163],[5,"InputsIndexError",6062,15130],[5,"OutputsIndexError",6062,15130],[5,"DefiniteDescriptorKey",15128],[6,"UtxoUpdateError",15192],[6,"OutputUpdateError",15192],[5,"Signature",13289,15210],[5,"UnknownAddressTypeError",2756,15199],[5,"UnknownHrpError",2756,15199],[5,"NetworkValidationError",2756,15199],[5,"InvalidBase58PayloadLengthError",2756,15199],[5,"LegacyAddressTooLongError",2756,15199],[5,"InvalidLegacyPrefixError",2756,15199],[6,"NetworkChecked",2756,15159],[6,"Infallible",15190],[5,"TryFromError",5978,15181],[5,"DecodeError",15211],[6,"Error",3134,15212],[10,"StdError",8772],[10,"CheckedSum",3052,15132],[5,"InvalidCharacterError",15132],[5,"TooPreciseError",15132],[5,"MissingDigitsError",15132],[5,"InputTooLargeError",15132],[10,"SerdeAmount",3113,15213],[10,"SerdeAmountForOpt",3113,15213],[10,"Allocator",15214],[5,"OsStr",15215],[5,"Path",15216],[5,"InvalidCharacterError",3134,15212],[6,"FromSqlError",15126],[5,"Address",10191,15217],[5,"AddrV2Message",10349,15217],[5,"PrefilledTransaction",3842,15218],[6,"Inventory",10533,15219],[5,"ShortId",3842,15218],[5,"Drain",15220],[5,"Drain",15151],[1,"i16"],[1,"i32"],[1,"i8"],[6,"Value",15221],[10,"Copy",15187],[1,"char"],[5,"ExtractIf",15222],[5,"Error",15223],[5,"IncorrectChecksumError",3503,15212],[5,"TooShortError",3503,15212],[5,"BinaryHeap",15224],[5,"VecDeque",15225],[5,"PushBytesBuf",5399,15171],[5,"CString",15226],[5,"DerivationPath",4146,15161],[6,"ChildNumber",4146,15161],[5,"TaprootMerkleBranch",13724,15227],[5,"FromUtf16Error",15151],[5,"FromUtf8Error",15151],[5,"Assets",15228],[6,"Error",4146,15161],[10,"Error",7265,15133],[10,"IntoDeserializer",7265,15133],[5,"StringDeserializer",7449,15229],[10,"FnOnce",15146],[10,"Pattern",15230],[20,"MaybeUninit",15231],[5,"Splice",15232],[6,"SocketAddr",15233],[5,"IntoIter",15234],[6,"Error",15235],[5,"TryReserveError",15236],[5,"IoSlice",15237],[6,"EncodeSliceError",3546,15238],[6,"DecodeError",3546,15239],[6,"DecodeSliceError",3546,15239],[17,"Config"],[17,"DecodeEstimate"],[10,"Engine",3546,15240],[10,"Config",3692,15240],[10,"DecodeEstimate",3692,15240],[5,"Alphabet",3636,15241],[6,"ParseAlphabetError",3636,15241],[5,"Base64Display",3680,15242],[5,"GeneralPurpose",3692,15243],[5,"GeneralPurposeConfig",3692,15243],[6,"DecodePaddingMode",3692,15240],[5,"DecodeMetadata",3692,15240],[5,"DecoderReader",3797,15244],[10,"Read",15237],[10,"StrConsumer",3810,15245],[5,"EncoderWriter",3810,15246],[10,"Write",15237],[5,"EncoderStringWriter",3810,15245],[6,"Error",3842,15218],[5,"HeaderAndShortIds",3842,15218],[5,"BlockTransactionsRequest",3842,15218],[5,"TxIndexOutOfRangeError",3842,15218],[5,"BlockTransactions",3842,15218],[6,"HexToArrayError",6825,15196],[5,"BlockFilterWriter",4032,15160],[5,"GcsFilterWriter",4032,15160],[6,"Error",4032,15160],[5,"BlockFilter",4032,15160],[5,"BitStreamWriter",4032,15160],[5,"BlockFilterReader",4032,15160],[5,"GcsFilterReader",4032,15160],[5,"BitStreamReader",4032,15160],[5,"ChainCode",4146,15161],[5,"Fingerprint",4146,15161],[5,"DerivationPathIterator",4146,15161],[5,"Xpriv",4146,15161],[5,"InvalidBase58PayloadLengthError",4146,15161],[6,"KeyRequest",11011,15184],[10,"IntoDerivationPath",4146,15161],[5,"Version",4505,15127],[6,"ValidationError",4505,15127],[5,"ParseHeightError",4696,15203],[5,"ParseTimeError",4696,15203],[5,"ConversionError",4696,15203],[6,"ParseError",15203],[5,"AbsLockTime",15247],[5,"Height",4882,15200],[5,"Time",4882,15200],[5,"DisabledLockTimeError",4882,15176],[5,"IncompatibleHeightError",4882,15176],[5,"IncompatibleTimeError",4882,15176],[5,"PushBytesError",5399,15248],[6,"Error",5399,15162],[6,"UintError",15162],[10,"PushBytesErrorReport",5399,15249],[6,"FromStrError",5978,15181],[6,"TryFromInstructionError",5978,15181],[5,"ParseIntError",10978,15250],[6,"ParseOutPointError",6062,15130],[5,"IndexOutOfBoundsError",6062,15130],[5,"Version",6062,15130],[5,"InputWeightPrediction",6062,15130],[10,"Decodable",6239,15182],[10,"Encodable",6239,15182],[10,"WriteExt",6239,15182],[6,"DecodeError",6239,15251],[10,"IntoDeError",6447,15252],[10,"ReadExt",6239,15182],[5,"CheckedData",6330,15182],[6,"FromHexError",6330,15182],[5,"OddLengthStringError",6825,15196],[5,"Hex",6447,15252],[10,"Case",6482,15253],[10,"EncodeBytes",6447,15252],[5,"DecodeInitError",6482,15253],[5,"DecodeError",6482,15253],[5,"Encoder",6482,15253],[5,"Decoder",6482,15253],[5,"SerializedSignature",6560,15205],[6,"Error",6560,15205],[5,"Iter",15254],[5,"Signature",11874,15255],[5,"MissingPrefixError",6647,15197],[5,"ContainsPrefixError",6647,15197],[17,"Engine"],[17,"Bytes"],[10,"Hash",12401,15139],[10,"HashEngine",12401,15139],[10,"FromHex",6825,15256],[17,"MidState"],[17,"Display"],[10,"DisplayHex",6825,15257],[6,"Case",6825,15258],[10,"Display",15138],[10,"LowerHex",15138],[10,"UpperHex",15138],[5,"InvalidCharError",6825,15196],[5,"InvalidLengthError",7045,15196],[5,"HexToBytesIter",6825,15259],[5,"BytesToHexIter",6825,15259],[10,"ExactSizeIterator",15260],[5,"HexDigitsIter",15259],[10,"DoubleEndedIterator",15261],[10,"FusedIterator",15262],[5,"BufEncoder",6989,15263],[5,"DisplayByteSlice",7007,15257],[5,"DisplayArray",7007,15257],[5,"HashEngine",7107,15209],[17,"Ok"],[17,"SerializeSeq"],[17,"SerializeTuple"],[17,"SerializeTupleStruct"],[17,"SerializeTupleVariant"],[17,"SerializeMap"],[17,"SerializeStruct"],[17,"SerializeStructVariant"],[10,"Error",8772,15148],[10,"SerializeSeq",8772,15148],[10,"SerializeTuple",8772,15148],[10,"SerializeTupleStruct",8772,15148],[10,"SerializeTupleVariant",8772,15148],[10,"SerializeMap",8772,15148],[10,"SerializeStruct",8772,15148],[10,"SerializeStructVariant",8772,15148],[10,"Visitor",7265,15133],[1,"f32"],[1,"i128"],[5,"IgnoredAny",7265,15264],[6,"Unexpected",7265,15133],[17,"Value"],[10,"DeserializeSeed",7265,15133],[10,"Expected",7265,15133],[17,"Deserializer"],[10,"VariantAccess",7265,15133],[10,"SeqAccess",7265,15133],[10,"MapAccess",7265,15133],[5,"Request",15265],[17,"Variant"],[10,"EnumAccess",7265,15133],[5,"UnitDeserializer",7449,15229],[5,"U32Deserializer",7449,15229],[5,"StrDeserializer",7449,15229],[5,"BorrowedStrDeserializer",7449,15229],[5,"CowStrDeserializer",7449,15229],[5,"BytesDeserializer",7449,15229],[5,"BorrowedBytesDeserializer",7449,15229],[5,"MapDeserializer",7449,15229],[5,"Error",7449,15229],[5,"BoolDeserializer",7449,15229],[5,"I8Deserializer",7449,15229],[5,"I16Deserializer",7449,15229],[5,"I32Deserializer",7449,15229],[5,"I64Deserializer",7449,15229],[5,"I128Deserializer",7449,15229],[5,"IsizeDeserializer",7449,15229],[5,"U8Deserializer",7449,15229],[5,"U16Deserializer",7449,15229],[5,"U64Deserializer",7449,15229],[5,"U128Deserializer",7449,15229],[5,"UsizeDeserializer",7449,15229],[5,"F32Deserializer",7449,15229],[5,"F64Deserializer",7449,15229],[5,"CharDeserializer",7449,15229],[5,"SeqDeserializer",7449,15229],[5,"SeqAccessDeserializer",7449,15229],[5,"MapAccessDeserializer",7449,15229],[5,"EnumAccessDeserializer",7449,15229],[1,"isize"],[5,"Impossible",8772,15266],[5,"Source",15265],[10,"SerdeHash",8902,15267],[5,"Hash",8907,15268],[5,"HashEngine",8907,15268],[5,"Midstate",8977,15117],[10,"Tag",9144,15170],[5,"Hash",9191,15269],[5,"HashEngine",9191,15269],[5,"Hash",9247,15270],[5,"HashEngine",9247,15270],[5,"Hash",9317,15271],[5,"HashEngine",9317,15271],[5,"Hash",9373,15272],[5,"State",9373,15272],[5,"HashEngine",9373,15272],[6,"ErrorKind",9465,15188],[5,"FromStd",9465,15273],[10,"BufRead",15237],[5,"ToStd",9465,15273],[5,"Take",9465,15186],[5,"Cursor",9465,15186],[5,"Sink",9465,15186],[5,"Keypair",12093,15167],[10,"Context",11473,15158],[5,"TweakedKeypair",9713,15163],[6,"ParseCompressedPublicKeyError",9713,15163],[5,"InvalidBase58PayloadLengthError",9713,15163],[5,"InvalidAddressVersionError",9713,15163],[5,"Context",12093,15167],[5,"NonNull",15274],[17,"TweakedAux"],[17,"TweakedKey"],[10,"TapTweak",9713,15163],[6,"All",11473,15275],[5,"DisplaySecret",15276],[5,"InvalidParityValue",11473,15155],[5,"AllPreallocated",11473,15158],[5,"ManuallyDrop",15277],[5,"SignOnlyPreallocated",11473,15158],[5,"VerifyOnlyPreallocated",11473,15158],[10,"Rng",12515,15278],[5,"AlignedType",12371,15279],[10,"PreallocatedContext",11473,15158],[5,"RecoverableSignature",11874,15280],[10,"CryptoRng",12515,15281],[6,"SignOnly",11473,15275],[6,"VerifyOnly",11473,15275],[5,"PartialMerkleTree",10083,15183],[5,"UnknownChainHashError",10141,15131],[5,"ServiceFlags",10191,15198],[5,"ParseMagicError",10191,15198],[5,"UnknownMagicError",10191,15198],[6,"AddrV2",10349,15217],[5,"CommandString",10404,15282],[5,"CommandStringError",10404,15282],[5,"RawNetworkMessage",10404,15282],[6,"NetworkMessage",10404,15282],[5,"GetBlocksMessage",10533,15219],[5,"GetHeadersMessage",10533,15219],[5,"FilterLoad",10611,15283],[6,"BloomFlags",10611,15283],[5,"FilterAdd",10611,15283],[5,"SendCmpct",10675,15284],[5,"CmpctBlock",10675,15284],[5,"GetBlockTxn",10675,15284],[5,"BlockTxn",10675,15284],[5,"GetCFilters",10768,15285],[5,"CFilter",10768,15285],[5,"GetCFHeaders",10768,15285],[5,"CFHeaders",10768,15285],[5,"GetCFCheckpt",10768,15285],[5,"CFCheckpt",10768,15285],[5,"VersionMessage",10900,15286],[6,"RejectReason",10900,15286],[5,"Reject",10900,15286],[5,"ParseIntError",15287],[5,"Output",11011,15288],[6,"GetKeyError",11011,15184],[6,"OutputType",11011,15184],[6,"SigningAlgorithm",11011,15184],[6,"IndexOutOfBoundsError",11011,15184],[5,"PsbtSighashType",11011,15289],[5,"Input",11011,15289],[6,"PsbtParseError",11011,15290],[6,"TaprootError",13320,15164],[6,"P2wpkhError",13320,15164],[6,"ConversionError",15128],[5,"ProprietaryKey",11402,15291],[10,"From",15190],[5,"Key",11402,15291],[5,"Pair",11402,15291],[5,"PublicKey",12093,15167],[10,"ThirtyTwoByteHash",11473,15156],[5,"OutOfRangeError",13269,15157],[5,"ElligatorSwift",12018,15292],[5,"SharedSecret",11843,15293],[5,"RecoverableSignature",12339,15294],[5,"Signature",12093,15167],[5,"SerializedSignature",11874,15295],[5,"RecoveryId",11874,15280],[5,"IntoIter",11996,15296],[5,"ElligatorSwiftSharedSecret",12018,15292],[6,"ElligatorSwiftParty",12018,15292],[17,"Target"],[10,"CPtr",12093,15167],[5,"ElligatorSwift",12093,15167],[6,"c_void",12371,15297],[1,"fn"],[5,"SchnorrSigExtraParams",12093,15167],[5,"Hmac",12401,15298],[5,"HmacEngine",12401,15298],[10,"FromStr",15299],[5,"Error",12515,15300],[5,"NonZero",15301],[10,"Fill",12515,15278],[10,"RngCore",12515,15281],[5,"Error",15302],[17,"Seed"],[10,"SeedableRng",12515,15281],[10,"Default",15303],[10,"AsMut",15190],[10,"SampleUniform",12842,15304],[10,"SampleRange",12842,15304],[10,"Distribution",13004,15305],[5,"DistIter",12567,15305],[5,"ThreadRng",13048,15306],[10,"DistString",12567,15305],[5,"Alphanumeric",12567,15307],[5,"Standard",12567,15308],[5,"Bernoulli",12567,15309],[6,"BernoulliError",12567,15309],[5,"OpenClosed01",12567,15310],[5,"Open01",12567,15310],[5,"Slice",12567,15311],[5,"WeightedIndex",12567,15312],[6,"WeightedError",12567,15312],[5,"Uniform",12567,15304],[5,"DistMap",12567,15305],[5,"EmptySlice",15311],[10,"AddAssign",15313],[10,"SampleBorrow",12842,15304],[5,"Wrapping",15314],[10,"SubAssign",15313],[5,"UniformInt",12842,15304],[5,"UniformChar",12842,15304],[5,"UniformFloat",12842,15304],[5,"UniformDuration",12842,15304],[17,"X"],[10,"UniformSampler",12842,15304],[5,"Duration",15315],[5,"WeightedIndex",12992,15316],[10,"Weight",12992,15316],[10,"SliceRandom",13180,15317],[10,"IteratorRandom",13180,15317],[5,"SliceChooseIter",13180,15317],[5,"OsRng",13048,15318],[5,"StdRng",13048,15319],[5,"ReseedingRng",13111,15320],[10,"BlockRngCore",15321],[5,"ReadRng",13111,15322],[5,"ReadError",13111,15322],[5,"StepRng",13159,15323],[10,"Index",15324],[6,"IndexVec",13212,15325],[6,"IndexVecIntoIter",13212,15325],[6,"IndexVecIter",13212,15325],[5,"Annex",13320,15164],[6,"Prevouts",13320,15164],[5,"PrevoutsSizeError",13320,15164],[5,"PrevoutsKindError",13320,15164],[6,"PrevoutsIndexError",13320,15164],[5,"SighashTypeParseError",13320,15164],[5,"SingleMissingOutputError",13320,15164],[6,"AnnexError",13320,15164],[6,"SigningDataError",13320,15164],[6,"EncodeSigningDataResult",13320,15164],[10,"BorrowMut",15135],[6,"MessageSignatureError",13669,15326],[5,"MessageSignature",13669,15326],[5,"TaprootBuilder",13724,15165],[6,"TaprootBuilderError",13724,15165],[6,"TapLeaf",13724,15165],[6,"SigFromSliceError",13724,15204],[6,"IncompleteBuilderError",13724,15165],[6,"HiddenNodesError",13724,15165],[5,"TapTree",13724,15165],[5,"NodeInfo",13724,15165],[5,"ScriptLeaf",13724,15165],[5,"FutureLeafVersion",13724,15165],[6,"TaprootError",13724,15165],[5,"LeafNodes",13724,15165],[5,"ScriptLeaves",13724,15165],[5,"BTreeSet",15327],[5,"SerializedSignature",14389,15328],[5,"IntoIter",14363,15227],[5,"IntoIter",14389,15329],[5,"IndexedTxGraph",14444],[5,"ChangeSet",14444],[10,"Indexer",14495],[5,"Arc",15330],[5,"ChangeSet",14928],[5,"ChangeSet",14504],[17,"ChangeSet"],[5,"KeychainTxOutIndex",14504],[6,"InsertDescriptorError",14504],[5,"Transaction",15331],[8,"Indexed",0,15332],[8,"KeychainIndexed",0,15332],[10,"SyncRequestBuilderExt",14504],[10,"FullScanRequestBuilderExt",14504],[5,"SpkTxOutIndex",14611],[5,"LocalChain",14648],[5,"ChangeSet",14648],[5,"MissingGenesisError",14648],[5,"CannotConnectError",14648],[6,"ApplyHeaderError",14648],[5,"AlterCheckPointError",14648],[5,"SyncRequestBuilder",14782,15333],[5,"SyncRequest",14782,15333],[5,"FullScanRequestBuilder",14782,15333],[5,"FullScanRequest",14782,15333],[6,"SyncItem",14782,15333],[5,"SyncProgress",14782,15333],[5,"SyncResponse",14782,15333],[5,"FullScanResponse",14782,15333],[10,"Any",15152],[10,"Send",15187],[17,"IntoIter"],[6,"CalculateFeeError",14928],[5,"TxNode",14928],[5,"CanonicalTx",14928],[5,"TxAncestors",14928],[5,"TxDescendants",14928],[5,"HashSet",15334],[15,"P2pkh",3027],[15,"P2sh",3027],[15,"Segwit",3027],[8,"ExtendedPubKey",4146],[8,"ExtendendPubKey",4146],[8,"ExtendedPrivKey",4146],[8,"ExtendendPrivKey",4146],[15,"Normal",4492],[15,"Hardened",4492],[15,"InvalidChecksum",6423],[15,"OversizedVectorAllocation",6423],[10,"ByteDecoder",6447],[10,"ByteEncoder",6447],[5,"With",6447],[6,"Lower",6482],[6,"Upper",6482],[5,"HmacMidState",7094],[8,"Result",9465],[15,"Unknown",10531],[15,"Unknown",10609],[15,"UnexpectedUnsignedTx",11389],[15,"InvalidPreimageHashPair",11389],[15,"AbsurdFeeRate",11394],[15,"SendingTooMuch",11394],[15,"MissingInputValue",11394],[15,"Inputs",11398],[15,"TxInput",11398],[8,"NonceFn",12093],[8,"EcdhHashFn",12093],[8,"SchnorrNonceFn",12093],[8,"EllswiftEcdhHashFn",12093],[15,"DescriptorAlreadyAssigned",14607],[15,"KeychainAlreadyAssigned",14607]],"r":[[0,15115],[2,15122],[3,15113],[4,15116],[5,15140],[6,15121],[7,15118],[8,15118],[9,15116],[11,15114],[12,15114],[14,15121],[16,15332],[17,14444],[18,14495],[19,15332],[20,15145],[21,15122],[22,14928],[23,15115],[24,15119],[237,14495],[267,15332],[268,14495],[356,15159],[357,15159],[362,15132],[368,15127],[369,15127],[371,15154],[372,15163],[376,15132],[379,15164],[380,15177],[381,15160],[382,15160],[383,15159],[384,15164],[406,15183],[412,15131],[413,15131],[422,15178],[423,15130],[430,15163],[431,15184],[432,15163],[433,15163],[439,15166],[440,15125],[441,15162],[442,15164],[443,15130],[444,15132],[450,15165],[451,15165],[452,15165],[453,15165],[454,15164],[455,15164],[456,15164],[457,15165],[458,15165],[459,15154],[464,15130],[465,15130],[466,15127],[467,15130],[468,15130],[486,15182],[488,15163],[489,15162],[490,15153],[491,15179],[492,15127],[493,15127],[494,15180],[495,15181],[496,15154],[497,15130],[498,15161],[499,15155],[515,15335],[536,15335],[640,15335],[641,15335],[642,15335],[645,15335],[982,15335],[1107,15336],[1307,15335],[1870,15335],[2007,15336],[2019,15335],[2035,15335],[2060,15335],[2082,15335],[2135,15335],[2137,15335],[2153,15335],[2242,15336],[2246,15335],[2264,15335],[2756,15159],[2757,15159],[2758,15159],[2762,15199],[2765,15199],[2767,15199],[2768,15159],[2770,15199],[2772,15159],[2773,15159],[2774,15159],[2776,15199],[2781,15199],[2785,15199],[2789,15199],[2791,15199],[2884,15159],[3033,15199],[3035,15199],[3037,15199],[3039,15199],[3041,15199],[3042,15199],[3043,15199],[3044,15199],[3046,15199],[3052,15132],[3056,15132],[3057,15132],[3058,15132],[3067,15132],[3070,15132],[3098,15132],[3113,15213],[3114,15213],[3115,15213],[3116,15213],[3124,15337],[3125,15337],[3126,15337],[3127,15338],[3128,15338],[3129,15339],[3130,15339],[3131,15339],[3132,15340],[3133,15340],[3135,15212],[3137,15212],[3138,15151],[3140,15193],[3232,15341],[3233,15341],[3258,15341],[3259,15341],[3260,15341],[3282,15341],[3504,15212],[3506,15212],[3507,15212],[3509,15212],[3547,15239],[3550,15239],[3551,15238],[3552,15240],[3559,15342],[3573,15239],[3575,15239],[3576,15239],[3577,15239],[3581,15239],[3582,15342],[3583,15238],[3585,15238],[3586,15238],[3587,15238],[3590,15238],[3591,15342],[3614,15342],[3615,15342],[3635,15342],[3636,15241],[3637,15241],[3638,15241],[3639,15241],[3641,15241],[3643,15241],[3645,15241],[3646,15241],[3680,15242],[3692,15240],[3694,15240],[3696,15240],[3697,15240],[3698,15240],[3699,15243],[3700,15243],[3745,15240],[3774,15243],[3775,15243],[3776,15243],[3777,15243],[3778,15243],[3779,15243],[3780,15243],[3781,15243],[3788,15240],[3797,15244],[3810,15245],[3811,15246],[3812,15245],[3842,15218],[3843,15218],[3844,15218],[3845,15218],[3847,15218],[3848,15218],[3849,15218],[4032,15160],[4033,15160],[4034,15160],[4035,15160],[4036,15160],[4037,15160],[4038,15160],[4039,15160],[4040,15160],[4041,15160],[4148,15161],[4149,15161],[4150,15161],[4151,15161],[4152,15161],[4153,15161],[4154,15161],[4155,15161],[4156,15161],[4157,15161],[4160,15161],[4162,15161],[4167,15161],[4172,15161],[4173,15161],[4174,15161],[4494,15177],[4495,15153],[4496,15343],[4497,15343],[4498,15343],[4499,15343],[4500,15343],[4501,15343],[4502,15343],[4503,15343],[4504,15343],[4507,15127],[4508,15127],[4509,15127],[4510,15127],[4517,15127],[4520,15127],[4521,15127],[4522,15127],[4523,15127],[4626,15174],[4627,15174],[4628,15174],[4629,15174],[4630,15174],[4631,15174],[4632,15174],[4633,15174],[4634,15174],[4636,15174],[4637,15174],[4639,15174],[4640,15174],[4644,15174],[4675,15174],[4693,15177],[4694,15344],[4695,15344],[4697,15203],[4698,15203],[4699,15203],[4700,15175],[4705,15203],[4706,15203],[4709,15203],[4883,15176],[4884,15200],[4885,15176],[4886,15176],[4887,15176],[4893,15200],[4895,15200],[5092,15178],[5093,15178],[5097,15178],[5098,15178],[5099,15178],[5100,15178],[5101,15178],[5102,15178],[5109,15178],[5143,15345],[5144,15345],[5145,15345],[5146,15345],[5147,15345],[5148,15345],[5149,15345],[5150,15345],[5151,15345],[5152,15345],[5153,15345],[5154,15345],[5155,15345],[5156,15345],[5157,15345],[5158,15345],[5159,15345],[5160,15345],[5161,15345],[5162,15345],[5163,15345],[5164,15345],[5165,15345],[5166,15345],[5167,15345],[5168,15345],[5169,15345],[5170,15345],[5171,15345],[5172,15345],[5173,15345],[5174,15345],[5175,15345],[5176,15345],[5177,15345],[5178,15345],[5179,15345],[5180,15345],[5181,15345],[5182,15345],[5183,15345],[5184,15345],[5185,15345],[5186,15345],[5187,15345],[5188,15345],[5189,15345],[5190,15345],[5191,15345],[5192,15345],[5193,15345],[5194,15345],[5195,15345],[5196,15345],[5197,15345],[5198,15345],[5199,15345],[5200,15345],[5201,15345],[5202,15345],[5203,15345],[5204,15345],[5205,15345],[5206,15345],[5207,15345],[5208,15345],[5209,15345],[5210,15345],[5211,15345],[5212,15345],[5213,15345],[5214,15345],[5215,15345],[5216,15345],[5217,15345],[5218,15345],[5219,15345],[5220,15345],[5221,15345],[5222,15345],[5223,15345],[5224,15345],[5225,15345],[5226,15345],[5227,15345],[5228,15345],[5229,15345],[5230,15345],[5231,15345],[5232,15345],[5233,15345],[5234,15345],[5235,15345],[5236,15345],[5237,15345],[5238,15345],[5239,15345],[5240,15345],[5241,15345],[5242,15345],[5243,15345],[5244,15345],[5245,15345],[5246,15345],[5247,15345],[5248,15345],[5249,15345],[5250,15345],[5251,15345],[5252,15345],[5253,15345],[5254,15345],[5255,15345],[5256,15345],[5257,15345],[5258,15345],[5259,15345],[5260,15345],[5261,15345],[5262,15345],[5263,15345],[5264,15345],[5265,15345],[5266,15345],[5267,15345],[5268,15345],[5269,15345],[5270,15345],[5271,15345],[5272,15345],[5273,15345],[5274,15345],[5275,15345],[5276,15345],[5277,15345],[5278,15345],[5279,15345],[5280,15345],[5281,15345],[5282,15345],[5283,15345],[5284,15345],[5285,15345],[5286,15345],[5287,15345],[5288,15345],[5289,15345],[5290,15345],[5291,15345],[5292,15345],[5293,15345],[5294,15345],[5295,15345],[5296,15345],[5297,15345],[5298,15345],[5299,15345],[5300,15345],[5301,15345],[5302,15345],[5303,15345],[5304,15345],[5305,15345],[5306,15345],[5307,15345],[5308,15345],[5309,15345],[5310,15345],[5311,15345],[5312,15345],[5313,15345],[5314,15345],[5315,15345],[5316,15345],[5317,15345],[5318,15345],[5319,15345],[5320,15345],[5321,15345],[5322,15345],[5323,15345],[5324,15345],[5325,15345],[5326,15345],[5327,15345],[5328,15345],[5329,15345],[5330,15345],[5331,15345],[5332,15345],[5333,15345],[5334,15345],[5335,15345],[5336,15345],[5337,15345],[5338,15345],[5339,15345],[5340,15345],[5341,15345],[5342,15345],[5343,15345],[5344,15345],[5345,15345],[5346,15345],[5347,15345],[5348,15345],[5349,15345],[5350,15345],[5351,15345],[5352,15345],[5353,15345],[5354,15345],[5355,15345],[5356,15345],[5357,15345],[5358,15345],[5359,15345],[5360,15345],[5361,15345],[5362,15345],[5363,15345],[5364,15345],[5365,15345],[5366,15345],[5367,15345],[5368,15345],[5369,15345],[5370,15345],[5371,15345],[5372,15345],[5373,15345],[5374,15345],[5375,15345],[5376,15345],[5377,15345],[5378,15345],[5379,15345],[5380,15345],[5381,15345],[5382,15345],[5383,15345],[5384,15345],[5385,15345],[5386,15345],[5387,15345],[5388,15345],[5389,15345],[5390,15345],[5391,15345],[5392,15345],[5393,15345],[5394,15345],[5395,15345],[5396,15345],[5397,15345],[5398,15345],[5399,15173],[5400,15166],[5402,15162],[5403,15191],[5404,15191],[5405,15191],[5409,15171],[5411,15171],[5412,15248],[5413,15249],[5414,15166],[5415,15125],[5416,15162],[5419,15162],[5887,15162],[5888,15162],[5889,15162],[5950,15162],[5951,15162],[5952,15162],[5953,15180],[5956,15180],[5957,15180],[5958,15180],[5979,15181],[5982,15181],[5983,15181],[6002,15181],[6063,15130],[6064,15130],[6065,15130],[6067,15130],[6068,15130],[6074,15130],[6075,15130],[6078,15130],[6079,15130],[6080,15130],[6081,15130],[6083,15130],[6086,15130],[6115,15130],[6170,15130],[6171,15130],[6222,15153],[6223,15153],[6224,15179],[6225,15179],[6241,15182],[6242,15251],[6243,15182],[6246,15172],[6248,15182],[6254,15182],[6270,15182],[6271,15182],[6283,15251],[6302,15251],[6317,15251],[6318,15182],[6330,15182],[6331,15182],[6333,15182],[6334,15182],[6335,15182],[6338,15182],[6343,15182],[6345,15182],[6346,15182],[6362,15182],[6363,15182],[6364,15182],[6404,15182],[6405,15182],[6427,15172],[6428,15172],[6429,15172],[6430,15172],[6431,15172],[6432,15172],[6433,15172],[6447,15252],[6448,15252],[6451,15252],[6453,15252],[6455,15252],[6456,15252],[6469,15252],[6482,15253],[6483,15253],[6484,15253],[6485,15253],[6486,15253],[6487,15253],[6488,15253],[6561,15205],[6564,15205],[6566,15205],[6648,15197],[6650,15197],[6653,15250],[6654,15197],[6655,15197],[6730,15127],[6731,15160],[6732,15160],[6733,15127],[6734,15130],[6735,15127],[6736,15127],[6737,15130],[6742,15139],[6743,15139],[6744,15139],[6745,15298],[6746,15298],[6751,15139],[6752,15139],[6758,15139],[6760,15139],[6761,15139],[6762,15139],[6766,15139],[6767,15139],[6768,15139],[6769,15139],[6770,15139],[6771,15139],[6772,15139],[6773,15139],[6774,15139],[6775,15139],[6776,15139],[6777,15139],[6779,15346],[6780,15169],[6825,15259],[6826,15258],[6828,15257],[6830,15256],[6831,15259],[6832,15196],[6833,15196],[6834,15259],[6837,15196],[6841,15196],[6859,15258],[6871,15258],[6887,15258],[6897,15258],[6913,15258],[6936,15258],[6937,15258],[6945,15258],[6988,15258],[6989,15263],[7008,15257],[7009,15257],[7010,15257],[7025,15258],[7029,15258],[7045,15196],[7046,15196],[7049,15196],[7051,15196],[7053,15196],[7075,15256],[7076,15196],[7077,15196],[7084,15257],[7086,15256],[7094,15298],[7095,15298],[7096,15298],[7107,15209],[7108,15209],[7178,15133],[7179,15347],[7180,15133],[7184,15148],[7185,15347],[7193,15148],[7197,15348],[7230,15348],[7233,15348],[7268,15133],[7269,15133],[7270,15133],[7271,15133],[7274,15133],[7275,15133],[7281,15133],[7283,15264],[7284,15133],[7286,15133],[7292,15133],[7298,15133],[7305,15133],[7306,15133],[7402,15133],[7449,15229],[7450,15229],[7451,15229],[7452,15229],[7453,15229],[7454,15229],[7455,15229],[7456,15229],[7457,15229],[7458,15229],[7459,15229],[7460,15229],[7461,15229],[7462,15229],[7463,15229],[7464,15229],[7465,15229],[7466,15229],[7467,15229],[7468,15229],[7469,15229],[7470,15229],[7471,15229],[7472,15229],[7473,15229],[7474,15229],[7475,15229],[7476,15229],[7477,15229],[8772,15148],[8781,15266],[8790,15148],[8791,15148],[8793,15148],[8795,15148],[8797,15148],[8799,15148],[8801,15148],[8803,15148],[8805,15148],[8901,15349],[8903,15267],[8907,15268],[8908,15268],[8977,15117],[8978,15117],[8979,15117],[9091,15168],[9144,15170],[9145,15170],[9191,15269],[9192,15269],[9247,15270],[9248,15270],[9317,15271],[9318,15271],[9373,15272],[9374,15272],[9375,15272],[9469,15186],[9473,15186],[9475,15188],[9476,15188],[9477,15273],[9486,15186],[9487,15186],[9488,15186],[9489,15186],[9491,15273],[9494,15186],[9581,15186],[9582,15186],[9585,15186],[9666,15186],[9714,15163],[9717,15163],[9718,15163],[9721,15163],[9723,15163],[9728,15155],[9730,15155],[9731,15163],[9732,15163],[9733,15163],[9734,15163],[9735,15163],[9736,15156],[9740,15163],[9741,15163],[9744,15163],[9745,15163],[9746,15163],[9747,15163],[9748,15163],[9749,15158],[9750,15163],[9751,15155],[10086,15183],[10087,15183],[10093,15183],[10101,15350],[10102,15350],[10143,15131],[10144,15131],[10145,15131],[10151,15131],[10152,15131],[10189,15351],[10190,15351],[10191,15217],[10196,15198],[10201,15198],[10202,15198],[10205,15198],[10209,15198],[10212,15198],[10302,15198],[10303,15198],[10304,15198],[10305,15198],[10306,15198],[10307,15198],[10349,15217],[10350,15217],[10351,15217],[10413,15282],[10414,15282],[10429,15282],[10430,15282],[10433,15282],[10437,15282],[10536,15219],[10537,15219],[10538,15219],[10612,15283],[10613,15283],[10614,15283],[10675,15284],[10676,15284],[10677,15284],[10678,15284],[10768,15285],[10769,15285],[10770,15285],[10771,15285],[10772,15285],[10773,15285],[10908,15286],[10909,15286],[10910,15286],[10978,15250],[10999,15352],[11000,15352],[11001,15352],[11002,15352],[11003,15352],[11004,15352],[11005,15352],[11006,15352],[11007,15352],[11008,15154],[11009,15154],[11010,15154],[11021,15185],[11023,15184],[11025,15184],[11026,15184],[11028,15184],[11029,15289],[11047,15184],[11062,15288],[11063,15184],[11066,15184],[11068,15290],[11069,15289],[11079,15184],[11080,15184],[11081,15184],[11082,15184],[11083,15184],[11279,15184],[11283,15184],[11402,15291],[11403,15291],[11404,15291],[11405,15291],[11473,15275],[11474,15158],[11475,15158],[11477,15156],[11483,15155],[11492,15155],[11494,15156],[11498,15155],[11499,15158],[11500,15155],[11501,15157],[11502,15156],[11503,15155],[11504,15275],[11505,15158],[11506,15158],[11507,15156],[11508,15158],[11509,15275],[11510,15158],[11511,15155],[11587,15156],[11598,15156],[11599,15156],[11600,15156],[11705,15156],[11706,15156],[11745,15156],[11746,15156],[11827,15353],[11828,15353],[11829,15353],[11830,15353],[11831,15353],[11832,15353],[11833,15353],[11834,15353],[11835,15353],[11836,15353],[11837,15353],[11838,15353],[11839,15353],[11840,15353],[11841,15353],[11842,15353],[11843,15293],[11868,15293],[11874,15280],[11875,15280],[11876,15295],[11877,15255],[11968,15255],[11996,15296],[11997,15295],[12020,15292],[12021,15292],[12022,15292],[12093,15167],[12094,15167],[12095,15167],[12096,15167],[12097,15167],[12098,15167],[12099,15167],[12104,15167],[12105,15167],[12106,15167],[12107,15167],[12108,15167],[12109,15167],[12110,15167],[12111,15167],[12112,15167],[12118,15167],[12172,15167],[12216,15167],[12217,15167],[12236,15167],[12242,15167],[12243,15167],[12244,15167],[12245,15167],[12246,15167],[12247,15167],[12248,15167],[12249,15167],[12250,15167],[12251,15167],[12252,15167],[12253,15167],[12254,15167],[12255,15167],[12256,15167],[12257,15167],[12258,15167],[12259,15167],[12260,15167],[12261,15167],[12262,15167],[12263,15167],[12264,15167],[12265,15167],[12266,15167],[12267,15167],[12268,15167],[12269,15167],[12270,15167],[12271,15167],[12272,15167],[12273,15167],[12274,15167],[12275,15167],[12276,15167],[12277,15167],[12278,15167],[12279,15167],[12280,15167],[12281,15167],[12282,15167],[12283,15167],[12284,15167],[12285,15167],[12286,15167],[12287,15167],[12288,15167],[12289,15167],[12290,15167],[12291,15167],[12292,15167],[12293,15167],[12294,15167],[12295,15167],[12296,15167],[12297,15167],[12298,15167],[12327,15167],[12339,15294],[12361,15294],[12362,15294],[12363,15294],[12364,15294],[12365,15294],[12371,15279],[12377,15279],[12378,15279],[12379,15279],[12380,15279],[12381,15297],[12390,15279],[12405,15139],[12406,15139],[12407,15139],[12408,15298],[12409,15298],[12423,15139],[12472,15139],[12473,15139],[12491,15139],[12493,15139],[12516,15281],[12517,15300],[12518,15278],[12520,15278],[12521,15281],[12523,15281],[12527,15354],[12547,15354],[12548,15354],[12551,15354],[12555,15354],[12558,15306],[12568,15307],[12569,15309],[12570,15309],[12571,15305],[12572,15305],[12573,15305],[12574,15305],[12578,15310],[12579,15310],[12580,15311],[12581,15308],[12583,15304],[12584,15312],[12585,15312],[12827,15308],[12841,15308],[12842,15304],[12843,15304],[12844,15304],[12846,15304],[12847,15304],[12848,15304],[12849,15304],[12850,15304],[12851,15304],[12989,15312],[12990,15312],[12991,15355],[12992,15316],[12993,15316],[13004,15281],[13005,15305],[13007,15317],[13008,15278],[13009,15281],[13011,15281],[13012,15317],[13013,15319],[13014,15306],[13038,15354],[13045,15306],[13048,15318],[13049,15319],[13050,15306],[13051,15356],[13086,15356],[13111,15322],[13112,15322],[13113,15320],[13159,15323],[13181,15317],[13182,15317],[13183,15317],[13198,15317],[13212,15325],[13213,15325],[13214,15325],[13249,15325],[13250,15325],[13269,15157],[13270,15157],[13289,15210],[13325,15164],[13326,15164],[13328,15164],[13330,15164],[13336,15164],[13338,15164],[13339,15164],[13346,15164],[13347,15164],[13349,15164],[13351,15164],[13353,15164],[13354,15164],[13355,15164],[13358,15164],[13360,15164],[13361,15164],[13365,15164],[13368,15164],[13369,15164],[13370,15164],[13371,15164],[13669,15357],[13673,15326],[13674,15326],[13709,15357],[13724,15165],[13728,15165],[13730,15165],[13733,15165],[13742,15165],[13743,15165],[13744,15165],[13745,15165],[13750,15165],[13751,15165],[13753,15204],[13755,15204],[13756,15165],[13757,15165],[13758,15165],[13759,15165],[13760,15165],[13761,15165],[13762,15165],[13763,15165],[13764,15165],[13765,15165],[13766,15165],[13767,15165],[13769,15165],[13770,15165],[13771,15165],[13772,15165],[13773,15165],[13774,15165],[13775,15227],[13776,15165],[14183,15165],[14231,15165],[14363,15227],[14364,15227],[14389,15329],[14390,15328],[14654,15118],[14655,15118],[14782,15333],[14783,15333],[14784,15333],[14787,15333],[14788,15333],[14789,15333],[14790,15333],[14791,15333],[14941,15119]],"b":[[34,"impl-AsRef%3C%5Bu8;+%3C%24hash+as+%24crate::Hash%3E::LEN%5D%3E-for-DescriptorId"],[35,"impl-AsRef%3C%5Bu8%5D%3E-for-DescriptorId"],[96,"impl-FromSql-for-Impl%3CScriptBuf%3E"],[97,"impl-FromSql-for-Impl%3CBlockHash%3E"],[98,"impl-FromSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[99,"impl-FromSql-for-Impl%3CTxid%3E"],[100,"impl-FromSql-for-Impl%3CDescriptorId%3E"],[101,"impl-FromSql-for-Impl%3CNetwork%3E"],[102,"impl-FromSql-for-Impl%3CTransaction%3E"],[103,"impl-FromSql-for-Impl%3CAmount%3E"],[155,"impl-Display-for-Balance"],[156,"impl-Debug-for-Balance"],[160,"impl-Display-for-DescriptorId"],[161,"impl-Debug-for-DescriptorId"],[162,"impl-UpperHex-for-DescriptorId"],[163,"impl-LowerHex-for-DescriptorId"],[165,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[167,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[168,"impl-From%3CTxPosInBlock%3C\'b%3E%3E-for-BlockId"],[282,"impl-ToSql-for-Impl%3CNetwork%3E"],[283,"impl-ToSql-for-Impl%3CTransaction%3E"],[284,"impl-ToSql-for-Impl%3CBlockHash%3E"],[285,"impl-ToSql-for-Impl%3CTxid%3E"],[286,"impl-ToSql-for-Impl%3CAmount%3E"],[287,"impl-ToSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[288,"impl-ToSql-for-Impl%3CScriptBuf%3E"],[289,"impl-ToSql-for-Impl%3CDescriptorId%3E"],[558,"impl-AsMut%3CScript%3E-for-Script"],[559,"impl-AsMut%3C%5Bu8%5D%3E-for-Script"],[560,"impl-AsMut%3C%5Bu8%5D%3E-for-ScriptBuf"],[561,"impl-AsMut%3CScript%3E-for-ScriptBuf"],[586,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2317%7D::%7Bconstant%230%7D%5D%3E-for-FilterHash"],[587,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHash"],[588,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHeader"],[589,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-FilterHeader"],[590,"impl-AsRef%3C%5Bu8;+bitcoin::::bip32::%7Bimpl%23106%7D::%7Bconstant%230%7D%5D%3E-for-XKeyIdentifier"],[591,"impl-AsRef%3C%5Bu8%5D%3E-for-XKeyIdentifier"],[592,"impl-AsRef%3C%5Bu8%5D%3E-for-BlockHash"],[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-TxMerkleNode"],[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-WitnessMerkleNode"],[597,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-WitnessMerkleNode"],[598,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-WitnessCommitment"],[599,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessCommitment"],[600,"impl-AsRef%3C%5Bu8%5D%3E-for-Script"],[601,"impl-AsRef%3CScript%3E-for-Script"],[602,"impl-AsRef%3CScript%3E-for-ScriptBuf"],[603,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptBuf"],[604,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-ScriptHash"],[605,"impl-AsRef%3CPushBytes%3E-for-ScriptHash"],[606,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptHash"],[607,"impl-AsRef%3C%5Bu8%5D%3E-for-WScriptHash"],[608,"impl-AsRef%3CPushBytes%3E-for-WScriptHash"],[609,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2363%7D::%7Bconstant%230%7D%5D%3E-for-WScriptHash"],[610,"impl-AsRef%3C%5Bu8%5D%3E-for-Txid"],[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-Wtxid"],[613,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-Wtxid"],[614,"impl-AsRef%3CPushBytes%3E-for-PubkeyHash"],[615,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2383%7D::%7Bconstant%230%7D%5D%3E-for-PubkeyHash"],[616,"impl-AsRef%3C%5Bu8%5D%3E-for-PubkeyHash"],[617,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2390%7D::%7Bconstant%230%7D%5D%3E-for-WPubkeyHash"],[618,"impl-AsRef%3C%5Bu8%5D%3E-for-WPubkeyHash"],[619,"impl-AsRef%3CPushBytes%3E-for-WPubkeyHash"],[620,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-LegacySighash"],[621,"impl-AsRef%3C%5Bu8%5D%3E-for-LegacySighash"],[622,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-SegwitV0Sighash"],[623,"impl-AsRef%3C%5Bu8%5D%3E-for-SegwitV0Sighash"],[624,"impl-AsRef%3C%5Bu8%5D%3E-for-TapSighash"],[625,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%23109%7D::%7Bconstant%230%7D%5D%3E-for-TapSighash"],[627,"impl-AsRef%3C%5Bu8%5D%3E-for-TapLeafHash"],[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-TapNodeHash"],[630,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23104%7D::%7Bconstant%230%7D%5D%3E-for-TapNodeHash"],[631,"impl-AsRef%3C%5Bu8%5D%3E-for-TapTweakHash"],[632,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23137%7D::%7Bconstant%230%7D%5D%3E-for-TapTweakHash"],[1086,"impl-Deserialize%3C\'de%3E-for-Psbt"],[1087,"impl-Psbt"],[1098,"impl-Div%3CWeight%3E-for-Amount"],[1099,"impl-Div%3Cu64%3E-for-Amount"],[1101,"impl-Div-for-Weight"],[1102,"impl-Div%3Cu64%3E-for-Weight"],[1151,"impl-PartialEq-for-Script"],[1152,"impl-PartialEq%3CScriptBuf%3E-for-Script"],[1153,"impl-PartialEq-for-ScriptBuf"],[1154,"impl-PartialEq%3CScript%3E-for-ScriptBuf"],[1328,"impl-Display-for-Denomination"],[1329,"impl-Debug-for-Denomination"],[1330,"impl-Display-for-Amount"],[1331,"impl-Debug-for-Amount"],[1332,"impl-Display-for-SignedAmount"],[1333,"impl-Debug-for-SignedAmount"],[1334,"impl-Display-for-FeeRate"],[1335,"impl-Debug-for-FeeRate"],[1336,"impl-Display-for-XOnlyPublicKey"],[1337,"impl-Debug-for-XOnlyPublicKey"],[1338,"impl-LowerHex-for-XOnlyPublicKey"],[1339,"impl-Debug-for-Weight"],[1340,"impl-Display-for-Weight"],[1341,"impl-Display-for-AddressType"],[1342,"impl-Debug-for-AddressType"],[1344,"impl-Display-for-Address"],[1345,"impl-Debug-for-Address%3CV%3E"],[1346,"impl-Debug-for-FilterHash"],[1347,"impl-UpperHex-for-FilterHash"],[1348,"impl-Display-for-FilterHash"],[1349,"impl-LowerHex-for-FilterHash"],[1350,"impl-Display-for-FilterHeader"],[1351,"impl-Debug-for-FilterHeader"],[1352,"impl-LowerHex-for-FilterHeader"],[1353,"impl-UpperHex-for-FilterHeader"],[1354,"impl-Display-for-XKeyIdentifier"],[1355,"impl-LowerHex-for-XKeyIdentifier"],[1356,"impl-UpperHex-for-XKeyIdentifier"],[1357,"impl-Debug-for-XKeyIdentifier"],[1358,"impl-LowerHex-for-BlockHash"],[1359,"impl-Display-for-BlockHash"],[1360,"impl-Debug-for-BlockHash"],[1361,"impl-UpperHex-for-BlockHash"],[1362,"impl-Debug-for-TxMerkleNode"],[1363,"impl-Display-for-TxMerkleNode"],[1364,"impl-LowerHex-for-TxMerkleNode"],[1365,"impl-UpperHex-for-TxMerkleNode"],[1366,"impl-Debug-for-WitnessMerkleNode"],[1367,"impl-LowerHex-for-WitnessMerkleNode"],[1368,"impl-Display-for-WitnessMerkleNode"],[1369,"impl-UpperHex-for-WitnessMerkleNode"],[1370,"impl-LowerHex-for-WitnessCommitment"],[1371,"impl-Display-for-WitnessCommitment"],[1372,"impl-UpperHex-for-WitnessCommitment"],[1373,"impl-Debug-for-WitnessCommitment"],[1375,"impl-Debug-for-Opcode"],[1376,"impl-Display-for-Opcode"],[1377,"impl-Debug-for-Script"],[1378,"impl-UpperHex-for-Script"],[1379,"impl-LowerHex-for-Script"],[1380,"impl-Display-for-Script"],[1381,"impl-UpperHex-for-ScriptBuf"],[1382,"impl-Debug-for-ScriptBuf"],[1383,"impl-LowerHex-for-ScriptBuf"],[1384,"impl-Display-for-ScriptBuf"],[1386,"impl-Debug-for-WitnessVersion"],[1387,"impl-Display-for-WitnessVersion"],[1388,"impl-LowerHex-for-ScriptHash"],[1389,"impl-Display-for-ScriptHash"],[1390,"impl-Debug-for-ScriptHash"],[1391,"impl-UpperHex-for-ScriptHash"],[1392,"impl-UpperHex-for-WScriptHash"],[1393,"impl-Debug-for-WScriptHash"],[1394,"impl-Display-for-WScriptHash"],[1395,"impl-LowerHex-for-WScriptHash"],[1396,"impl-Display-for-Txid"],[1397,"impl-LowerHex-for-Txid"],[1398,"impl-UpperHex-for-Txid"],[1399,"impl-Debug-for-Txid"],[1400,"impl-Debug-for-Wtxid"],[1401,"impl-Display-for-Wtxid"],[1402,"impl-LowerHex-for-Wtxid"],[1403,"impl-UpperHex-for-Wtxid"],[1404,"impl-Debug-for-OutPoint"],[1405,"impl-Display-for-OutPoint"],[1407,"impl-UpperHex-for-Sequence"],[1408,"impl-LowerHex-for-Sequence"],[1409,"impl-Display-for-Sequence"],[1410,"impl-Debug-for-Sequence"],[1415,"impl-Display-for-PublicKey"],[1416,"impl-Debug-for-PublicKey"],[1417,"impl-UpperHex-for-PubkeyHash"],[1418,"impl-LowerHex-for-PubkeyHash"],[1419,"impl-Debug-for-PubkeyHash"],[1420,"impl-Display-for-PubkeyHash"],[1421,"impl-Display-for-WPubkeyHash"],[1422,"impl-LowerHex-for-WPubkeyHash"],[1423,"impl-Debug-for-WPubkeyHash"],[1424,"impl-UpperHex-for-WPubkeyHash"],[1425,"impl-Debug-for-CompressedPublicKey"],[1426,"impl-Display-for-CompressedPublicKey"],[1427,"impl-Display-for-PrivateKey"],[1428,"impl-Debug-for-PrivateKey"],[1429,"impl-LowerHex-for-LegacySighash"],[1430,"impl-Display-for-LegacySighash"],[1431,"impl-Debug-for-LegacySighash"],[1432,"impl-UpperHex-for-LegacySighash"],[1433,"impl-Display-for-SegwitV0Sighash"],[1434,"impl-Debug-for-SegwitV0Sighash"],[1435,"impl-UpperHex-for-SegwitV0Sighash"],[1436,"impl-LowerHex-for-SegwitV0Sighash"],[1437,"impl-LowerHex-for-TapSighash"],[1438,"impl-Display-for-TapSighash"],[1439,"impl-Debug-for-TapSighash"],[1440,"impl-UpperHex-for-TapSighash"],[1441,"impl-Display-for-TapSighashType"],[1442,"impl-Debug-for-TapSighashType"],[1443,"impl-Display-for-EcdsaSighashType"],[1444,"impl-Debug-for-EcdsaSighashType"],[1447,"impl-Debug-for-Network"],[1448,"impl-Display-for-Network"],[1449,"impl-Debug-for-Work"],[1450,"impl-Display-for-Work"],[1451,"impl-UpperHex-for-Work"],[1452,"impl-LowerHex-for-Work"],[1453,"impl-Display-for-Target"],[1454,"impl-UpperHex-for-Target"],[1455,"impl-LowerHex-for-Target"],[1456,"impl-Debug-for-Target"],[1457,"impl-UpperHex-for-CompactTarget"],[1458,"impl-Debug-for-CompactTarget"],[1459,"impl-LowerHex-for-CompactTarget"],[1460,"impl-Display-for-Psbt"],[1461,"impl-Debug-for-Psbt"],[1462,"impl-LowerHex-for-TapLeafHash"],[1463,"impl-Display-for-TapLeafHash"],[1464,"impl-UpperHex-for-TapLeafHash"],[1465,"impl-Debug-for-TapLeafHash"],[1466,"impl-LowerHex-for-TapNodeHash"],[1467,"impl-UpperHex-for-TapNodeHash"],[1468,"impl-Debug-for-TapNodeHash"],[1469,"impl-Display-for-TapNodeHash"],[1470,"impl-UpperHex-for-TapTweakHash"],[1471,"impl-LowerHex-for-TapTweakHash"],[1472,"impl-Display-for-TapTweakHash"],[1473,"impl-Debug-for-TapTweakHash"],[1483,"impl-From%3CCompressedPublicKey%3E-for-XOnlyPublicKey"],[1484,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1485,"impl-From%3CTweakedPublicKey%3E-for-XOnlyPublicKey"],[1486,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1487,"impl-From%3CXOnlyPublicKey%3E-for-XOnlyPublicKey"],[1497,"impl-From%3C%26Xpub%3E-for-XKeyIdentifier"],[1498,"impl-From%3CHash%3E-for-XKeyIdentifier"],[1499,"impl-From%3CXpub%3E-for-XKeyIdentifier"],[1502,"impl-From%3C%26Header%3E-for-BlockHash"],[1503,"impl-From%3CHeader%3E-for-BlockHash"],[1504,"impl-From%3C%26Block%3E-for-BlockHash"],[1505,"impl-From%3CBlock%3E-for-BlockHash"],[1506,"impl-From%3CHash%3E-for-BlockHash"],[1507,"impl-From%3CTxid%3E-for-TxMerkleNode"],[1508,"impl-From%3CHash%3E-for-TxMerkleNode"],[1510,"impl-From%3CWtxid%3E-for-WitnessMerkleNode"],[1512,"impl-From%3CHash%3E-for-WitnessMerkleNode"],[1516,"impl-From%3CWitnessVersion%3E-for-Opcode"],[1518,"impl-From%3Cu8%3E-for-Opcode"],[1519,"impl-From%3C%26Script%3E-for-ScriptBuf"],[1520,"impl-From%3CAddress%3E-for-ScriptBuf"],[1521,"impl-From%3CCow%3C\'a,+Script%3E%3E-for-ScriptBuf"],[1522,"impl-From%3CVec%3Cu8%3E%3E-for-ScriptBuf"],[1527,"impl-From%3CHash%3E-for-ScriptHash"],[1528,"impl-From%3CScriptBuf%3E-for-ScriptHash"],[1529,"impl-From%3C%26Script%3E-for-ScriptHash"],[1530,"impl-From%3C%26ScriptBuf%3E-for-ScriptHash"],[1531,"impl-From%3C%26Script%3E-for-WScriptHash"],[1532,"impl-From%3CScriptBuf%3E-for-WScriptHash"],[1533,"impl-From%3C%26ScriptBuf%3E-for-WScriptHash"],[1534,"impl-From%3CHash%3E-for-WScriptHash"],[1536,"impl-From%3CHash%3E-for-Txid"],[1537,"impl-From%3C%26Transaction%3E-for-Txid"],[1539,"impl-From%3CTransaction%3E-for-Txid"],[1540,"impl-From%3C%26Transaction%3E-for-Wtxid"],[1541,"impl-From%3CHash%3E-for-Wtxid"],[1542,"impl-From%3CTransaction%3E-for-Wtxid"],[1546,"impl-From%3CLockTime%3E-for-Sequence"],[1547,"impl-From%3CRelLockTime%3E-for-Sequence"],[1551,"impl-From%3C%26%5BVec%3Cu8%3E%5D%3E-for-Witness"],[1553,"impl-From%3C%26%5B%26%5Bu8%5D%5D%3E-for-Witness"],[1554,"impl-From%3CVec%3CVec%3Cu8%3E%3E%3E-for-Witness"],[1555,"impl-From%3CVec%3C%26%5Bu8%5D%3E%3E-for-Witness"],[1557,"impl-From%3Cusize%3E-for-VarInt"],[1558,"impl-From%3Cu64%3E-for-VarInt"],[1559,"impl-From%3Cu16%3E-for-VarInt"],[1560,"impl-From%3Cu8%3E-for-VarInt"],[1561,"impl-From%3Cu32%3E-for-VarInt"],[1562,"impl-From%3CCompressedPublicKey%3E-for-PublicKey"],[1564,"impl-From%3CPublicKey%3E-for-PublicKey"],[1565,"impl-From%3CCompressedPublicKey%3E-for-PubkeyHash"],[1566,"impl-From%3CPublicKey%3E-for-PubkeyHash"],[1567,"impl-From%3CHash%3E-for-PubkeyHash"],[1568,"impl-From%3C%26PublicKey%3E-for-PubkeyHash"],[1569,"impl-From%3C%26CompressedPublicKey%3E-for-PubkeyHash"],[1571,"impl-From%3C%26CompressedPublicKey%3E-for-WPubkeyHash"],[1572,"impl-From%3CHash%3E-for-WPubkeyHash"],[1574,"impl-From%3CCompressedPublicKey%3E-for-WPubkeyHash"],[1597,"impl-From%3CScriptPath%3C\'s%3E%3E-for-TapLeafHash"],[1599,"impl-From%3CHash%3CTapLeafTag%3E%3E-for-TapLeafHash"],[1602,"impl-From%3CHash%3CTapBranchTag%3E%3E-for-TapNodeHash"],[1603,"impl-From%3CTapLeafHash%3E-for-TapNodeHash"],[1604,"impl-From%3C%26LeafNode%3E-for-TapNodeHash"],[1605,"impl-From%3CLeafNode%3E-for-TapNodeHash"],[1607,"impl-From%3CHash%3CTapTweakTag%3E%3E-for-TapTweakHash"],[1608,"impl-From%3CTaprootSpendInfo%3E-for-TapTweakHash"],[1610,"impl-From%3C%26TaprootSpendInfo%3E-for-TapTweakHash"],[1717,"impl-ParseableKey-for-XOnlyPublicKey"],[1718,"impl-XOnlyPublicKey"],[1731,"impl-PublicKey"],[1732,"impl-ParseableKey-for-PublicKey"],[1880,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-Script"],[1881,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-Script"],[1882,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Script"],[1883,"impl-Index%3CRange%3Cusize%3E%3E-for-Script"],[1884,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Script"],[1885,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-Script"],[1886,"impl-Index%3CRangeFull%3E-for-Script"],[2029,"impl-Mul%3Cu64%3E-for-Weight"],[2030,"impl-Mul%3CFeeRate%3E-for-Weight"],[2098,"impl-PartialOrd%3CScriptBuf%3E-for-Script"],[2099,"impl-PartialOrd-for-Script"],[2100,"impl-PartialOrd-for-ScriptBuf"],[2101,"impl-PartialOrd%3CScript%3E-for-ScriptBuf"],[2196,"impl-Serialize-for-XOnlyPublicKey"],[2197,"impl-XOnlyPublicKey"],[2235,"impl-Psbt"],[2236,"impl-Serialize-for-Psbt"],[2261,"impl-Sum%3C%26Weight%3E-for-Weight"],[2262,"impl-Sum-for-Weight"],[2475,"impl-TryFrom%3CString%3E-for-FeeRate"],[2476,"impl-TryFrom%3C%26str%3E-for-FeeRate"],[2478,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-FeeRate"],[2480,"impl-TryFrom%3CString%3E-for-Weight"],[2481,"impl-TryFrom%3C%26str%3E-for-Weight"],[2483,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Weight"],[2498,"impl-TryFrom%3CInstruction%3C\'a%3E%3E-for-WitnessVersion"],[2499,"impl-TryFrom%3COpcode%3E-for-WitnessVersion"],[2500,"impl-TryFrom%3CFe32%3E-for-WitnessVersion"],[2501,"impl-TryFrom%3Cu8%3E-for-WitnessVersion"],[2510,"impl-TryFrom%3CString%3E-for-Sequence"],[2511,"impl-TryFrom%3C%26str%3E-for-Sequence"],[2512,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Sequence"],[2531,"impl-TryFrom%3CMagic%3E-for-Network"],[2533,"impl-TryFrom%3CChainHash%3E-for-Network"],[2885,"impl-Display-for-FromScriptError"],[2886,"impl-Debug-for-FromScriptError"],[2887,"impl-Display-for-P2shError"],[2888,"impl-Debug-for-P2shError"],[2889,"impl-Display-for-UnknownAddressTypeError"],[2890,"impl-Debug-for-UnknownAddressTypeError"],[2891,"impl-Display-for-ParseError"],[2892,"impl-Debug-for-ParseError"],[2893,"impl-Display-for-UnknownHrpError"],[2894,"impl-Debug-for-UnknownHrpError"],[2895,"impl-Display-for-NetworkValidationError"],[2896,"impl-Debug-for-NetworkValidationError"],[2897,"impl-Display-for-InvalidBase58PayloadLengthError"],[2898,"impl-Debug-for-InvalidBase58PayloadLengthError"],[2899,"impl-Debug-for-LegacyAddressTooLongError"],[2900,"impl-Display-for-LegacyAddressTooLongError"],[2901,"impl-Debug-for-InvalidLegacyPrefixError"],[2902,"impl-Display-for-InvalidLegacyPrefixError"],[2906,"impl-From%3CInfallible%3E-for-FromScriptError"],[2907,"impl-From%3CError%3E-for-FromScriptError"],[2909,"impl-From%3CTryFromError%3E-for-FromScriptError"],[2913,"impl-From%3CDecodeError%3E-for-ParseError"],[2914,"impl-From%3CInvalidLegacyPrefixError%3E-for-ParseError"],[2915,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-ParseError"],[2916,"impl-From%3CError%3E-for-ParseError"],[2917,"impl-From%3CTryFromError%3E-for-ParseError"],[2918,"impl-From%3CUnknownHrpError%3E-for-ParseError"],[2920,"impl-From%3CLegacyAddressTooLongError%3E-for-ParseError"],[2921,"impl-From%3CError%3E-for-ParseError"],[2922,"impl-From%3CNetworkValidationError%3E-for-ParseError"],[2923,"impl-From%3CInfallible%3E-for-ParseError"],[3084,"impl-Display-for-ParseAmountError"],[3085,"impl-Debug-for-ParseAmountError"],[3086,"impl-Display-for-Display"],[3087,"impl-Debug-for-Display"],[3088,"impl-From%3CInvalidCharacterError%3E-for-ParseAmountError"],[3090,"impl-From%3CInfallible%3E-for-ParseAmountError"],[3091,"impl-From%3COutOfRangeError%3E-for-ParseAmountError"],[3092,"impl-From%3CTooPreciseError%3E-for-ParseAmountError"],[3093,"impl-From%3CMissingDigitsError%3E-for-ParseAmountError"],[3094,"impl-From%3CInputTooLargeError%3E-for-ParseAmountError"],[3147,"impl-AsMut%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3148,"impl-AsMut%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3155,"impl-AsRef%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%3COsStr%3E-for-String"],[3158,"impl-AsRef%3CPath%3E-for-String"],[3159,"impl-AsRef%3C%5Bu8%5D%3E-for-String"],[3160,"impl-AsRef%3Cstr%3E-for-String"],[3194,"impl-Decodable-for-Vec%3CVarInt%3E"],[3195,"impl-Decodable-for-Vec%3CHeader%3E"],[3196,"impl-Decodable-for-Vec%3C(u32,+Address)%3E"],[3197,"impl-Decodable-for-Vec%3CBlockHash%3E"],[3198,"impl-Decodable-for-Vec%3Cu64%3E"],[3199,"impl-Decodable-for-Vec%3CTapLeafHash%3E"],[3200,"impl-Decodable-for-Vec%3CTxOut%3E"],[3201,"impl-Decodable-for-Vec%3CFilterHeader%3E"],[3202,"impl-Decodable-for-Vec%3CFilterHash%3E"],[3203,"impl-Decodable-for-Vec%3CVec%3Cu8%3E%3E"],[3204,"impl-Decodable-for-Vec%3CAddrV2Message%3E"],[3205,"impl-Decodable-for-Vec%3CTxIn%3E"],[3206,"impl-Decodable-for-Vec%3CTxMerkleNode%3E"],[3207,"impl-Decodable-for-Vec%3CPrefilledTransaction%3E"],[3208,"impl-Decodable-for-Vec%3CTransaction%3E"],[3209,"impl-Decodable-for-Vec%3CInventory%3E"],[3210,"impl-Decodable-for-Vec%3Cu8%3E"],[3211,"impl-Decodable-for-Vec%3CShortId%3E"],[3212,"impl-Encodable-for-Vec%3CBlockHash%3E"],[3213,"impl-Encodable-for-Vec%3CInventory%3E"],[3214,"impl-Encodable-for-Vec%3CTxOut%3E"],[3215,"impl-Encodable-for-Vec%3CVarInt%3E"],[3216,"impl-Encodable-for-Vec%3CVec%3Cu8%3E%3E"],[3217,"impl-Encodable-for-Vec%3C(u32,+Address)%3E"],[3218,"impl-Encodable-for-Vec%3CAddrV2Message%3E"],[3219,"impl-Encodable-for-Vec%3CPrefilledTransaction%3E"],[3220,"impl-Encodable-for-Vec%3CTxIn%3E"],[3221,"impl-Encodable-for-Vec%3CFilterHeader%3E"],[3222,"impl-Encodable-for-Vec%3Cu8%3E"],[3223,"impl-Encodable-for-Vec%3CTapLeafHash%3E"],[3224,"impl-Encodable-for-Vec%3Cu64%3E"],[3225,"impl-Encodable-for-Vec%3CShortId%3E"],[3226,"impl-Encodable-for-Vec%3CFilterHash%3E"],[3227,"impl-Encodable-for-Vec%3CHeader%3E"],[3228,"impl-Encodable-for-Vec%3CTxMerkleNode%3E"],[3229,"impl-Encodable-for-Vec%3CTransaction%3E"],[3263,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3264,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3265,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3266,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3267,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3268,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3269,"impl-PartialEq-for-String"],[3270,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3271,"impl-PartialEq%3C%26str%3E-for-String"],[3272,"impl-PartialEq%3Cstr%3E-for-String"],[3273,"impl-PartialEq%3CValue%3E-for-String"],[3283,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3284,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3285,"impl-Extend%3CBox%3Cstr%3E%3E-for-String"],[3286,"impl-Extend%3C%26char%3E-for-String"],[3287,"impl-Extend%3C%26str%3E-for-String"],[3288,"impl-Extend%3CString%3E-for-String"],[3289,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3290,"impl-Extend%3Cchar%3E-for-String"],[3294,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3295,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3296,"impl-Extend%3CString%3E-for-String"],[3297,"impl-Extend%3Cchar%3E-for-String"],[3298,"impl-Extend%3C%26str%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%26T%3E-for-Vec%3CT,+A%3E"],[3302,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3303,"impl-Extend%3C%26char%3E-for-String"],[3304,"impl-Extend%3Cchar%3E-for-String"],[3306,"impl-Write-for-Vec%3Cu8,+A%3E"],[3307,"impl-Write-for-Vec%3Cu8%3E"],[3308,"impl-Debug-for-Error"],[3309,"impl-Display-for-Error"],[3310,"impl-Display-for-InvalidCharacterError"],[3311,"impl-Debug-for-InvalidCharacterError"],[3313,"impl-Display-for-String"],[3314,"impl-Debug-for-String"],[3315,"impl-From%3CIncorrectChecksumError%3E-for-Error"],[3316,"impl-From%3CTooShortError%3E-for-Error"],[3317,"impl-From%3CInfallible%3E-for-Error"],[3319,"impl-From%3CInvalidCharacterError%3E-for-Error"],[3321,"impl-From%3CBinaryHeap%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3322,"impl-From%3CVecDeque%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3323,"impl-From%3C%26mut+%5BT%5D%3E-for-Vec%3CT%3E"],[3324,"impl-From%3CPushBytesBuf%3E-for-Vec%3Cu8%3E"],[3325,"impl-From%3C%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3326,"impl-From%3CString%3E-for-Vec%3Cu8%3E"],[3328,"impl-From%3C%26%5BT%5D%3E-for-Vec%3CT%3E"],[3329,"impl-From%3CBox%3C%5BT%5D,+A%3E%3E-for-Vec%3CT,+A%3E"],[3330,"impl-From%3CCString%3E-for-Vec%3Cu8%3E"],[3331,"impl-From%3CDerivationPath%3E-for-Vec%3CChildNumber%3E"],[3332,"impl-From%3C%26mut+%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3333,"impl-From%3CScriptBuf%3E-for-Vec%3Cu8%3E"],[3334,"impl-From%3C%26str%3E-for-Vec%3Cu8%3E"],[3335,"impl-From%3CCow%3C\'a,+%5BT%5D%3E%3E-for-Vec%3CT%3E"],[3336,"impl-From%3C%26%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3337,"impl-From%3CTaprootMerkleBranch%3E-for-Vec%3CTapNodeHash%3E"],[3339,"impl-From%3C%26str%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%26String%3E-for-String"],[3343,"impl-From%3CBox%3Cstr%3E%3E-for-String"],[3344,"impl-From%3C%26mut+str%3E-for-String"],[3347,"impl-FromIterator%3CCow%3C\'a,+str%3E%3E-for-String"],[3348,"impl-FromIterator%3CBox%3Cstr%3E%3E-for-String"],[3349,"impl-FromIterator%3C%26str%3E-for-String"],[3350,"impl-FromIterator%3C%26char%3E-for-String"],[3351,"impl-FromIterator%3CString%3E-for-String"],[3352,"impl-FromIterator%3Cchar%3E-for-String"],[3389,"impl-IntoIterator-for-Vec%3CT,+A%3E"],[3390,"impl-IntoIterator-for-%26mut+Vec%3CT,+A%3E"],[3391,"impl-IntoIterator-for-%26Vec%3CT,+A%3E"],[3398,"impl-Merge-for-Vec%3CT%3E"],[3399,"impl-Vec%3CT,+A%3E"],[3409,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3410,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3411,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3412,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3413,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3414,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3415,"impl-PartialEq%3Cstr%3E-for-String"],[3416,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3417,"impl-PartialEq%3C%26str%3E-for-String"],[3497,"impl-Write-for-Vec%3Cu8%3E"],[3498,"impl-Write-for-Vec%3Cu8,+A%3E"],[3524,"impl-Display-for-IncorrectChecksumError"],[3525,"impl-Debug-for-IncorrectChecksumError"],[3526,"impl-Display-for-TooShortError"],[3527,"impl-Debug-for-TooShortError"],[3601,"impl-Display-for-EncodeSliceError"],[3602,"impl-Debug-for-EncodeSliceError"],[3603,"impl-Debug-for-DecodeError"],[3604,"impl-Display-for-DecodeError"],[3605,"impl-Debug-for-DecodeSliceError"],[3606,"impl-Display-for-DecodeSliceError"],[3662,"impl-Display-for-ParseAlphabetError"],[3663,"impl-Debug-for-ParseAlphabetError"],[3852,"impl-AsMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3853,"impl-AsMut%3C%5Bu8%5D%3E-for-ShortId"],[3857,"impl-AsRef%3C%5Bu8;+6%5D%3E-for-ShortId"],[3858,"impl-AsRef%3C%5Bu8%5D%3E-for-ShortId"],[3863,"impl-Borrow%3C%5Bu8;+6%5D%3E-for-ShortId"],[3864,"impl-Borrow%3C%5Bu8%5D%3E-for-ShortId"],[3872,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ShortId"],[3873,"impl-BorrowMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3934,"impl-Debug-for-Error"],[3935,"impl-Display-for-Error"],[3937,"impl-LowerHex-for-ShortId"],[3938,"impl-UpperHex-for-ShortId"],[3939,"impl-Debug-for-ShortId"],[3940,"impl-Display-for-ShortId"],[3943,"impl-Display-for-TxIndexOutOfRangeError"],[3944,"impl-Debug-for-TxIndexOutOfRangeError"],[3949,"impl-From%3C%5Bu8;+6%5D%3E-for-ShortId"],[3950,"impl-From%3C%26%5Bu8;+6%5D%3E-for-ShortId"],[4074,"impl-Display-for-Error"],[4075,"impl-Debug-for-Error"],[4083,"impl-From%3CError%3E-for-Error"],[4085,"impl-From%3CInfallible%3E-for-Error"],[4177,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4178,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainCode"],[4179,"impl-AsMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4180,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4185,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4186,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainCode"],[4187,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4188,"impl-AsRef%3C%5Bu8%5D%3E-for-Fingerprint"],[4192,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainCode"],[4194,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4195,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4197,"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"],[4208,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4209,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4303,"impl-Debug-for-ChainCode"],[4304,"impl-UpperHex-for-ChainCode"],[4305,"impl-LowerHex-for-ChainCode"],[4306,"impl-Display-for-ChainCode"],[4307,"impl-Display-for-Fingerprint"],[4308,"impl-UpperHex-for-Fingerprint"],[4309,"impl-LowerHex-for-Fingerprint"],[4310,"impl-Debug-for-Fingerprint"],[4311,"impl-Display-for-Xpriv"],[4312,"impl-Debug-for-Xpriv"],[4313,"impl-Display-for-Xpub"],[4314,"impl-Debug-for-Xpub"],[4315,"impl-Debug-for-ChildNumber"],[4316,"impl-Display-for-ChildNumber"],[4317,"impl-Debug-for-DerivationPath"],[4318,"impl-Display-for-DerivationPath"],[4319,"impl-Display-for-Error"],[4320,"impl-Debug-for-Error"],[4321,"impl-Debug-for-InvalidBase58PayloadLengthError"],[4322,"impl-Display-for-InvalidBase58PayloadLengthError"],[4325,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainCode"],[4326,"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"],[4335,"impl-From%3C%26%5BChildNumber%5D%3E-for-DerivationPath"],[4336,"impl-From%3CVec%3CChildNumber%3E%3E-for-DerivationPath"],[4337,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-Error"],[4339,"impl-From%3CError%3E-for-Error"],[4340,"impl-From%3CInfallible%3E-for-Error"],[4341,"impl-From%3CError%3E-for-Error"],[4568,"impl-Display-for-Bip34Error"],[4569,"impl-Debug-for-Bip34Error"],[4570,"impl-Display-for-ValidationError"],[4571,"impl-Debug-for-ValidationError"],[4646,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4647,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainHash"],[4650,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4651,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainHash"],[4653,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainHash"],[4654,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4655,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4657,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainHash"],[4665,"impl-Debug-for-ChainHash"],[4666,"impl-Display-for-ChainHash"],[4667,"impl-LowerHex-for-ChainHash"],[4668,"impl-UpperHex-for-ChainHash"],[4670,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainHash"],[4671,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4764,"impl-Debug-for-Height"],[4765,"impl-Display-for-Height"],[4766,"impl-Display-for-ParseHeightError"],[4767,"impl-Debug-for-ParseHeightError"],[4768,"impl-Display-for-Time"],[4769,"impl-Debug-for-Time"],[4770,"impl-Debug-for-ParseTimeError"],[4771,"impl-Display-for-ParseTimeError"],[4772,"impl-Display-for-ConversionError"],[4773,"impl-Debug-for-ConversionError"],[4774,"impl-Display-for-LockTime"],[4775,"impl-Debug-for-LockTime"],[4783,"impl-From%3CHeight%3E-for-LockTime"],[4785,"impl-From%3CTime%3E-for-LockTime"],[4786,"impl-From%3CAbsLockTime%3E-for-LockTime"],[4849,"impl-TryFrom%3C%26str%3E-for-Height"],[4851,"impl-TryFrom%3CString%3E-for-Height"],[4852,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[4855,"impl-TryFrom%3C%26str%3E-for-Time"],[4856,"impl-TryFrom%3CString%3E-for-Time"],[4857,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[4860,"impl-TryFrom%3CString%3E-for-LockTime"],[4861,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-LockTime"],[4863,"impl-TryFrom%3C%26str%3E-for-LockTime"],[4959,"impl-Debug-for-Height"],[4960,"impl-Display-for-Height"],[4961,"impl-Debug-for-Time"],[4962,"impl-Display-for-Time"],[4963,"impl-Display-for-TimeOverflowError"],[4964,"impl-Debug-for-TimeOverflowError"],[4965,"impl-Display-for-LockTime"],[4966,"impl-Debug-for-LockTime"],[4967,"impl-Debug-for-DisabledLockTimeError"],[4968,"impl-Display-for-DisabledLockTimeError"],[4969,"impl-Display-for-IncompatibleHeightError"],[4970,"impl-Debug-for-IncompatibleHeightError"],[4971,"impl-Debug-for-IncompatibleTimeError"],[4972,"impl-Display-for-IncompatibleTimeError"],[4977,"impl-From%3CHeight%3E-for-LockTime"],[4978,"impl-From%3CTime%3E-for-LockTime"],[4979,"impl-From%3CRelLockTime%3E-for-LockTime"],[5055,"impl-TryFrom%3CString%3E-for-Height"],[5056,"impl-TryFrom%3C%26str%3E-for-Height"],[5057,"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"],[5422,"impl-AsMut%3CPushBytes%3E-for-PushBytes"],[5423,"impl-AsMut%3C%5Bu8%5D%3E-for-PushBytes"],[5428,"impl-AsRef%3CPushBytes%3E-for-PushBytes"],[5429,"impl-AsRef%3C%5Bu8%5D%3E-for-PushBytes"],[5496,"impl-Debug-for-Builder"],[5497,"impl-Display-for-Builder"],[5503,"impl-Display-for-PushBytesError"],[5504,"impl-Debug-for-PushBytesError"],[5505,"impl-Debug-for-Error"],[5506,"impl-Display-for-Error"],[5513,"impl-From%3C%26mut+%5Bu8;+11%5D%3E-for-%26mut+PushBytes"],[5514,"impl-From%3C%26mut+%5Bu8;+56%5D%3E-for-%26mut+PushBytes"],[5515,"impl-From%3C%26%5Bu8;+0%5D%3E-for-%26PushBytes"],[5516,"impl-From%3C%26%5Bu8;+24%5D%3E-for-%26PushBytes"],[5517,"impl-From%3C%26mut+%5Bu8;+45%5D%3E-for-%26mut+PushBytes"],[5518,"impl-From%3C%26%5Bu8;+28%5D%3E-for-%26PushBytes"],[5519,"impl-From%3C%26%5Bu8;+30%5D%3E-for-%26PushBytes"],[5520,"impl-From%3C%26mut+%5Bu8;+36%5D%3E-for-%26mut+PushBytes"],[5521,"impl-From%3C%26mut+%5Bu8;+41%5D%3E-for-%26mut+PushBytes"],[5522,"impl-From%3C%26%5Bu8;+52%5D%3E-for-%26PushBytes"],[5523,"impl-From%3C%26%5Bu8;+3%5D%3E-for-%26PushBytes"],[5524,"impl-From%3C%26%5Bu8;+44%5D%3E-for-%26PushBytes"],[5525,"impl-From%3C%26mut+%5Bu8;+17%5D%3E-for-%26mut+PushBytes"],[5526,"impl-From%3C%26mut+%5Bu8;+67%5D%3E-for-%26mut+PushBytes"],[5527,"impl-From%3C%26mut+%5Bu8;+70%5D%3E-for-%26mut+PushBytes"],[5528,"impl-From%3C%26%5Bu8;+68%5D%3E-for-%26PushBytes"],[5529,"impl-From%3C%26%5Bu8;+62%5D%3E-for-%26PushBytes"],[5530,"impl-From%3C%26mut+%5Bu8;+15%5D%3E-for-%26mut+PushBytes"],[5531,"impl-From%3C%26mut+%5Bu8;+2%5D%3E-for-%26mut+PushBytes"],[5532,"impl-From%3C%26mut+%5Bu8;+32%5D%3E-for-%26mut+PushBytes"],[5533,"impl-From%3C%26%5Bu8;+10%5D%3E-for-%26PushBytes"],[5534,"impl-From%3C%26%5Bu8;+33%5D%3E-for-%26PushBytes"],[5535,"impl-From%3C%26%5Bu8;+25%5D%3E-for-%26PushBytes"],[5536,"impl-From%3C%26mut+%5Bu8;+43%5D%3E-for-%26mut+PushBytes"],[5537,"impl-From%3C%26%5Bu8;+42%5D%3E-for-%26PushBytes"],[5538,"impl-From%3C%26mut+%5Bu8;+24%5D%3E-for-%26mut+PushBytes"],[5539,"impl-From%3C%26mut+%5Bu8;+31%5D%3E-for-%26mut+PushBytes"],[5540,"impl-From%3C%26%5Bu8;+76%5D%3E-for-%26PushBytes"],[5541,"impl-From%3C%26%5Bu8;+36%5D%3E-for-%26PushBytes"],[5542,"impl-From%3C%26mut+%5Bu8;+1%5D%3E-for-%26mut+PushBytes"],[5543,"impl-From%3C%26%5Bu8;+72%5D%3E-for-%26PushBytes"],[5544,"impl-From%3C%26mut+%5Bu8;+7%5D%3E-for-%26mut+PushBytes"],[5545,"impl-From%3C%26%5Bu8;+35%5D%3E-for-%26PushBytes"],[5546,"impl-From%3C%26%5Bu8;+19%5D%3E-for-%26PushBytes"],[5547,"impl-From%3C%26%5Bu8;+8%5D%3E-for-%26PushBytes"],[5548,"impl-From%3C%26%5Bu8;+17%5D%3E-for-%26PushBytes"],[5549,"impl-From%3C%26mut+%5Bu8;+51%5D%3E-for-%26mut+PushBytes"],[5550,"impl-From%3C%26mut+%5Bu8;+69%5D%3E-for-%26mut+PushBytes"],[5551,"impl-From%3C%26%5Bu8;+16%5D%3E-for-%26PushBytes"],[5552,"impl-From%3C%26%5Bu8;+41%5D%3E-for-%26PushBytes"],[5553,"impl-From%3C%26%5Bu8;+1%5D%3E-for-%26PushBytes"],[5554,"impl-From%3C%26mut+%5Bu8;+58%5D%3E-for-%26mut+PushBytes"],[5555,"impl-From%3C%26mut+%5Bu8;+3%5D%3E-for-%26mut+PushBytes"],[5556,"impl-From%3C%26mut+%5Bu8;+6%5D%3E-for-%26mut+PushBytes"],[5557,"impl-From%3C%26mut+%5Bu8;+40%5D%3E-for-%26mut+PushBytes"],[5558,"impl-From%3C%26%5Bu8;+23%5D%3E-for-%26PushBytes"],[5559,"impl-From%3C%26%5Bu8;+53%5D%3E-for-%26PushBytes"],[5560,"impl-From%3C%26%5Bu8;+48%5D%3E-for-%26PushBytes"],[5561,"impl-From%3C%26mut+%5Bu8;+37%5D%3E-for-%26mut+PushBytes"],[5562,"impl-From%3C%26%5Bu8;+46%5D%3E-for-%26PushBytes"],[5563,"impl-From%3C%26%5Bu8;+58%5D%3E-for-%26PushBytes"],[5564,"impl-From%3C%26mut+%5Bu8;+8%5D%3E-for-%26mut+PushBytes"],[5565,"impl-From%3C%26%5Bu8;+15%5D%3E-for-%26PushBytes"],[5566,"impl-From%3C%26mut+%5Bu8;+0%5D%3E-for-%26mut+PushBytes"],[5567,"impl-From%3C%26%5Bu8;+61%5D%3E-for-%26PushBytes"],[5568,"impl-From%3C%26mut+%5Bu8;+34%5D%3E-for-%26mut+PushBytes"],[5569,"impl-From%3C%26%5Bu8;+39%5D%3E-for-%26PushBytes"],[5570,"impl-From%3C%26mut+%5Bu8;+27%5D%3E-for-%26mut+PushBytes"],[5571,"impl-From%3C%26%5Bu8;+29%5D%3E-for-%26PushBytes"],[5572,"impl-From%3C%26%5Bu8;+54%5D%3E-for-%26PushBytes"],[5573,"impl-From%3C%26mut+%5Bu8;+29%5D%3E-for-%26mut+PushBytes"],[5574,"impl-From%3C%26%5Bu8;+74%5D%3E-for-%26PushBytes"],[5575,"impl-From%3C%26mut+%5Bu8;+52%5D%3E-for-%26mut+PushBytes"],[5576,"impl-From%3C%26%5Bu8;+63%5D%3E-for-%26PushBytes"],[5577,"impl-From%3C%26mut+%5Bu8;+65%5D%3E-for-%26mut+PushBytes"],[5578,"impl-From%3C%26mut+%5Bu8;+68%5D%3E-for-%26mut+PushBytes"],[5579,"impl-From%3C%26mut+%5Bu8;+33%5D%3E-for-%26mut+PushBytes"],[5580,"impl-From%3C%26mut+%5Bu8;+14%5D%3E-for-%26mut+PushBytes"],[5581,"impl-From%3C%26%5Bu8;+12%5D%3E-for-%26PushBytes"],[5582,"impl-From%3C%26%5Bu8;+43%5D%3E-for-%26PushBytes"],[5583,"impl-From%3C%26%5Bu8;+40%5D%3E-for-%26PushBytes"],[5584,"impl-From%3C%26mut+%5Bu8;+47%5D%3E-for-%26mut+PushBytes"],[5585,"impl-From%3C%26%5Bu8;+34%5D%3E-for-%26PushBytes"],[5586,"impl-From%3C%26mut+%5Bu8;+48%5D%3E-for-%26mut+PushBytes"],[5587,"impl-From%3C%26%5Bu8;+26%5D%3E-for-%26PushBytes"],[5588,"impl-From%3C%26mut+%5Bu8;+53%5D%3E-for-%26mut+PushBytes"],[5589,"impl-From%3C%26%5Bu8;+9%5D%3E-for-%26PushBytes"],[5590,"impl-From%3C%26%5Bu8;+50%5D%3E-for-%26PushBytes"],[5591,"impl-From%3C%26mut+%5Bu8;+4%5D%3E-for-%26mut+PushBytes"],[5592,"impl-From%3C%26mut+%5Bu8;+46%5D%3E-for-%26mut+PushBytes"],[5593,"impl-From%3C%26%5Bu8;+73%5D%3E-for-%26PushBytes"],[5594,"impl-From%3C%26mut+%5Bu8;+16%5D%3E-for-%26mut+PushBytes"],[5595,"impl-From%3C%26mut+%5Bu8;+9%5D%3E-for-%26mut+PushBytes"],[5596,"impl-From%3C%26%5Bu8;+75%5D%3E-for-%26PushBytes"],[5597,"impl-From%3C%26mut+%5Bu8;+71%5D%3E-for-%26mut+PushBytes"],[5598,"impl-From%3C%26mut+%5Bu8;+55%5D%3E-for-%26mut+PushBytes"],[5599,"impl-From%3C%26%5Bu8;+49%5D%3E-for-%26PushBytes"],[5600,"impl-From%3C%26mut+%5Bu8;+28%5D%3E-for-%26mut+PushBytes"],[5601,"impl-From%3C%26%5Bu8;+55%5D%3E-for-%26PushBytes"],[5602,"impl-From%3C%26mut+%5Bu8;+10%5D%3E-for-%26mut+PushBytes"],[5603,"impl-From%3C%26mut+%5Bu8;+35%5D%3E-for-%26mut+PushBytes"],[5604,"impl-From%3C%26mut+%5Bu8;+61%5D%3E-for-%26mut+PushBytes"],[5605,"impl-From%3C%26%5Bu8;+57%5D%3E-for-%26PushBytes"],[5606,"impl-From%3C%26mut+%5Bu8;+60%5D%3E-for-%26mut+PushBytes"],[5607,"impl-From%3C%26%5Bu8;+22%5D%3E-for-%26PushBytes"],[5608,"impl-From%3C%26%5Bu8;+69%5D%3E-for-%26PushBytes"],[5609,"impl-From%3C%26%5Bu8;+60%5D%3E-for-%26PushBytes"],[5610,"impl-From%3C%26mut+%5Bu8;+26%5D%3E-for-%26mut+PushBytes"],[5611,"impl-From%3C%26%5Bu8;+27%5D%3E-for-%26PushBytes"],[5612,"impl-From%3C%26mut+%5Bu8;+76%5D%3E-for-%26mut+PushBytes"],[5613,"impl-From%3C%26mut+%5Bu8;+62%5D%3E-for-%26mut+PushBytes"],[5614,"impl-From%3C%26%5Bu8;+13%5D%3E-for-%26PushBytes"],[5615,"impl-From%3C%26%5Bu8;+71%5D%3E-for-%26PushBytes"],[5616,"impl-From%3C%26%5Bu8;+14%5D%3E-for-%26PushBytes"],[5617,"impl-From%3C%26%5Bu8;+59%5D%3E-for-%26PushBytes"],[5618,"impl-From%3C%26mut+%5Bu8;+75%5D%3E-for-%26mut+PushBytes"],[5619,"impl-From%3C%26mut+%5Bu8;+18%5D%3E-for-%26mut+PushBytes"],[5620,"impl-From%3C%26%5Bu8;+56%5D%3E-for-%26PushBytes"],[5621,"impl-From%3C%26mut+%5Bu8;+64%5D%3E-for-%26mut+PushBytes"],[5622,"impl-From%3C%26%5Bu8;+31%5D%3E-for-%26PushBytes"],[5623,"impl-From%3C%26%5Bu8;+4%5D%3E-for-%26PushBytes"],[5624,"impl-From%3C%26%5Bu8;+45%5D%3E-for-%26PushBytes"],[5625,"impl-From%3C%26mut+%5Bu8;+13%5D%3E-for-%26mut+PushBytes"],[5626,"impl-From%3C%26mut+%5Bu8;+59%5D%3E-for-%26mut+PushBytes"],[5627,"impl-From%3C%26mut+%5Bu8;+19%5D%3E-for-%26mut+PushBytes"],[5628,"impl-From%3C%26%5Bu8;+51%5D%3E-for-%26PushBytes"],[5629,"impl-From%3C%26mut+%5Bu8;+73%5D%3E-for-%26mut+PushBytes"],[5630,"impl-From%3C%26mut+%5Bu8;+5%5D%3E-for-%26mut+PushBytes"],[5631,"impl-From%3C%26%5Bu8;+18%5D%3E-for-%26PushBytes"],[5632,"impl-From%3C%26%5Bu8;+21%5D%3E-for-%26PushBytes"],[5633,"impl-From%3C%26%5Bu8;+20%5D%3E-for-%26PushBytes"],[5634,"impl-From%3C%26mut+%5Bu8;+66%5D%3E-for-%26mut+PushBytes"],[5635,"impl-From%3C%26%5Bu8;+7%5D%3E-for-%26PushBytes"],[5636,"impl-From%3C%26mut+%5Bu8;+50%5D%3E-for-%26mut+PushBytes"],[5637,"impl-From%3C%26mut+%5Bu8;+49%5D%3E-for-%26mut+PushBytes"],[5638,"impl-From%3C%26mut+%5Bu8;+42%5D%3E-for-%26mut+PushBytes"],[5639,"impl-From%3C%26mut+%5Bu8;+20%5D%3E-for-%26mut+PushBytes"],[5640,"impl-From%3C%26%5Bu8;+67%5D%3E-for-%26PushBytes"],[5641,"impl-From%3C%26%5Bu8;+5%5D%3E-for-%26PushBytes"],[5642,"impl-From%3C%26mut+%5Bu8;+74%5D%3E-for-%26mut+PushBytes"],[5643,"impl-From%3C%26%5Bu8;+66%5D%3E-for-%26PushBytes"],[5644,"impl-From%3C%26mut+%5Bu8;+39%5D%3E-for-%26mut+PushBytes"],[5645,"impl-From%3C%26%5Bu8;+11%5D%3E-for-%26PushBytes"],[5646,"impl-From%3C%26mut+%5Bu8;+23%5D%3E-for-%26mut+PushBytes"],[5647,"impl-From%3C%26mut+%5Bu8;+25%5D%3E-for-%26mut+PushBytes"],[5648,"impl-From%3C%26%5Bu8;+70%5D%3E-for-%26PushBytes"],[5649,"impl-From%3C%26%5Bu8;+6%5D%3E-for-%26PushBytes"],[5650,"impl-From%3C%26%5Bu8;+2%5D%3E-for-%26PushBytes"],[5651,"impl-From%3C%26%5Bu8;+37%5D%3E-for-%26PushBytes"],[5652,"impl-From%3C%26%5Bu8;+32%5D%3E-for-%26PushBytes"],[5653,"impl-From%3C%26%5Bu8;+65%5D%3E-for-%26PushBytes"],[5654,"impl-From%3C%26mut+%5Bu8;+44%5D%3E-for-%26mut+PushBytes"],[5655,"impl-From%3C%26mut+%5Bu8;+30%5D%3E-for-%26mut+PushBytes"],[5656,"impl-From%3C%26mut+%5Bu8;+54%5D%3E-for-%26mut+PushBytes"],[5657,"impl-From%3C%26mut+%5Bu8;+38%5D%3E-for-%26mut+PushBytes"],[5658,"impl-From%3C%26mut+%5Bu8;+63%5D%3E-for-%26mut+PushBytes"],[5659,"impl-From%3C%26mut+%5Bu8;+12%5D%3E-for-%26mut+PushBytes"],[5660,"impl-From%3C%26mut+%5Bu8;+72%5D%3E-for-%26mut+PushBytes"],[5661,"impl-From%3C%26%5Bu8;+38%5D%3E-for-%26PushBytes"],[5662,"impl-From%3C%26mut+%5Bu8;+22%5D%3E-for-%26mut+PushBytes"],[5663,"impl-From%3C%26%5Bu8;+47%5D%3E-for-%26PushBytes"],[5664,"impl-From%3C%26mut+%5Bu8;+57%5D%3E-for-%26mut+PushBytes"],[5665,"impl-From%3C%26mut+%5Bu8;+21%5D%3E-for-%26mut+PushBytes"],[5666,"impl-From%3C%26%5Bu8;+64%5D%3E-for-%26PushBytes"],[5667,"impl-From%3C%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5668,"impl-From%3C%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5669,"impl-From%3C%26%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5670,"impl-From%3C%26%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5671,"impl-From%3CWPubkeyHash%3E-for-PushBytesBuf"],[5672,"impl-From%3C%26%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5673,"impl-From%3C%26%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5674,"impl-From%3C%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5675,"impl-From%3C%26%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5676,"impl-From%3C%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5677,"impl-From%3C%26%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5678,"impl-From%3C%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5679,"impl-From%3C%26%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5680,"impl-From%3C%26%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5681,"impl-From%3C%26%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5682,"impl-From%3C%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5683,"impl-From%3C%26%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5684,"impl-From%3C%26%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5685,"impl-From%3C%26%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5686,"impl-From%3C%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5687,"impl-From%3C%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5688,"impl-From%3C%26%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5689,"impl-From%3C%26%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5690,"impl-From%3C%26%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5691,"impl-From%3C%26%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5692,"impl-From%3C%26%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5693,"impl-From%3C%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5694,"impl-From%3C%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5695,"impl-From%3C%26%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5696,"impl-From%3C%26%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5697,"impl-From%3C%26%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5698,"impl-From%3C%26%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5699,"impl-From%3C%26%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5700,"impl-From%3C%26%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5701,"impl-From%3C%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5702,"impl-From%3C%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5703,"impl-From%3C%26%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5704,"impl-From%3C%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5705,"impl-From%3C%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5706,"impl-From%3C%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5707,"impl-From%3C%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5708,"impl-From%3C%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5709,"impl-From%3C%26%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5710,"impl-From%3C%26%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5711,"impl-From%3C%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5712,"impl-From%3C%26%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5713,"impl-From%3C%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5714,"impl-From%3C%26%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5715,"impl-From%3C%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5716,"impl-From%3C%26%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5717,"impl-From%3C%26%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5719,"impl-From%3C%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5720,"impl-From%3C%26%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5721,"impl-From%3C%26%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5722,"impl-From%3C%26%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5723,"impl-From%3C%26%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5724,"impl-From%3C%26%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5725,"impl-From%3C%26%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5726,"impl-From%3C%26%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5727,"impl-From%3C%26%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5728,"impl-From%3C%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5729,"impl-From%3C%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5730,"impl-From%3C%26%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5731,"impl-From%3C%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5732,"impl-From%3C%26%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5733,"impl-From%3C%26%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5734,"impl-From%3C%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5735,"impl-From%3C%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5736,"impl-From%3C%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5737,"impl-From%3C%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5738,"impl-From%3C%26%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5739,"impl-From%3C%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5740,"impl-From%3C%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5741,"impl-From%3C%26%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5742,"impl-From%3C%26%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5743,"impl-From%3C%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5744,"impl-From%3C%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5745,"impl-From%3C%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5746,"impl-From%3C%26%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5747,"impl-From%3C%26%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5748,"impl-From%3C%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5749,"impl-From%3C%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5750,"impl-From%3C%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5751,"impl-From%3C%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5752,"impl-From%3C%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5753,"impl-From%3C%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5754,"impl-From%3C%26%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5755,"impl-From%3C%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5756,"impl-From%3C%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5757,"impl-From%3C%26%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5758,"impl-From%3C%26%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5759,"impl-From%3C%26%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5760,"impl-From%3C%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5761,"impl-From%3C%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5762,"impl-From%3C%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5763,"impl-From%3C%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5764,"impl-From%3C%26%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5765,"impl-From%3C%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5766,"impl-From%3C%26%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5767,"impl-From%3C%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5768,"impl-From%3C%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5769,"impl-From%3C%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5770,"impl-From%3C%26%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5771,"impl-From%3C%26%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5772,"impl-From%3C%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5773,"impl-From%3C%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5774,"impl-From%3C%26%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5775,"impl-From%3C%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5776,"impl-From%3C%26%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5777,"impl-From%3C%26%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5778,"impl-From%3C%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5779,"impl-From%3C%26%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5780,"impl-From%3C%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5781,"impl-From%3C%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5782,"impl-From%3C%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5783,"impl-From%3C%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5784,"impl-From%3C%26%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5785,"impl-From%3C%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5786,"impl-From%3C%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5787,"impl-From%3C%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5788,"impl-From%3C%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5789,"impl-From%3C%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5790,"impl-From%3C%26%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5791,"impl-From%3C%26%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5792,"impl-From%3C%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5793,"impl-From%3C%26%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5794,"impl-From%3C%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5795,"impl-From%3C%26%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5796,"impl-From%3C%26%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5797,"impl-From%3C%26%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5798,"impl-From%3C%26%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5799,"impl-From%3C%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5800,"impl-From%3C%26%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5801,"impl-From%3C%26%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5802,"impl-From%3C%26%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5803,"impl-From%3C%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5804,"impl-From%3CWScriptHash%3E-for-PushBytesBuf"],[5805,"impl-From%3C%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5806,"impl-From%3C%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5807,"impl-From%3C%26%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5808,"impl-From%3C%26%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5809,"impl-From%3C%26%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5810,"impl-From%3C%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5811,"impl-From%3C%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5812,"impl-From%3C%26%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5813,"impl-From%3C%26%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5814,"impl-From%3CPubkeyHash%3E-for-PushBytesBuf"],[5815,"impl-From%3C%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5816,"impl-From%3C%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5817,"impl-From%3C%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5818,"impl-From%3C%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5819,"impl-From%3C%26%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5820,"impl-From%3C%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5821,"impl-From%3C%26%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5822,"impl-From%3CScriptHash%3E-for-PushBytesBuf"],[5823,"impl-From%3C%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5824,"impl-From%3C%26%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5825,"impl-From%3C%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5827,"impl-From%3CUintError%3E-for-Error"],[5829,"impl-From%3CInfallible%3E-for-Error"],[5832,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-PushBytes"],[5833,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-PushBytes"],[5834,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-PushBytes"],[5835,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-PushBytes"],[5836,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-PushBytes"],[5837,"impl-Index%3CRangeFull%3E-for-PushBytes"],[5838,"impl-Index%3Cusize%3E-for-PushBytes"],[5839,"impl-Index%3CRange%3Cusize%3E%3E-for-PushBytes"],[5918,"impl-TryFrom%3C%26%5Bu8%5D%3E-for-%26PushBytes"],[5919,"impl-TryFrom%3C%26mut+%5Bu8%5D%3E-for-%26mut+PushBytes"],[5966,"impl-Display-for-Error"],[5967,"impl-Debug-for-Error"],[6024,"impl-Display-for-FromStrError"],[6025,"impl-Debug-for-FromStrError"],[6026,"impl-Display-for-TryFromInstructionError"],[6027,"impl-Debug-for-TryFromInstructionError"],[6028,"impl-Display-for-TryFromError"],[6029,"impl-Debug-for-TryFromError"],[6031,"impl-From%3CTryFromError%3E-for-FromStrError"],[6032,"impl-From%3CParseIntError%3E-for-FromStrError"],[6033,"impl-From%3CInfallible%3E-for-FromStrError"],[6034,"impl-From%3CTryFromError%3E-for-TryFromInstructionError"],[6035,"impl-From%3CInfallible%3E-for-TryFromInstructionError"],[6131,"impl-Debug-for-ParseOutPointError"],[6132,"impl-Display-for-ParseOutPointError"],[6133,"impl-Display-for-InputsIndexError"],[6134,"impl-Debug-for-InputsIndexError"],[6135,"impl-Display-for-OutputsIndexError"],[6136,"impl-Debug-for-OutputsIndexError"],[6137,"impl-Display-for-IndexOutOfBoundsError"],[6138,"impl-Debug-for-IndexOutOfBoundsError"],[6139,"impl-Display-for-Version"],[6140,"impl-Debug-for-Version"],[6285,"impl-Display-for-DecodeError%3CE%3E"],[6286,"impl-Debug-for-DecodeError%3CE%3E"],[6288,"impl-From%3C%26Network%3E-for-%26Params"],[6289,"impl-From%3CNetwork%3E-for-Params"],[6290,"impl-From%3C%26Network%3E-for-Params"],[6291,"impl-From%3CNetwork%3E-for-%26Params"],[6378,"impl-Display-for-Error"],[6379,"impl-Debug-for-Error"],[6380,"impl-Debug-for-FromHexError"],[6381,"impl-Display-for-FromHexError"],[6384,"impl-From%3CError%3E-for-Error"],[6385,"impl-From%3CInfallible%3E-for-Error"],[6568,"impl-AsRef%3C%5Bu8%5D%3E-for-SerializedSignature"],[6569,"impl-AsRef%3CPushBytes%3E-for-SerializedSignature"],[6596,"impl-Debug-for-Signature"],[6597,"impl-Display-for-Signature"],[6598,"impl-Debug-for-SerializedSignature"],[6599,"impl-LowerHex-for-SerializedSignature"],[6600,"impl-Display-for-SerializedSignature"],[6601,"impl-UpperHex-for-SerializedSignature"],[6602,"impl-Display-for-Error"],[6603,"impl-Debug-for-Error"],[6606,"impl-From%3CInfallible%3E-for-Error"],[6607,"impl-From%3CError%3E-for-Error"],[6608,"impl-From%3CNonStandardSighashTypeError%3E-for-Error"],[6610,"impl-From%3CHexToBytesError%3E-for-Error"],[6620,"impl-Signature"],[6621,"impl-Serialize-for-Signature"],[6684,"impl-Debug-for-PrefixedHexError"],[6685,"impl-Display-for-PrefixedHexError"],[6686,"impl-Debug-for-UnprefixedHexError"],[6687,"impl-Display-for-UnprefixedHexError"],[6688,"impl-Display-for-MissingPrefixError"],[6689,"impl-Debug-for-MissingPrefixError"],[6690,"impl-Display-for-ContainsPrefixError"],[6691,"impl-Debug-for-ContainsPrefixError"],[6693,"impl-From%3CParseIntError%3E-for-PrefixedHexError"],[6694,"impl-From%3CMissingPrefixError%3E-for-PrefixedHexError"],[6696,"impl-From%3CContainsPrefixError%3E-for-UnprefixedHexError"],[6697,"impl-From%3CParseIntError%3E-for-UnprefixedHexError"],[6783,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::hash160::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[6784,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[6796,"impl-Display-for-Hash"],[6797,"impl-UpperHex-for-Hash"],[6798,"impl-LowerHex-for-Hash"],[6799,"impl-Debug-for-Hash"],[6800,"impl-From%3CScriptHash%3E-for-Hash"],[6801,"impl-From%3CXKeyIdentifier%3E-for-Hash"],[6803,"impl-From%3CPubkeyHash%3E-for-Hash"],[6804,"impl-From%3CWPubkeyHash%3E-for-Hash"],[6888,"impl-Display-for-HexToBytesError"],[6889,"impl-Debug-for-HexToBytesError"],[6890,"impl-Debug-for-InvalidCharError"],[6891,"impl-Display-for-InvalidCharError"],[6892,"impl-Debug-for-OddLengthStringError"],[6893,"impl-Display-for-OddLengthStringError"],[6894,"impl-Debug-for-HexToArrayError"],[6895,"impl-Display-for-HexToArrayError"],[6901,"impl-From%3CInvalidCharError%3E-for-HexToBytesError"],[6902,"impl-From%3COddLengthStringError%3E-for-HexToBytesError"],[6905,"impl-From%3CInvalidLengthError%3E-for-HexToArrayError"],[6906,"impl-From%3CInvalidCharError%3E-for-HexToArrayError"],[7017,"impl-LowerHex-for-DisplayByteSlice%3C\'a%3E"],[7018,"impl-UpperHex-for-DisplayByteSlice%3C\'a%3E"],[7019,"impl-Display-for-DisplayByteSlice%3C\'a%3E"],[7020,"impl-Debug-for-DisplayByteSlice%3C\'a%3E"],[7021,"impl-UpperHex-for-DisplayArray%3C\'a,+LEN%3E"],[7022,"impl-LowerHex-for-DisplayArray%3C\'a,+LEN%3E"],[7023,"impl-Debug-for-DisplayArray%3C\'a,+LEN%3E"],[7024,"impl-Display-for-DisplayArray%3C\'a,+LEN%3E"],[7062,"impl-Display-for-InvalidLengthError"],[7063,"impl-Debug-for-InvalidLengthError"],[7111,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::ripemd160::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[7112,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[7139,"impl-Write-for-HashEngine"],[7140,"impl-Write-for-HashEngine"],[7141,"impl-UpperHex-for-Hash"],[7142,"impl-Debug-for-Hash"],[7143,"impl-Display-for-Hash"],[7144,"impl-LowerHex-for-Hash"],[7176,"impl-Write-for-HashEngine"],[7177,"impl-Write-for-HashEngine"],[7362,"impl-Display-for-Unexpected%3C\'a%3E"],[7363,"impl-Debug-for-Unexpected%3C\'a%3E"],[7594,"impl-Error-for-Error"],[7595,"impl-Error-for-Error"],[8477,"impl-Debug-for-Error"],[8478,"impl-Display-for-Error"],[8617,"impl-MapAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8618,"impl-SeqAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8815,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8816,"impl-dyn+Error"],[8817,"impl-dyn+Error+%2B+Send"],[8818,"impl-dyn+Error"],[8819,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8820,"impl-dyn+Error+%2B+Send"],[8821,"impl-dyn+Error+%2B+Send"],[8822,"impl-dyn+Error"],[8823,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8831,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[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-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8836,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8837,"impl-SerializeMap-for-Impossible%3COk,+Error%3E"],[8840,"impl-dyn+Error+%2B+Send"],[8841,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8842,"impl-dyn+Error"],[8851,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8852,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8860,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8861,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8862,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8863,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8911,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha1::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8912,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[8939,"impl-Write-for-HashEngine"],[8940,"impl-Write-for-HashEngine"],[8941,"impl-Display-for-Hash"],[8942,"impl-UpperHex-for-Hash"],[8943,"impl-Debug-for-Hash"],[8944,"impl-LowerHex-for-Hash"],[8975,"impl-Write-for-HashEngine"],[8976,"impl-Write-for-HashEngine"],[8982,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256::%7Bimpl%2320%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8983,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9025,"impl-Write-for-HashEngine"],[9026,"impl-Write-for-HashEngine"],[9027,"impl-LowerHex-for-Hash"],[9028,"impl-UpperHex-for-Hash"],[9029,"impl-Display-for-Hash"],[9030,"impl-Debug-for-Hash"],[9031,"impl-UpperHex-for-Midstate"],[9032,"impl-LowerHex-for-Midstate"],[9033,"impl-Display-for-Midstate"],[9034,"impl-Debug-for-Midstate"],[9035,"impl-From%3CWScriptHash%3E-for-Hash"],[9036,"impl-From%3CDescriptorId%3E-for-Hash"],[9089,"impl-Write-for-HashEngine"],[9090,"impl-Write-for-HashEngine"],[9094,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9095,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256d::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9109,"impl-LowerHex-for-Hash"],[9110,"impl-Display-for-Hash"],[9111,"impl-Debug-for-Hash"],[9112,"impl-UpperHex-for-Hash"],[9113,"impl-From%3CTxMerkleNode%3E-for-Hash"],[9114,"impl-From%3CLegacySighash%3E-for-Hash"],[9116,"impl-From%3CWtxid%3E-for-Hash"],[9117,"impl-From%3CBlockHash%3E-for-Hash"],[9118,"impl-From%3CSegwitV0Sighash%3E-for-Hash"],[9119,"impl-From%3CWitnessCommitment%3E-for-Hash"],[9120,"impl-From%3CFilterHeader%3E-for-Hash"],[9121,"impl-From%3CHash%3E-for-Hash"],[9122,"impl-From%3CFilterHash%3E-for-Hash"],[9123,"impl-From%3CTxid%3E-for-Hash"],[9124,"impl-From%3CWitnessMerkleNode%3E-for-Hash"],[9148,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256t::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash%3CT%3E"],[9149,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash%3CT%3E"],[9163,"impl-Display-for-Hash%3CT%3E"],[9164,"impl-Debug-for-Hash%3CT%3E"],[9165,"impl-LowerHex-for-Hash%3CT%3E"],[9166,"impl-UpperHex-for-Hash%3CT%3E"],[9167,"impl-From%3CTapNodeHash%3E-for-Hash%3CTapBranchTag%3E"],[9168,"impl-From%3CTapLeafHash%3E-for-Hash%3CTapLeafTag%3E"],[9169,"impl-From%3CTapTweakHash%3E-for-Hash%3CTapTweakTag%3E"],[9171,"impl-From%3CTapSighash%3E-for-Hash%3CTapSighashTag%3E"],[9195,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha384::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9196,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9213,"impl-Display-for-Hash"],[9214,"impl-UpperHex-for-Hash"],[9215,"impl-LowerHex-for-Hash"],[9216,"impl-Debug-for-Hash"],[9251,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9252,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9279,"impl-Write-for-HashEngine"],[9280,"impl-Write-for-HashEngine"],[9281,"impl-Display-for-Hash"],[9282,"impl-Debug-for-Hash"],[9283,"impl-LowerHex-for-Hash"],[9284,"impl-UpperHex-for-Hash"],[9315,"impl-Write-for-HashEngine"],[9316,"impl-Write-for-HashEngine"],[9321,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9322,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512_256::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9339,"impl-UpperHex-for-Hash"],[9340,"impl-LowerHex-for-Hash"],[9341,"impl-Debug-for-Hash"],[9342,"impl-Display-for-Hash"],[9378,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9379,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::siphash24::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9411,"impl-Write-for-HashEngine"],[9412,"impl-Write-for-HashEngine"],[9413,"impl-Display-for-Hash"],[9414,"impl-LowerHex-for-Hash"],[9415,"impl-Debug-for-Hash"],[9416,"impl-UpperHex-for-Hash"],[9463,"impl-Write-for-HashEngine"],[9464,"impl-Write-for-HashEngine"],[9514,"impl-BufRead-for-FromStd%3CT%3E"],[9515,"impl-BufRead-for-FromStd%3CT%3E"],[9516,"impl-BufRead-for-ToStd%3CT%3E"],[9517,"impl-BufRead-for-ToStd%3CT%3E"],[9555,"impl-BufRead-for-FromStd%3CT%3E"],[9556,"impl-BufRead-for-FromStd%3CT%3E"],[9557,"impl-BufRead-for-ToStd%3CT%3E"],[9558,"impl-BufRead-for-ToStd%3CT%3E"],[9562,"impl-Write-for-FromStd%3CT%3E"],[9563,"impl-Write-for-FromStd%3CT%3E"],[9564,"impl-Write-for-ToStd%3CT%3E"],[9565,"impl-Write-for-ToStd%3CT%3E"],[9566,"impl-Write-for-Sink"],[9567,"impl-Write-for-Sink"],[9568,"impl-Display-for-Error"],[9569,"impl-Debug-for-Error"],[9576,"impl-From%3CErrorKind%3E-for-Error"],[9577,"impl-From%3CError%3E-for-Error"],[9612,"impl-Read-for-FromStd%3CT%3E"],[9613,"impl-Read-for-FromStd%3CT%3E"],[9614,"impl-Read-for-ToStd%3CT%3E"],[9615,"impl-Read-for-ToStd%3CT%3E"],[9622,"impl-Read-for-FromStd%3CT%3E"],[9623,"impl-Read-for-FromStd%3CT%3E"],[9624,"impl-Read-for-ToStd%3CT%3E"],[9625,"impl-Read-for-ToStd%3CT%3E"],[9700,"impl-Write-for-FromStd%3CT%3E"],[9701,"impl-Write-for-FromStd%3CT%3E"],[9702,"impl-Write-for-ToStd%3CT%3E"],[9703,"impl-Write-for-ToStd%3CT%3E"],[9704,"impl-Write-for-Sink"],[9705,"impl-Write-for-Sink"],[9706,"impl-Write-for-FromStd%3CT%3E"],[9707,"impl-Write-for-FromStd%3CT%3E"],[9708,"impl-Write-for-ToStd%3CT%3E"],[9709,"impl-Write-for-ToStd%3CT%3E"],[9711,"impl-Write-for-Sink"],[9712,"impl-Write-for-Sink"],[9874,"impl-LowerHex-for-TweakedPublicKey"],[9875,"impl-Display-for-TweakedPublicKey"],[9876,"impl-Debug-for-TweakedPublicKey"],[9878,"impl-Display-for-FromSliceError"],[9879,"impl-Debug-for-FromSliceError"],[9880,"impl-Display-for-FromWifError"],[9881,"impl-Debug-for-FromWifError"],[9882,"impl-Display-for-ParsePublicKeyError"],[9883,"impl-Debug-for-ParsePublicKeyError"],[9884,"impl-Display-for-ParseCompressedPublicKeyError"],[9885,"impl-Debug-for-ParseCompressedPublicKeyError"],[9886,"impl-Debug-for-UncompressedPublicKeyError"],[9887,"impl-Display-for-UncompressedPublicKeyError"],[9888,"impl-Display-for-InvalidBase58PayloadLengthError"],[9889,"impl-Debug-for-InvalidBase58PayloadLengthError"],[9890,"impl-Debug-for-InvalidAddressVersionError"],[9891,"impl-Display-for-InvalidAddressVersionError"],[9900,"impl-From%3CInfallible%3E-for-FromSliceError"],[9901,"impl-From%3CError%3E-for-FromSliceError"],[9903,"impl-From%3CError%3E-for-FromWifError"],[9904,"impl-From%3CInfallible%3E-for-FromWifError"],[9905,"impl-From%3CError%3E-for-FromWifError"],[9906,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-FromWifError"],[9907,"impl-From%3CInvalidAddressVersionError%3E-for-FromWifError"],[9909,"impl-From%3CFromSliceError%3E-for-ParsePublicKeyError"],[9910,"impl-From%3CInfallible%3E-for-ParsePublicKeyError"],[9912,"impl-From%3CError%3E-for-ParseCompressedPublicKeyError"],[9913,"impl-From%3CHexToArrayError%3E-for-ParseCompressedPublicKeyError"],[9915,"impl-From%3CInfallible%3E-for-ParseCompressedPublicKeyError"],[9979,"impl-Serialize-for-TweakedPublicKey"],[9980,"impl-TweakedPublicKey"],[10028,"impl-TryFrom%3Ci32%3E-for-Parity"],[10029,"impl-TryFrom%3Cu8%3E-for-Parity"],[10117,"impl-Display-for-MerkleBlockError"],[10118,"impl-Debug-for-MerkleBlockError"],[10167,"impl-Display-for-ParseNetworkError"],[10168,"impl-Debug-for-ParseNetworkError"],[10169,"impl-Display-for-UnknownChainHashError"],[10170,"impl-Debug-for-UnknownChainHashError"],[10214,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10215,"impl-AsMut%3C%5Bu8%5D%3E-for-Magic"],[10216,"impl-AsRef%3C%5Bu8%5D%3E-for-Magic"],[10217,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Magic"],[10225,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Magic"],[10226,"impl-Borrow%3C%5Bu8%5D%3E-for-Magic"],[10231,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Magic"],[10232,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10271,"impl-Display-for-ServiceFlags"],[10272,"impl-Debug-for-ServiceFlags"],[10273,"impl-UpperHex-for-ServiceFlags"],[10274,"impl-LowerHex-for-ServiceFlags"],[10275,"impl-UpperHex-for-Magic"],[10276,"impl-LowerHex-for-Magic"],[10277,"impl-Display-for-Magic"],[10278,"impl-Debug-for-Magic"],[10279,"impl-Debug-for-ParseMagicError"],[10280,"impl-Display-for-ParseMagicError"],[10281,"impl-Debug-for-UnknownMagicError"],[10282,"impl-Display-for-UnknownMagicError"],[10486,"impl-Debug-for-CommandString"],[10487,"impl-Display-for-CommandString"],[10488,"impl-Debug-for-CommandStringError"],[10489,"impl-Display-for-CommandStringError"],[10511,"impl-TryFrom%3C%26str%3E-for-CommandString"],[10512,"impl-TryFrom%3CString%3E-for-CommandString"],[10514,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-CommandString"],[10987,"impl-Display-for-ParseIntError"],[10988,"impl-Debug-for-ParseIntError"],[11197,"impl-Display-for-Error"],[11198,"impl-Debug-for-Error"],[11202,"impl-Display-for-GetKeyError"],[11203,"impl-Debug-for-GetKeyError"],[11206,"impl-Display-for-SignError"],[11207,"impl-Debug-for-SignError"],[11208,"impl-Debug-for-ExtractTxError"],[11209,"impl-Display-for-ExtractTxError"],[11210,"impl-Debug-for-IndexOutOfBoundsError"],[11211,"impl-Display-for-IndexOutOfBoundsError"],[11212,"impl-Display-for-PsbtParseError"],[11213,"impl-Debug-for-PsbtParseError"],[11214,"impl-Debug-for-PsbtSighashType"],[11215,"impl-Display-for-PsbtSighashType"],[11217,"impl-From%3CError%3E-for-Error"],[11219,"impl-From%3CInfallible%3E-for-Error"],[11220,"impl-From%3CFromSliceError%3E-for-Error"],[11221,"impl-From%3CError%3E-for-Error"],[11226,"impl-From%3CError%3E-for-GetKeyError"],[11227,"impl-From%3CInfallible%3E-for-GetKeyError"],[11230,"impl-From%3CInfallible%3E-for-SignError"],[11231,"impl-From%3CTaprootError%3E-for-SignError"],[11232,"impl-From%3CIndexOutOfBoundsError%3E-for-SignError"],[11233,"impl-From%3CP2wpkhError%3E-for-SignError"],[11241,"impl-From%3CEcdsaSighashType%3E-for-PsbtSighashType"],[11243,"impl-From%3CTapSighashType%3E-for-PsbtSighashType"],[11434,"impl-Display-for-Key"],[11435,"impl-Debug-for-Key"],[11645,"impl-LowerHex-for-PublicKey"],[11646,"impl-Debug-for-PublicKey"],[11647,"impl-Display-for-PublicKey"],[11648,"impl-Display-for-InvalidParityValue"],[11649,"impl-Debug-for-InvalidParityValue"],[11651,"impl-LowerHex-for-Message"],[11652,"impl-Debug-for-Message"],[11653,"impl-Display-for-Message"],[11654,"impl-Debug-for-Error"],[11655,"impl-Display-for-Error"],[11662,"impl-From%3CT%3E-for-SecretKey"],[11663,"impl-From%3CKeypair%3E-for-SecretKey"],[11665,"impl-From%3C%26Keypair%3E-for-SecretKey"],[11666,"impl-From%3C%26Keypair%3E-for-PublicKey"],[11667,"impl-From%3CPublicKey%3E-for-PublicKey"],[11669,"impl-From%3CKeypair%3E-for-PublicKey"],[11673,"impl-From%3CT%3E-for-Message"],[11674,"impl-From%3CSegwitV0Sighash%3E-for-Message"],[11675,"impl-From%3CTapSighash%3E-for-Message"],[11676,"impl-From%3CLegacySighash%3E-for-Message"],[11749,"impl-PublicKey"],[11750,"impl-Serialize-for-PublicKey"],[11914,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[11915,"impl-PartialEq-for-SerializedSignature"],[11928,"impl-Debug-for-SerializedSignature"],[11929,"impl-Display-for-SerializedSignature"],[11930,"impl-Debug-for-Signature"],[11931,"impl-Display-for-Signature"],[11935,"impl-From%3CSignature%3E-for-SerializedSignature"],[11936,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[11954,"impl-IntoIterator-for-SerializedSignature"],[11955,"impl-IntoIterator-for-%26SerializedSignature"],[11961,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[11962,"impl-PartialOrd-for-SerializedSignature"],[11981,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[11983,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[12050,"impl-Debug-for-ElligatorSwift"],[12051,"impl-Display-for-ElligatorSwift"],[12052,"impl-LowerHex-for-ElligatorSwift"],[12451,"impl-Write-for-HmacEngine%3CT%3E"],[12452,"impl-Write-for-HmacEngine%3CT%3E"],[12453,"impl-Display-for-FromSliceError"],[12454,"impl-Debug-for-FromSliceError"],[12455,"impl-LowerHex-for-Hmac%3CT%3E"],[12456,"impl-Display-for-Hmac%3CT%3E"],[12457,"impl-Debug-for-Hmac%3CT%3E"],[12474,"impl-Index%3Cusize%3E-for-Hmac%3CT%3E"],[12475,"impl-Index%3CRange%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12476,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12477,"impl-Index%3CRangeFull%3E-for-Hmac%3CT%3E"],[12478,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12513,"impl-Write-for-HmacEngine%3CT%3E"],[12514,"impl-Write-for-HmacEngine%3CT%3E"],[12530,"impl-Display-for-Error"],[12531,"impl-Debug-for-Error"],[12532,"impl-From%3CNonZero%3Cu32%3E%3E-for-Error"],[12533,"impl-From%3CError%3E-for-Error"],[12645,"impl-Display-for-BernoulliError"],[12646,"impl-Debug-for-BernoulliError"],[12654,"impl-Display-for-WeightedError"],[12655,"impl-Debug-for-WeightedError"],[12668,"impl-From%3CRangeInclusive%3CX%3E%3E-for-Uniform%3CX%3E"],[12669,"impl-From%3CRange%3CX%3E%3E-for-Uniform%3CX%3E"],[12697,"impl-Distribution%3Cf32%3E-for-OpenClosed01"],[12698,"impl-Distribution%3Cf64%3E-for-OpenClosed01"],[12699,"impl-Distribution%3Cf64%3E-for-Open01"],[12700,"impl-Distribution%3Cf32%3E-for-Open01"],[12705,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2328%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12706,"impl-Distribution%3Ci16%3E-for-Standard"],[12707,"impl-Distribution%3COption%3CT%3E%3E-for-Standard"],[12708,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2337%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12709,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2345%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12710,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2354%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12711,"impl-Distribution%3Cu64%3E-for-Standard"],[12712,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J)%3E-for-Standard"],[12713,"impl-Distribution%3Ci8%3E-for-Standard"],[12714,"impl-Distribution%3Cu128%3E-for-Standard"],[12715,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12716,"impl-Distribution%3Ci32%3E-for-Standard"],[12717,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2327%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12718,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2332%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12719,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2353%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12720,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2333%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12721,"impl-Distribution%3C(A,+B,+C)%3E-for-Standard"],[12722,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2341%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12723,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2331%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12724,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I)%3E-for-Standard"],[12725,"impl-Distribution%3Cbool%3E-for-Standard"],[12726,"impl-Distribution%3CNonZero%3Cu8%3E%3E-for-Standard"],[12727,"impl-Distribution%3Ci64%3E-for-Standard"],[12728,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G)%3E-for-Standard"],[12729,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K)%3E-for-Standard"],[12730,"impl-Distribution%3Cf64%3E-for-Standard"],[12731,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12732,"impl-Distribution%3Cu8%3E-for-Standard"],[12733,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12734,"impl-Distribution%3Cu32%3E-for-Standard"],[12735,"impl-Distribution%3C()%3E-for-Standard"],[12736,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2346%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12737,"impl-Distribution%3C(A,+B)%3E-for-Standard"],[12738,"impl-Distribution%3C(A,+B,+C,+D,+E)%3E-for-Standard"],[12739,"impl-Distribution%3CNonZero%3Cu32%3E%3E-for-Standard"],[12740,"impl-Distribution%3CNonZero%3Cu128%3E%3E-for-Standard"],[12741,"impl-Distribution%3Cchar%3E-for-Standard"],[12742,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H)%3E-for-Standard"],[12743,"impl-Distribution%3Cisize%3E-for-Standard"],[12744,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K,+L)%3E-for-Standard"],[12745,"impl-Distribution%3Ci128%3E-for-Standard"],[12746,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2330%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12747,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2355%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12748,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2335%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12749,"impl-Distribution%3CNonZero%3Cu64%3E%3E-for-Standard"],[12750,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2347%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12751,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2326%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12752,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2352%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12753,"impl-Distribution%3C(A,+B,+C,+D,+E,+F)%3E-for-Standard"],[12754,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12755,"impl-Distribution%3CNonZero%3Cusize%3E%3E-for-Standard"],[12756,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2350%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12757,"impl-Distribution%3C%5BT;+32%5D%3E-for-Standard"],[12758,"impl-Distribution%3C(A,)%3E-for-Standard"],[12759,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2344%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12760,"impl-Distribution%3Cu16%3E-for-Standard"],[12761,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2340%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12762,"impl-Distribution%3Cf32%3E-for-Standard"],[12763,"impl-Distribution%3C(A,+B,+C,+D)%3E-for-Standard"],[12764,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2339%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12765,"impl-Distribution%3CWrapping%3CT%3E%3E-for-Standard"],[12766,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2351%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12767,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2334%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12768,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2348%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12769,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12770,"impl-Distribution%3Cusize%3E-for-Standard"],[12771,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2325%7D::%7Bconstant%230%7D%5D%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%2338%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12774,"impl-Distribution%3CNonZero%3Cu16%3E%3E-for-Standard"],[12886,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12887,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12888,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12889,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12890,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12891,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12892,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12893,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12894,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12895,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12896,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12897,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12899,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12900,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12903,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12904,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12905,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12906,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12907,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12908,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12909,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12910,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12911,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12912,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12913,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12914,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12916,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12917,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12920,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12921,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12922,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12923,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12924,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12925,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12926,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12927,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12928,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12929,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12930,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12931,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12933,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12934,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12938,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12939,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12940,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12941,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12942,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12943,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12944,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12945,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12946,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12947,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12948,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12949,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12950,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12951,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12953,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12954,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12955,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12956,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12957,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12958,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12959,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12960,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12961,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12962,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12963,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12964,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[13126,"impl-Display-for-ReadError"],[13127,"impl-Debug-for-ReadError"],[13229,"impl-From%3CVec%3Cusize%3E%3E-for-IndexVec"],[13231,"impl-From%3CVec%3Cu32%3E%3E-for-IndexVec"],[13278,"impl-Display-for-OutOfRangeError"],[13279,"impl-Debug-for-OutOfRangeError"],[13302,"impl-Display-for-Signature"],[13303,"impl-LowerHex-for-Signature"],[13304,"impl-Debug-for-Signature"],[13312,"impl-Serialize-for-Signature"],[13313,"impl-Signature"],[13477,"impl-Display-for-PrevoutsSizeError"],[13478,"impl-Debug-for-PrevoutsSizeError"],[13479,"impl-Display-for-PrevoutsKindError"],[13480,"impl-Debug-for-PrevoutsKindError"],[13481,"impl-Display-for-PrevoutsIndexError"],[13482,"impl-Debug-for-PrevoutsIndexError"],[13483,"impl-Display-for-InvalidSighashTypeError"],[13484,"impl-Debug-for-InvalidSighashTypeError"],[13485,"impl-Debug-for-NonStandardSighashTypeError"],[13486,"impl-Display-for-NonStandardSighashTypeError"],[13487,"impl-Display-for-SighashTypeParseError"],[13488,"impl-Debug-for-SighashTypeParseError"],[13490,"impl-Debug-for-TaprootError"],[13491,"impl-Display-for-TaprootError"],[13492,"impl-Debug-for-P2wpkhError"],[13493,"impl-Display-for-P2wpkhError"],[13494,"impl-Display-for-SingleMissingOutputError"],[13495,"impl-Debug-for-SingleMissingOutputError"],[13496,"impl-Debug-for-AnnexError"],[13497,"impl-Display-for-AnnexError"],[13498,"impl-Debug-for-SigningDataError%3CE%3E"],[13499,"impl-Display-for-SigningDataError%3CE%3E"],[13512,"impl-From%3CPrevoutsKindError%3E-for-TaprootError"],[13513,"impl-From%3CInfallible%3E-for-TaprootError"],[13514,"impl-From%3CPrevoutsSizeError%3E-for-TaprootError"],[13515,"impl-From%3CPrevoutsIndexError%3E-for-TaprootError"],[13516,"impl-From%3CInputsIndexError%3E-for-TaprootError"],[13518,"impl-From%3CInfallible%3E-for-P2wpkhError"],[13519,"impl-From%3CInputsIndexError%3E-for-P2wpkhError"],[13524,"impl-From%3CInfallible%3E-for-SigningDataError%3CE%3E"],[13525,"impl-From%3CError%3E-for-SigningDataError%3CE%3E"],[13691,"impl-Display-for-MessageSignatureError"],[13692,"impl-Debug-for-MessageSignatureError"],[13693,"impl-Display-for-MessageSignature"],[13694,"impl-Debug-for-MessageSignature"],[13696,"impl-From%3CError%3E-for-MessageSignatureError"],[13697,"impl-From%3CInfallible%3E-for-MessageSignatureError"],[13942,"impl-Debug-for-SigFromSliceError"],[13943,"impl-Display-for-SigFromSliceError"],[13947,"impl-Display-for-IncompleteBuilderError"],[13948,"impl-Debug-for-IncompleteBuilderError"],[13949,"impl-Debug-for-HiddenNodesError"],[13950,"impl-Display-for-HiddenNodesError"],[13957,"impl-LowerHex-for-FutureLeafVersion"],[13958,"impl-Debug-for-FutureLeafVersion"],[13959,"impl-Display-for-FutureLeafVersion"],[13960,"impl-UpperHex-for-FutureLeafVersion"],[13961,"impl-Debug-for-LeafVersion"],[13962,"impl-LowerHex-for-LeafVersion"],[13963,"impl-Display-for-LeafVersion"],[13964,"impl-UpperHex-for-LeafVersion"],[13965,"impl-Debug-for-TaprootBuilderError"],[13966,"impl-Display-for-TaprootBuilderError"],[13967,"impl-Debug-for-TaprootError"],[13968,"impl-Display-for-TaprootError"],[13973,"impl-From%3CError%3E-for-SigFromSliceError"],[13974,"impl-From%3CInfallible%3E-for-SigFromSliceError"],[13975,"impl-From%3CInvalidSighashTypeError%3E-for-SigFromSliceError"],[13976,"impl-From%3C%5BTapNodeHash;+99%5D%3E-for-TaprootMerkleBranch"],[13977,"impl-From%3C%5BTapNodeHash;+71%5D%3E-for-TaprootMerkleBranch"],[13978,"impl-From%3C%5BTapNodeHash;+77%5D%3E-for-TaprootMerkleBranch"],[13979,"impl-From%3C%5BTapNodeHash;+118%5D%3E-for-TaprootMerkleBranch"],[13980,"impl-From%3C%5BTapNodeHash;+72%5D%3E-for-TaprootMerkleBranch"],[13981,"impl-From%3C%5BTapNodeHash;+27%5D%3E-for-TaprootMerkleBranch"],[13982,"impl-From%3C%5BTapNodeHash;+125%5D%3E-for-TaprootMerkleBranch"],[13983,"impl-From%3C%5BTapNodeHash;+75%5D%3E-for-TaprootMerkleBranch"],[13984,"impl-From%3C%5BTapNodeHash;+52%5D%3E-for-TaprootMerkleBranch"],[13985,"impl-From%3C%5BTapNodeHash;+55%5D%3E-for-TaprootMerkleBranch"],[13986,"impl-From%3C%5BTapNodeHash;+68%5D%3E-for-TaprootMerkleBranch"],[13987,"impl-From%3C%5BTapNodeHash;+83%5D%3E-for-TaprootMerkleBranch"],[13988,"impl-From%3C%5BTapNodeHash;+31%5D%3E-for-TaprootMerkleBranch"],[13989,"impl-From%3C%5BTapNodeHash;+46%5D%3E-for-TaprootMerkleBranch"],[13990,"impl-From%3C%5BTapNodeHash;+95%5D%3E-for-TaprootMerkleBranch"],[13991,"impl-From%3C%5BTapNodeHash;+80%5D%3E-for-TaprootMerkleBranch"],[13992,"impl-From%3C%5BTapNodeHash;+67%5D%3E-for-TaprootMerkleBranch"],[13994,"impl-From%3C%5BTapNodeHash;+94%5D%3E-for-TaprootMerkleBranch"],[13995,"impl-From%3C%5BTapNodeHash;+109%5D%3E-for-TaprootMerkleBranch"],[13996,"impl-From%3C%5BTapNodeHash;+15%5D%3E-for-TaprootMerkleBranch"],[13997,"impl-From%3C%5BTapNodeHash;+63%5D%3E-for-TaprootMerkleBranch"],[13998,"impl-From%3C%5BTapNodeHash;+74%5D%3E-for-TaprootMerkleBranch"],[13999,"impl-From%3C%5BTapNodeHash;+126%5D%3E-for-TaprootMerkleBranch"],[14000,"impl-From%3C%5BTapNodeHash;+4%5D%3E-for-TaprootMerkleBranch"],[14001,"impl-From%3C%5BTapNodeHash;+100%5D%3E-for-TaprootMerkleBranch"],[14002,"impl-From%3C%5BTapNodeHash;+110%5D%3E-for-TaprootMerkleBranch"],[14003,"impl-From%3C%5BTapNodeHash;+49%5D%3E-for-TaprootMerkleBranch"],[14004,"impl-From%3C%5BTapNodeHash;+82%5D%3E-for-TaprootMerkleBranch"],[14005,"impl-From%3C%5BTapNodeHash;+42%5D%3E-for-TaprootMerkleBranch"],[14006,"impl-From%3C%5BTapNodeHash;+38%5D%3E-for-TaprootMerkleBranch"],[14007,"impl-From%3C%5BTapNodeHash;+23%5D%3E-for-TaprootMerkleBranch"],[14008,"impl-From%3C%5BTapNodeHash;+1%5D%3E-for-TaprootMerkleBranch"],[14009,"impl-From%3C%5BTapNodeHash;+62%5D%3E-for-TaprootMerkleBranch"],[14010,"impl-From%3C%5BTapNodeHash;+115%5D%3E-for-TaprootMerkleBranch"],[14011,"impl-From%3C%5BTapNodeHash;+79%5D%3E-for-TaprootMerkleBranch"],[14012,"impl-From%3C%5BTapNodeHash;+69%5D%3E-for-TaprootMerkleBranch"],[14013,"impl-From%3C%5BTapNodeHash;+91%5D%3E-for-TaprootMerkleBranch"],[14014,"impl-From%3C%5BTapNodeHash;+54%5D%3E-for-TaprootMerkleBranch"],[14015,"impl-From%3C%5BTapNodeHash;+57%5D%3E-for-TaprootMerkleBranch"],[14016,"impl-From%3C%5BTapNodeHash;+8%5D%3E-for-TaprootMerkleBranch"],[14017,"impl-From%3C%5BTapNodeHash;+51%5D%3E-for-TaprootMerkleBranch"],[14018,"impl-From%3C%5BTapNodeHash;+76%5D%3E-for-TaprootMerkleBranch"],[14019,"impl-From%3C%5BTapNodeHash;+98%5D%3E-for-TaprootMerkleBranch"],[14020,"impl-From%3C%5BTapNodeHash;+6%5D%3E-for-TaprootMerkleBranch"],[14021,"impl-From%3C%5BTapNodeHash;+119%5D%3E-for-TaprootMerkleBranch"],[14022,"impl-From%3C%5BTapNodeHash;+81%5D%3E-for-TaprootMerkleBranch"],[14023,"impl-From%3C%5BTapNodeHash;+122%5D%3E-for-TaprootMerkleBranch"],[14024,"impl-From%3C%5BTapNodeHash;+60%5D%3E-for-TaprootMerkleBranch"],[14025,"impl-From%3C%5BTapNodeHash;+58%5D%3E-for-TaprootMerkleBranch"],[14026,"impl-From%3C%5BTapNodeHash;+30%5D%3E-for-TaprootMerkleBranch"],[14027,"impl-From%3C%5BTapNodeHash;+104%5D%3E-for-TaprootMerkleBranch"],[14028,"impl-From%3C%5BTapNodeHash;+28%5D%3E-for-TaprootMerkleBranch"],[14029,"impl-From%3C%5BTapNodeHash;+26%5D%3E-for-TaprootMerkleBranch"],[14030,"impl-From%3C%5BTapNodeHash;+90%5D%3E-for-TaprootMerkleBranch"],[14031,"impl-From%3C%5BTapNodeHash;+53%5D%3E-for-TaprootMerkleBranch"],[14032,"impl-From%3C%5BTapNodeHash;+50%5D%3E-for-TaprootMerkleBranch"],[14033,"impl-From%3C%5BTapNodeHash;+64%5D%3E-for-TaprootMerkleBranch"],[14034,"impl-From%3C%5BTapNodeHash;+92%5D%3E-for-TaprootMerkleBranch"],[14035,"impl-From%3C%5BTapNodeHash;+37%5D%3E-for-TaprootMerkleBranch"],[14036,"impl-From%3C%5BTapNodeHash;+11%5D%3E-for-TaprootMerkleBranch"],[14037,"impl-From%3C%5BTapNodeHash;+33%5D%3E-for-TaprootMerkleBranch"],[14038,"impl-From%3C%5BTapNodeHash;+17%5D%3E-for-TaprootMerkleBranch"],[14039,"impl-From%3C%5BTapNodeHash;+18%5D%3E-for-TaprootMerkleBranch"],[14040,"impl-From%3C%5BTapNodeHash;+112%5D%3E-for-TaprootMerkleBranch"],[14041,"impl-From%3C%5BTapNodeHash;+21%5D%3E-for-TaprootMerkleBranch"],[14042,"impl-From%3C%5BTapNodeHash;+48%5D%3E-for-TaprootMerkleBranch"],[14043,"impl-From%3C%5BTapNodeHash;+113%5D%3E-for-TaprootMerkleBranch"],[14044,"impl-From%3C%5BTapNodeHash;+19%5D%3E-for-TaprootMerkleBranch"],[14045,"impl-From%3C%5BTapNodeHash;+87%5D%3E-for-TaprootMerkleBranch"],[14046,"impl-From%3C%5BTapNodeHash;+0%5D%3E-for-TaprootMerkleBranch"],[14047,"impl-From%3C%5BTapNodeHash;+35%5D%3E-for-TaprootMerkleBranch"],[14048,"impl-From%3C%5BTapNodeHash;+9%5D%3E-for-TaprootMerkleBranch"],[14049,"impl-From%3C%5BTapNodeHash;+14%5D%3E-for-TaprootMerkleBranch"],[14050,"impl-From%3C%5BTapNodeHash;+89%5D%3E-for-TaprootMerkleBranch"],[14051,"impl-From%3C%5BTapNodeHash;+41%5D%3E-for-TaprootMerkleBranch"],[14052,"impl-From%3C%5BTapNodeHash;+128%5D%3E-for-TaprootMerkleBranch"],[14053,"impl-From%3C%5BTapNodeHash;+106%5D%3E-for-TaprootMerkleBranch"],[14054,"impl-From%3C%5BTapNodeHash;+10%5D%3E-for-TaprootMerkleBranch"],[14055,"impl-From%3C%5BTapNodeHash;+97%5D%3E-for-TaprootMerkleBranch"],[14056,"impl-From%3C%5BTapNodeHash;+47%5D%3E-for-TaprootMerkleBranch"],[14057,"impl-From%3C%5BTapNodeHash;+84%5D%3E-for-TaprootMerkleBranch"],[14058,"impl-From%3C%5BTapNodeHash;+108%5D%3E-for-TaprootMerkleBranch"],[14059,"impl-From%3C%5BTapNodeHash;+45%5D%3E-for-TaprootMerkleBranch"],[14060,"impl-From%3C%5BTapNodeHash;+124%5D%3E-for-TaprootMerkleBranch"],[14061,"impl-From%3C%5BTapNodeHash;+88%5D%3E-for-TaprootMerkleBranch"],[14062,"impl-From%3C%5BTapNodeHash;+123%5D%3E-for-TaprootMerkleBranch"],[14063,"impl-From%3C%5BTapNodeHash;+86%5D%3E-for-TaprootMerkleBranch"],[14064,"impl-From%3C%5BTapNodeHash;+43%5D%3E-for-TaprootMerkleBranch"],[14065,"impl-From%3C%5BTapNodeHash;+114%5D%3E-for-TaprootMerkleBranch"],[14066,"impl-From%3C%5BTapNodeHash;+61%5D%3E-for-TaprootMerkleBranch"],[14067,"impl-From%3C%5BTapNodeHash;+107%5D%3E-for-TaprootMerkleBranch"],[14068,"impl-From%3C%5BTapNodeHash;+12%5D%3E-for-TaprootMerkleBranch"],[14069,"impl-From%3C%5BTapNodeHash;+93%5D%3E-for-TaprootMerkleBranch"],[14070,"impl-From%3C%5BTapNodeHash;+3%5D%3E-for-TaprootMerkleBranch"],[14071,"impl-From%3C%5BTapNodeHash;+127%5D%3E-for-TaprootMerkleBranch"],[14072,"impl-From%3C%5BTapNodeHash;+111%5D%3E-for-TaprootMerkleBranch"],[14073,"impl-From%3C%5BTapNodeHash;+105%5D%3E-for-TaprootMerkleBranch"],[14074,"impl-From%3C%5BTapNodeHash;+70%5D%3E-for-TaprootMerkleBranch"],[14075,"impl-From%3C%5BTapNodeHash;+102%5D%3E-for-TaprootMerkleBranch"],[14076,"impl-From%3C%5BTapNodeHash;+20%5D%3E-for-TaprootMerkleBranch"],[14077,"impl-From%3C%5BTapNodeHash;+16%5D%3E-for-TaprootMerkleBranch"],[14078,"impl-From%3C%5BTapNodeHash;+2%5D%3E-for-TaprootMerkleBranch"],[14079,"impl-From%3C%5BTapNodeHash;+13%5D%3E-for-TaprootMerkleBranch"],[14080,"impl-From%3C%5BTapNodeHash;+25%5D%3E-for-TaprootMerkleBranch"],[14081,"impl-From%3C%5BTapNodeHash;+65%5D%3E-for-TaprootMerkleBranch"],[14082,"impl-From%3C%5BTapNodeHash;+78%5D%3E-for-TaprootMerkleBranch"],[14083,"impl-From%3C%5BTapNodeHash;+56%5D%3E-for-TaprootMerkleBranch"],[14084,"impl-From%3C%5BTapNodeHash;+85%5D%3E-for-TaprootMerkleBranch"],[14085,"impl-From%3C%5BTapNodeHash;+117%5D%3E-for-TaprootMerkleBranch"],[14086,"impl-From%3C%5BTapNodeHash;+7%5D%3E-for-TaprootMerkleBranch"],[14087,"impl-From%3C%5BTapNodeHash;+101%5D%3E-for-TaprootMerkleBranch"],[14088,"impl-From%3C%5BTapNodeHash;+34%5D%3E-for-TaprootMerkleBranch"],[14089,"impl-From%3C%5BTapNodeHash;+103%5D%3E-for-TaprootMerkleBranch"],[14090,"impl-From%3C%5BTapNodeHash;+22%5D%3E-for-TaprootMerkleBranch"],[14091,"impl-From%3C%5BTapNodeHash;+120%5D%3E-for-TaprootMerkleBranch"],[14092,"impl-From%3C%5BTapNodeHash;+36%5D%3E-for-TaprootMerkleBranch"],[14093,"impl-From%3C%5BTapNodeHash;+29%5D%3E-for-TaprootMerkleBranch"],[14094,"impl-From%3C%5BTapNodeHash;+40%5D%3E-for-TaprootMerkleBranch"],[14095,"impl-From%3C%5BTapNodeHash;+66%5D%3E-for-TaprootMerkleBranch"],[14096,"impl-From%3C%5BTapNodeHash;+32%5D%3E-for-TaprootMerkleBranch"],[14097,"impl-From%3C%5BTapNodeHash;+59%5D%3E-for-TaprootMerkleBranch"],[14098,"impl-From%3C%5BTapNodeHash;+116%5D%3E-for-TaprootMerkleBranch"],[14099,"impl-From%3C%5BTapNodeHash;+73%5D%3E-for-TaprootMerkleBranch"],[14100,"impl-From%3C%5BTapNodeHash;+5%5D%3E-for-TaprootMerkleBranch"],[14101,"impl-From%3C%5BTapNodeHash;+39%5D%3E-for-TaprootMerkleBranch"],[14102,"impl-From%3C%5BTapNodeHash;+121%5D%3E-for-TaprootMerkleBranch"],[14103,"impl-From%3C%5BTapNodeHash;+44%5D%3E-for-TaprootMerkleBranch"],[14104,"impl-From%3C%5BTapNodeHash;+96%5D%3E-for-TaprootMerkleBranch"],[14105,"impl-From%3C%5BTapNodeHash;+24%5D%3E-for-TaprootMerkleBranch"],[14169,"impl-IntoIterator-for-TaprootMerkleBranch"],[14170,"impl-IntoIterator-for-%26TaprootMerkleBranch"],[14171,"impl-IntoIterator-for-%26mut+TaprootMerkleBranch"],[14220,"impl-Serialize-for-Signature"],[14221,"impl-Signature"],[14222,"impl-TaprootMerkleBranch"],[14223,"impl-Serialize-for-TaprootMerkleBranch"],[14227,"impl-Serialize-for-ControlBlock"],[14228,"impl-ControlBlock"],[14274,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[14275,"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"],[14281,"impl-TryFrom%3CVec%3CTapNodeHash%3E%3E-for-TaprootMerkleBranch"],[14286,"impl-TryFrom%3CTaprootBuilder%3E-for-TapTree"],[14287,"impl-TryFrom%3CNodeInfo%3E-for-TapTree"],[14404,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[14405,"impl-PartialEq-for-SerializedSignature"],[14408,"impl-Debug-for-SerializedSignature"],[14409,"impl-Display-for-SerializedSignature"],[14411,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[14412,"impl-From%3CSignature%3E-for-SerializedSignature"],[14420,"impl-IntoIterator-for-%26SerializedSignature"],[14421,"impl-IntoIterator-for-SerializedSignature"],[14427,"impl-PartialOrd-for-SerializedSignature"],[14428,"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"],[14515,"impl-KeychainTxOutIndex%3CK%3E"],[14516,"impl-Indexer-for-KeychainTxOutIndex%3CK%3E"],[14535,"impl-Display-for-InsertDescriptorError%3CK%3E"],[14536,"impl-Debug-for-InsertDescriptorError%3CK%3E"],[14700,"impl-Display-for-MissingGenesisError"],[14701,"impl-Debug-for-MissingGenesisError"],[14702,"impl-Debug-for-AlterCheckPointError"],[14703,"impl-Display-for-AlterCheckPointError"],[14704,"impl-Debug-for-CannotConnectError"],[14705,"impl-Display-for-CannotConnectError"],[14706,"impl-Debug-for-ApplyHeaderError"],[14707,"impl-Display-for-ApplyHeaderError"],[14718,"impl-FromIterator%3C(u32,+BlockHash)%3E-for-ChangeSet"],[14719,"impl-FromIterator%3C(u32,+Option%3CBlockHash%3E)%3E-for-ChangeSet"],[14834,"impl-Display-for-SyncItem%3C\'i,+I%3E"],[14835,"impl-Debug-for-SyncItem%3C\'i,+I%3E"],[15006,"impl-Debug-for-CalculateFeeError"],[15007,"impl-Display-for-CalculateFeeError"]],"c":"OjAAAAEAAAAAADYAEAAAADUCNwJTBMoH4QflBwkILQrDCvYN+A35DfoNAA4CDgMOBA46EDsQPBA9ECISaxigGCAZLBmQHJccaiJvIhwmHSbfJ/QsAi0DLastui3LLWsubC5tLm4ueS61LioywDLBMsIyxTLIMjgzOTPWNVc3","e":"OjAAAAEAAAAAABYnEAAAAAAAjNh6+P//v///9/8HP99//z//X6sWZM6GAABwQMR95Kf/+z/4//8f/H//HwAAAAAAAAAAAAAAAAAAAAAAAPDH///9/98XAAD4//////8DgP////////////////////8/NAAA+P////////////////////////8fAP//////5/f///////8O+If//////////////f////////////////9vAP/+//////////////////////8H8Emdv6oP//YY3e+3FCVCeQv8/x+A//8DIAAAAABA/+f8///n/////wEA+P//////f/z//z8AAAAAAAAAAAEAAAAgAAD4DwAAAAAA8P///////8D/AwAeAPi///P//+8h4P8A8P9/ADz4////////jwEAwMD8/////w8AhP////////////////////8B/////////wcM4P///////x8AAAAAAADA/////////////9///1/9HuAAgP///////////w8AAAAAAN7/++D/w793wHjw8//w/P//////AT//x///94//+38hUAT8I4A/IJ7RHP7HAAAwCPY//4B//ID//4H/BwD+HwAA/v8I/v8PAPz/wf8dHwD+fwHyPwD+/w8AAICDx8sA/gVgzv///v//v//////PAD8B8LX//f/9/wAA/v93OFAAAID/////AwAAADz8////DwDw//8Z4Of//x///89Gd8jfxwHQAAAEfOAP//zj/////x8AAACA////+f+fNMAe/7/nAQCA+f+/aewnAAD+/////////ykNOAfA///H//////8HAPD/////+////78cAPgAAPz/D/7+////zx8AgP//5P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOP4/3/+/9////5P/P///////////////////////////////3//////////////////1/8FgAP4GwDA/z/8////PwD/8wcAAPD//38f+P9/AAAA////7////woIAAT+///fjx8Y9wAAwg8A4D4CAAD/BwDwmwIA/w4AgP//AAAAAHwg+Af8//9PAPb+//8B/////5/rSPj7fwD+////3wb+//8HAAAAAADA//93fv8DAMD/7//+//7DDAGw+PnjP/7//x8L8MD/A9g/gL/xBwAADM//////kz///xcEAAAAAAAAAAAAAAAAAADw3wQAAABYHwAAwN+AkBSpKpEDAACA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8////wcAAAAAAADg////b/z/4f////////////////////////8fAAAAAIcAAH8AMOCBAAAgPMD/////kz///+P//+////8/Yv0c//7/7///739+//l//ze///z//5M////8////P/nz/z/////kz/8/3v////+PdBn2/38DAAAA/v/7//////f7DxYCAADg//f///z/0////+9/AwAAAADM/////////yDf/+///////19k3xYA8QEAwAcAXAB88P///f/////H/wcAPP/vBP49APz/D///AACA//////////9PoQPAsP/9/z8A/P8/A/wfAAAAAAD//+H//x8C/n//DwD+////I0D+nwP8/7//HPDfD///7////+HhvX/vAf////////8P4AcAgP///x8Av////wEA/D/3P/4AAAAAAAAAAAAAAADA////////8/n////P//93mFdWPgAAD+D4AfD/v/////8/7P8DAID///8fAzv3nwMAAAAA0ML/////////wT/8vv//////AV06AbD/cwAA8H+g2v///////9//AwDg32PUh4f//b+//18TeBg/eP7/Hx+/B/v///+Ah+P+PwgAwP8P/v///+AH//+A8P0AwCf8/7//+///////4W/fbv7Pu4f/A0D//v/v94ey+IIq//8PYHgAgCDxAADw//////////8HYACAQP/////////////8f//////P/wOA//8fgP9////+//n//f///wM/HwAAAAAA4P//fwz////4/wO8///+4x8GIJwe/38BDPP8P//12/9z+wEAAAAAAID///////////////////8fCL5xBwAAAPs//P//+///////9/8P4N//RoD+HwAAAAAAAID5/////////////7D//P//////3////8P///v/////////////////xwgk+H8AAAAfAAB44P8gX/DH//8//nj+//9//v/P//8BP/49/f8/4v71DxD/zwDs9wAA4P//BxYEAAAg/+PgwJ8jgCMBAPz//+//X4AhAIv+//2/HwD8/wPw/f8UBAAAJHL4/wf//wEAAPn/+f/f//ETAAAAC9r84M8fAP5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","a":{"is_coin_base":[1970],"ntxid":[978],"read_to_end":[9648],"txid":[979],"wtxid":[981]}}],\ -["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","FullScanResponse","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResponse","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}{{{Bj{{d{Bf}}{d{Bh}}}}}f}2222{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,"SyncResponse",116],[5,"FullScanResponse",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"],[50,"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":"OzAAAAEAAIwAFQAKAAAADQATACIABwAtAAMAMgABADsAAQBHAAEATgACAFUAAgBbAA0AawAJAIAADwCaAAQAoAALAK4AAACxAAAAtgAAAM4AAADWAAIA3QAPAPIADwA="}],\ +["bdk_chain",{"t":"KFSFFKGFFFPKFRFFIEEIKFEFFPNNMNNONNNNDEONOONNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNONOONCCNNNNNNNNNNNNNNNNNNNNNMNNMNONECNMENNNNNNONNNNNNNNDCODNNNNNOCENNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOOOONNNNNNNNNNNNNONNNNNNNNNNNNNFGPPPPFTTPPPFFPFFTTPGTTGFFFGFTTTTTTTTTTTTTTTTTTTPPFPPPTPGGPPPPTTTTFFPPPPPPFFFFPPTTPFFFFFFPPPPPFFFFFFGFFFPPPPFFFFFPPPPPPPPPPPPPPPPPFTFFFFFFFGFFFFTTTTTTNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNONNNNNNCNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNNNNNNOOCNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNCONONNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNCNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOFGGPPPGTPFPFGPFPGGKPFPPPPGPPPGPPPFPFPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOPPPGPFPFPFPFGGFPFPPPPPFPPPKGFPPPPPPPPGPPFPNNNNMNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNKKCCMMMMMMMHCHHHHCHHHPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRGPRGGKPPPPPPCNNNNNNNNNNNNMHNHHHNNNHCHNHHHNNHCNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNCFSSSPSPGPSSPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNKRKRFGKFFPPPNNNNNNNNNNNNNNMNNNNNMNNMNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFSSSSSSSSSSRRKMNNNNNNNFNNNNNNNNNNNNFFKNNNNMNNNNNNNNNNNNNNNNNNNNNNNNFFGFPFFFPNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONONNNNNNNNNONNNNNONONNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNFFFFFGFFFFPPNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPFGFFGIIIIFPPKPFPPPPIPPPPFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNOOOOOONNNOOOOOONNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOFFCCCCCCCCCPPGFFFTPPTTTFPPGFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNONNNNNONNNNNNNNNNNNNNNONNNNNONNNNNTSFSSSSSSSTSSTSSTTTSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNFCCPFFSGTTTTFFTPFTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFFGTTTTTFPFTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGPPPJJJJJFPPPPPPCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSFFPGGFFPPPFPFFKFFFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCHGPPSSFNNNNNNNNNNNNNNNNNNNPGPPFGPPPPPPPPPPPPPPPPPPGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFTFFTTTTTGFTPFFFFPFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNOONNONHHOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNOOONNNNNNNOSFFFNNNNNNNNNNNNNTPKGKTPFTKTTTTPKONOOOONNNNNNNNMHHNMMMMMMMMMMCNNNNNNNNNNNNNOOONOCOOOMMMMMMMMMMOCHNNNNNNNNNNNFKPKGGPPSPPPPKPFKNNNNNNNNNNNNMNNHHHMMMMMMMMMMNNNNNNNNNNNNNNNNNNNMMMMMMMMMMHHNNNNNNNNNNNNNNNNNOOOOJFJJJJJOOOOOOOOOOOOOKKRRKRFRKFNNNNNNMMNNMNCNNMNNNNNNNNNKFFFFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPPFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNPFPFPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFTRTRFKKFFTRMMQCNMMMNCNQQCMMMCQCCCCCQCCCCMHFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGRKRKIGGFPPFPPPFPNMNNNNNNNNNNNNNNCNNNNNNNNNNNCNNNNNNNNNNNNNNNCNNNNNNNNNQNNNNNNNNNNNMNNNQNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQFNNNNNNNNNNNNNNNNNRFFKNMNNNNNNNNNNNNQNNNQNNNNNNNNNNNNNNNGGPPFPFPFNNNNNNNONNNNONNNNNNNRKGGPPPPMRKRKNMMNNNNFFFNNNONONNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKYKRRRKYRRRRRRRKNNNCMMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMQNNCMMMMMMNMMMMMMMMMMMMMMMMNMMMMMMMPPPKKKKRPKKRRRRRKPFKPKPPPPPKPKPPPGPPPRRRKKNNNNNNNNNMNNMMNMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMNNNMNMNNNNNNNNNMNNNNNNMNMNNNMNMNNNNMNNNNNNNMNNMNNCNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKRRRRRRRRFRRRRRRRRKKRKRKRKRKRKRKRKKNNNNNNMNNNNNNNNNNMMMMMMMNNNNNNNNNNNNNNMMMMMMNNNMMMMMMNNNNNMMMMMNMMMMMMMMMMMMNMMMMMMMMNNNNNNNNNCTKNMNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPKPPPFPFGFPPPPPPPPKIFFPFPPKPNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNHHNNQNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNPFPPGGPPFPFPPPPFPGGGFFFFPPPFKRRFFFIIKFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPFGPPPPPFPPNNNNNHHNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNPPGGFPPPPPFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHFTTTTFTTTTSFTTFTTTFTNCONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCCCCNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGFFPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNOOOONONNNNNNNNNNNPPPPPPPPPFFPPPPPPPPPPPPPPSSPPGPPPFPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOPPPFFGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNOONNNNNNNNNNNNOONNNOOPGFFPPNNNNNNNNNNNNNNNNNNNNONNNNNNNNNOONNNNNNONNNNNNNNNNNNONNNNNNFFFFNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNONNNNNNNNONNNNONNNNFFFFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPPPPFGFNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONOOOOOOOONNNNNNNNNNNNOONNNFNNNNNNNNNNNNNNNNNNNNSSSSSSSSHFFFPPPPPPPPPPGRGPKGPGFPPPPPPPPPPPPPPPPPGPPPPPPPPPPPPPPFGPPFPGFPPPPPPPPPGGIGIPPPPPPPPPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNOOONNNNNNNNNNNNNOONNNNOOOOCOOOCNNNOONNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNONNNNNNNNNNNNNOOOOOOOOOOOOOOOOOFFFINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNONNNONNNNNNNNNNNNNNOONNNGFKTGPTPPPFPPPPPPPPFTFPTPGKFFFFGFKKKGFFTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCMNNNNNNNNNCCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCQNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSFNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNPPFGFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKFIFIFIPPPPFSSSSSIFFPPPPRFMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQQNNNNNNNNNNNNNNNNNNHNNNNNCHHHHHHJHHHHHHHHHHHHHHHHHHHJHHHHHHHHHHHJHHHHHJJJHHHHHHHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNHHHHHNNNNNFTNNNNIIIIGNNNNNNNNINNNNNNNNNNTRTRFKKFFTRMNMNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNMNNNNNQQNNNNNMNNNNNMNMNNNQNQMNNNNNNNNNNNNNNNNNNNNTKFKTKKRKNNNCNMNNNNNNNMNNNNNNNMMCHNNCNNNCNNHNMNMNNNNPFFGFFKKPPPFFFFPFGFMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNCKKKRFFFFFKRMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPGFCKFNNNNNNNNNNKKRKKKRKKFFMNMNNMMNMMNMNNMNNNNNMMMHMNNNNMHNMFFFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNRKFKNNMNMNNMMNMMNNCNNNNNMMNNNNNNGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPFGPGPGPPPPPFPFFPPPPPPGGPGPFPFFFPPFPFGPPPFPPFFGGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNSPPPFGPNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNOHNNNNNNNNNNNNNNFPPPFPGPPGPPPPPPPPFFGFPPPPFFPGPFSSSSSSSFGFFFPFFFFGGFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONCNNONNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNONNNNRKMMMMMCCFSPKGPFTTKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNMNNNMNNNNNNNNNNNNNNNNNNNNMNNNOOOOFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGTPFFFFPFFTNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNONNNNNNSHFFFPPGFFFFPNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNNNTGFFPPTTTFFFFFNNNOOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNONOOOONNNNNNNNNNNNNNNNNN","n":["Anchor","AnchorImpl","BIP32_MAX_INDEX","Balance","BlockId","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","FullScanResponse","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResponse","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"],[356,"bdk_chain::bitcoin"],[2756,"bdk_chain::bitcoin::address"],[3027,"bdk_chain::bitcoin::address::AddressData"],[3030,"bdk_chain::bitcoin::address::error"],[3052,"bdk_chain::bitcoin::amount"],[3113,"bdk_chain::bitcoin::amount::serde"],[3124,"bdk_chain::bitcoin::amount::serde::as_btc"],[3127,"bdk_chain::bitcoin::amount::serde::as_btc::opt"],[3129,"bdk_chain::bitcoin::amount::serde::as_sat"],[3132,"bdk_chain::bitcoin::amount::serde::as_sat::opt"],[3134,"bdk_chain::bitcoin::base58"],[3503,"bdk_chain::bitcoin::base58::error"],[3546,"bdk_chain::bitcoin::base64"],[3636,"bdk_chain::bitcoin::base64::alphabet"],[3680,"bdk_chain::bitcoin::base64::display"],[3692,"bdk_chain::bitcoin::base64::engine"],[3774,"bdk_chain::bitcoin::base64::engine::general_purpose"],[3782,"bdk_chain::bitcoin::base64::prelude"],[3797,"bdk_chain::bitcoin::base64::read"],[3810,"bdk_chain::bitcoin::base64::write"],[3842,"bdk_chain::bitcoin::bip152"],[4032,"bdk_chain::bitcoin::bip158"],[4146,"bdk_chain::bitcoin::bip32"],[4492,"bdk_chain::bitcoin::bip32::ChildNumber"],[4494,"bdk_chain::bitcoin::blockdata"],[4505,"bdk_chain::bitcoin::blockdata::block"],[4625,"bdk_chain::bitcoin::blockdata::constants"],[4693,"bdk_chain::bitcoin::blockdata::fee_rate"],[4694,"bdk_chain::bitcoin::blockdata::locktime"],[4696,"bdk_chain::bitcoin::blockdata::locktime::absolute"],[4882,"bdk_chain::bitcoin::blockdata::locktime::relative"],[5092,"bdk_chain::bitcoin::blockdata::opcodes"],[5143,"bdk_chain::bitcoin::blockdata::opcodes::all"],[5399,"bdk_chain::bitcoin::blockdata::script"],[5953,"bdk_chain::bitcoin::blockdata::script::witness_program"],[5978,"bdk_chain::bitcoin::blockdata::script::witness_version"],[6062,"bdk_chain::bitcoin::blockdata::transaction"],[6222,"bdk_chain::bitcoin::blockdata::weight"],[6224,"bdk_chain::bitcoin::blockdata::witness"],[6239,"bdk_chain::bitcoin::consensus"],[6330,"bdk_chain::bitcoin::consensus::encode"],[6423,"bdk_chain::bitcoin::consensus::encode::Error"],[6427,"bdk_chain::bitcoin::consensus::params"],[6447,"bdk_chain::bitcoin::consensus::serde"],[6482,"bdk_chain::bitcoin::consensus::serde::hex"],[6560,"bdk_chain::bitcoin::ecdsa"],[6647,"bdk_chain::bitcoin::error"],[6730,"bdk_chain::bitcoin::hash_types"],[6738,"bdk_chain::bitcoin::hashes"],[6779,"bdk_chain::bitcoin::hashes::cmp"],[6780,"bdk_chain::bitcoin::hashes::hash160"],[6825,"bdk_chain::bitcoin::hashes::hex"],[6989,"bdk_chain::bitcoin::hashes::hex::buf_encoder"],[7007,"bdk_chain::bitcoin::hashes::hex::display"],[7045,"bdk_chain::bitcoin::hashes::hex::error"],[7074,"bdk_chain::bitcoin::hashes::hex::parse"],[7083,"bdk_chain::bitcoin::hashes::hex::prelude"],[7094,"bdk_chain::bitcoin::hashes::hmac"],[7107,"bdk_chain::bitcoin::hashes::ripemd160"],[7178,"bdk_chain::bitcoin::hashes::serde"],[7265,"bdk_chain::bitcoin::hashes::serde::de"],[7449,"bdk_chain::bitcoin::hashes::serde::de::value"],[8772,"bdk_chain::bitcoin::hashes::serde::ser"],[8901,"bdk_chain::bitcoin::hashes::serde_macros"],[8902,"bdk_chain::bitcoin::hashes::serde_macros::serde_details"],[8907,"bdk_chain::bitcoin::hashes::sha1"],[8977,"bdk_chain::bitcoin::hashes::sha256"],[9091,"bdk_chain::bitcoin::hashes::sha256d"],[9144,"bdk_chain::bitcoin::hashes::sha256t"],[9191,"bdk_chain::bitcoin::hashes::sha384"],[9247,"bdk_chain::bitcoin::hashes::sha512"],[9317,"bdk_chain::bitcoin::hashes::sha512_256"],[9373,"bdk_chain::bitcoin::hashes::siphash24"],[9465,"bdk_chain::bitcoin::io"],[9713,"bdk_chain::bitcoin::key"],[10083,"bdk_chain::bitcoin::merkle_tree"],[10141,"bdk_chain::bitcoin::network"],[10189,"bdk_chain::bitcoin::network::as_core_arg"],[10191,"bdk_chain::bitcoin::p2p"],[10349,"bdk_chain::bitcoin::p2p::address"],[10404,"bdk_chain::bitcoin::p2p::message"],[10531,"bdk_chain::bitcoin::p2p::message::NetworkMessage"],[10533,"bdk_chain::bitcoin::p2p::message_blockdata"],[10609,"bdk_chain::bitcoin::p2p::message_blockdata::Inventory"],[10611,"bdk_chain::bitcoin::p2p::message_bloom"],[10675,"bdk_chain::bitcoin::p2p::message_compact_blocks"],[10768,"bdk_chain::bitcoin::p2p::message_filter"],[10900,"bdk_chain::bitcoin::p2p::message_network"],[10978,"bdk_chain::bitcoin::parse"],[10999,"bdk_chain::bitcoin::policy"],[11008,"bdk_chain::bitcoin::pow"],[11011,"bdk_chain::bitcoin::psbt"],[11389,"bdk_chain::bitcoin::psbt::Error"],[11394,"bdk_chain::bitcoin::psbt::ExtractTxError"],[11398,"bdk_chain::bitcoin::psbt::IndexOutOfBoundsError"],[11402,"bdk_chain::bitcoin::psbt::raw"],[11473,"bdk_chain::bitcoin::secp256k1"],[11827,"bdk_chain::bitcoin::secp256k1::constants"],[11843,"bdk_chain::bitcoin::secp256k1::ecdh"],[11874,"bdk_chain::bitcoin::secp256k1::ecdsa"],[11996,"bdk_chain::bitcoin::secp256k1::ecdsa::serialized_signature"],[12018,"bdk_chain::bitcoin::secp256k1::ellswift"],[12093,"bdk_chain::bitcoin::secp256k1::ffi"],[12339,"bdk_chain::bitcoin::secp256k1::ffi::recovery"],[12371,"bdk_chain::bitcoin::secp256k1::ffi::types"],[12401,"bdk_chain::bitcoin::secp256k1::hashes"],[12515,"bdk_chain::bitcoin::secp256k1::rand"],[12567,"bdk_chain::bitcoin::secp256k1::rand::distributions"],[12842,"bdk_chain::bitcoin::secp256k1::rand::distributions::uniform"],[12985,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted"],[12992,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted::alias_method"],[13004,"bdk_chain::bitcoin::secp256k1::rand::prelude"],[13048,"bdk_chain::bitcoin::secp256k1::rand::rngs"],[13111,"bdk_chain::bitcoin::secp256k1::rand::rngs::adapter"],[13159,"bdk_chain::bitcoin::secp256k1::rand::rngs::mock"],[13180,"bdk_chain::bitcoin::secp256k1::rand::seq"],[13212,"bdk_chain::bitcoin::secp256k1::rand::seq::index"],[13269,"bdk_chain::bitcoin::secp256k1::scalar"],[13289,"bdk_chain::bitcoin::secp256k1::schnorr"],[13320,"bdk_chain::bitcoin::sighash"],[13669,"bdk_chain::bitcoin::sign_message"],[13724,"bdk_chain::bitcoin::taproot"],[14363,"bdk_chain::bitcoin::taproot::merkle_branch"],[14389,"bdk_chain::bitcoin::taproot::serialized_signature"],[14444,"bdk_chain::indexed_tx_graph"],[14495,"bdk_chain::indexer"],[14504,"bdk_chain::indexer::keychain_txout"],[14607,"bdk_chain::indexer::keychain_txout::InsertDescriptorError"],[14611,"bdk_chain::indexer::spk_txout"],[14648,"bdk_chain::local_chain"],[14780,"bdk_chain::rusqlite_impl"],[14782,"bdk_chain::spk_client"],[14928,"bdk_chain::tx_graph"],[15113,"bdk_chain::balance"],[15114,"bdk_chain::descriptor_ext"],[15115,"bdk_chain::tx_data_traits"],[15116,"bdk_core::block_id"],[15117,"bitcoin_hashes::sha256"],[15118,"bdk_core::checkpoint"],[15119,"bdk_core::tx_update"],[15120,"core::clone"],[15121,"bdk_chain::chain_data"],[15122,"bdk_chain::spk_iter"],[15123,"core::cmp"],[15124,"rusqlite::types::value_ref"],[15125,"bitcoin::blockdata::block"],[15126,"rusqlite::types::from_sql"],[15127,"bitcoin::blockdata::transaction"],[15128,"bitcoin_units::amount"],[15129,"bitcoin::blockdata::script::owned"],[15130,"bitcoin::network"],[15131,"miniscript::descriptor::key"],[15132,"miniscript::descriptor"],[15133,"serde::de"],[15134,"core::option"],[15135,"core::borrow"],[15136,"core::result"],[15137,"core::iter::traits::collect"],[15138,"core::fmt"],[15139,"bitcoin_hashes"],[15140,"bdk_chain::chain_oracle"],[15141,"core::hash"],[15142,"core::slice::index"],[15143,"fallible_iterator"],[15144,"core::iter::traits::iterator"],[15145,"bdk_core::merge"],[15146,"core::ops::function"],[15147,"core::ops::range"],[15148,"serde::ser"],[15149,"rusqlite::types::to_sql"],[15150,"rusqlite"],[15151,"alloc::string"],[15152,"core::any"],[15153,"bitcoin_units::weight"],[15154,"bitcoin::pow"],[15155,"secp256k1::key"],[15156,"secp256k1"],[15157,"secp256k1::scalar"],[15158,"secp256k1::context"],[15159,"bitcoin::address"],[15160,"bitcoin::bip158"],[15161,"bitcoin::bip32"],[15162,"bitcoin::blockdata::script"],[15163,"bitcoin::crypto::key"],[15164,"bitcoin::crypto::sighash"],[15165,"bitcoin::taproot"],[15166,"bitcoin::blockdata::script::borrowed"],[15167,"secp256k1_sys"],[15168,"bitcoin_hashes::sha256d"],[15169,"bitcoin_hashes::hash160"],[15170,"bitcoin_hashes::sha256t"],[15171,"bitcoin::blockdata::script::push_bytes::primitive"],[15172,"bitcoin::consensus::params"],[15173,"bitcoin::blockdata::script::builder"],[15174,"bitcoin::blockdata::constants"],[15175,"bitcoin::blockdata::locktime::absolute"],[15176,"bitcoin::blockdata::locktime::relative"],[15177,"bitcoin_units::fee_rate"],[15178,"bitcoin::blockdata::opcodes"],[15179,"bitcoin::blockdata::witness"],[15180,"bitcoin::blockdata::script::witness_program"],[15181,"bitcoin::blockdata::script::witness_version"],[15182,"bitcoin::consensus::encode"],[15183,"bitcoin::merkle_tree::block"],[15184,"bitcoin::psbt"],[15185,"bitcoin::psbt::error"],[15186,"bitcoin_io"],[15187,"core::marker"],[15188,"bitcoin_io::error"],[15189,"bitcoin_units::amount::serde::private"],[15190,"core::convert"],[15191,"bitcoin::blockdata::script::instruction"],[15192,"miniscript::psbt"],[15193,"alloc::vec"],[15194,"alloc::borrow"],[15195,"miniscript::primitives::relative_locktime"],[15196,"hex_conservative::error"],[15197,"bitcoin::error"],[15198,"bitcoin::p2p"],[15199,"bitcoin::address::error"],[15200,"bitcoin_units::locktime::relative"],[15201,"miniscript::miniscript::decode"],[15202,"alloc::boxed"],[15203,"bitcoin_units::locktime::absolute"],[15204,"bitcoin::crypto::taproot"],[15205,"bitcoin::crypto::ecdsa"],[15206,"alloc::collections::btree::map"],[15207,"bech32::primitives::gf32"],[15208,"miniscript::miniscript::hash256"],[15209,"bitcoin_hashes::ripemd160"],[15210,"secp256k1::schnorr"],[15211,"bech32::segwit"],[15212,"base58ck::error"],[15213,"bitcoin_units::amount::serde"],[15214,"core::alloc"],[15215,"std::ffi::os_str"],[15216,"std::path"],[15217,"bitcoin::p2p::address"],[15218,"bitcoin::p2p::message_blockdata"],[15219,"bitcoin::bip152"],[15220,"alloc::vec::drain"],[15221,"serde_json::value"],[15222,"alloc::vec::extract_if"],[15223,"std::io::error"],[15224,"alloc::collections::vec_deque"],[15225,"bitcoin::taproot::merkle_branch"],[15226,"alloc::ffi::c_str"],[15227,"alloc::collections::binary_heap"],[15228,"miniscript::plan"],[15229,"serde::de::value"],[15230,"core::str::pattern"],[15231,"core::mem::maybe_uninit"],[15232,"alloc::vec::splice"],[15233,"core::net::socket_addr"],[15234,"alloc::vec::into_iter"],[15235,"rusqlite::error"],[15236,"alloc::collections"],[15237,"std::io"],[15238,"base64::encode"],[15239,"base64::decode"],[15240,"base64::engine"],[15241,"base64::alphabet"],[15242,"base64::display"],[15243,"base64::engine::general_purpose"],[15244,"base64::read::decoder"],[15245,"base64::write::encoder_string_writer"],[15246,"base64::write::encoder"],[15247,"miniscript::primitives::absolute_locktime"],[15248,"bitcoin::blockdata::script::push_bytes::error"],[15249,"bitcoin::blockdata::script::push_bytes"],[15250,"bitcoin_units::parse"],[15251,"bitcoin::consensus"],[15252,"bitcoin::consensus::serde"],[15253,"bitcoin::consensus::serde::hex"],[15254,"core::slice::iter"],[15255,"secp256k1::ecdsa"],[15256,"hex_conservative::parse"],[15257,"hex_conservative::display"],[15258,"hex_conservative"],[15259,"hex_conservative::iter"],[15260,"core::iter::traits::exact_size"],[15261,"core::iter::traits::double_ended"],[15262,"core::iter::traits::marker"],[15263,"hex_conservative::buf_encoder"],[15264,"serde::de::ignored_any"],[15265,"core::error"],[15266,"serde::ser::impossible"],[15267,"bitcoin_hashes::serde_macros::serde_details"],[15268,"bitcoin_hashes::sha1"],[15269,"bitcoin_hashes::sha384"],[15270,"bitcoin_hashes::sha512"],[15271,"bitcoin_hashes::sha512_256"],[15272,"bitcoin_hashes::siphash24"],[15273,"bitcoin_io::bridge"],[15274,"core::ptr::non_null"],[15275,"secp256k1::context::alloc_only"],[15276,"secp256k1::secret"],[15277,"core::mem::manually_drop"],[15278,"rand::rng"],[15279,"secp256k1_sys::types"],[15280,"secp256k1::ecdsa::recovery"],[15281,"rand_core"],[15282,"bitcoin::p2p::message"],[15283,"bitcoin::p2p::message_bloom"],[15284,"bitcoin::p2p::message_compact_blocks"],[15285,"bitcoin::p2p::message_filter"],[15286,"bitcoin::p2p::message_network"],[15287,"core::num::error"],[15288,"bitcoin::psbt::map::output"],[15289,"bitcoin::psbt::map::input"],[15290,"bitcoin::psbt::display_from_str"],[15291,"bitcoin::psbt::raw"],[15292,"secp256k1::ellswift"],[15293,"secp256k1::ecdh"],[15294,"secp256k1_sys::recovery"],[15295,"secp256k1::ecdsa::serialized_signature"],[15296,"secp256k1::ecdsa::serialized_signature::into_iter"],[15297,"core::ffi"],[15298,"bitcoin_hashes::hmac"],[15299,"core::str::traits"],[15300,"rand_core::error"],[15301,"core::num::nonzero"],[15302,"getrandom::error"],[15303,"core::default"],[15304,"rand::distributions::uniform"],[15305,"rand::distributions::distribution"],[15306,"rand::rngs::thread"],[15307,"rand::distributions::other"],[15308,"rand::distributions"],[15309,"rand::distributions::bernoulli"],[15310,"rand::distributions::float"],[15311,"rand::distributions::slice"],[15312,"rand::distributions::weighted_index"],[15313,"core::ops::arith"],[15314,"core::num::wrapping"],[15315,"core::time"],[15316,"rand::distributions::weighted::alias_method"],[15317,"rand::seq"],[15318,"rand_core::os"],[15319,"rand::rngs::std"],[15320,"rand::rngs::adapter::reseeding"],[15321,"rand_core::block"],[15322,"rand::rngs::adapter::read"],[15323,"rand::rngs::mock"],[15324,"core::ops::index"],[15325,"rand::seq::index"],[15326,"bitcoin::sign_message::message_signing"],[15327,"alloc::collections::btree::set"],[15328,"bitcoin::taproot::serialized_signature"],[15329,"bitcoin::taproot::serialized_signature::into_iter"],[15330,"alloc::sync"],[15331,"rusqlite::transaction"],[15332,"bdk_core"],[15333,"bdk_core::spk_client"],[15334,"std::collections::hash::set"],[15335,"bitcoin"],[15336,"bitcoin::crypto"],[15337,"bitcoin_units::amount::serde::as_btc"],[15338,"bitcoin_units::amount::serde::as_btc::opt"],[15339,"bitcoin_units::amount::serde::as_sat"],[15340,"bitcoin_units::amount::serde::as_sat::opt"],[15341,"base58ck"],[15342,"base64"],[15343,"bitcoin::blockdata"],[15344,"bitcoin::blockdata::locktime"],[15345,"bitcoin::blockdata::opcodes::all"],[15346,"bitcoin_hashes::cmp"],[15347,"serde_derive"],[15348,"serde"],[15349,"bitcoin_hashes::serde_macros"],[15350,"bitcoin::merkle_tree"],[15351,"bitcoin::network::as_core_arg"],[15352,"bitcoin::policy"],[15353,"secp256k1::constants"],[15354,"rand"],[15355,"rand::distributions::weighted"],[15356,"rand::rngs"],[15357,"bitcoin::sign_message"]],"i":[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,30,0,0,134,0,0,150,129,144,0,127,127,0,0,0,0,0,0,27,78,129,79,127,148,148,148,148,148,79,27,78,29,27,78,129,79,79,147,135,0,134,134,134,139,134,0,0,144,145,144,145,27,78,27,78,0,0,88,88,88,88,88,134,0,0,0,0,135,30,134,27,134,0,0,0,0,0,0,30,144,145,144,145,0,0,0,0,0,0,0,0,0,0,147,30,30,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,27,78,129,79,127,148,78,27,78,79,80,27,78,79,81,0,87,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,0,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,106,81,106,106,28,28,106,81,81,28,81,89,90,91,23,92,93,94,95,96,26,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,28,28,95,95,95,96,96,96,26,26,97,97,98,98,98,99,99,99,100,100,101,101,102,102,30,103,103,104,104,105,105,28,87,87,87,104,119,29,0,0,0,120,120,0,134,27,78,129,81,79,88,135,87,89,89,90,90,91,91,23,23,92,92,93,93,94,94,120,130,106,28,28,136,137,95,95,96,96,26,26,97,97,138,119,127,139,29,133,140,141,98,98,99,99,142,143,100,100,101,101,110,102,102,144,145,146,147,30,80,148,149,150,112,103,103,113,104,104,114,105,105,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,28,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,106,28,106,30,127,120,127,127,120,78,27,78,79,27,78,129,79,27,78,129,79,129,27,78,27,78,79,130,133,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,106,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,100,101,110,102,144,147,30,80,148,149,112,103,113,104,114,105,81,120,150,141,143,120,29,29,120,29,0,27,89,90,23,92,93,120,26,97,138,127,139,133,140,146,149,103,120,28,119,139,29,27,89,90,23,92,93,120,106,28,26,97,138,119,127,139,29,133,140,146,149,103,106,106,81,27,78,28,138,119,127,133,110,149,112,113,114,28,28,27,78,27,78,27,129,81,79,87,89,90,91,23,92,93,94,120,106,28,95,96,26,97,138,119,127,139,29,133,141,98,99,142,143,100,101,102,144,145,30,80,148,149,150,150,103,104,105,150,148,148,27,78,27,78,27,27,78,79,79,27,78,79,106,0,127,119,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,110,102,112,103,113,104,114,105,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,106,28,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,81,134,134,27,27,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,28,28,136,136,137,137,95,95,96,96,26,26,97,97,138,138,119,119,127,127,139,139,29,29,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,30,30,80,80,148,148,149,149,150,150,112,112,103,103,113,113,104,104,114,114,105,105,0,28,150,146,150,150,150,150,150,129,129,89,150,150,150,150,150,150,150,150,106,134,134,27,27,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,28,28,28,28,136,137,137,95,95,95,95,96,96,96,96,26,26,26,26,97,97,97,97,138,138,119,127,127,127,127,139,29,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,30,30,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,27,78,143,134,27,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,28,28,28,28,28,136,137,95,95,95,95,95,96,96,96,96,96,26,26,26,26,97,97,97,97,138,119,127,127,127,139,29,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,30,80,148,148,149,150,112,103,103,103,113,104,104,104,104,104,114,105,105,105,105,127,80,148,146,27,78,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,106,28,106,30,148,127,145,149,144,30,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,27,78,149,146,127,28,127,80,148,149,27,28,105,81,79,80,148,30,149,104,79,141,142,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,27,78,129,129,129,87,103,104,127,127,81,81,89,90,91,23,92,93,94,95,96,26,97,133,141,141,98,99,142,143,100,101,102,103,104,105,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,145,134,27,78,129,81,79,88,87,89,90,91,23,92,93,94,137,95,96,26,97,138,127,141,98,99,142,143,100,101,102,144,145,30,150,103,104,105,27,78,27,78,127,80,148,149,150,79,79,79,143,79,87,79,79,143,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,106,28,136,137,95,96,26,97,138,119,127,139,29,133,141,98,99,142,100,101,110,102,144,145,147,30,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,26,97,133,98,99,143,100,101,102,103,104,105,141,143,29,150,106,106,106,106,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,28,28,133,106,29,29,106,133,29,127,127,29,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,29,80,30,87,148,148,148,0,148,148,106,139,106,139,27,78,129,79,79,27,78,79,78,0,143,106,28,136,138,133,141,143,28,28,28,28,28,28,28,28,141,143,28,133,29,138,29,150,0,106,87,87,87,87,87,87,136,133,87,136,87,136,133,106,28,141,142,87,136,30,0,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,106,106,28,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,100,101,110,102,144,147,30,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,28,28,28,28,141,142,106,27,78,27,78,87,28,28,79,28,87,106,87,139,29,119,133,119,119,27,78,27,78,27,78,27,78,27,129,81,81,79,87,89,90,91,23,92,93,94,120,130,106,28,95,96,26,97,138,119,127,139,29,133,141,98,99,142,143,100,101,102,144,145,30,80,148,149,150,150,103,104,105,150,150,0,150,150,150,0,78,139,133,140,150,27,78,79,80,27,78,79,27,78,79,79,81,0,133,133,133,106,87,106,80,148,27,78,89,90,91,23,92,93,94,95,96,26,97,98,99,100,101,102,103,104,105,106,141,142,143,148,149,127,30,137,27,78,81,141,81,141,106,79,80,148,137,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,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,26,97,98,99,100,101,102,103,104,105,127,81,141,27,78,129,129,129,105,81,141,27,141,134,27,78,129,81,79,88,87,89,90,91,23,92,93,94,130,106,28,137,95,96,26,97,138,127,141,98,99,142,143,100,101,102,144,145,30,80,148,150,103,104,105,27,78,27,78,80,145,130,78,79,79,133,143,148,79,81,29,120,119,29,134,27,27,78,78,129,129,129,129,81,79,79,79,79,88,135,87,89,90,91,23,92,93,94,120,130,28,136,137,137,137,137,137,95,96,26,97,138,119,127,127,127,127,139,29,133,140,141,98,99,142,142,143,100,101,110,102,144,145,146,147,30,30,30,80,148,149,150,112,103,113,104,114,105,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,81,29,29,120,29,138,146,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,27,78,27,78,27,78,150,78,150,150,150,139,81,141,142,136,29,150,138,29,134,27,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,28,136,137,95,96,26,97,138,119,127,139,29,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,30,80,148,149,150,112,103,113,104,114,105,120,139,29,28,119,87,120,133,106,141,142,141,142,106,29,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,267,267,267,267,267,266,267,267,327,329,325,266,267,267,267,326,327,328,329,325,266,267,267,267,326,327,328,329,267,325,266,267,326,327,328,329,325,266,267,326,327,328,329,266,267,326,327,329,266,267,326,327,329,326,329,266,267,326,327,329,267,267,325,266,267,326,327,328,329,325,325,266,266,267,267,326,326,327,327,328,328,329,329,325,325,266,267,267,267,267,326,327,328,328,329,325,325,266,267,267,267,326,327,328,329,326,267,329,267,266,267,326,327,329,326,266,267,327,325,266,267,326,327,328,329,267,267,326,266,267,326,327,329,326,267,326,325,328,267,325,266,267,326,327,328,329,325,267,328,329,325,266,267,267,326,327,328,329,325,266,267,326,327,328,329,266,325,266,267,326,327,328,329,325,266,267,326,327,328,329,267,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,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,283,115,283,283,115,115,283,122,209,208,123,122,165,209,208,115,283,283,358,359,123,122,165,209,208,115,283,283,358,359,283,283,122,165,209,208,283,358,359,122,165,209,208,283,358,359,115,283,122,283,283,283,115,122,165,115,283,358,359,122,122,165,165,115,115,283,283,358,358,359,359,283,122,122,165,209,208,115,283,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,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,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,358,359,359,359,115,283,115,115,115,115,115,115,115,115,361,358,123,122,165,209,208,283,358,359,122,123,209,208,123,209,208,122,122,115,283,122,115,283,122,283,123,209,208,123,123,208,123,165,115,283,283,283,165,122,122,122,122,122,122,122,122,0,0,0,283,283,165,123,209,208,358,359,122,165,209,208,115,283,358,359,122,358,359,123,209,208,283,123,122,165,209,208,115,115,283,283,358,359,123,122,165,209,208,283,358,359,123,122,165,209,208,115,283,358,359,123,122,165,209,208,283,358,359,283,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,29,365,234,235,366,367,368,367,366,29,368,367,29,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,29,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,30,147,0,0,0,30,30,147,30,30,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,265,265,265,0,0,0,265,265,265,265,265,265,533,534,265,533,534,265,533,534,265,533,534,265,265,533,534,533,534,265,533,534,265,533,534,265,265,533,533,534,534,265,533,534,265,533,534,265,265,533,534,533,534,265,533,534,265,533,534,265,533,534,265,533,534,265,533,534,265,533,534,533,534,265,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,282,282,282,657,282,667,666,217,658,282,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,667,666,217,658,282,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,282,178,655,662,657,177,663,219,664,190,662,178,282,219,282,655,177,282,282,217,282,661,662,657,219,190,282,219,217,658,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,217,658,658,282,282,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,282,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,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,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,282,178,655,661,662,657,177,663,219,664,190,178,219,667,666,217,658,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,659,667,666,282,667,666,282,282,282,660,661,282,282,655,177,177,662,177,219,282,0,177,663,219,178,655,177,662,178,662,177,667,666,667,666,662,177,661,178,178,219,217,282,178,655,662,657,177,663,219,664,190,661,177,663,661,178,217,217,282,282,661,662,657,219,219,190,217,0,217,217,219,667,666,658,659,660,656,665,178,664,190,217,658,282,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,282,282,282,282,178,655,659,660,661,661,661,662,662,657,177,663,219,664,190,656,665,667,666,217,658,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,655,655,667,666,217,658,282,178,655,659,660,661,662,657,177,663,219,664,190,656,665,219,663,667,666,217,658,282,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,676,676,0,679,679,679,679,680,676,679,680,676,679,680,676,679,680,676,679,676,676,680,676,679,680,680,676,679,680,676,676,679,679,679,679,676,679,679,679,680,676,676,679,679,679,679,679,676,679,679,679,679,679,679,679,676,679,679,679,679,679,676,679,679,679,679,679,684,679,676,679,685,679,680,676,680,679,680,676,679,680,676,679,679,679,679,680,676,679,679,679,679,684,679,680,676,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,677,0,0,0,704,704,677,677,677,0,0,0,0,0,52,52,677,13,705,677,52,52,52,52,52,52,707,708,52,705,706,704,677,707,708,52,705,706,704,677,52,706,707,707,708,708,52,705,706,677,52,705,706,677,705,706,52,677,705,677,52,52,705,706,704,677,705,705,706,706,704,704,52,52,52,52,705,706,704,704,677,707,708,52,52,705,706,704,677,677,52,52,52,52,52,52,677,52,52,52,52,52,707,708,52,705,706,704,677,707,708,707,708,52,677,677,705,52,52,677,677,52,707,708,52,705,706,677,13,677,52,705,706,677,704,707,708,52,52,52,707,708,52,705,706,704,677,52,52,707,708,52,705,706,704,677,52,705,706,52,52,705,677,13,677,13,677,52,707,708,52,705,706,704,677,707,708,52,705,706,704,677,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}}}{}{}}0000000000300{{{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`{d}}}}}}{Bl{{Cb{{C`{Cf}}}}}}{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{{h{Df}}{h{Bn}}}}}j}{{{Ff{DfBn}}}j}2{Bbj}{Bbl}44{{{Fh{c}}}{{Aj{c}}}{}}5{c{{C`{c}}}{}}{Fjc{}}707{c{{Db{c}}}{}}8888{nd}99{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}}}Bn}{{{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{{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`{d}}}}}{{Id{Ib}}}}{{{h{{C`{Bn}}}}}{{Id{Ib}}}}{{{h{{C`{Cl}}}}}{{Id{Ib}}}}{{{h{{C`{Cj}}}}}{{Id{Ib}}}}{{{h{{C`{{D`{Cn}}}}}}}{{Id{Ib}}}}{{{h{{C`{Cf}}}}}{{Id{Ib}}}}{{{h{{C`{Ch}}}}}{{Id{Ib}}}}{{{h{{C`{Cd}}}}}{{Id{Ib}}}}{{{h{{Db{c}}}}}{{Id{Ib}}}{fI`}}{{{h{c}}}If{}}0{{{h{b}}}Cf}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0`1{c{{Dn{e}}}{}{}}0000000000000000000000000`````{{{h{c}}}Ij{}}000000000000`{ce{}{}}000000000000``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{IlIl}{{CfCf}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhCf}}Cf}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`}{{}Cd}{{}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{Cd}}}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{AhMd}}}}{{{h{AhMd}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhCh}}}{{h{AhMd}}}}{{{h{AhCh}}}{{h{Ah{Ab{A`}}}}}}2{{{h{AhJb}}}}{{{h{AhJb}}}Mf}3{{{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{Cd}}}{{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{{Ab{A`}}}}}}{{{h{Kd}}}{{h{{Ad{A`}}}}}}{{{h{Kf}}}{{h{{Ad{A`}}}}}}{{{h{Kf}}}{{h{{Ab{A`}}}}}}{{{h{Bn}}}{{h{{Ad{A`}}}}}}{{{h{Bn}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ad{A`}}}}}}{{{h{Kj}}}{{h{{Ad{A`}}}}}}{{{h{Kj}}}{{h{{Ab{A`}}}}}}{{{h{Kl}}}{{h{{Ab{A`}}}}}}{{{h{Kl}}}{{h{{Ad{A`}}}}}}{{{h{Md}}}{{h{{Ab{A`}}}}}}{{{h{Md}}}{{h{Md}}}}{{{h{Ch}}}{{h{{Ab{A`}}}}}}{{{h{Ch}}}{{h{Md}}}}{{{h{Kn}}}{{h{Nf}}}}{{{h{Kn}}}{{h{{Ab{A`}}}}}}{{{h{Kn}}}{{h{{Ad{A`}}}}}}{{{h{L`}}}{{h{{Ab{A`}}}}}}{{{h{L`}}}{{h{Nf}}}}{{{h{L`}}}{{h{{Ad{A`}}}}}}{{{h{Cd}}}{{h{{Ad{A`}}}}}}{{{h{Cd}}}{{h{{Ab{A`}}}}}}{{{h{Lb}}}{{h{{Ad{A`}}}}}}{{{h{Lb}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{{Ad{A`}}}}}}{{{h{Ld}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{Nf}}}}{{{h{Lf}}}{{h{Nf}}}}{{{h{Lf}}}{{h{{Ab{A`}}}}}}{{{h{Lf}}}{{h{{Ad{A`}}}}}}{{{h{Lh}}}{{h{{Ad{A`}}}}}}{{{h{Lh}}}{{h{{Ab{A`}}}}}}{{{h{Lj}}}{{h{{Ab{A`}}}}}}{{{h{Lj}}}{{h{{Ad{A`}}}}}}{{{h{Ll}}}{{h{{Ab{A`}}}}}}{{{h{Ll}}}{{h{{Ad{A`}}}}}}{{{h{Cl}}}{{h{Nh}}}}{{{h{Ln}}}{{h{{Ab{A`}}}}}}{{{h{Ln}}}{{h{{Ad{A`}}}}}}{{{h{M`}}}{{h{{Ab{A`}}}}}}{{{h{M`}}}{{h{{Ad{A`}}}}}}{{{h{Mb}}}{{h{{Ab{A`}}}}}}{{{h{Mb}}}{{h{{Ad{A`}}}}}}{{{h{Ch}}}{{h{Md}}}}{{{h{{Jn{c}}}}}{{h{{Jn{Nj}}}}}Nl}{{{Jn{Nj}}}Jn}{{{h{{Jn{Nj}}}}}{{h{Jn}}}}{{{Ad{A`}}}M`}{{{h{Nn}}}Hj}{{{h{Cj}}}Hj}```{{{h{O`}}}{{Dn{EdOb}}}}{{{h{O`}}}Bn}`{{{h{c}}}{{h{e}}}{}{}}000000000{{{h{Kb}}}{{h{{Ab{A`}}}}}}{{{h{Kd}}}{{h{{Ab{A`}}}}}}2{{{h{Kf}}}{{h{{Ab{A`}}}}}}33{{{h{Bn}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ab{A`}}}}}}55{{{h{Kj}}}{{h{{Ab{A`}}}}}}{{{h{Kl}}}{{h{{Ab{A`}}}}}}77777{{{h{Ch}}}{{h{Md}}}}888{{{h{Kn}}}{{h{{Ab{A`}}}}}}9{{{h{L`}}}{{h{{Ab{A`}}}}}}{{{h{Cd}}}{{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}}}{}{}}00{{{h{Ll}}}{{h{{Ab{A`}}}}}}1111111111{{{h{Ln}}}{{h{{Ab{A`}}}}}}22{{{h{M`}}}{{h{{Ab{A`}}}}}}333{{{h{Mb}}}{{h{{Ab{A`}}}}}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000000000000000{{{h{AhCh}}}{{h{AhMd}}}}1111111111111111111111111111111111111{{}Od}0{{{h{Md}}}Of}{ClOh}{{{h{c}}Oj}Ef{}}{{{h{O`}}}Ef}{{{h{c}}Ol}Ef{}}{{{h{On}}Ol}Ef}2{Il{{Dh{Il}}}}{{CfCf}{{Dh{Cf}}}}{{IlIl}{{Dh{Il}}}}{{InIn}{{Dh{In}}}}{{CfEd}{{Dh{Cf}}}}{{IlA@`}{{Dh{Il}}}}{{A@bEd}{{Dh{A@b}}}}{{InEd}{{Dh{In}}}}3210{{A@bIn}{{Dh{Cf}}}}43765{{A@dA@f}A@h}{{{h{AhA@j}}}Bf}{{{h{A@l}}}A@l}{{{h{Cf}}}Cf}{{{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{Ch}}}Ch}{{{h{AA`}}}AA`}{{{h{AAb}}}AAb}{{{h{Kn}}}Kn}{{{h{L`}}}L`}{{{h{Cd}}}Cd}{{{h{Lb}}}Lb}{{{h{AAd}}}AAd}{{{h{Nn}}}Nn}{{{h{On}}}On}{{{h{AAf}}}AAf}{{{h{Cj}}}Cj}{{{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{Cl}}}Cl}{{{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{Cf}}{h{Cf}}}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{Ch}}{h{Ch}}}Bh}{{{h{AA`}}{h{AA`}}}Bh}{{{h{AAb}}{h{AAb}}}Bh}{{{h{Kn}}{h{Kn}}}Bh}{{{h{L`}}{h{L`}}}Bh}{{{h{Cd}}{h{Cd}}}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{Cj}}{h{Cj}}}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{Cl}}{h{Cl}}}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{Cj}}}}}}{{{h{AhABl}}ABl}{{Dn{BfABn}}}}``{{{h{O`}}}{{Dh{Kh}}}}{{{h{Cj}}}Mh}{{{h{Cj}}}Cd}{{{h{Kj}}{h{{Ab{A`}}}}}Kl}{{{h{Cj}}}Lb}`{{{h{Ahc}}}{{Dn{CfAC`}}}{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{CdAC`}}}{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{ChAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{NnAC`}}}{ACbACd}}7{{{h{Ahc}}}{{Dn{CjAC`}}}{ACbACd}}{{{h{Cf}}{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{Ch}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Cd}}{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{Cj}}{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}{{}Cf}{{}Il}{{}Ch}{{}AAd}{{}Nn}{{}On}{{}A@j}{{}Ml}{{}ABj}{{}N`}{{}Nb}{{}Nd}{{{h{Ch}}}h}{{{h{AhCh}}}{{h{Ah}}}}{{cACl}{{Dn{Cf}}}E`}{{cACl}{{Dn{Il}}}E`}10{c{{Dn{Cf}}}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{Ch}}}E`}{c{{Dn{Kn}}}E`}{c{{Dn{L`}}}E`}{c{{Dn{Cd}}}E`}{c{{Dn{Lb}}}E`}{c{{Dn{AAd}}}E`}{c{{Dn{Nn}}}E`}{c{{Dn{On}}}E`}{c{{Dn{AAf}}}E`}{c{{Dn{Cj}}}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{Cl}}}E`}{c{{Dn{J`}}}E`}{c{{Dn{ABh}}}E`}{c{{Dn{ABj}}}E`}{{{h{{Ab{A`}}}}}{{Dn{ABlABn}}}}{c{{Dn{ABl}}}E`}{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}{CfADf}{IlADf}{{CfA@l}ADf}{{IlA@l}ADf}{{CfEd}}{{CfIn}}{{IlA@`}}{{InIn}}{{InEd}}{{{h{AhCf}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{{{h{Md}}}Cf}`{{{h{On}}}Ef}{{{h{Nn}}}Ef}{{}}00000000000000{{}ADh}1010101{{{h{A@l}}{h{A@l}}}Ef}{{{h{Cf}}{h{Cf}}}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{Ch}}}Ef}{{{h{Md}}{h{Md}}}Ef}{{{h{Ch}}{h{Ch}}}Ef}{{{h{Ch}}{h{Md}}}Ef}{{{h{AA`}}{h{AA`}}}Ef}{{{h{AAb}}{h{AAb}}}Ef}{{{h{Kn}}{h{Kn}}}Ef}{{{h{L`}}{h{L`}}}Ef}{{{h{Cd}}{h{Cd}}}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{Cj}}{h{Cj}}}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{Cl}}{h{Cl}}}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{AhCh}}c}Bf{{El{}{{Ej{ADj}}}}}}{{{h{ABl}}{h{{Jd{c}}}}}{{Dn{CjADl}}}Jl}{{{h{ABd}}{h{Ah{ADn{Cd}}}}{h{Ah{ADn{Df}}}}}{{Dn{BfAE`}}}}{ABl{{Dn{CjAEb}}}}0{ABlCj}{{ABlA@b}{{Dn{CjAEb}}}}{{{h{ABl}}}{{Dn{CfABn}}}}{{A@bEd}{{Dh{Cf}}}}{{A@bIn}{{Dh{Cf}}}}{{{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{Cf}}{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}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{Jn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Nl}{{{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{Ch}}{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{Cd}}{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{Cj}}{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{Cl}}{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`}}}}{{Cf{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{Il{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{{h{AAn}}{h{AhAEd}}}{{Dn{BfF`}}}}{cc{}}000{AEfJb}{AAjJb}2{AAlJb}{ACjJb}{MfJb}555{ClA@n}6{MhKb}7{MhKd}8{MjKf}{AEhKf}{{{h{AEh}}}Kf};{FlBn}{{{h{O`}}}Bn}={O`Bn}{{{h{Fl}}}Bn}{MhBn}{cc{}}{MhKh}{CdKh}2{LbKj}{MhKj}4{MhKl}5{A`A@d}{AAbA@d}7{{{ADn{A`}}}Ch}8{{{h{Md}}}Ch}{JnCh}{{{AEj{Md}}}Ch};;{{{h{Md}}}Kn}<{{{h{Ch}}}Kn}{MjKn}{ChKn}?{{{h{Ch}}}L`}{{{h{Md}}}L`}{nL`}{ChL`}{{{h{Cj}}}Cd}{CjCd}{cc{}}{MhCd}1{MhLb}{CjLb}{{{h{Cj}}}Lb}44{AElOn}5{OlOn}66{{{h{{Ab{{ADn{A`}}}}}}}A@j}{{{ADn{{h{{Ab{A`}}}}}}}A@j}8{{{ADn{{ADn{A`}}}}}A@j}{{{h{{Ab{{h{{Ab{A`}}}}}}}}}A@j}{AEnAAh}{A`AAh}<{EdAAh}{DfAAh}{HjAAh}{AEfAAj}{AAlAAj}{cc{}}{{{h{AAl}}}Ld}{MjLd}{{{h{AAj}}}Ld}{AAlLd}4{AAjLd}5{{{h{AAl}}}Lf}{AAlLf}{MjLf}88{MhLh}9{MhLj}::{{{Mn{Ml}}}Ll};{ABbAB`}<<<{ClABf}==={ABjABh}>>>>{{{Mn{N`}}}Ln}{AF`Ln}{cc{}}0{{{h{AFb}}}M`}{LnM`}2{{{Mn{Nb}}}M`}{AFbM`}4{AFdMb}{{{h{AFd}}}Mb}6{{{Mn{Nd}}}Mb}{AEnOn}{{{Ad{A`}}}J`}{{{Ad{A`}}}ABh}{{{h{O`}}c}ABd{{AFf{{h{Cd}}}{{Hd{Ef}}}}}}{ADd{{Dn{CfAFh}}}}{ADd{{Dn{IlAFh}}}}{{}Kb}{{}Kd}{{}Kf}{{}Bn}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cd}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{{h{{Ab{A`}}}}}{{h{Md}}}}{{{ADn{A`}}}Ch}{{{h{Ah{Ab{A`}}}}}{{h{AhMd}}}}{Oh{{Dh{Cl}}}}{ABjABh}{DfOn}{DfABb}{DfABj}{A`{{Dn{AB`AFj}}}}{{{h{G`}}}{{Dn{ClAFl}}}}{{}Kb}{{}Kd}{{}Kf}{{}Bn}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cd}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{ADdA@l}{{Dn{CfAFh}}}}{{ADdA@l}{{Dn{IlAFh}}}}{{FlFlc}ABj{{ADb{Nh}}}}{{{h{Fl}}{h{{Ab{Cd}}}}c}ABd{{AFf{{h{Cd}}}{{Hd{Ef}}}}}}{AEnOn}{{{h{G`}}}{{Dn{ChAFn}}}}{{{h{G`}}}{{Dn{OnAG`}}}}{{{h{G`}}}{{Dn{J`AG`}}}}{{{h{G`}}}{{Dn{ABhAG`}}}}{{{h{G`}}}{{Dn{ABjAG`}}}}{EdCf}{cCh{{El{}{{Ej{ADj}}}}}}{{Jb{Dh{M`}}}Mb}{{{h{AGb}}}{{Ff{JbJh}}}}{Ed{{Dh{In}}}}{{{Ad{A`}}}J`}{{{Ad{A`}}}ABh}{AGd{{Dh{Cl}}}}{{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`}{MhCd}{MhLb}{MjLd}{MjLf}{MhLh}{MhLj}{{{Mn{Ml}}}Ll}{{{Mn{N`}}}Ln}{{{Mn{Nb}}}M`}{{{Mn{Nd}}}Mb}{EdCf}{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{JbAH`}}}}{{{h{{Ab{A`}}}}}{{Dn{JbJj}}}}{{{h{{Ab{A`}}}}}{{Dn{KbFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KdFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KfFn}}}}{{{h{{Ab{A`}}}}}{{Dn{BnFn}}}}{{{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{CdFn}}}}{{{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{BnFn}}}}{{{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{CdFn}}}}{{{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{Cf}}}}{{{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{Cd}}}}{{{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{Cl}}}}{{{h{G`}}}{{Dn{ABl}}}}{{{h{G`}}}{{Dn{Ln}}}}{{{h{G`}}}{{Dn{M`}}}}{{{h{G`}}}{{Dn{Mb}}}}{{{h{G`}}A@l}{{Dn{CfAFh}}}}{{{h{G`}}A@l}{{Dn{IlAFh}}}}{{{h{G`}}}{{Dn{CfAHn}}}}{{{h{G`}}}{{Dn{IlAHn}}}}{{{h{G`}}}{{Dn{OnAI`}}}}{{{h{G`}}}{{Dn{J`AI`}}}}{{{h{G`}}}{{Dn{ABhAI`}}}}{{{h{G`}}}{{Dn{ABjAI`}}}}{Cj{{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{Cf}}{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{Ch}}{h{Ahc}}}BfGf}{{{h{AA`}}{h{Ahc}}}BfGf}{{{h{AAb}}{h{Ahc}}}BfGf}{{{h{Kn}}{h{Ahc}}}BfGf}{{{h{L`}}{h{Ahc}}}BfGf}{{{h{Cd}}{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{Cj}}{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{Cl}}{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{Bn}}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}}{AIb{Hj}}}h}{{{h{Md}}{AId{Hj}}}h}{{{h{Md}}{AIf{Hj}}}h}{{{h{Md}}{AIh{Hj}}}h}{{{h{Md}}AIj}h}{{{h{Md}}{AIl{Hj}}}h}{{{h{Md}}{Ff{{AIn{Hj}}{AIn{Hj}}}}}h}{{{h{Kn}}c}h{{Gj{{Ab{A`}}}}}}{{{h{L`}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Cd}}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}}AIj}{{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{Ch{{AJd{Md}}}}{Ch{{ADn{A`}}}}{{{h{A@j}}}}{{{AJd{Md}}}Ch}{{{h{Cj}}AJfAJh}Ef}{{{h{Cj}}}Ef}{{{h{Md}}}Ef}{{{h{A@j}}}Ef}2{{{h{On}}}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}}}}Cl}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}{ClAGd}{{{h{Jn}}{h{Md}}}Ef}{{{h{ABh}}}ABh}{{{h{ABh}}c}ABh{{ADb{Nh}}}}1`11{{{h{Md}}}Cf}{ChAAf}{{{h{Md}}A@b}Cf}{{ChA@b}AAf}{{CfEd}}{{IlA@`}}{{A@bIn}}{{InA@b}}{{InEd}}{{{h{AhCf}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{Il}``{{}{{h{Md}}}}{{}Ch}{{AAb{h{{Ab{A`}}}}}{{Dn{AA`AJl}}}}{{CdDf}AAd}{{}A@j}{cAAj{{AHd{AEf}}}}{{AJnc}AAn{{AHd{ABf}}}}{cCh{{ADb{Nf}}}}{{{h{AAj}}}Ch}{{{h{Ld}}}Ch}{{{h{Kn}}}Ch}{{{h{{Jd{c}}}}Jb{Dh{M`}}}ChJl}{ACjCh}{{{h{Lf}}}Ch}{{{h{L`}}}Ch}98{{{h{AA`}}}Ch}{{{h{A@j}}Hj}{{Dh{{h{{Ab{A`}}}}}}}}{{{h{Cj}}}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{Ch}}}}{LfCh}{{{h{AAj}}}{{Dn{ChAGh}}}}{{{h{AAl}}}Ch}{{{h{Md}}c}Jn{{AHd{A@n}}}}{{{h{Md}}}AA`}{Cl{{h{Nh}}}}`{{{h{Cf}}{h{Cf}}}{{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{Ch}}}{{Dh{Bh}}}}{{{h{Ch}}{h{Md}}}{{Dh{Bh}}}}{{{h{Ch}}{h{Ch}}}{{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{Cd}}{h{Cd}}}{{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{Cj}}{h{Cj}}}{{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{Cl}}{h{Cl}}}{{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{ChAGl}}}}}}}}}{}}{{{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{AhCh}}ADj}Bf}0{{{h{AhCh}}A@d}Bf}{{{h{AhCh}}c}Bf{{ADb{Nf}}}}{{{h{Ahc}}}{{Dn{AAjACf}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAlACf}}}{ACbACd}}{{{h{Md}}}{{Dh{{h{Md}}}}}}{{CfEd}Cf}{{IlA@`}Il}{{{h{AhCf}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{Jn{Nj}}Cl}{{Dn{JnAHh}}}}{{{h{AhCh}}Hj}Bf}0{In{{Dh{In}}}}{{{h{AhCh}}}Bf}{{{h{Jn}}}{{Dh{Kn}}}}{{{h{Md}}}Kn}{{{h{Jn}}}Ch}`{{{h{Cj}}}{{`{{Gn{}{{Ej{Hj}}}}}}}}`{{{h{A@j}}}{{Dh{{h{{Ab{A`}}}}}}}}{{{h{Nn}}}In}`{{CfcACl}DnHn}{{IlcACl}DnHn}101010{{{h{Cf}}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{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{Ch}}c}DnHn}{{{h{Kn}}c}DnHn}{{{h{L`}}c}DnHn}{{{h{Cd}}c}DnHn}{{{h{Lb}}c}DnHn}{{{h{AAd}}c}DnHn}{{{h{Nn}}c}DnHn}{{{h{On}}c}DnHn}{{{h{AAf}}c}DnHn}{{{h{Cj}}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{Cl}}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{Cj}}}}{{{h{ABl}}Hj{h{Ah{AKj{c}}}}{Dh{Ln}}}{{Dn{AL`ALb}}}{{Dj{Cj}}}}{{{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}}}}{{CfCf}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhCf}}Cf}Bf}{{{h{AhIl}}Il}Bf}{{{h{AhIn}}In}Bf}{cCf{{Gn{}{{Ej{Cf}}}}}}{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`}}}}{CfADd}{IlADd}{Kb}{Kd}{Kf}{Bn}{Kh}{Kj}{Kl}{Kn}{L`}{Cd}{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}{Cl{{h{G`}}}}{AAbALj}{{CfA@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}}}Ch}{{{h{Md}}{h{{Jd{c}}}}Jb}ChJl}1{{{h{Jb}}}AAj}{{{h{AAj}}}AAj}{{{h{Jn}}}If}{KbMh}{KdMh}{KfMj}{BnMh}{KhMh}{KjMh}{KlMh}{KnMj}{L`n}{CdMh}{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{CfEd}{IlA@`}{A@bEd}00{MbJf}{{{h{n}}}n}0{Cf{{Dn{IlAM`}}}}{AAjAMb}{{{h{c}}}If{}}00000000000000000000000000000000000000000{{CfA@l}If}{{IlA@l}If}10{J`ABh}{ABbDf}{A@dA`}{Il{{Dn{CfAM`}}}}{InEd}0{{{h{A@j}}}{{ADn{{ADn{A`}}}}}}{AAnIf}{ABhJ`}3{{{h{Jb}}}Jb}{{{h{Cj}}c}Hj{{Hf{{h{AAd}}}{{Hd{{Dh{AAf}}}}}}}}{{{h{O`}}}Hj}{{{h{Nn}}}Hj}{{{h{Cj}}}Hj}{c{{Dn{e}}}{}{}}{Il{{Dn{Cf}}}}11{Cf{{Dn{Il}}}}{{{h{G`}}}{{Dn{A@b}}}}3{{{AJd{G`}}}{{Dn{A@b}}}}{If{{Dn{A@b}}}}5{{{h{G`}}}{{Dn{In}}}}{If{{Dn{In}}}}7{{{AJd{G`}}}{{Dn{In}}}}88888888888888{ALj{{Dn{AAb}}}}9{A@d{{Dn{AAb}}}}{ADj{{Dn{AAb}}}}{A`{{Dn{AAb}}}}<<<<<<{If{{Dn{On}}}}{{{h{G`}}}{{Dn{On}}}}{{{AJd{G`}}}{{Dn{On}}}}?????????{AAj{{Dn{AAl}}}}{c{{Dn{e}}}{}{}}000000000{Oh{{Dn{Cl}}}}{AGd{{Dn{Cl}}}}222222222222222222222222222222222222222222222222222222222222222222{{{h{Jb}}{h{{Jd{c}}}}{h{Jb}}JhJf}EfJl}{{{h{Cj}}Hj}{{Dn{{h{Nn}}AMd}}}}{{{h{Cj}}Hj}{{Dn{{h{AAf}}AMf}}}}`{{{h{Cj}}}Cd}``{{{h{c}}}Ij{}}00000000000000000000000000000000000000000000000000000000{ACl{{h{G`}}}}0{{CfCf}Cf}{{IlIl}Il}10`{IlCf}`{{{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{Cj}}}Hj}{ce{}{}}0000000000000000000000000000000000000000000000000000000{{{h{O`}}}In}{{{h{AAf}}}In}{{{h{Cj}}}In}{HjCh}`{{{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{Cj}}}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`}}}}{cc{}}{AJlAGj}{ANnAGj}{AO`AGj}{AO`AK`}44{AO`AHh}5{ANbAHh}{ANdAHh}{AObAHh}{ANjAHh}{ANhAHh}{ANfAHh}{AOdAHh}{ANnAHh}{AJlAHh}>>>>>>>>{{{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{AO`AFh}{cc{}}{AOjAFh}{AOlAFh}{AOnAFh}{B@`AFh}{AM`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{B@h}}}}{{{h{If}}}{{h{B@j}}}}{{{h{If}}}{{h{G`}}}}<30{{{h{c}}}{{h{e}}}{}{}}00401{{{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{BA`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{A`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{ADn{A`}}}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ln}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Fl}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Nn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ed}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Bn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAf}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{Ff{DfBAh}}}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Cj}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAf}}AC`}}}{ACbACd}}{{{h{{ADn{Nn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Bn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Cj}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{ADn{A`}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ed}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{A`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BA`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{Ff{DfBAh}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ln}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Fl}}}}{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{{ADn{ci}}}}}Ef{}{{Eh{c}}}B@fB@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{Ah{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{If}}{h{G`}}}Ef}{{{h{If}}{h{{AEj{G`}}}}}Ef}{{{h{If}}{h{BBd}}}Ef}{{{h{If}}{h{{h{G`}}}}}Ef}{{{h{If}}{h{If}}}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{{AEj{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{AJd{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{BBh}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{If}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{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}}}}c}Bf{}B@f}{{{h{Ah{ADn{ce}}}}{h{c}}}BfBBfB@f}{{{h{AhIf}}BBh}Bf}{{{h{AhIf}}{h{BBh}}}Bf}{{{h{AhIf}}{AEj{G`}}}Bf}{{{h{AhIf}}{h{G`}}}Bf}{{{h{AhIf}}If}Bf}{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{Ah{ADn{ce}}}}Hj}BfBBfB@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}{AO`AOd}{B@lAOd}{BC`AOd}{cc{}}0{{{BCb{ce}}}{{ADn{ce}}}{}B@f}{BCd{{ADn{M`}}}}{Ch{{ADn{A`}}}}{BCf{{ADn{A`}}}}{{{h{{Ad{c}}}}}{{ADn{c}}}Al}{If{{ADn{A`}}}}{{{AEj{{Ab{c}}}}}{{ADn{c}}}{}}{{{AJd{{Ab{c}}e}}}{{ADn{ce}}}{}B@f}{BCh{{ADn{A`}}}}9{BCj{{ADn{BCl}}}}{{{h{{Ab{c}}}}}{{ADn{c}}}Al}{{{h{G`}}}{{ADn{A`}}}}{{{Ad{c}}}{{ADn{c}}}{}}{{{h{Ah{Ab{c}}}}}{{ADn{c}}}Al}{{{BCn{ce}}}{{ADn{ce}}}{}B@f}{{{h{Ah{Ad{c}}}}}{{ADn{c}}}Al}{BBhIf}{cc{}}{{{h{AhG`}}}If}{{{AJd{G`}}}If}{{{AEj{G`}}}If}{{{h{If}}}If}{{{h{G`}}}If}{{{h{G`}}}{{Dn{{ADn{A`}}}}}}{e{{ADn{c}}}{}{{El{}{{Ej{c}}}}}}{cIf{{El{}{{Ej{{AJd{G`}}}}}}}}{cIf{{El{}{{Ej{{h{G`}}}}}}}}{cIf{{El{}{{Ej{{AEj{G`}}}}}}}}{cIf{{El{}{{Ej{{h{BBh}}}}}}}}{cIf{{El{}{{Ej{BBh}}}}}}{cIf{{El{}{{Ej{If}}}}}}{{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{Cn}}}BDd}{{{ADn{ce}}}{{AJd{{Ab{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{{Ad{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{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{{Ad{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{Ah{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{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{{AEj{G`}}}}}Ef}{{{h{If}}{h{G`}}}Ef}{{{h{If}}{h{{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{}}00{BFbBFd}{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{BAf}}}{{h{{Ad{A`}}}}}}{{{h{AhBAf}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBAf}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBAf}}}A`}{{{h{BAf}}}A`}{{{h{BAd}}}{{h{Cj}}}}5{{{h{BAf}}}{{h{{Ab{A`}}}}}}``{{{h{c}}}{{h{e}}}{}{}}07010000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00670000{{{h{Fl}}Ed}{{Ff{EdEd}}}}{{{h{BHj}}}BHj}{{{h{BAd}}}BAd}{{{h{BAf}}}BAf}{{{h{BHl}}}BHl}{{{h{BHn}}}BHn}{{{h{BI`}}}BI`}{{{h{BIb}}}BIb}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{BAd}}{h{BAd}}}Bh}{{{h{BAf}}{h{BAf}}}Bh}{{{h{BHl}}{h{BHl}}}Bh}{{{h{BHn}}{h{BHn}}}Bh}{{{h{BIb}}{h{BIb}}}Bh}{{{h{Ahc}}}{{Dn{BAdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BAfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BIbAC`}}}{ACbACd}}20{{{h{BAd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAf}}{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}}{{}BAf}{c{{Dn{BAf}}}E`}{{{h{BHj}}{h{BHj}}}Ef}{{{h{BAd}}{h{BAd}}}Ef}{{{h{BAf}}{h{BAf}}}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{BAd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BAf}}{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{}}0{{{Ad{A`}}}BAf}{{{h{{Ad{A`}}}}}BAf}22222{{{h{O`}}EdDf{h{{Ab{Hj}}}}}{{Dn{BHlBHj}}}}{{{h{G`}}}{{Dn{BAfBId}}}}{{{h{BHn}}{h{O`}}}{{Dn{BIbBI`}}}}{{{h{G`}}}{{Dn{BAf}}}}{{{h{BAd}}{h{Ahc}}}BfGf}{{{h{BAf}}{h{Ahc}}}BfGf}{{{h{BHl}}{h{Ahc}}}BfGf}{{{h{BHn}}{h{Ahc}}}BfGf}{{{h{BIb}}{h{Ahc}}}BfGf}``{{{h{BAf}}c}h{}}`{ce{}{}}000000{{{h{BAf}}}Ef}{{{h{BAf}}}Hj}`{{{h{BAd}}{h{BAd}}}{{Dh{Bh}}}}{{{h{BAf}}{h{BAf}}}{{Dh{Bh}}}}{{{h{BHl}}{h{BHl}}}{{Dh{Bh}}}}{{{h{BHn}}{h{BHn}}}{{Dh{Bh}}}}{{{h{BIb}}{h{BIb}}}{{Dh{Bh}}}}`{{{h{BAf}}c}DnHn}`{{{h{BHj}}}{{Dh{{h{AOf}}}}}}{{{h{BI`}}}{{Dh{{h{AOf}}}}}}{BAf{{Ad{A`}}}}{{{h{c}}}e{}{}}000000{{{h{c}}}If{}}00`{c{{Dn{e}}}{}{}}00{{{h{{Ab{A`}}}}}{{Dn{BAf}}}}11111111111`{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{c}}{Ff{EdEd}}}BAf{{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{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{{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{BCl}}}{{h{{Ab{BCl}}}}}}{{{h{BCj}}}{{h{{Ab{BCl}}}}}}{{{h{c}}}{{h{e}}}{}{}}40>30=000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}=0<:;0000000{{}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{{Ab{A`}}}}}{{Dn{BJlBDf}}}}{{{h{{Ab{A`}}}}}{{Dn{AEhBDf}}}}{{}BJh}{{}BCj}``````{{{h{BJl}}{h{{Jd{c}}}}{h{e}}}{{Dn{BJlBDf}}}AGf{{ADb{{Ab{BCl}}}}}}{{{h{AEh}}{h{{Jd{c}}}}{h{e}}}{{Dn{AEhBDf}}}Jl{{ADb{{Ab{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}}}{{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{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{{Ab{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{}}{{{h{{Ad{A`}}}}}BJf}1{{{Ad{A`}}}BJf}2{{{Ad{A`}}}BJh}{{{h{{Ad{A`}}}}}BJh}444{DfBCl}{{{h{{Ab{BCl}}}}}BCj}{{{ADn{BCl}}}BCj}7{AO`BDf}{AOdBDf}{JjBDf}:{BJnBDf};{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{{Ab{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{{Ad{A`}}}}{BJh{{Ad{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}}}{}{}}{{{h{{Ab{A`}}}}}{{Dn{BJf}}}}1{{{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}}}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}{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{BnBKf}}}}`>>>>{{{h{Fl}}}J`}````````````````````{{{h{Oh}}}{{h{{Ad{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhOh}}}A`}{{{h{Oh}}}A`}4{{{h{Oh}}}{{h{{Ab{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}64{{{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{cc{}}{{{h{{Ad{A`}}}}}Oh}{{{Ad{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{{Ad{A`}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}{{{h{{Ab{A`}}}}}{{Dn{Oh}}}}1{{{h{c}}}Ij{}}{cOh{{ADb{Nh}}}}{ClOh}<```````````````````{{{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}1{BKnBKj}222{AJhOj}{BL`Oj}{AJfOj}{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{ChAGl}}}}}}}}}{}}{{{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{c{{Dn{e}}}{}{}}{If{{Dn{AJf}}}}{{{AJd{G`}}}{{Dn{AJf}}}}{{{h{G`}}}{{Dn{AJf}}}}3{{{h{G`}}}{{Dn{AJh}}}}4{If{{Dn{AJh}}}}{{{AJd{G`}}}{{Dn{AJh}}}}66{{{h{G`}}}{{Dn{Oj}}}}{{{AJd{G`}}}{{Dn{Oj}}}}{If{{Dn{Oj}}}}9999999{{{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{}}00{BLbOl}{AElOl}{BLdOl}3333{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{ChAGl}}}}}}}}}{}}{{{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{{{h{G`}}}{{Dn{BLb}}}}{{{AJd{G`}}}{{Dn{BLb}}}}{If{{Dn{BLb}}}}{c{{Dn{e}}}{}{}}0{{{AJd{G`}}}{{Dn{BLd}}}}{If{{Dn{BLd}}}}{{{h{G`}}}{{Dn{BLd}}}}33{On{{Dn{OlBLf}}}}4444444444{{{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{AhBCf}}}{{h{AhNf}}}}10{{{h{BCf}}}{{h{Nf}}}}{{{h{Nf}}}{{h{Nf}}}}51{{{h{Od}}}{{h{Md}}}}{{{h{AJb}}}{{h{Md}}}}{{{h{AJ`}}}{{h{Md}}}}{{{h{c}}}{{h{e}}}{}{}}000000500{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000700{{{h{BCf}}}Hj}{{{h{AhBCf}}}Bf}{{{h{Od}}}Od}{{{h{ADj}}}ADj}{{{h{AJb}}}AJb}{{{h{AJ`}}}AJ`}{{{h{BCf}}}BCf}{{{h{BLl}}}BLl}{{{h{BLn}}}BLn}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{Nf}}{h{Nf}}}Bh}{{{h{BCf}}{h{BCf}}}Bh}{{}Od}{{}BCf}{{{h{BCf}}}h}{{{h{AhBCf}}}{{h{Ah}}}}{{}{{h{Nf}}}}{{{h{Od}}{h{Od}}}Ef}{{{h{ADj}}{h{ADj}}}Ef}{{{h{Nf}}{h{Nf}}}Ef}{{{h{BCf}}{h{BCf}}}Ef}{{{h{BLl}}{h{BLl}}}Ef}{{{h{BLn}}{h{BLn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000{{{h{AhBCf}}{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{BCf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BLl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{{{ADn{A`}}}Od}111{{{h{{Ad{A`}}}}}{{h{Nf}}}}{{{h{Ah{Ad{A`}}}}}{{h{AhNf}}}}00010100100010010101010110100111110000001101011010001010010011001101001101110111100011010001010100111000010111111010000011011101111110010111010001001110{{{Ad{A`}}}BCf}{{{h{{Ad{A`}}}}}BCf}0011{LdBCf}2{KnBCf}3322{L`BCf}434344443343334344344343344443444334433333483443334333334343334444444443443443343443343334334334433434334333343434343333444{LfBCf}44555545545545544544599{AO`BLn}{BM`BLn}{{{h{Nf}}{h{Ahc}}}BfGf}{{{h{BCf}}{h{Ahc}}}BfGf}{{{h{Nf}}{AId{Hj}}}h}{{{h{Nf}}{AIf{Hj}}}h}{{{h{Nf}}{AIb{Hj}}}h}{{{h{Nf}}Hj}h}{{{h{Nf}}{AIl{Hj}}}h}{{{h{Nf}}{Ff{{AIn{Hj}}{AIn{Hj}}}}}h}{{{h{Nf}}AIj}h}{{{h{Nf}}{AIh{Hj}}}h}{{{h{BMb}}}Hj}{{{h{BLl}}}Hj}{ce{}{}}0000000{Od{{ADn{A`}}}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}00222{OdCh}{{{h{Od}}}Ef}{{{h{Nf}}}Ef}{{{h{BCf}}}Ef}{{{h{Od}}}Hj}{{{h{Nf}}}Hj}{{{h{BCf}}}Hj}{{}Od}{{}BCf}{{{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{BCf}}{h{BCf}}}{{Dh{Bh}}}}{{{h{AhBCf}}}{{Dh{A`}}}}{{{h{AhBCf}}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{AhBCf}}Hj}A`}{{{h{AhBCf}}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{{Ab{A`}}}}}{{Dn{{h{Nf}}}}}}{{{h{Ah{Ab{A`}}}}}{{Dn{{h{AhNf}}}}}}2{{{ADn{A`}}}{{Dn{BCf}}}}3333333333{{{h{c}}}Ij{}}00000000{ce{}{}}0000000{HjBCf}``{{{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{AO`BMd}{cc{}}{BMhBMd}{ANnBMd}{ANnBMf}3{AO`BMf}4???{{{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@bInCf}{{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{{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{Cl{{h{Nh}}}}{{{h{Cl}}}{{h{Nh}}}}{ClNh}{{{h{Cl}}}Nh}{cc{}}{AO`{{BNh{c}}}{}}1{ce{}{}}0{{{BNh{c}}}eBNjBDh}```5`````{{{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`}}}}{AO`AC`}{cc{}}{ACfAC`}{BObBO`}22{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{{Ab{A`}}}}}}{{{h{C@b}}}{{h{Nf}}}}{{{h{c}}}{{h{e}}}{}{}}020{{{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}{AHfC@d}{JjC@d}{AFnC@d}4{{{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{cc{}}{BMhAG`}{C@jAG`}2{C@lAI`}{BMhAI`}44{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{{Ad{A`}}}}}}{{{h{Mj}}}{{h{{Ab{A`}}}}}}0{{{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{cc{}}{LfMj}{LdMj}{KfMj}{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{BObAFn}1{CBfAFn}22{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`}}}}}}{{{h{c}}}{{h{e}}}{}{}}10{{{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{BfACf}}}}{{{h{AhCCl}}}{{Dn{BfBBl}}}}{{{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{HjACf}}}}{{{h{AhCCl}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}````````````````{{{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}}77{{{h{Ah{CKf{ce}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}0{{{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{{Ab{A`}}}}}}{{{h{CKl}}}{{h{{Ad{A`}}}}}}1{{{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{{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{BfACf}}}}{{{h{AhCKn}}}{{Dn{BfBBl}}}}{{{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{HjACf}}}}{{{h{AhCKn}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}```{{}n}{{{h{n}}}h}{{{h{n}}}{{h{{Ad{A`}}}}}}{{{h{n}}}{{h{{Ab{A`}}}}}}{{{h{CL`}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}2001{{{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{BfACf}}}}{{{h{AhADh}}}{{Dn{BfBBl}}}}{{{h{n}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CL`}}{h{AhEn}}}{{Dn{BfF`}}}}000{dn}{cc{}}{L`n}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{KbMh}{LhMh}{KjMh}{LbMh}{KlMh}{cc{}}{KhMh}{BnMh}{KdMh}{CdMh}{LjMh}{ALlMh}{{}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{{Ad{A`}}}}}CLb}{{{h{{Mn{c}}}}}{{h{{Ab{A`}}}}}CLb}{{{h{c}}}{{h{e}}}{}{}}1{{{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}}}}{cc{}}{Ln{{Mn{N`}}}}{Ll{{Mn{Ml}}}}{M`{{Mn{Nb}}}}{{}{{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{{Ab{A`}}}}}}{{{h{CLl}}}{{h{{Ad{A`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}0{{{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{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{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`}}}}BBl}}}CMj}{{{h{Ah{CMh{c}}}}}{{Dn{{h{{Ab{A`}}}}ACf}}}CMj}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ab{A`}}}}BBl}}}ACn}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ab{A`}}}}ACf}}}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{BfBBl}}}BHf}{{{h{Ah{CMh{c}}}}}{{Dn{BfACf}}}BHf}{{{h{Ah{CMl{c}}}}}{{Dn{BfACf}}}ACh}{{{h{Ah{CMl{c}}}}}{{Dn{BfBBl}}}ACh}{{{h{AhCNb}}}{{Dn{BfACf}}}}{{{h{AhCNb}}}{{Dn{BfBBl}}}}{{{h{ACf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CMf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0000{BBlACf}{CMfACf}2{AO`CMf}3{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{BfBBl}}}BH`}{{{h{Ah{CMh{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfACf}}}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{HjBBl}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}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{HjACf}}}}{{{h{AhCNb}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}{{{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{}}0{CNhAGb}11{CNhACj}22{JjAHb}{AO`AHb}4{AO`AHl}5{JjAHl}{CNnAHl}{AOdAHl}{CNlAHl}{AHbAHj}:{AO`AHj}{JjCNj}{BIdCNj}={AO`CNj}>>>{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{Cd}}}}{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{Cd}}}}{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{Cl}}}E`}{{{h{Cl}}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}}}{}{}}004300{{{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{}}{EdDAj}11{ClAGd}22{{{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{c{{Dn{e}}}{}{}}{If{{Dn{DBb}}}}9{{{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{BAb}}}BAb}{{{h{DBj}}}DBj}{{{h{DBl}}}DBl}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{BAb}}{h{BAb}}}Bh}{{{h{Ahc}}}{{Dn{BAbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBlAC`}}}{ACbACd}}10{{{h{BAb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAb}}{h{BAb}}}Ef}{{{h{DBj}}{h{DBj}}}Ef}{{{h{DBl}}{h{DBl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{BAb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{{h{BAb}}{h{Ahc}}}BfGf}{ce{}{}}00``{{{h{BAb}}}{{Dh{{Ad{A`}}}}}}{{{ADn{Bn}}Bn}DBj}{{{ADn{Bn}}Bn}DBl}{{{h{BAb}}{h{BAb}}}{{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`}}}}{FnABn}{ACfABn}{AC`ABn}{cc{}}{AO`ABn}111{AO`DEb}{BDfDEb}333{DEhAKn}{DF`AKn}5{AO`AKn}{DFbAKn}{AO`AEb}8{AO`DEh}99{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{{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}2{cAJnDG`}{DFnAEf}{{{h{AGb}}}AEf}{AGbAEf}66{AJnJf}77{cAKlDG`}{LlAKl}{LhAKl}{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}}c}DnHn}{{{h{AEf}}}{{Ad{A`}}}}0{{{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`}}}}}}{{{h{c}}}{{h{e}}}{}{}}1{{{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{DGl}}}Ef}{{{h{DGl}}{h{{Ab{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{}}{DGhD@n}1{C@hDGl}{{{h{C@h}}}DGl}33{DGjC@h}{{{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{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{{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}}}{}{}}00{{{h{DGl}}}{{Dn{C@h}}}}1{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}}}}{AIl{Hj}}}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}AIj}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIf{Hj}}}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIb{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{HjBBl}}}CAb}{{{h{Ah{DId{c}}}}{h{{Ab{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{Ab{A`}}}}}Bf}{{{h{DIh}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{{{DIj{Df}}}DIh}{DJ`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{Il}}}{}}{c{{Dh{Cf}}}{}}{{{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}{{{AIb{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}}}ADd{D@hACd}}{{{h{DL`}}{h{Ahc}}}CF`{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}}}{{Ad{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}Ef{D@hACd}}{{{h{DKh}}{h{Ahc}}}BBb{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAa}}}{D@hACd}{}{}{}{}{}{}{}}333{{{h{DKh}}{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}4{{{h{DKh}}{h{Ahc}}}{{Ff{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}Ed{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DMb{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}Df{D@hACd}}{{{h{DKh}}{h{Ahc}}}A`{D@hACd}}99{{{h{DKh}}{h{Ahc}}}CF`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egi}}}{D@hACd}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{DIj{Ed}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAiAk}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CKd{D@hACd}}>{{{h{DKh}}{h{Ahc}}}Bf{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmo}}}{D@hACd}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ad{e}}}{D@hACd}{}}0{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAi}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}AEn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikm}}}{D@hACd}{}{}{}{}{}}3333{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAc}}}{D@hACd}{}{}{}{}{}{}{}{}}44{{{h{DKh}}{h{Ahc}}}BAn{D@hACd}}5555{{{h{DKh}}{h{Ahc}}}{{Ff{eg}}}{D@hACd}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAe}}}{D@hACd}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{DIj{AD`}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{A`}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{Hj}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}CFb{D@hACd}};{{{h{DKh}}{h{Ahc}}}A@`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{AEn}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}BBh{D@hACd}}>>>>{{{h{DKh}}{h{Ahc}}}AD`{D@hACd}}?{{{h{DKh}}{h{Ahc}}}BB`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{Df}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}Hj{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egik}}}{D@hACd}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}ADd{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ad{e}}}{D@hACd}{}}00{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAg}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}}1111{{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{BBb}}}DM`DM`}{{ce}{{DMf{BB`}}}DM`DM`}{{ce}{{DMf{CKd}}}DM`DM`}{{ce}{{DMf{Hj}}}DM`DM`}{{ce}{{DMf{CFb}}}DM`DM`}{{ce}{{DMf{Df}}}DM`DM`}{{ce}{{DMf{A`}}}DM`DM`}{{ce}{{DMf{A@`}}}DM`DM`}{{ce}{{DMf{AEn}}}DM`DM`}{{ce}{{DMf{BAn}}}DM`DM`}{{ce}{{DMf{Ed}}}DM`DM`}{{ce}{{DMf{AD`}}}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}}}}9?;578{{ce}{{DMf{BBb}}}DM`DM`};?7>=5342{{{h{{DN`{}{{DMn{c}}}}}}{h{Ahe}}}c{}{D@hACd}}{{{h{{DMf{BB`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Df}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AD`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Ed}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Hj}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AEn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BAn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CKd}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CFb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BBb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A@`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{DMh}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMj{CF`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMj{ADd}}}}{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`}}}}{{{ADn{Hj}}}DOn}{{{ADn{Df}}}DOn}{cc{}}00{{{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{Cj}}}}{{{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`}}}CB`}{{{h{{EAd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{cc{}}000000{AO`E@l}1111{AO`DFb}{AMdDFb}{E@jDFb}{E@hDFb}{E@lDFb}6{AMdDF`}7{AO`DF`}8{AO`EAb}99{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{Cj}}}}{{{EAf{c}}}{{Dn{Efc}}}{}}{{{h{AF`}}}Ln}{{{h{{AKj{c}}}}{h{Ahe}}Hj{h{Md}}g}{{EAf{{EAd{AMd}}}}}{{Dj{Cj}}}{AChACd}{{AHd{Df}}}}{{{h{{AKj{c}}}}Hj{h{Md}}Df}{{Dn{LhAMd}}}{{Dj{Cj}}}}{{{EAf{c}}g}{{EAf{e}}}{}{}{{BDn{c}{{Hd{e}}}}}}{c{{AKj{c}}}{{Dj{Cj}}}}{{{h{Md}}AGl}AF`}{{{h{{Ab{A`}}}}}{{Dn{E@dEAb}}}}`{{{h{Ah{AKj{c}}}}Hj{h{Md}}CfABb}{{Dn{LjDF`}}}{{Dj{Cj}}}}{{{h{Ah{AKj{c}}}}Hj{h{Md}}CfABb}{{Dn{LjAMd}}}{{Dj{Cj}}}}{{{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}}CfABb}{{Dn{Bf{EAd{AMd}}}}}{{Dj{Cj}}}{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{Cj}}}{AChACd}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}AB`}{{Dn{LlDFb}}}{{Dj{Cj}}}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}gAB`}{{Dn{LlDFb}}}{{Dj{Cj}}}{{Dj{AAf}}}{{AHd{Ln}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}{Dh{E@d}}{Dh{{Ff{LnDf}}}}AB`}{{Dn{LlDFb}}}{{Dj{Cj}}}{{Dj{AAf}}}}{{{h{c}}}e{}{}}000000000000{{{h{c}}}If{}}0000000000{{{h{{AKj{c}}}}}{{h{Cj}}}{{Dj{Cj}}}}{c{{Dn{e}}}{}{}}0000000000000000000000000000000{{{h{c}}}Ij{}}000000000000000`{ce{}{}}000000000000000{{{h{Md}}}AF`}{{{h{Ah{AKj{c}}}}Hj}{{Dh{{h{AhA@j}}}}}{{EAh{Cj}}}}```````{{{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}{AO`EAj}{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`Ch}{{Dn{EAnEB`}}}}{{EAnA`ChAGl}{{Dn{EAnEB`}}}}{{{h{EBb}}}{{Dh{{h{M`}}}}}}{{{h{BCd}}}{{h{{Ab{M`}}}}}}{{{h{AhBCd}}}{{h{Ah{Ab{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{BCd}}}BCd}{{{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{BCd}}{h{BCd}}}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{ChAGl}}}}}{{Dh{AKf}}}}{{{h{{Ab{A`}}}}}{{Dn{BCdECb}}}}{{{h{{Ab{A`}}}}}{{Dn{AKfECb}}}}{{}BCd}{{}EAn}{{{h{AFb}}}A`}{{{h{BCd}}}h}{{{h{AhBCd}}}{{h{Ah}}}}{c{{Dn{AKb}}}E`}{c{{Dn{BCd}}}E`}{c{{Dn{EBj}}}E`}{c{{Dn{EBl}}}E`}{c{{Dn{EBb}}}E`}{c{{Dn{AKf}}}E`}{c{{Dn{AGl}}}E`}{{{h{BCd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKb}}{h{AKb}}}Ef}{{{h{EBd}}{h{EBd}}}Ef}{{{h{BCd}}{h{BCd}}}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{BCd}}{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{}}000{JjEBd}{AO`EBd}{AFjEBd}{{{Ad{M`}}}BCd}000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000444{AO`EBf}{AO`EBh}666{EBjEBl}777777{AO`EB`}88{AO`ECb}{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{BCd}}{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{BCd{{ADn{M`}}}}33{{{h{AhBCd}}}}{{{h{BCd}}}}{BCd}{EBhEBl}{EBjEBl}5{{{h{BCd}}}Ef}{{{h{EAn}}}Ef}{{{h{AFb}}}{{h{EBb}}}}{{{h{AFb}}}{{Dh{Ln}}}}{{{h{EBl}}}ECd}{{{h{AFb}}}{{Dh{AGl}}}}`{{{h{BCd}}}Hj}`{{{h{AFb}}}{{h{BCd}}}}{{{h{EBn}}}{{h{BCd}}}}`{{{h{AFd}}}{{Dh{M`}}}}{{}EAn}{M`AFb}{M`EBl}{{{h{{Jd{c}}}}Jb{Dh{M`}}}AFdJl}{{ChAGl}EBl}{{ChAGl}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{BCd}}{h{BCd}}}{{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{ChAGl}}{ECh{BCd}}}}}}}}{AKbECj}{{{h{AKb}}c}DnHn}{{{h{BCd}}c}DnHn}{{{h{BCd}}}{{ADn{A`}}}}{{{h{EBj}}c}DnHn}{{{h{EBl}}c}DnHn}{{{h{EBb}}c}DnHn}{{{h{AKf}}c}DnHn}{{{h{AKf}}}{{ADn{A`}}}}{{{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}}}{}{}}0{ECj{{Dn{AKb}}}}1{{{h{ECj}}}{{Dn{AKb}}}}22{{{AJd{{Ab{M`}}}}}{{Dn{BCd}}}}{{{ADn{M`}}}{{Dn{BCd}}}}{{{h{{Ab{M`}}}}}{{Dn{BCd}}}}5555{EAn{{Dn{EBj}}}}6{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{DfCh}}}}}}}}{c{{Dn{EAnEB`}}}{{El{}{{Ej{{Ff{DfCh}}}}}}}}``{{{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`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}0{{{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{{Ab{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`}}}}{AKbECj}{{{h{AKb}}}ECj}{cc{}}01{{{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{{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{Cj}}}}}{{El{}{{Ej{c}}}}}{{El{}{{Ej{{Ff{gi}}}}}}}}{{{h{Ah{ED`{ce}}}}i}{{EDb{c}}}fEDd{{AHd{{EDf{Cj}}}}}{{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{{EDb{cEDh}}}{}}{{{EDj{c}}}{{EDb{ce}}}{}DJf}?``{{{h{{ED`{ce}}}}}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}Cdc}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}CdEd}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}g}{{EDb{c}}}fEDd{{AHd{{EDf{Cj}}}}}}{{{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{Cj}}}c{}}{{{h{Ah{EDd{}{{EDl{c}}}}}}AAd{h{AAf}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}{h{Cj}}}Ef{}}````````````{{{h{{EDn{c}}}}}{{AKh{c{Bd{{D`{Cn}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}e}Bf{AlBjFb}{}}{{{h{Ah{EDn{c}}}}EDh}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{EDh}}}EDh}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{}{{EDn{c}}}{}}{{}EDh}{c{{Dn{EDh}}}E`}{{{h{{EE`{c}}}}{h{{EE`{c}}}}}EfEh}{{{h{EDh}}{h{EDh}}}Ef}{{{h{{EDn{c}}}}{h{AhEn}}}FdFb}{{{h{{EE`{c}}}}{h{AhEn}}}FdFb}0{{{h{EDh}}{h{AhEn}}}Fd}{cc{}}00{{{h{EEb}}}{{Id{EDh}}}}{{{h{{EDn{c}}}}c}{{Dh{{h{{D`{Cn}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}Ch}{{Dh{{h{{Ff{cDf}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{Cj}}}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{EDh}}}Ef}{{{h{{EDn{c}}}}{h{Cj}}}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{AhEDh}}EDh}Bf}{{{h{{EDn{c}}}}{h{Cj}}e}Il{AlBjFb}{{Hh{c}}}}{Df{{EDn{c}}}{}}{{{h{{EDn{c}}}}c}{{Dh{{Ff{DfEf}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}c}{{Dh{{Ff{{EEd{Ch}}EDh}}}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{h{{ECh{{EEf{cAAd}}}}}}}{AlBjFb}}{{{h{EDh}}{h{EEb}}}{{Id{Bf}}}}2{{{h{Ah{EDn{c}}}}cDf}{{Dh{{Ff{{ADn{{EEd{Ch}}}}EDh}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{{AKh{cDf}}}}}EDh{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Ch}}}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}e}{{`{{Gn{}{{Ej{{EEf{cCh}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{EEh{h{{EDn{c}}}}e}EEh{}{{Hh{c}}}}{{{h{{EDn{c}}}}{h{Cj}}e}{{Ff{CfCf}}}{AlBjFb}{{Hh{c}}}}{{{h{EDh}}c}DnHn}{{{h{{EDn{c}}}}cDf}{{Dh{Ch}}}{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}}}}Cd}{{`{{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{Ch}}}}}}Al}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{EEf{cCh}}}}}}Al}}}{AlBjFb}}{{EEh{h{{EDn{c}}}}}EEh{}}{ce{}{}}00`````{{{h{{EEl{c}}}}}{{h{{AKh{cCh}}}}}{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}}}}Ch}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{Cj}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}e{AlBjFb}{}}{{{h{{EEl{c}}}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}cCh}Ef{AlBjFb}}>{{{h{{EEl{c}}}}{h{Cj}}}Ef{AlBjFb}}0{{{h{{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{{EEl{c}}}}{h{Cj}}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{Cj}}}{{ECh{c}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{{EEl{c}}}}{h{Cj}}e}{{Ff{CfCf}}}{AlBjFb}{{Hh{c}}}}{{{h{{EEl{c}}}}{h{c}}}{{Dh{Ch}}}{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}}}}Cd}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd{h{AAf}}}}}}}}}}}{AlBjFb}}{{{h{c}}}Ij{}}={{{h{{EEl{c}}}}e}{{`{{CCb{}{{Ej{{Ff{{h{c}}Ch}}}}}}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`}}}}3{cEF`{{El{}{{Ej{{Ff{DfBn}}}}}}}}{{{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{{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{}}0{{{EFj{c}}}{{EFl{c}}}{}}1{{{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{DfCh}}}}}}}}}{BjAl}}1{{{h{{EG`{c}}}}}{{ADn{c}}}{BjAl}}`{{{h{Ah{EFl{c}}}}}{{Dh{AAd}}}{}}{{{h{Ah{EFl{c}}}}}{{Dh{Ch}}}{}}{{{h{Ah{EG`{c}}}}c}{{Dh{{Ff{DfCh}}}}}{BjAl}}{{{h{Ah{EFl{c}}}}}{{Dh{Cd}}}{}}{{{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{Ch}}}}}}`{{{EFn{c}}cg}{{EFn{c}}}Bj{{Gn{}{{Ej{{Ff{DfCh}}}}}}EGl}{{El{}{{EGn{e}}}}}}{{{EFn{c}}{h{{EDn{c}}}}}{{EFn{c}}}{AlBjFb}}`{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{{Ff{cCh}}}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}7777{c{{Dn{e}}}{}{}}000000000000000``{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{Cd}}}}}}``{{{h{c}}}Ij{}}0000000{{{EFj{{Ff{cDf}}}}{h{{EDn{c}}}}}{{EFj{{Ff{cDf}}}}}{AlBjFb}}{ce{}{}}0000000``````````````{{{h{{Fh{c}}}}}{{h{{ECh{{Ff{cCd}}}}}}}{}}{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}{{{h{{EDj{c}}}}}{{`{{Gn{}{{Ej{Df}}}}}}}f}```{{{h{Ah{Fh{c}}}}{EDj{c}}}Bf{AlBj}}{{{h{Ah{Fh{c}}}}{Aj{c}}}{{EDj{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}{Aj{c}}{Dh{Ed}}}{{EDj{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}}Ch}{{Hd{Ef}}}}}}{{{h{Ah{Fh{c}}}}g}{{EDj{c}}}{AlBj}{{AHd{{EDf{Cj}}}}}{{El{}{{Ej{{Ff{eEd}}}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{{Fh{c}}}}{h{Cj}}}{{Dn{CfEH`}}}{}}`{c{{Dh{Cf}}}{}}{c{{Dh{Il}}}{}}01{{{h{{Fh{c}}}}}{{Fh{c}}}Al}{{{h{{EHb{ce}}}}}{{EHb{ce}}}AlAl}{{{h{{EHd{ce}}}}}{{EHd{ce}}}AlAl}{{{h{{EDj{c}}}}}{{EDj{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}BhBjBj}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}BhBjBj}{{}{{Fh{c}}}{}}{{}{{EDj{c}}}{}}{{{h{{EHb{ce}}}}}{{h{g}}}{}{}{}}{c{{Dn{{EDj{e}}}}}E`{BjEb}}{{{h{{Fh{c}}}}{h{Cj}}}{{`{{Gn{}{{Ej{{Ff{HjCd}}}}}}}}}{}}{{{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{{EDj{c}}}}{h{{EDj{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{{EDj{c}}}}{h{AhEn}}}FdFb}{cc{}}0{{{Aj{c}}}{{Fh{c}}}{BjAl}}11111{{{h{EEb}}}{{Id{{EDj{c}}}}}{fAlBjI`Dd}}{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{EHb{{EDf{Cj}}c}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{e}}jCd}{{Dh{{An{{h{c}}}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dh{{Ff{{An{{h{c}}}}Cd}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{h{{Fh{c}}}}Cd}{{Dh{{EDf{Cj}}}}}{}}{{{h{{Fh{c}}}}Cd}{{Dh{{EHb{{EDf{Cj}}c}}}}}{}}{{{h{{Fh{c}}}}AAd}{{Dh{{h{AAf}}}}}{}}{{{h{EEb}}}{{Id{Bf}}}}{{{h{{Fh{c}}}}}{{EDj{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}Cdc}{{EDj{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}CdEd}{{EDj{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}e}{{EDj{c}}}{AlBj}{{AHd{{EDf{Cj}}}}}}{{{h{Ah{Fh{c}}}}AAdAAf}{{EDj{c}}}{AlBj}}{ce{}{}}000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}011{{{h{{Fh{c}}}}}Ef{}}{{{h{{EDj{c}}}}}EfBj}``{{{h{{Fh{c}}}}{h{e}}j}{{`{{Gn{}{{Ej{{EHd{{EDf{Cj}}c}}}}}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{Fh{c}}g}{{Fh{e}}}{AlBj}{AlBj}{{Hf{c}{{Hd{e}}}}}}{{{EDj{c}}g}{{EDj{e}}}BjBj{{Hf{c}{{Hd{e}}}}}}{{{h{Ah{EDj{c}}}}{EDj{c}}}BfBj}{c{{Fh{e}}}{{El{}{{Ej{Cj}}}}}{AlBj}}{{{h{Ah{EHf{cg}}}}}{{Dh{i}}}{}{}{{Hf{Hj{EDf{Cj}}}{{Hd{{Dh{e}}}}}}}{}}{{{h{Ah{EHh{cg}}}}}{{Dh{i}}}{}{}{{Hf{HjCd}{{Hd{{Dh{e}}}}}}}{}}{{{h{{Fh{c}}}}AAd}{{h{{EHj{Cd}}}}}{}}{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}{{Dh{Bh}}}HlHl}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}{{Dh{Bh}}}HlHl}{{{h{{EDj{c}}}}{h{EEb}}}{{Id{Bf}}}{fAlBjI`Dd}}`{{{h{{EDj{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}}Ch}{{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}}jCd}{{Dn{{Dh{{An{{h{c}}}}}}}}}fGd}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dn{{Dh{{Ff{{An{{h{c}}}}Cd}}}}}}}fGd}2222222{{{h{{Fh{c}}}}{h{e}}j}{{`{{Gn{}{{Ej{{Dn{{EHd{{EDf{Cj}}c}}}}}}}}}}}fGd}``{{{h{{Fh{c}}}}Cd}{{Dh{{AKh{Df{h{AAf}}}}}}}{}}{{{h{{Fh{c}}}}Cd}{{`{{CCb{}{{Ej{{Ff{Df{h{{EHj{Cd}}}}}}}}}}}}}{}}`{{{h{{EDj{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}````{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{EHb{{EDf{Cj}}c}}}}}}}}}{}}{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{{Fh{c}}}}ei}{{EHf{ci}}}{AlBj}{{AHd{{EDf{Cj}}}}}{}{{Hf{Hj{EDf{Cj}}}{{Hd{{Dh{g}}}}}}}}{{{h{{Fh{c}}}}{h{Cj}}g}{{EHh{cg}}}{}{}{{Hf{HjCd}{{Hd{{Dh{e}}}}}}}}{{{h{{Fh{c}}}}Cdg}{{EHh{cg}}}{AlBj}{}{{Hf{HjCd}{{Hd{{Dh{e}}}}}}}}","D":"AEIjABDl","p":[[5,"Balance",0,15113],[5,"DescriptorId",0,15114],[10,"Anchor",0,15115],[1,"reference"],[5,"BlockId",0,15116],[5,"ConfirmationBlockTime",0,15116],[5,"Hash",8977,15117],[1,"u8"],[1,"slice"],[1,"array"],[5,"CheckPoint",0,15118],[0,"mut"],[5,"TxUpdate",0,15119],[10,"Clone",15120],[6,"ChainPosition",0,15121],[5,"FullTxOut",0,15121],[5,"TxPosInBlock",0,15115],[5,"SpkIterator",0,15122],[1,"unit"],[6,"Ordering",15123],[10,"Ord",15123],[6,"ValueRef",15124],[5,"BlockHash",356,15125],[5,"Impl",0],[8,"FromSqlResult",15126],[5,"Txid",356,15127],[5,"Amount",356,15128],[5,"ScriptBuf",356,15129],[5,"Transaction",356,15127],[6,"Network",356,15130],[6,"DescriptorPublicKey",15131],[6,"Descriptor",15132],[5,"AnchorImpl",0],[10,"DeserializeOwned",7265,15133],[1,"u32"],[6,"Option",15134],[10,"Borrow",15135],[10,"DescriptorExt",0,15114],[6,"Result",15136],[10,"Deserializer",7178,15133],[10,"Deserialize",7178,15133],[1,"u64"],[1,"bool"],[10,"PartialEq",15123],[17,"Item"],[10,"IntoIterator",15137],[5,"Formatter",15138],[5,"Error",15138],[10,"Debug",15138],[8,"Result",15138],[1,"tuple"],[5,"TxGraph",14928],[1,"never"],[5,"Header",4505,15125],[5,"FromSliceError",12401,15139],[1,"str"],[17,"Error"],[10,"ChainOracle",0,15140],[10,"Hasher",15141],[10,"Hash",15141],[10,"SliceIndex",15142],[5,"IntoFallible",15143],[10,"Iterator",15144],[10,"Merge",0,15145],[5,"CheckPointIter",0,15118],[17,"Output"],[10,"FnMut",15146],[10,"RangeBounds",15147],[1,"usize"],[10,"PartialOrd",15123],[10,"Serializer",7178,15148],[10,"Serialize",7178,15148],[6,"ToSqlOutput",15149],[8,"Result",15150],[5,"String",3134,15151],[5,"Convert",15143],[5,"TypeId",15152],[5,"SignedAmount",356,15128],[5,"Weight",356,15153],[5,"Work",356,15154],[5,"XOnlyPublicKey",356,15155],[5,"Secp256k1",9713,15156],[5,"Scalar",11473,15157],[6,"Parity",9713,15155],[6,"Error",11473,15156],[10,"Verification",9713,15158],[5,"Address",356,15159],[6,"AddressType",356,15159],[5,"FilterHash",356,15160],[5,"FilterHeader",356,15160],[5,"XKeyIdentifier",356,15161],[5,"TxMerkleNode",356,15125],[5,"WitnessMerkleNode",356,15125],[5,"WitnessCommitment",356,15125],[5,"ScriptHash",356,15162],[5,"WScriptHash",356,15162],[5,"Wtxid",356,15127],[5,"PubkeyHash",356,15163],[5,"WPubkeyHash",356,15163],[5,"LegacySighash",356,15164],[5,"SegwitV0Sighash",356,15164],[5,"TapSighash",356,15164],[5,"TapLeafHash",356,15165],[5,"TapNodeHash",356,15165],[5,"TapTweakHash",356,15165],[5,"Script",356,15166],[5,"XOnlyPublicKey",12093,15167],[5,"Hash",9091,15168],[5,"Hash",6780,15169],[5,"TapSighashTag",356,15164],[5,"Hash",9144,15170],[5,"TapLeafTag",356,15165],[5,"TapBranchTag",356,15165],[5,"TapTweakTag",356,15165],[5,"PushBytes",5399,15171],[5,"Params",6239,15172],[6,"NetworkUnchecked",2756,15159],[10,"NetworkValidation",2756,15159],[5,"TxIn",356,15127],[5,"Block",356,15125],[6,"Bip34Error",4505,15125],[5,"Builder",5399,15173],[5,"Bytes",5399,15166],[5,"ChainHash",4625,15174],[6,"LockTime",4696,15175],[6,"LockTime",4882,15176],[5,"Sequence",356,15127],[1,"i64"],[5,"FeeRate",356,15177],[5,"Opcode",356,15178],[6,"ClassifyContext",5092,15178],[6,"Class",5092,15178],[5,"Witness",356,15179],[6,"Denomination",356,15128],[6,"KnownHrp",356,15159],[5,"WitnessProgram",356,15180],[6,"WitnessVersion",356,15181],[5,"OutPoint",356,15127],[5,"TxOut",356,15127],[5,"VarInt",356,15182],[5,"PublicKey",356,15163],[5,"CompressedPublicKey",356,15163],[5,"PrivateKey",356,15163],[6,"TapSighashType",356,15164],[6,"EcdsaSighashType",356,15164],[5,"MerkleBlock",356,15183],[6,"NetworkKind",356,15130],[5,"Target",356,15154],[5,"CompactTarget",356,15154],[5,"Psbt",356,15184],[6,"Error",11011,15185],[6,"Error",6330,15182],[10,"Read",9465,15186],[10,"Sized",15187],[5,"Error",9465,15188],[10,"Write",9465,15186],[5,"TweakedPublicKey",9713,15163],[5,"Token",15189],[10,"BufRead",9465,15186],[1,"u128"],[10,"AsRef",15190],[1,"f64"],[5,"Display",3052,15128],[5,"HashEngine",8977,15117],[6,"Instruction",5399,15191],[6,"Error",15192],[5,"Vec",3134,15193],[6,"MerkleBlockError",10083,15183],[6,"ExtractTxError",11011,15184],[10,"Write",15138],[5,"PublicKey",11473,15155],[5,"Xpub",4146,15161],[6,"Cow",15194],[5,"RelLockTime",15195],[1,"u16"],[5,"ScriptPath",13320,15164],[5,"LeafNode",13724,15165],[5,"TaprootSpendInfo",13724,15165],[10,"Fn",15146],[6,"ParseAmountError",3052,15128],[5,"InvalidSighashTypeError",13320,15164],[5,"ParseNetworkError",10141,15130],[6,"HexToBytesError",6825,15196],[6,"PrefixedHexError",6647,15197],[5,"Keypair",9713,15155],[5,"Magic",10191,15198],[10,"Signing",11473,15158],[5,"UncompressedPublicKeyError",9713,15163],[6,"FromScriptError",2756,15199],[6,"LeafVersion",13724,15165],[5,"TimeOverflowError",4882,15200],[6,"KeyParseError",15201],[6,"FromSliceError",9713,15163],[10,"Into",15190],[5,"NonStandardSighashTypeError",13320,15164],[6,"ParseError",2756,15199],[6,"ParsePublicKeyError",9713,15163],[6,"FromWifError",9713,15163],[6,"ParseError",15128],[6,"UnprefixedHexError",6647,15197],[5,"Range",15147],[5,"RangeInclusive",15147],[5,"RangeTo",15147],[5,"RangeToInclusive",15147],[5,"RangeFull",15147],[5,"RangeFrom",15147],[6,"Bound",15147],[5,"InstructionIndices",5399,15191],[5,"Instructions",5399,15191],[5,"Box",15202],[5,"Height",4696,15203],[5,"Time",4696,15203],[5,"Iter",6224,15179],[6,"Error",5953,15180],[5,"SecretKey",11473,15155],[6,"P2shError",2756,15199],[5,"Signature",13724,15204],[5,"Signature",6560,15205],[5,"ControlBlock",13724,15165],[5,"BTreeMap",15206],[5,"SighashCache",13320,15164],[5,"Message",11473,15156],[6,"SignError",11011,15184],[6,"PsbtSighashMsg",15192],[6,"SighashError",15192],[6,"SigningKeys",11011,15184],[10,"GetKey",11011,15184],[6,"AddressData",2756,15159],[5,"Fe32",15207],[5,"Hash",15208],[5,"Hash",7107,15209],[5,"OutOfRangeError",15128],[5,"SortKey",9713,15163],[5,"InputsIndexError",6062,15127],[5,"OutputsIndexError",6062,15127],[5,"DefiniteDescriptorKey",15131],[6,"UtxoUpdateError",15192],[6,"OutputUpdateError",15192],[5,"Signature",13289,15210],[5,"UnknownAddressTypeError",2756,15199],[5,"UnknownHrpError",2756,15199],[5,"NetworkValidationError",2756,15199],[5,"InvalidBase58PayloadLengthError",2756,15199],[5,"LegacyAddressTooLongError",2756,15199],[5,"InvalidLegacyPrefixError",2756,15199],[6,"NetworkChecked",2756,15159],[5,"TryFromError",5978,15181],[6,"Infallible",15190],[5,"DecodeError",15211],[6,"Error",3134,15212],[10,"StdError",8772],[10,"CheckedSum",3052,15128],[5,"TooPreciseError",15128],[5,"MissingDigitsError",15128],[5,"InputTooLargeError",15128],[5,"InvalidCharacterError",15128],[10,"SerdeAmount",3113,15213],[10,"SerdeAmountForOpt",3113,15213],[10,"Allocator",15214],[5,"OsStr",15215],[5,"Path",15216],[5,"InvalidCharacterError",3134,15212],[6,"FromSqlError",15126],[5,"AddrV2Message",10349,15217],[6,"Inventory",10533,15218],[5,"PrefilledTransaction",3842,15219],[5,"ShortId",3842,15219],[5,"Address",10191,15217],[5,"Drain",15220],[5,"Drain",15151],[1,"i16"],[1,"i32"],[1,"i8"],[6,"Value",15221],[10,"Copy",15187],[1,"char"],[5,"ExtractIf",15222],[5,"Error",15223],[5,"TooShortError",3503,15212],[5,"IncorrectChecksumError",3503,15212],[5,"VecDeque",15224],[5,"TaprootMerkleBranch",13724,15225],[5,"PushBytesBuf",5399,15171],[5,"CString",15226],[5,"DerivationPath",4146,15161],[6,"ChildNumber",4146,15161],[5,"BinaryHeap",15227],[5,"FromUtf16Error",15151],[5,"FromUtf8Error",15151],[5,"Assets",15228],[6,"Error",4146,15161],[10,"Error",7265,15133],[10,"IntoDeserializer",7265,15133],[5,"StringDeserializer",7449,15229],[10,"FnOnce",15146],[10,"Pattern",15230],[20,"MaybeUninit",15231],[5,"Splice",15232],[6,"SocketAddr",15233],[5,"IntoIter",15234],[6,"Error",15235],[5,"TryReserveError",15236],[5,"IoSlice",15237],[6,"EncodeSliceError",3546,15238],[6,"DecodeError",3546,15239],[6,"DecodeSliceError",3546,15239],[17,"Config"],[17,"DecodeEstimate"],[10,"Engine",3546,15240],[10,"Config",3692,15240],[10,"DecodeEstimate",3692,15240],[5,"Alphabet",3636,15241],[6,"ParseAlphabetError",3636,15241],[5,"Base64Display",3680,15242],[5,"GeneralPurpose",3692,15243],[5,"GeneralPurposeConfig",3692,15243],[6,"DecodePaddingMode",3692,15240],[5,"DecodeMetadata",3692,15240],[5,"DecoderReader",3797,15244],[10,"Read",15237],[10,"StrConsumer",3810,15245],[5,"EncoderWriter",3810,15246],[10,"Write",15237],[5,"EncoderStringWriter",3810,15245],[6,"Error",3842,15219],[5,"HeaderAndShortIds",3842,15219],[5,"BlockTransactionsRequest",3842,15219],[5,"TxIndexOutOfRangeError",3842,15219],[5,"BlockTransactions",3842,15219],[6,"HexToArrayError",6825,15196],[5,"BlockFilterWriter",4032,15160],[5,"GcsFilterWriter",4032,15160],[6,"Error",4032,15160],[5,"BlockFilter",4032,15160],[5,"BitStreamWriter",4032,15160],[5,"BlockFilterReader",4032,15160],[5,"GcsFilterReader",4032,15160],[5,"BitStreamReader",4032,15160],[5,"ChainCode",4146,15161],[5,"Fingerprint",4146,15161],[5,"DerivationPathIterator",4146,15161],[5,"Xpriv",4146,15161],[5,"InvalidBase58PayloadLengthError",4146,15161],[6,"KeyRequest",11011,15184],[10,"IntoDerivationPath",4146,15161],[5,"Version",4505,15125],[6,"ValidationError",4505,15125],[5,"ParseHeightError",4696,15203],[5,"ParseTimeError",4696,15203],[5,"ConversionError",4696,15203],[6,"ParseError",15203],[5,"AbsLockTime",15247],[5,"Height",4882,15200],[5,"Time",4882,15200],[5,"DisabledLockTimeError",4882,15176],[5,"IncompatibleHeightError",4882,15176],[5,"IncompatibleTimeError",4882,15176],[5,"PushBytesError",5399,15248],[6,"Error",5399,15162],[6,"UintError",15162],[10,"PushBytesErrorReport",5399,15249],[6,"FromStrError",5978,15181],[6,"TryFromInstructionError",5978,15181],[5,"ParseIntError",10978,15250],[6,"ParseOutPointError",6062,15127],[5,"IndexOutOfBoundsError",6062,15127],[5,"Version",6062,15127],[5,"InputWeightPrediction",6062,15127],[10,"Decodable",6239,15182],[10,"Encodable",6239,15182],[10,"WriteExt",6239,15182],[6,"DecodeError",6239,15251],[10,"IntoDeError",6447,15252],[10,"ReadExt",6239,15182],[5,"CheckedData",6330,15182],[6,"FromHexError",6330,15182],[5,"OddLengthStringError",6825,15196],[5,"Hex",6447,15252],[10,"Case",6482,15253],[10,"EncodeBytes",6447,15252],[5,"DecodeInitError",6482,15253],[5,"DecodeError",6482,15253],[5,"Encoder",6482,15253],[5,"Decoder",6482,15253],[5,"SerializedSignature",6560,15205],[6,"Error",6560,15205],[5,"Iter",15254],[5,"Signature",11874,15255],[5,"MissingPrefixError",6647,15197],[5,"ContainsPrefixError",6647,15197],[17,"Engine"],[17,"Bytes"],[10,"Hash",12401,15139],[10,"HashEngine",12401,15139],[10,"FromHex",6825,15256],[17,"MidState"],[17,"Display"],[10,"DisplayHex",6825,15257],[6,"Case",6825,15258],[10,"Display",15138],[10,"LowerHex",15138],[10,"UpperHex",15138],[5,"InvalidCharError",6825,15196],[5,"InvalidLengthError",7045,15196],[5,"HexToBytesIter",6825,15259],[5,"BytesToHexIter",6825,15259],[10,"ExactSizeIterator",15260],[5,"HexDigitsIter",15259],[10,"DoubleEndedIterator",15261],[10,"FusedIterator",15262],[5,"BufEncoder",6989,15263],[5,"DisplayByteSlice",7007,15257],[5,"DisplayArray",7007,15257],[5,"HashEngine",7107,15209],[17,"Ok"],[17,"SerializeSeq"],[17,"SerializeTuple"],[17,"SerializeTupleStruct"],[17,"SerializeTupleVariant"],[17,"SerializeMap"],[17,"SerializeStruct"],[17,"SerializeStructVariant"],[10,"Error",8772,15148],[10,"SerializeSeq",8772,15148],[10,"SerializeTuple",8772,15148],[10,"SerializeTupleStruct",8772,15148],[10,"SerializeTupleVariant",8772,15148],[10,"SerializeMap",8772,15148],[10,"SerializeStruct",8772,15148],[10,"SerializeStructVariant",8772,15148],[10,"Visitor",7265,15133],[1,"f32"],[1,"i128"],[5,"IgnoredAny",7265,15264],[6,"Unexpected",7265,15133],[17,"Value"],[10,"DeserializeSeed",7265,15133],[10,"Expected",7265,15133],[17,"Deserializer"],[10,"VariantAccess",7265,15133],[10,"SeqAccess",7265,15133],[10,"MapAccess",7265,15133],[5,"Request",15265],[17,"Variant"],[10,"EnumAccess",7265,15133],[5,"UnitDeserializer",7449,15229],[5,"U32Deserializer",7449,15229],[5,"StrDeserializer",7449,15229],[5,"BorrowedStrDeserializer",7449,15229],[5,"CowStrDeserializer",7449,15229],[5,"BytesDeserializer",7449,15229],[5,"BorrowedBytesDeserializer",7449,15229],[5,"MapDeserializer",7449,15229],[5,"Error",7449,15229],[5,"BoolDeserializer",7449,15229],[5,"I8Deserializer",7449,15229],[5,"I16Deserializer",7449,15229],[5,"I32Deserializer",7449,15229],[5,"I64Deserializer",7449,15229],[5,"I128Deserializer",7449,15229],[5,"IsizeDeserializer",7449,15229],[5,"U8Deserializer",7449,15229],[5,"U16Deserializer",7449,15229],[5,"U64Deserializer",7449,15229],[5,"U128Deserializer",7449,15229],[5,"UsizeDeserializer",7449,15229],[5,"F32Deserializer",7449,15229],[5,"F64Deserializer",7449,15229],[5,"CharDeserializer",7449,15229],[5,"SeqDeserializer",7449,15229],[5,"SeqAccessDeserializer",7449,15229],[5,"MapAccessDeserializer",7449,15229],[5,"EnumAccessDeserializer",7449,15229],[1,"isize"],[5,"Impossible",8772,15266],[5,"Source",15265],[10,"SerdeHash",8902,15267],[5,"Hash",8907,15268],[5,"HashEngine",8907,15268],[5,"Midstate",8977,15117],[10,"Tag",9144,15170],[5,"Hash",9191,15269],[5,"HashEngine",9191,15269],[5,"Hash",9247,15270],[5,"HashEngine",9247,15270],[5,"Hash",9317,15271],[5,"HashEngine",9317,15271],[5,"Hash",9373,15272],[5,"State",9373,15272],[5,"HashEngine",9373,15272],[6,"ErrorKind",9465,15188],[5,"FromStd",9465,15273],[10,"BufRead",15237],[5,"ToStd",9465,15273],[5,"Take",9465,15186],[5,"Cursor",9465,15186],[5,"Sink",9465,15186],[5,"Keypair",12093,15167],[10,"Context",11473,15158],[5,"TweakedKeypair",9713,15163],[6,"ParseCompressedPublicKeyError",9713,15163],[5,"InvalidBase58PayloadLengthError",9713,15163],[5,"InvalidAddressVersionError",9713,15163],[5,"Context",12093,15167],[5,"NonNull",15274],[17,"TweakedAux"],[17,"TweakedKey"],[10,"TapTweak",9713,15163],[6,"All",11473,15275],[5,"DisplaySecret",15276],[5,"InvalidParityValue",11473,15155],[5,"AllPreallocated",11473,15158],[5,"ManuallyDrop",15277],[5,"SignOnlyPreallocated",11473,15158],[5,"VerifyOnlyPreallocated",11473,15158],[10,"Rng",12515,15278],[5,"AlignedType",12371,15279],[10,"PreallocatedContext",11473,15158],[5,"RecoverableSignature",11874,15280],[10,"CryptoRng",12515,15281],[6,"SignOnly",11473,15275],[6,"VerifyOnly",11473,15275],[5,"PartialMerkleTree",10083,15183],[5,"UnknownChainHashError",10141,15130],[5,"ServiceFlags",10191,15198],[5,"ParseMagicError",10191,15198],[5,"UnknownMagicError",10191,15198],[6,"AddrV2",10349,15217],[5,"CommandString",10404,15282],[5,"CommandStringError",10404,15282],[5,"RawNetworkMessage",10404,15282],[6,"NetworkMessage",10404,15282],[5,"GetBlocksMessage",10533,15218],[5,"GetHeadersMessage",10533,15218],[5,"FilterLoad",10611,15283],[6,"BloomFlags",10611,15283],[5,"FilterAdd",10611,15283],[5,"SendCmpct",10675,15284],[5,"CmpctBlock",10675,15284],[5,"GetBlockTxn",10675,15284],[5,"BlockTxn",10675,15284],[5,"GetCFilters",10768,15285],[5,"CFilter",10768,15285],[5,"GetCFHeaders",10768,15285],[5,"CFHeaders",10768,15285],[5,"GetCFCheckpt",10768,15285],[5,"CFCheckpt",10768,15285],[5,"VersionMessage",10900,15286],[6,"RejectReason",10900,15286],[5,"Reject",10900,15286],[5,"ParseIntError",15287],[5,"Output",11011,15288],[6,"GetKeyError",11011,15184],[6,"OutputType",11011,15184],[6,"SigningAlgorithm",11011,15184],[6,"IndexOutOfBoundsError",11011,15184],[5,"PsbtSighashType",11011,15289],[5,"Input",11011,15289],[6,"PsbtParseError",11011,15290],[6,"P2wpkhError",13320,15164],[6,"TaprootError",13320,15164],[6,"ConversionError",15131],[5,"ProprietaryKey",11402,15291],[10,"From",15190],[5,"Key",11402,15291],[5,"Pair",11402,15291],[5,"PublicKey",12093,15167],[10,"ThirtyTwoByteHash",11473,15156],[5,"OutOfRangeError",13269,15157],[5,"ElligatorSwift",12018,15292],[5,"SharedSecret",11843,15293],[5,"RecoverableSignature",12339,15294],[5,"Signature",12093,15167],[5,"SerializedSignature",11874,15295],[5,"RecoveryId",11874,15280],[5,"IntoIter",11996,15296],[5,"ElligatorSwiftSharedSecret",12018,15292],[6,"ElligatorSwiftParty",12018,15292],[17,"Target"],[10,"CPtr",12093,15167],[5,"ElligatorSwift",12093,15167],[6,"c_void",12371,15297],[1,"fn"],[5,"SchnorrSigExtraParams",12093,15167],[5,"Hmac",12401,15298],[5,"HmacEngine",12401,15298],[10,"FromStr",15299],[5,"Error",12515,15300],[5,"NonZero",15301],[10,"Fill",12515,15278],[10,"RngCore",12515,15281],[5,"Error",15302],[17,"Seed"],[10,"SeedableRng",12515,15281],[10,"Default",15303],[10,"AsMut",15190],[10,"SampleUniform",12842,15304],[10,"SampleRange",12842,15304],[10,"Distribution",13004,15305],[5,"DistIter",12567,15305],[5,"ThreadRng",13048,15306],[10,"DistString",12567,15305],[5,"Alphanumeric",12567,15307],[5,"Standard",12567,15308],[5,"Bernoulli",12567,15309],[6,"BernoulliError",12567,15309],[5,"OpenClosed01",12567,15310],[5,"Open01",12567,15310],[5,"Slice",12567,15311],[5,"WeightedIndex",12567,15312],[6,"WeightedError",12567,15312],[5,"Uniform",12567,15304],[5,"DistMap",12567,15305],[5,"EmptySlice",15311],[10,"AddAssign",15313],[10,"SampleBorrow",12842,15304],[5,"Wrapping",15314],[10,"SubAssign",15313],[5,"UniformInt",12842,15304],[5,"UniformChar",12842,15304],[5,"UniformFloat",12842,15304],[5,"UniformDuration",12842,15304],[17,"X"],[10,"UniformSampler",12842,15304],[5,"Duration",15315],[5,"WeightedIndex",12992,15316],[10,"Weight",12992,15316],[10,"SliceRandom",13180,15317],[10,"IteratorRandom",13180,15317],[5,"SliceChooseIter",13180,15317],[5,"OsRng",13048,15318],[5,"StdRng",13048,15319],[5,"ReseedingRng",13111,15320],[10,"BlockRngCore",15321],[5,"ReadRng",13111,15322],[5,"ReadError",13111,15322],[5,"StepRng",13159,15323],[10,"Index",15324],[6,"IndexVec",13212,15325],[6,"IndexVecIntoIter",13212,15325],[6,"IndexVecIter",13212,15325],[5,"Annex",13320,15164],[6,"Prevouts",13320,15164],[5,"PrevoutsSizeError",13320,15164],[5,"PrevoutsKindError",13320,15164],[6,"PrevoutsIndexError",13320,15164],[5,"SighashTypeParseError",13320,15164],[5,"SingleMissingOutputError",13320,15164],[6,"AnnexError",13320,15164],[6,"SigningDataError",13320,15164],[6,"EncodeSigningDataResult",13320,15164],[10,"BorrowMut",15135],[6,"MessageSignatureError",13669,15326],[5,"MessageSignature",13669,15326],[5,"TaprootBuilder",13724,15165],[6,"TaprootBuilderError",13724,15165],[6,"TapLeaf",13724,15165],[6,"SigFromSliceError",13724,15204],[6,"IncompleteBuilderError",13724,15165],[6,"HiddenNodesError",13724,15165],[5,"TapTree",13724,15165],[5,"NodeInfo",13724,15165],[5,"ScriptLeaf",13724,15165],[5,"FutureLeafVersion",13724,15165],[6,"TaprootError",13724,15165],[5,"LeafNodes",13724,15165],[5,"ScriptLeaves",13724,15165],[5,"BTreeSet",15327],[5,"SerializedSignature",14389,15328],[5,"IntoIter",14363,15225],[5,"IntoIter",14389,15329],[5,"IndexedTxGraph",14444],[5,"ChangeSet",14444],[10,"Indexer",14495],[5,"Arc",15330],[5,"ChangeSet",14504],[5,"ChangeSet",14928],[17,"ChangeSet"],[5,"KeychainTxOutIndex",14504],[6,"InsertDescriptorError",14504],[5,"Transaction",15331],[8,"Indexed",0,15332],[8,"KeychainIndexed",0,15332],[10,"SyncRequestBuilderExt",14504],[10,"FullScanRequestBuilderExt",14504],[5,"SpkTxOutIndex",14611],[5,"LocalChain",14648],[5,"ChangeSet",14648],[5,"MissingGenesisError",14648],[5,"CannotConnectError",14648],[6,"ApplyHeaderError",14648],[5,"AlterCheckPointError",14648],[5,"SyncRequestBuilder",14782,15333],[5,"SyncRequest",14782,15333],[5,"FullScanRequestBuilder",14782,15333],[5,"FullScanRequest",14782,15333],[6,"SyncItem",14782,15333],[5,"SyncProgress",14782,15333],[5,"SyncResponse",14782,15333],[5,"FullScanResponse",14782,15333],[10,"Any",15152],[10,"Send",15187],[17,"IntoIter"],[6,"CalculateFeeError",14928],[5,"TxNode",14928],[5,"CanonicalTx",14928],[5,"TxAncestors",14928],[5,"TxDescendants",14928],[5,"HashSet",15334],[15,"P2pkh",3027],[15,"P2sh",3027],[15,"Segwit",3027],[8,"ExtendedPubKey",4146],[8,"ExtendendPubKey",4146],[8,"ExtendedPrivKey",4146],[8,"ExtendendPrivKey",4146],[15,"Normal",4492],[15,"Hardened",4492],[15,"InvalidChecksum",6423],[15,"OversizedVectorAllocation",6423],[10,"ByteDecoder",6447],[10,"ByteEncoder",6447],[5,"With",6447],[6,"Lower",6482],[6,"Upper",6482],[5,"HmacMidState",7094],[8,"Result",9465],[15,"Unknown",10531],[15,"Unknown",10609],[15,"UnexpectedUnsignedTx",11389],[15,"InvalidPreimageHashPair",11389],[15,"AbsurdFeeRate",11394],[15,"SendingTooMuch",11394],[15,"MissingInputValue",11394],[15,"Inputs",11398],[15,"TxInput",11398],[8,"NonceFn",12093],[8,"EcdhHashFn",12093],[8,"SchnorrNonceFn",12093],[8,"EllswiftEcdhHashFn",12093],[15,"DescriptorAlreadyAssigned",14607],[15,"KeychainAlreadyAssigned",14607]],"r":[[0,15115],[2,15122],[3,15113],[4,15116],[5,15140],[6,15121],[7,15118],[8,15118],[9,15116],[11,15114],[12,15114],[14,15121],[16,15332],[17,14444],[18,14495],[19,15332],[20,15145],[21,15122],[22,14928],[23,15115],[24,15119],[237,14495],[267,15332],[268,14495],[356,15159],[357,15159],[362,15128],[368,15125],[369,15125],[371,15154],[372,15163],[376,15128],[379,15164],[380,15177],[381,15160],[382,15160],[383,15159],[384,15164],[406,15183],[412,15130],[413,15130],[422,15178],[423,15127],[430,15163],[431,15184],[432,15163],[433,15163],[439,15166],[440,15129],[441,15162],[442,15164],[443,15127],[444,15128],[450,15165],[451,15165],[452,15165],[453,15165],[454,15164],[455,15164],[456,15164],[457,15165],[458,15165],[459,15154],[464,15127],[465,15127],[466,15125],[467,15127],[468,15127],[486,15182],[488,15163],[489,15162],[490,15153],[491,15179],[492,15125],[493,15125],[494,15180],[495,15181],[496,15154],[497,15127],[498,15161],[499,15155],[515,15335],[536,15335],[640,15335],[641,15335],[642,15335],[645,15335],[982,15335],[1107,15336],[1307,15335],[1870,15335],[2007,15336],[2019,15335],[2035,15335],[2060,15335],[2082,15335],[2135,15335],[2137,15335],[2153,15335],[2242,15336],[2246,15335],[2264,15335],[2756,15159],[2757,15159],[2758,15159],[2762,15199],[2765,15199],[2767,15199],[2768,15159],[2770,15199],[2772,15159],[2773,15159],[2774,15159],[2776,15199],[2781,15199],[2785,15199],[2789,15199],[2791,15199],[2884,15159],[3033,15199],[3035,15199],[3037,15199],[3039,15199],[3041,15199],[3042,15199],[3043,15199],[3044,15199],[3046,15199],[3052,15128],[3056,15128],[3057,15128],[3058,15128],[3067,15128],[3070,15128],[3098,15128],[3113,15213],[3114,15213],[3115,15213],[3116,15213],[3124,15337],[3125,15337],[3126,15337],[3127,15338],[3128,15338],[3129,15339],[3130,15339],[3131,15339],[3132,15340],[3133,15340],[3135,15212],[3137,15212],[3138,15151],[3140,15193],[3232,15341],[3233,15341],[3258,15341],[3259,15341],[3260,15341],[3282,15341],[3504,15212],[3506,15212],[3507,15212],[3509,15212],[3547,15239],[3550,15239],[3551,15238],[3552,15240],[3559,15342],[3573,15239],[3575,15239],[3576,15239],[3577,15239],[3581,15239],[3582,15342],[3583,15238],[3585,15238],[3586,15238],[3587,15238],[3590,15238],[3591,15342],[3614,15342],[3615,15342],[3635,15342],[3636,15241],[3637,15241],[3638,15241],[3639,15241],[3641,15241],[3643,15241],[3645,15241],[3646,15241],[3680,15242],[3692,15240],[3694,15240],[3696,15240],[3697,15240],[3698,15240],[3699,15243],[3700,15243],[3745,15240],[3774,15243],[3775,15243],[3776,15243],[3777,15243],[3778,15243],[3779,15243],[3780,15243],[3781,15243],[3788,15240],[3797,15244],[3810,15245],[3811,15246],[3812,15245],[3842,15219],[3843,15219],[3844,15219],[3845,15219],[3847,15219],[3848,15219],[3849,15219],[4032,15160],[4033,15160],[4034,15160],[4035,15160],[4036,15160],[4037,15160],[4038,15160],[4039,15160],[4040,15160],[4041,15160],[4148,15161],[4149,15161],[4150,15161],[4151,15161],[4152,15161],[4153,15161],[4154,15161],[4155,15161],[4156,15161],[4157,15161],[4160,15161],[4162,15161],[4167,15161],[4172,15161],[4173,15161],[4174,15161],[4494,15177],[4495,15153],[4496,15343],[4497,15343],[4498,15343],[4499,15343],[4500,15343],[4501,15343],[4502,15343],[4503,15343],[4504,15343],[4507,15125],[4508,15125],[4509,15125],[4510,15125],[4517,15125],[4520,15125],[4521,15125],[4522,15125],[4523,15125],[4626,15174],[4627,15174],[4628,15174],[4629,15174],[4630,15174],[4631,15174],[4632,15174],[4633,15174],[4634,15174],[4636,15174],[4637,15174],[4639,15174],[4640,15174],[4644,15174],[4675,15174],[4693,15177],[4694,15344],[4695,15344],[4697,15203],[4698,15203],[4699,15203],[4700,15175],[4705,15203],[4706,15203],[4709,15203],[4883,15176],[4884,15200],[4885,15176],[4886,15176],[4887,15176],[4893,15200],[4895,15200],[5092,15178],[5093,15178],[5097,15178],[5098,15178],[5099,15178],[5100,15178],[5101,15178],[5102,15178],[5109,15178],[5143,15345],[5144,15345],[5145,15345],[5146,15345],[5147,15345],[5148,15345],[5149,15345],[5150,15345],[5151,15345],[5152,15345],[5153,15345],[5154,15345],[5155,15345],[5156,15345],[5157,15345],[5158,15345],[5159,15345],[5160,15345],[5161,15345],[5162,15345],[5163,15345],[5164,15345],[5165,15345],[5166,15345],[5167,15345],[5168,15345],[5169,15345],[5170,15345],[5171,15345],[5172,15345],[5173,15345],[5174,15345],[5175,15345],[5176,15345],[5177,15345],[5178,15345],[5179,15345],[5180,15345],[5181,15345],[5182,15345],[5183,15345],[5184,15345],[5185,15345],[5186,15345],[5187,15345],[5188,15345],[5189,15345],[5190,15345],[5191,15345],[5192,15345],[5193,15345],[5194,15345],[5195,15345],[5196,15345],[5197,15345],[5198,15345],[5199,15345],[5200,15345],[5201,15345],[5202,15345],[5203,15345],[5204,15345],[5205,15345],[5206,15345],[5207,15345],[5208,15345],[5209,15345],[5210,15345],[5211,15345],[5212,15345],[5213,15345],[5214,15345],[5215,15345],[5216,15345],[5217,15345],[5218,15345],[5219,15345],[5220,15345],[5221,15345],[5222,15345],[5223,15345],[5224,15345],[5225,15345],[5226,15345],[5227,15345],[5228,15345],[5229,15345],[5230,15345],[5231,15345],[5232,15345],[5233,15345],[5234,15345],[5235,15345],[5236,15345],[5237,15345],[5238,15345],[5239,15345],[5240,15345],[5241,15345],[5242,15345],[5243,15345],[5244,15345],[5245,15345],[5246,15345],[5247,15345],[5248,15345],[5249,15345],[5250,15345],[5251,15345],[5252,15345],[5253,15345],[5254,15345],[5255,15345],[5256,15345],[5257,15345],[5258,15345],[5259,15345],[5260,15345],[5261,15345],[5262,15345],[5263,15345],[5264,15345],[5265,15345],[5266,15345],[5267,15345],[5268,15345],[5269,15345],[5270,15345],[5271,15345],[5272,15345],[5273,15345],[5274,15345],[5275,15345],[5276,15345],[5277,15345],[5278,15345],[5279,15345],[5280,15345],[5281,15345],[5282,15345],[5283,15345],[5284,15345],[5285,15345],[5286,15345],[5287,15345],[5288,15345],[5289,15345],[5290,15345],[5291,15345],[5292,15345],[5293,15345],[5294,15345],[5295,15345],[5296,15345],[5297,15345],[5298,15345],[5299,15345],[5300,15345],[5301,15345],[5302,15345],[5303,15345],[5304,15345],[5305,15345],[5306,15345],[5307,15345],[5308,15345],[5309,15345],[5310,15345],[5311,15345],[5312,15345],[5313,15345],[5314,15345],[5315,15345],[5316,15345],[5317,15345],[5318,15345],[5319,15345],[5320,15345],[5321,15345],[5322,15345],[5323,15345],[5324,15345],[5325,15345],[5326,15345],[5327,15345],[5328,15345],[5329,15345],[5330,15345],[5331,15345],[5332,15345],[5333,15345],[5334,15345],[5335,15345],[5336,15345],[5337,15345],[5338,15345],[5339,15345],[5340,15345],[5341,15345],[5342,15345],[5343,15345],[5344,15345],[5345,15345],[5346,15345],[5347,15345],[5348,15345],[5349,15345],[5350,15345],[5351,15345],[5352,15345],[5353,15345],[5354,15345],[5355,15345],[5356,15345],[5357,15345],[5358,15345],[5359,15345],[5360,15345],[5361,15345],[5362,15345],[5363,15345],[5364,15345],[5365,15345],[5366,15345],[5367,15345],[5368,15345],[5369,15345],[5370,15345],[5371,15345],[5372,15345],[5373,15345],[5374,15345],[5375,15345],[5376,15345],[5377,15345],[5378,15345],[5379,15345],[5380,15345],[5381,15345],[5382,15345],[5383,15345],[5384,15345],[5385,15345],[5386,15345],[5387,15345],[5388,15345],[5389,15345],[5390,15345],[5391,15345],[5392,15345],[5393,15345],[5394,15345],[5395,15345],[5396,15345],[5397,15345],[5398,15345],[5399,15173],[5400,15166],[5402,15162],[5403,15191],[5404,15191],[5405,15191],[5409,15171],[5411,15171],[5412,15248],[5413,15249],[5414,15166],[5415,15129],[5416,15162],[5419,15162],[5887,15162],[5888,15162],[5889,15162],[5950,15162],[5951,15162],[5952,15162],[5953,15180],[5956,15180],[5957,15180],[5958,15180],[5979,15181],[5982,15181],[5983,15181],[6002,15181],[6063,15127],[6064,15127],[6065,15127],[6067,15127],[6068,15127],[6074,15127],[6075,15127],[6078,15127],[6079,15127],[6080,15127],[6081,15127],[6083,15127],[6086,15127],[6115,15127],[6170,15127],[6171,15127],[6222,15153],[6223,15153],[6224,15179],[6225,15179],[6241,15182],[6242,15251],[6243,15182],[6246,15172],[6248,15182],[6254,15182],[6270,15182],[6271,15182],[6283,15251],[6302,15251],[6317,15251],[6318,15182],[6330,15182],[6331,15182],[6333,15182],[6334,15182],[6335,15182],[6338,15182],[6343,15182],[6345,15182],[6346,15182],[6362,15182],[6363,15182],[6364,15182],[6404,15182],[6405,15182],[6427,15172],[6428,15172],[6429,15172],[6430,15172],[6431,15172],[6432,15172],[6433,15172],[6447,15252],[6448,15252],[6451,15252],[6453,15252],[6455,15252],[6456,15252],[6469,15252],[6482,15253],[6483,15253],[6484,15253],[6485,15253],[6486,15253],[6487,15253],[6488,15253],[6561,15205],[6564,15205],[6566,15205],[6648,15197],[6650,15197],[6653,15250],[6654,15197],[6655,15197],[6730,15125],[6731,15160],[6732,15160],[6733,15125],[6734,15127],[6735,15125],[6736,15125],[6737,15127],[6742,15139],[6743,15139],[6744,15139],[6745,15298],[6746,15298],[6751,15139],[6752,15139],[6758,15139],[6760,15139],[6761,15139],[6762,15139],[6766,15139],[6767,15139],[6768,15139],[6769,15139],[6770,15139],[6771,15139],[6772,15139],[6773,15139],[6774,15139],[6775,15139],[6776,15139],[6777,15139],[6779,15346],[6780,15169],[6825,15259],[6826,15258],[6828,15257],[6830,15256],[6831,15259],[6832,15196],[6833,15196],[6834,15259],[6837,15196],[6841,15196],[6859,15258],[6871,15258],[6887,15258],[6897,15258],[6913,15258],[6936,15258],[6937,15258],[6945,15258],[6988,15258],[6989,15263],[7008,15257],[7009,15257],[7010,15257],[7025,15258],[7029,15258],[7045,15196],[7046,15196],[7049,15196],[7051,15196],[7053,15196],[7075,15256],[7076,15196],[7077,15196],[7084,15257],[7086,15256],[7094,15298],[7095,15298],[7096,15298],[7107,15209],[7108,15209],[7178,15133],[7179,15347],[7180,15133],[7184,15148],[7185,15347],[7193,15148],[7197,15348],[7230,15348],[7233,15348],[7268,15133],[7269,15133],[7270,15133],[7271,15133],[7274,15133],[7275,15133],[7281,15133],[7283,15264],[7284,15133],[7286,15133],[7292,15133],[7298,15133],[7305,15133],[7306,15133],[7402,15133],[7449,15229],[7450,15229],[7451,15229],[7452,15229],[7453,15229],[7454,15229],[7455,15229],[7456,15229],[7457,15229],[7458,15229],[7459,15229],[7460,15229],[7461,15229],[7462,15229],[7463,15229],[7464,15229],[7465,15229],[7466,15229],[7467,15229],[7468,15229],[7469,15229],[7470,15229],[7471,15229],[7472,15229],[7473,15229],[7474,15229],[7475,15229],[7476,15229],[7477,15229],[8772,15148],[8781,15266],[8790,15148],[8791,15148],[8793,15148],[8795,15148],[8797,15148],[8799,15148],[8801,15148],[8803,15148],[8805,15148],[8901,15349],[8903,15267],[8907,15268],[8908,15268],[8977,15117],[8978,15117],[8979,15117],[9091,15168],[9144,15170],[9145,15170],[9191,15269],[9192,15269],[9247,15270],[9248,15270],[9317,15271],[9318,15271],[9373,15272],[9374,15272],[9375,15272],[9469,15186],[9473,15186],[9475,15188],[9476,15188],[9477,15273],[9486,15186],[9487,15186],[9488,15186],[9489,15186],[9491,15273],[9494,15186],[9581,15186],[9582,15186],[9585,15186],[9666,15186],[9714,15163],[9717,15163],[9718,15163],[9721,15163],[9723,15163],[9728,15155],[9730,15155],[9731,15163],[9732,15163],[9733,15163],[9734,15163],[9735,15163],[9736,15156],[9740,15163],[9741,15163],[9744,15163],[9745,15163],[9746,15163],[9747,15163],[9748,15163],[9749,15158],[9750,15163],[9751,15155],[10086,15183],[10087,15183],[10093,15183],[10101,15350],[10102,15350],[10143,15130],[10144,15130],[10145,15130],[10151,15130],[10152,15130],[10189,15351],[10190,15351],[10191,15217],[10196,15198],[10201,15198],[10202,15198],[10205,15198],[10209,15198],[10212,15198],[10302,15198],[10303,15198],[10304,15198],[10305,15198],[10306,15198],[10307,15198],[10349,15217],[10350,15217],[10351,15217],[10413,15282],[10414,15282],[10429,15282],[10430,15282],[10433,15282],[10437,15282],[10536,15218],[10537,15218],[10538,15218],[10612,15283],[10613,15283],[10614,15283],[10675,15284],[10676,15284],[10677,15284],[10678,15284],[10768,15285],[10769,15285],[10770,15285],[10771,15285],[10772,15285],[10773,15285],[10908,15286],[10909,15286],[10910,15286],[10978,15250],[10999,15352],[11000,15352],[11001,15352],[11002,15352],[11003,15352],[11004,15352],[11005,15352],[11006,15352],[11007,15352],[11008,15154],[11009,15154],[11010,15154],[11021,15185],[11023,15184],[11025,15184],[11026,15184],[11028,15184],[11029,15289],[11047,15184],[11062,15288],[11063,15184],[11066,15184],[11068,15290],[11069,15289],[11079,15184],[11080,15184],[11081,15184],[11082,15184],[11083,15184],[11279,15184],[11283,15184],[11402,15291],[11403,15291],[11404,15291],[11405,15291],[11473,15275],[11474,15158],[11475,15158],[11477,15156],[11483,15155],[11492,15155],[11494,15156],[11498,15155],[11499,15158],[11500,15155],[11501,15157],[11502,15156],[11503,15155],[11504,15275],[11505,15158],[11506,15158],[11507,15156],[11508,15158],[11509,15275],[11510,15158],[11511,15155],[11587,15156],[11598,15156],[11599,15156],[11600,15156],[11705,15156],[11706,15156],[11745,15156],[11746,15156],[11827,15353],[11828,15353],[11829,15353],[11830,15353],[11831,15353],[11832,15353],[11833,15353],[11834,15353],[11835,15353],[11836,15353],[11837,15353],[11838,15353],[11839,15353],[11840,15353],[11841,15353],[11842,15353],[11843,15293],[11868,15293],[11874,15280],[11875,15280],[11876,15295],[11877,15255],[11968,15255],[11996,15296],[11997,15295],[12020,15292],[12021,15292],[12022,15292],[12093,15167],[12094,15167],[12095,15167],[12096,15167],[12097,15167],[12098,15167],[12099,15167],[12104,15167],[12105,15167],[12106,15167],[12107,15167],[12108,15167],[12109,15167],[12110,15167],[12111,15167],[12112,15167],[12118,15167],[12172,15167],[12216,15167],[12217,15167],[12236,15167],[12242,15167],[12243,15167],[12244,15167],[12245,15167],[12246,15167],[12247,15167],[12248,15167],[12249,15167],[12250,15167],[12251,15167],[12252,15167],[12253,15167],[12254,15167],[12255,15167],[12256,15167],[12257,15167],[12258,15167],[12259,15167],[12260,15167],[12261,15167],[12262,15167],[12263,15167],[12264,15167],[12265,15167],[12266,15167],[12267,15167],[12268,15167],[12269,15167],[12270,15167],[12271,15167],[12272,15167],[12273,15167],[12274,15167],[12275,15167],[12276,15167],[12277,15167],[12278,15167],[12279,15167],[12280,15167],[12281,15167],[12282,15167],[12283,15167],[12284,15167],[12285,15167],[12286,15167],[12287,15167],[12288,15167],[12289,15167],[12290,15167],[12291,15167],[12292,15167],[12293,15167],[12294,15167],[12295,15167],[12296,15167],[12297,15167],[12298,15167],[12327,15167],[12339,15294],[12361,15294],[12362,15294],[12363,15294],[12364,15294],[12365,15294],[12371,15279],[12377,15279],[12378,15279],[12379,15279],[12380,15279],[12381,15297],[12390,15279],[12405,15139],[12406,15139],[12407,15139],[12408,15298],[12409,15298],[12423,15139],[12472,15139],[12473,15139],[12491,15139],[12493,15139],[12516,15281],[12517,15300],[12518,15278],[12520,15278],[12521,15281],[12523,15281],[12527,15354],[12547,15354],[12548,15354],[12551,15354],[12555,15354],[12558,15306],[12568,15307],[12569,15309],[12570,15309],[12571,15305],[12572,15305],[12573,15305],[12574,15305],[12578,15310],[12579,15310],[12580,15311],[12581,15308],[12583,15304],[12584,15312],[12585,15312],[12827,15308],[12841,15308],[12842,15304],[12843,15304],[12844,15304],[12846,15304],[12847,15304],[12848,15304],[12849,15304],[12850,15304],[12851,15304],[12989,15312],[12990,15312],[12991,15355],[12992,15316],[12993,15316],[13004,15281],[13005,15305],[13007,15317],[13008,15278],[13009,15281],[13011,15281],[13012,15317],[13013,15319],[13014,15306],[13038,15354],[13045,15306],[13048,15318],[13049,15319],[13050,15306],[13051,15356],[13086,15356],[13111,15322],[13112,15322],[13113,15320],[13159,15323],[13181,15317],[13182,15317],[13183,15317],[13198,15317],[13212,15325],[13213,15325],[13214,15325],[13249,15325],[13250,15325],[13269,15157],[13270,15157],[13289,15210],[13325,15164],[13326,15164],[13328,15164],[13330,15164],[13336,15164],[13338,15164],[13339,15164],[13346,15164],[13347,15164],[13349,15164],[13351,15164],[13353,15164],[13354,15164],[13355,15164],[13358,15164],[13360,15164],[13361,15164],[13365,15164],[13368,15164],[13369,15164],[13370,15164],[13371,15164],[13669,15357],[13673,15326],[13674,15326],[13709,15357],[13724,15165],[13728,15165],[13730,15165],[13733,15165],[13742,15165],[13743,15165],[13744,15165],[13745,15165],[13750,15165],[13751,15165],[13753,15204],[13755,15204],[13756,15165],[13757,15165],[13758,15165],[13759,15165],[13760,15165],[13761,15165],[13762,15165],[13763,15165],[13764,15165],[13765,15165],[13766,15165],[13767,15165],[13769,15165],[13770,15165],[13771,15165],[13772,15165],[13773,15165],[13774,15165],[13775,15225],[13776,15165],[14183,15165],[14231,15165],[14363,15225],[14364,15225],[14389,15329],[14390,15328],[14654,15118],[14655,15118],[14782,15333],[14783,15333],[14784,15333],[14787,15333],[14788,15333],[14789,15333],[14790,15333],[14791,15333],[14941,15119]],"b":[[34,"impl-AsRef%3C%5Bu8%5D%3E-for-DescriptorId"],[35,"impl-AsRef%3C%5Bu8;+%3C%24hash+as+%24crate::Hash%3E::LEN%5D%3E-for-DescriptorId"],[96,"impl-FromSql-for-Impl%3CBlockHash%3E"],[97,"impl-FromSql-for-Impl%3CTxid%3E"],[98,"impl-FromSql-for-Impl%3CDescriptorId%3E"],[99,"impl-FromSql-for-Impl%3CAmount%3E"],[100,"impl-FromSql-for-Impl%3CScriptBuf%3E"],[101,"impl-FromSql-for-Impl%3CTransaction%3E"],[102,"impl-FromSql-for-Impl%3CNetwork%3E"],[103,"impl-FromSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[155,"impl-Display-for-Balance"],[156,"impl-Debug-for-Balance"],[160,"impl-Display-for-DescriptorId"],[161,"impl-LowerHex-for-DescriptorId"],[162,"impl-UpperHex-for-DescriptorId"],[163,"impl-Debug-for-DescriptorId"],[165,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[166,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[168,"impl-From%3CTxPosInBlock%3C\'b%3E%3E-for-BlockId"],[282,"impl-ToSql-for-Impl%3CDescriptorId%3E"],[283,"impl-ToSql-for-Impl%3CBlockHash%3E"],[284,"impl-ToSql-for-Impl%3CNetwork%3E"],[285,"impl-ToSql-for-Impl%3CTransaction%3E"],[286,"impl-ToSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[287,"impl-ToSql-for-Impl%3CAmount%3E"],[288,"impl-ToSql-for-Impl%3CScriptBuf%3E"],[289,"impl-ToSql-for-Impl%3CTxid%3E"],[558,"impl-AsMut%3CScript%3E-for-Script"],[559,"impl-AsMut%3C%5Bu8%5D%3E-for-Script"],[560,"impl-AsMut%3CScript%3E-for-ScriptBuf"],[561,"impl-AsMut%3C%5Bu8%5D%3E-for-ScriptBuf"],[586,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHash"],[587,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2317%7D::%7Bconstant%230%7D%5D%3E-for-FilterHash"],[588,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHeader"],[589,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-FilterHeader"],[590,"impl-AsRef%3C%5Bu8;+bitcoin::::bip32::%7Bimpl%23106%7D::%7Bconstant%230%7D%5D%3E-for-XKeyIdentifier"],[591,"impl-AsRef%3C%5Bu8%5D%3E-for-XKeyIdentifier"],[592,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2322%7D::%7Bconstant%230%7D%5D%3E-for-BlockHash"],[593,"impl-AsRef%3C%5Bu8%5D%3E-for-BlockHash"],[594,"impl-AsRef%3C%5Bu8%5D%3E-for-TxMerkleNode"],[595,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-TxMerkleNode"],[596,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-WitnessMerkleNode"],[597,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessMerkleNode"],[598,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessCommitment"],[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-Script"],[601,"impl-AsRef%3CScript%3E-for-Script"],[602,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptBuf"],[603,"impl-AsRef%3CScript%3E-for-ScriptBuf"],[604,"impl-AsRef%3CPushBytes%3E-for-ScriptHash"],[605,"impl-AsRef%3C%5Bu8%5D%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-WScriptHash"],[608,"impl-AsRef%3CPushBytes%3E-for-WScriptHash"],[609,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2363%7D::%7Bconstant%230%7D%5D%3E-for-WScriptHash"],[610,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Txid"],[611,"impl-AsRef%3C%5Bu8%5D%3E-for-Txid"],[612,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-Wtxid"],[613,"impl-AsRef%3C%5Bu8%5D%3E-for-Wtxid"],[614,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2383%7D::%7Bconstant%230%7D%5D%3E-for-PubkeyHash"],[615,"impl-AsRef%3C%5Bu8%5D%3E-for-PubkeyHash"],[616,"impl-AsRef%3CPushBytes%3E-for-PubkeyHash"],[617,"impl-AsRef%3CPushBytes%3E-for-WPubkeyHash"],[618,"impl-AsRef%3C%5Bu8%5D%3E-for-WPubkeyHash"],[619,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2390%7D::%7Bconstant%230%7D%5D%3E-for-WPubkeyHash"],[620,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-LegacySighash"],[621,"impl-AsRef%3C%5Bu8%5D%3E-for-LegacySighash"],[622,"impl-AsRef%3C%5Bu8%5D%3E-for-SegwitV0Sighash"],[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-TapSighash"],[625,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%23109%7D::%7Bconstant%230%7D%5D%3E-for-TapSighash"],[627,"impl-AsRef%3C%5Bu8%5D%3E-for-TapLeafHash"],[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-TapNodeHash"],[630,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23104%7D::%7Bconstant%230%7D%5D%3E-for-TapNodeHash"],[631,"impl-AsRef%3C%5Bu8%5D%3E-for-TapTweakHash"],[632,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23137%7D::%7Bconstant%230%7D%5D%3E-for-TapTweakHash"],[1086,"impl-Psbt"],[1087,"impl-Deserialize%3C\'de%3E-for-Psbt"],[1098,"impl-Div%3Cu64%3E-for-Amount"],[1099,"impl-Div%3CWeight%3E-for-Amount"],[1101,"impl-Div-for-Weight"],[1102,"impl-Div%3Cu64%3E-for-Weight"],[1151,"impl-PartialEq%3CScriptBuf%3E-for-Script"],[1152,"impl-PartialEq-for-Script"],[1153,"impl-PartialEq-for-ScriptBuf"],[1154,"impl-PartialEq%3CScript%3E-for-ScriptBuf"],[1328,"impl-Debug-for-Denomination"],[1329,"impl-Display-for-Denomination"],[1330,"impl-Display-for-Amount"],[1331,"impl-Debug-for-Amount"],[1332,"impl-Display-for-SignedAmount"],[1333,"impl-Debug-for-SignedAmount"],[1334,"impl-Debug-for-FeeRate"],[1335,"impl-Display-for-FeeRate"],[1336,"impl-LowerHex-for-XOnlyPublicKey"],[1337,"impl-Debug-for-XOnlyPublicKey"],[1338,"impl-Display-for-XOnlyPublicKey"],[1339,"impl-Debug-for-Weight"],[1340,"impl-Display-for-Weight"],[1341,"impl-Display-for-AddressType"],[1342,"impl-Debug-for-AddressType"],[1344,"impl-Display-for-Address"],[1345,"impl-Debug-for-Address%3CV%3E"],[1346,"impl-Debug-for-FilterHash"],[1347,"impl-LowerHex-for-FilterHash"],[1348,"impl-UpperHex-for-FilterHash"],[1349,"impl-Display-for-FilterHash"],[1350,"impl-Display-for-FilterHeader"],[1351,"impl-Debug-for-FilterHeader"],[1352,"impl-UpperHex-for-FilterHeader"],[1353,"impl-LowerHex-for-FilterHeader"],[1354,"impl-UpperHex-for-XKeyIdentifier"],[1355,"impl-Debug-for-XKeyIdentifier"],[1356,"impl-Display-for-XKeyIdentifier"],[1357,"impl-LowerHex-for-XKeyIdentifier"],[1358,"impl-LowerHex-for-BlockHash"],[1359,"impl-Display-for-BlockHash"],[1360,"impl-UpperHex-for-BlockHash"],[1361,"impl-Debug-for-BlockHash"],[1362,"impl-LowerHex-for-TxMerkleNode"],[1363,"impl-Display-for-TxMerkleNode"],[1364,"impl-Debug-for-TxMerkleNode"],[1365,"impl-UpperHex-for-TxMerkleNode"],[1366,"impl-LowerHex-for-WitnessMerkleNode"],[1367,"impl-UpperHex-for-WitnessMerkleNode"],[1368,"impl-Display-for-WitnessMerkleNode"],[1369,"impl-Debug-for-WitnessMerkleNode"],[1370,"impl-Display-for-WitnessCommitment"],[1371,"impl-UpperHex-for-WitnessCommitment"],[1372,"impl-Debug-for-WitnessCommitment"],[1373,"impl-LowerHex-for-WitnessCommitment"],[1375,"impl-Debug-for-Opcode"],[1376,"impl-Display-for-Opcode"],[1377,"impl-Debug-for-Script"],[1378,"impl-UpperHex-for-Script"],[1379,"impl-Display-for-Script"],[1380,"impl-LowerHex-for-Script"],[1381,"impl-Debug-for-ScriptBuf"],[1382,"impl-LowerHex-for-ScriptBuf"],[1383,"impl-Display-for-ScriptBuf"],[1384,"impl-UpperHex-for-ScriptBuf"],[1386,"impl-Display-for-WitnessVersion"],[1387,"impl-Debug-for-WitnessVersion"],[1388,"impl-UpperHex-for-ScriptHash"],[1389,"impl-Display-for-ScriptHash"],[1390,"impl-LowerHex-for-ScriptHash"],[1391,"impl-Debug-for-ScriptHash"],[1392,"impl-UpperHex-for-WScriptHash"],[1393,"impl-Display-for-WScriptHash"],[1394,"impl-LowerHex-for-WScriptHash"],[1395,"impl-Debug-for-WScriptHash"],[1396,"impl-UpperHex-for-Txid"],[1397,"impl-Display-for-Txid"],[1398,"impl-Debug-for-Txid"],[1399,"impl-LowerHex-for-Txid"],[1400,"impl-LowerHex-for-Wtxid"],[1401,"impl-UpperHex-for-Wtxid"],[1402,"impl-Debug-for-Wtxid"],[1403,"impl-Display-for-Wtxid"],[1404,"impl-Display-for-OutPoint"],[1405,"impl-Debug-for-OutPoint"],[1407,"impl-LowerHex-for-Sequence"],[1408,"impl-UpperHex-for-Sequence"],[1409,"impl-Display-for-Sequence"],[1410,"impl-Debug-for-Sequence"],[1415,"impl-Display-for-PublicKey"],[1416,"impl-Debug-for-PublicKey"],[1417,"impl-Display-for-PubkeyHash"],[1418,"impl-LowerHex-for-PubkeyHash"],[1419,"impl-UpperHex-for-PubkeyHash"],[1420,"impl-Debug-for-PubkeyHash"],[1421,"impl-Display-for-WPubkeyHash"],[1422,"impl-Debug-for-WPubkeyHash"],[1423,"impl-UpperHex-for-WPubkeyHash"],[1424,"impl-LowerHex-for-WPubkeyHash"],[1425,"impl-Debug-for-CompressedPublicKey"],[1426,"impl-Display-for-CompressedPublicKey"],[1427,"impl-Debug-for-PrivateKey"],[1428,"impl-Display-for-PrivateKey"],[1429,"impl-UpperHex-for-LegacySighash"],[1430,"impl-Display-for-LegacySighash"],[1431,"impl-Debug-for-LegacySighash"],[1432,"impl-LowerHex-for-LegacySighash"],[1433,"impl-UpperHex-for-SegwitV0Sighash"],[1434,"impl-Display-for-SegwitV0Sighash"],[1435,"impl-LowerHex-for-SegwitV0Sighash"],[1436,"impl-Debug-for-SegwitV0Sighash"],[1437,"impl-Debug-for-TapSighash"],[1438,"impl-Display-for-TapSighash"],[1439,"impl-LowerHex-for-TapSighash"],[1440,"impl-UpperHex-for-TapSighash"],[1441,"impl-Display-for-TapSighashType"],[1442,"impl-Debug-for-TapSighashType"],[1443,"impl-Display-for-EcdsaSighashType"],[1444,"impl-Debug-for-EcdsaSighashType"],[1447,"impl-Display-for-Network"],[1448,"impl-Debug-for-Network"],[1449,"impl-Display-for-Work"],[1450,"impl-LowerHex-for-Work"],[1451,"impl-Debug-for-Work"],[1452,"impl-UpperHex-for-Work"],[1453,"impl-LowerHex-for-Target"],[1454,"impl-Display-for-Target"],[1455,"impl-UpperHex-for-Target"],[1456,"impl-Debug-for-Target"],[1457,"impl-LowerHex-for-CompactTarget"],[1458,"impl-UpperHex-for-CompactTarget"],[1459,"impl-Debug-for-CompactTarget"],[1460,"impl-Display-for-Psbt"],[1461,"impl-Debug-for-Psbt"],[1462,"impl-Debug-for-TapLeafHash"],[1463,"impl-UpperHex-for-TapLeafHash"],[1464,"impl-Display-for-TapLeafHash"],[1465,"impl-LowerHex-for-TapLeafHash"],[1466,"impl-LowerHex-for-TapNodeHash"],[1467,"impl-Display-for-TapNodeHash"],[1468,"impl-Debug-for-TapNodeHash"],[1469,"impl-UpperHex-for-TapNodeHash"],[1470,"impl-UpperHex-for-TapTweakHash"],[1471,"impl-LowerHex-for-TapTweakHash"],[1472,"impl-Display-for-TapTweakHash"],[1473,"impl-Debug-for-TapTweakHash"],[1482,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1483,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1485,"impl-From%3CCompressedPublicKey%3E-for-XOnlyPublicKey"],[1486,"impl-From%3CTweakedPublicKey%3E-for-XOnlyPublicKey"],[1487,"impl-From%3CXOnlyPublicKey%3E-for-XOnlyPublicKey"],[1497,"impl-From%3CHash%3E-for-XKeyIdentifier"],[1498,"impl-From%3CXpub%3E-for-XKeyIdentifier"],[1499,"impl-From%3C%26Xpub%3E-for-XKeyIdentifier"],[1501,"impl-From%3CHeader%3E-for-BlockHash"],[1502,"impl-From%3C%26Block%3E-for-BlockHash"],[1504,"impl-From%3CBlock%3E-for-BlockHash"],[1505,"impl-From%3C%26Header%3E-for-BlockHash"],[1506,"impl-From%3CHash%3E-for-BlockHash"],[1508,"impl-From%3CHash%3E-for-TxMerkleNode"],[1509,"impl-From%3CTxid%3E-for-TxMerkleNode"],[1511,"impl-From%3CWtxid%3E-for-WitnessMerkleNode"],[1512,"impl-From%3CHash%3E-for-WitnessMerkleNode"],[1516,"impl-From%3Cu8%3E-for-Opcode"],[1517,"impl-From%3CWitnessVersion%3E-for-Opcode"],[1519,"impl-From%3CVec%3Cu8%3E%3E-for-ScriptBuf"],[1521,"impl-From%3C%26Script%3E-for-ScriptBuf"],[1522,"impl-From%3CAddress%3E-for-ScriptBuf"],[1523,"impl-From%3CCow%3C\'a,+Script%3E%3E-for-ScriptBuf"],[1526,"impl-From%3C%26Script%3E-for-ScriptHash"],[1528,"impl-From%3C%26ScriptBuf%3E-for-ScriptHash"],[1529,"impl-From%3CHash%3E-for-ScriptHash"],[1530,"impl-From%3CScriptBuf%3E-for-ScriptHash"],[1532,"impl-From%3C%26ScriptBuf%3E-for-WScriptHash"],[1533,"impl-From%3C%26Script%3E-for-WScriptHash"],[1534,"impl-From%3CHash%3E-for-WScriptHash"],[1535,"impl-From%3CScriptBuf%3E-for-WScriptHash"],[1536,"impl-From%3C%26Transaction%3E-for-Txid"],[1537,"impl-From%3CTransaction%3E-for-Txid"],[1539,"impl-From%3CHash%3E-for-Txid"],[1541,"impl-From%3CHash%3E-for-Wtxid"],[1542,"impl-From%3CTransaction%3E-for-Wtxid"],[1543,"impl-From%3C%26Transaction%3E-for-Wtxid"],[1546,"impl-From%3CRelLockTime%3E-for-Sequence"],[1548,"impl-From%3CLockTime%3E-for-Sequence"],[1551,"impl-From%3C%26%5BVec%3Cu8%3E%5D%3E-for-Witness"],[1552,"impl-From%3CVec%3C%26%5Bu8%5D%3E%3E-for-Witness"],[1554,"impl-From%3CVec%3CVec%3Cu8%3E%3E%3E-for-Witness"],[1555,"impl-From%3C%26%5B%26%5Bu8%5D%5D%3E-for-Witness"],[1556,"impl-From%3Cu16%3E-for-VarInt"],[1557,"impl-From%3Cu8%3E-for-VarInt"],[1559,"impl-From%3Cu64%3E-for-VarInt"],[1560,"impl-From%3Cu32%3E-for-VarInt"],[1561,"impl-From%3Cusize%3E-for-VarInt"],[1562,"impl-From%3CPublicKey%3E-for-PublicKey"],[1563,"impl-From%3CCompressedPublicKey%3E-for-PublicKey"],[1565,"impl-From%3C%26CompressedPublicKey%3E-for-PubkeyHash"],[1566,"impl-From%3CHash%3E-for-PubkeyHash"],[1567,"impl-From%3C%26PublicKey%3E-for-PubkeyHash"],[1568,"impl-From%3CCompressedPublicKey%3E-for-PubkeyHash"],[1570,"impl-From%3CPublicKey%3E-for-PubkeyHash"],[1572,"impl-From%3C%26CompressedPublicKey%3E-for-WPubkeyHash"],[1573,"impl-From%3CCompressedPublicKey%3E-for-WPubkeyHash"],[1574,"impl-From%3CHash%3E-for-WPubkeyHash"],[1597,"impl-From%3CHash%3CTapLeafTag%3E%3E-for-TapLeafHash"],[1598,"impl-From%3CScriptPath%3C\'s%3E%3E-for-TapLeafHash"],[1601,"impl-From%3C%26LeafNode%3E-for-TapNodeHash"],[1602,"impl-From%3CTapLeafHash%3E-for-TapNodeHash"],[1604,"impl-From%3CHash%3CTapBranchTag%3E%3E-for-TapNodeHash"],[1605,"impl-From%3CLeafNode%3E-for-TapNodeHash"],[1607,"impl-From%3CTaprootSpendInfo%3E-for-TapTweakHash"],[1608,"impl-From%3C%26TaprootSpendInfo%3E-for-TapTweakHash"],[1610,"impl-From%3CHash%3CTapTweakTag%3E%3E-for-TapTweakHash"],[1717,"impl-ParseableKey-for-XOnlyPublicKey"],[1718,"impl-XOnlyPublicKey"],[1731,"impl-ParseableKey-for-PublicKey"],[1732,"impl-PublicKey"],[1880,"impl-Index%3CRange%3Cusize%3E%3E-for-Script"],[1881,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-Script"],[1882,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Script"],[1883,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-Script"],[1884,"impl-Index%3CRangeFull%3E-for-Script"],[1885,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Script"],[1886,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-Script"],[2029,"impl-Mul%3CFeeRate%3E-for-Weight"],[2030,"impl-Mul%3Cu64%3E-for-Weight"],[2098,"impl-PartialOrd-for-Script"],[2099,"impl-PartialOrd%3CScriptBuf%3E-for-Script"],[2100,"impl-PartialOrd%3CScript%3E-for-ScriptBuf"],[2101,"impl-PartialOrd-for-ScriptBuf"],[2196,"impl-XOnlyPublicKey"],[2197,"impl-Serialize-for-XOnlyPublicKey"],[2235,"impl-Serialize-for-Psbt"],[2236,"impl-Psbt"],[2261,"impl-Sum%3C%26Weight%3E-for-Weight"],[2262,"impl-Sum-for-Weight"],[2475,"impl-TryFrom%3C%26str%3E-for-FeeRate"],[2477,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-FeeRate"],[2478,"impl-TryFrom%3CString%3E-for-FeeRate"],[2480,"impl-TryFrom%3C%26str%3E-for-Weight"],[2481,"impl-TryFrom%3CString%3E-for-Weight"],[2483,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Weight"],[2498,"impl-TryFrom%3CFe32%3E-for-WitnessVersion"],[2500,"impl-TryFrom%3COpcode%3E-for-WitnessVersion"],[2501,"impl-TryFrom%3CInstruction%3C\'a%3E%3E-for-WitnessVersion"],[2502,"impl-TryFrom%3Cu8%3E-for-WitnessVersion"],[2509,"impl-TryFrom%3CString%3E-for-Sequence"],[2510,"impl-TryFrom%3C%26str%3E-for-Sequence"],[2511,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Sequence"],[2532,"impl-TryFrom%3CChainHash%3E-for-Network"],[2533,"impl-TryFrom%3CMagic%3E-for-Network"],[2885,"impl-Debug-for-FromScriptError"],[2886,"impl-Display-for-FromScriptError"],[2887,"impl-Display-for-P2shError"],[2888,"impl-Debug-for-P2shError"],[2889,"impl-Display-for-UnknownAddressTypeError"],[2890,"impl-Debug-for-UnknownAddressTypeError"],[2891,"impl-Display-for-ParseError"],[2892,"impl-Debug-for-ParseError"],[2893,"impl-Debug-for-UnknownHrpError"],[2894,"impl-Display-for-UnknownHrpError"],[2895,"impl-Display-for-NetworkValidationError"],[2896,"impl-Debug-for-NetworkValidationError"],[2897,"impl-Display-for-InvalidBase58PayloadLengthError"],[2898,"impl-Debug-for-InvalidBase58PayloadLengthError"],[2899,"impl-Debug-for-LegacyAddressTooLongError"],[2900,"impl-Display-for-LegacyAddressTooLongError"],[2901,"impl-Debug-for-InvalidLegacyPrefixError"],[2902,"impl-Display-for-InvalidLegacyPrefixError"],[2907,"impl-From%3CError%3E-for-FromScriptError"],[2908,"impl-From%3CTryFromError%3E-for-FromScriptError"],[2909,"impl-From%3CInfallible%3E-for-FromScriptError"],[2913,"impl-From%3CInfallible%3E-for-ParseError"],[2915,"impl-From%3CUnknownHrpError%3E-for-ParseError"],[2916,"impl-From%3CNetworkValidationError%3E-for-ParseError"],[2917,"impl-From%3CDecodeError%3E-for-ParseError"],[2918,"impl-From%3CInvalidLegacyPrefixError%3E-for-ParseError"],[2919,"impl-From%3CLegacyAddressTooLongError%3E-for-ParseError"],[2920,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-ParseError"],[2921,"impl-From%3CError%3E-for-ParseError"],[2922,"impl-From%3CTryFromError%3E-for-ParseError"],[2923,"impl-From%3CError%3E-for-ParseError"],[3084,"impl-Debug-for-ParseAmountError"],[3085,"impl-Display-for-ParseAmountError"],[3086,"impl-Debug-for-Display"],[3087,"impl-Display-for-Display"],[3088,"impl-From%3CInfallible%3E-for-ParseAmountError"],[3090,"impl-From%3CTooPreciseError%3E-for-ParseAmountError"],[3091,"impl-From%3CMissingDigitsError%3E-for-ParseAmountError"],[3092,"impl-From%3CInputTooLargeError%3E-for-ParseAmountError"],[3093,"impl-From%3CInvalidCharacterError%3E-for-ParseAmountError"],[3094,"impl-From%3COutOfRangeError%3E-for-ParseAmountError"],[3147,"impl-AsMut%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3148,"impl-AsMut%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3155,"impl-AsRef%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3156,"impl-AsRef%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3157,"impl-AsRef%3COsStr%3E-for-String"],[3158,"impl-AsRef%3CPath%3E-for-String"],[3159,"impl-AsRef%3Cstr%3E-for-String"],[3160,"impl-AsRef%3C%5Bu8%5D%3E-for-String"],[3194,"impl-Decodable-for-Vec%3CAddrV2Message%3E"],[3195,"impl-Decodable-for-Vec%3CVarInt%3E"],[3196,"impl-Decodable-for-Vec%3Cu8%3E"],[3197,"impl-Decodable-for-Vec%3CVec%3Cu8%3E%3E"],[3198,"impl-Decodable-for-Vec%3CTapLeafHash%3E"],[3199,"impl-Decodable-for-Vec%3CHeader%3E"],[3200,"impl-Decodable-for-Vec%3CInventory%3E"],[3201,"impl-Decodable-for-Vec%3CTxIn%3E"],[3202,"impl-Decodable-for-Vec%3CPrefilledTransaction%3E"],[3203,"impl-Decodable-for-Vec%3Cu64%3E"],[3204,"impl-Decodable-for-Vec%3CTxMerkleNode%3E"],[3205,"impl-Decodable-for-Vec%3CBlockHash%3E"],[3206,"impl-Decodable-for-Vec%3CFilterHeader%3E"],[3207,"impl-Decodable-for-Vec%3CShortId%3E"],[3208,"impl-Decodable-for-Vec%3C(u32,+Address)%3E"],[3209,"impl-Decodable-for-Vec%3CFilterHash%3E"],[3210,"impl-Decodable-for-Vec%3CTransaction%3E"],[3211,"impl-Decodable-for-Vec%3CTxOut%3E"],[3212,"impl-Encodable-for-Vec%3CTxIn%3E"],[3213,"impl-Encodable-for-Vec%3CFilterHash%3E"],[3214,"impl-Encodable-for-Vec%3CBlockHash%3E"],[3215,"impl-Encodable-for-Vec%3CTransaction%3E"],[3216,"impl-Encodable-for-Vec%3CVec%3Cu8%3E%3E"],[3217,"impl-Encodable-for-Vec%3Cu64%3E"],[3218,"impl-Encodable-for-Vec%3CInventory%3E"],[3219,"impl-Encodable-for-Vec%3Cu8%3E"],[3220,"impl-Encodable-for-Vec%3CAddrV2Message%3E"],[3221,"impl-Encodable-for-Vec%3CShortId%3E"],[3222,"impl-Encodable-for-Vec%3CVarInt%3E"],[3223,"impl-Encodable-for-Vec%3CFilterHeader%3E"],[3224,"impl-Encodable-for-Vec%3C(u32,+Address)%3E"],[3225,"impl-Encodable-for-Vec%3CTxMerkleNode%3E"],[3226,"impl-Encodable-for-Vec%3CTxOut%3E"],[3227,"impl-Encodable-for-Vec%3CTapLeafHash%3E"],[3228,"impl-Encodable-for-Vec%3CPrefilledTransaction%3E"],[3229,"impl-Encodable-for-Vec%3CHeader%3E"],[3263,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3264,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3265,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3266,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3267,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3268,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3269,"impl-PartialEq%3Cstr%3E-for-String"],[3270,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3271,"impl-PartialEq%3CValue%3E-for-String"],[3272,"impl-PartialEq%3C%26str%3E-for-String"],[3273,"impl-PartialEq-for-String"],[3283,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3284,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3285,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3286,"impl-Extend%3CBox%3Cstr%3E%3E-for-String"],[3287,"impl-Extend%3C%26char%3E-for-String"],[3288,"impl-Extend%3CString%3E-for-String"],[3289,"impl-Extend%3C%26str%3E-for-String"],[3290,"impl-Extend%3Cchar%3E-for-String"],[3294,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3295,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3296,"impl-Extend%3Cchar%3E-for-String"],[3297,"impl-Extend%3C%26char%3E-for-String"],[3298,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3299,"impl-Extend%3C%26str%3E-for-String"],[3300,"impl-Extend%3CString%3E-for-String"],[3301,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3302,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3303,"impl-Extend%3C%26char%3E-for-String"],[3304,"impl-Extend%3Cchar%3E-for-String"],[3306,"impl-Write-for-Vec%3Cu8,+A%3E"],[3307,"impl-Write-for-Vec%3Cu8%3E"],[3308,"impl-Display-for-Error"],[3309,"impl-Debug-for-Error"],[3310,"impl-Display-for-InvalidCharacterError"],[3311,"impl-Debug-for-InvalidCharacterError"],[3313,"impl-Debug-for-String"],[3314,"impl-Display-for-String"],[3315,"impl-From%3CTooShortError%3E-for-Error"],[3316,"impl-From%3CInfallible%3E-for-Error"],[3317,"impl-From%3CInvalidCharacterError%3E-for-Error"],[3318,"impl-From%3CIncorrectChecksumError%3E-for-Error"],[3321,"impl-From%3CVecDeque%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3322,"impl-From%3CTaprootMerkleBranch%3E-for-Vec%3CTapNodeHash%3E"],[3323,"impl-From%3CScriptBuf%3E-for-Vec%3Cu8%3E"],[3324,"impl-From%3CPushBytesBuf%3E-for-Vec%3Cu8%3E"],[3325,"impl-From%3C%26%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3326,"impl-From%3CString%3E-for-Vec%3Cu8%3E"],[3327,"impl-From%3CCow%3C\'a,+%5BT%5D%3E%3E-for-Vec%3CT%3E"],[3328,"impl-From%3CBox%3C%5BT%5D,+A%3E%3E-for-Vec%3CT,+A%3E"],[3329,"impl-From%3CCString%3E-for-Vec%3Cu8%3E"],[3331,"impl-From%3CDerivationPath%3E-for-Vec%3CChildNumber%3E"],[3332,"impl-From%3C%26%5BT%5D%3E-for-Vec%3CT%3E"],[3333,"impl-From%3C%26str%3E-for-Vec%3Cu8%3E"],[3334,"impl-From%3C%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3335,"impl-From%3C%26mut+%5BT%5D%3E-for-Vec%3CT%3E"],[3336,"impl-From%3CBinaryHeap%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3337,"impl-From%3C%26mut+%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3338,"impl-From%3Cchar%3E-for-String"],[3340,"impl-From%3C%26mut+str%3E-for-String"],[3341,"impl-From%3CBox%3Cstr%3E%3E-for-String"],[3342,"impl-From%3CCow%3C\'a,+str%3E%3E-for-String"],[3343,"impl-From%3C%26String%3E-for-String"],[3344,"impl-From%3C%26str%3E-for-String"],[3347,"impl-FromIterator%3CBox%3Cstr%3E%3E-for-String"],[3348,"impl-FromIterator%3C%26str%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"],[3389,"impl-IntoIterator-for-%26Vec%3CT,+A%3E"],[3390,"impl-IntoIterator-for-%26mut+Vec%3CT,+A%3E"],[3391,"impl-IntoIterator-for-Vec%3CT,+A%3E"],[3398,"impl-Vec%3CT,+A%3E"],[3399,"impl-Merge-for-Vec%3CT%3E"],[3409,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3410,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3411,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3412,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3413,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3414,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3415,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3416,"impl-PartialEq%3Cstr%3E-for-String"],[3417,"impl-PartialEq%3C%26str%3E-for-String"],[3497,"impl-Write-for-Vec%3Cu8,+A%3E"],[3498,"impl-Write-for-Vec%3Cu8%3E"],[3524,"impl-Display-for-IncorrectChecksumError"],[3525,"impl-Debug-for-IncorrectChecksumError"],[3526,"impl-Display-for-TooShortError"],[3527,"impl-Debug-for-TooShortError"],[3601,"impl-Display-for-EncodeSliceError"],[3602,"impl-Debug-for-EncodeSliceError"],[3603,"impl-Display-for-DecodeError"],[3604,"impl-Debug-for-DecodeError"],[3605,"impl-Display-for-DecodeSliceError"],[3606,"impl-Debug-for-DecodeSliceError"],[3662,"impl-Display-for-ParseAlphabetError"],[3663,"impl-Debug-for-ParseAlphabetError"],[3852,"impl-AsMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3853,"impl-AsMut%3C%5Bu8%5D%3E-for-ShortId"],[3857,"impl-AsRef%3C%5Bu8;+6%5D%3E-for-ShortId"],[3858,"impl-AsRef%3C%5Bu8%5D%3E-for-ShortId"],[3863,"impl-Borrow%3C%5Bu8;+6%5D%3E-for-ShortId"],[3865,"impl-Borrow%3C%5Bu8%5D%3E-for-ShortId"],[3873,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ShortId"],[3874,"impl-BorrowMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3934,"impl-Display-for-Error"],[3935,"impl-Debug-for-Error"],[3937,"impl-LowerHex-for-ShortId"],[3938,"impl-UpperHex-for-ShortId"],[3939,"impl-Display-for-ShortId"],[3940,"impl-Debug-for-ShortId"],[3943,"impl-Display-for-TxIndexOutOfRangeError"],[3944,"impl-Debug-for-TxIndexOutOfRangeError"],[3949,"impl-From%3C%5Bu8;+6%5D%3E-for-ShortId"],[3950,"impl-From%3C%26%5Bu8;+6%5D%3E-for-ShortId"],[4074,"impl-Debug-for-Error"],[4075,"impl-Display-for-Error"],[4083,"impl-From%3CError%3E-for-Error"],[4085,"impl-From%3CInfallible%3E-for-Error"],[4177,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4178,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainCode"],[4179,"impl-AsMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4180,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4185,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4186,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainCode"],[4187,"impl-AsRef%3C%5Bu8%5D%3E-for-Fingerprint"],[4188,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4192,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainCode"],[4194,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4195,"impl-Borrow%3C%5Bu8%5D%3E-for-Fingerprint"],[4197,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4205,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4207,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainCode"],[4208,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4209,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4303,"impl-Debug-for-ChainCode"],[4304,"impl-UpperHex-for-ChainCode"],[4305,"impl-LowerHex-for-ChainCode"],[4306,"impl-Display-for-ChainCode"],[4307,"impl-UpperHex-for-Fingerprint"],[4308,"impl-LowerHex-for-Fingerprint"],[4309,"impl-Debug-for-Fingerprint"],[4310,"impl-Display-for-Fingerprint"],[4311,"impl-Debug-for-Xpriv"],[4312,"impl-Display-for-Xpriv"],[4313,"impl-Debug-for-Xpub"],[4314,"impl-Display-for-Xpub"],[4315,"impl-Debug-for-ChildNumber"],[4316,"impl-Display-for-ChildNumber"],[4317,"impl-Display-for-DerivationPath"],[4318,"impl-Debug-for-DerivationPath"],[4319,"impl-Debug-for-Error"],[4320,"impl-Display-for-Error"],[4321,"impl-Debug-for-InvalidBase58PayloadLengthError"],[4322,"impl-Display-for-InvalidBase58PayloadLengthError"],[4324,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainCode"],[4326,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4328,"impl-From%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4329,"impl-From%3C%26%5Bu8;+4%5D%3E-for-Fingerprint"],[4334,"impl-From%3C%26%5BChildNumber%5D%3E-for-DerivationPath"],[4335,"impl-From%3CVec%3CChildNumber%3E%3E-for-DerivationPath"],[4337,"impl-From%3CInfallible%3E-for-Error"],[4338,"impl-From%3CError%3E-for-Error"],[4339,"impl-From%3CError%3E-for-Error"],[4341,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-Error"],[4568,"impl-Debug-for-Bip34Error"],[4569,"impl-Display-for-Bip34Error"],[4570,"impl-Debug-for-ValidationError"],[4571,"impl-Display-for-ValidationError"],[4646,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainHash"],[4647,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4650,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4651,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainHash"],[4652,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainHash"],[4654,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4655,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4657,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainHash"],[4665,"impl-Debug-for-ChainHash"],[4666,"impl-Display-for-ChainHash"],[4667,"impl-LowerHex-for-ChainHash"],[4668,"impl-UpperHex-for-ChainHash"],[4670,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainHash"],[4671,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4764,"impl-Debug-for-Height"],[4765,"impl-Display-for-Height"],[4766,"impl-Debug-for-ParseHeightError"],[4767,"impl-Display-for-ParseHeightError"],[4768,"impl-Debug-for-Time"],[4769,"impl-Display-for-Time"],[4770,"impl-Display-for-ParseTimeError"],[4771,"impl-Debug-for-ParseTimeError"],[4772,"impl-Debug-for-ConversionError"],[4773,"impl-Display-for-ConversionError"],[4774,"impl-Display-for-LockTime"],[4775,"impl-Debug-for-LockTime"],[4784,"impl-From%3CTime%3E-for-LockTime"],[4785,"impl-From%3CAbsLockTime%3E-for-LockTime"],[4786,"impl-From%3CHeight%3E-for-LockTime"],[4850,"impl-TryFrom%3CString%3E-for-Height"],[4851,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[4852,"impl-TryFrom%3C%26str%3E-for-Height"],[4854,"impl-TryFrom%3C%26str%3E-for-Time"],[4856,"impl-TryFrom%3CString%3E-for-Time"],[4857,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[4860,"impl-TryFrom%3C%26str%3E-for-LockTime"],[4861,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-LockTime"],[4862,"impl-TryFrom%3CString%3E-for-LockTime"],[4959,"impl-Debug-for-Height"],[4960,"impl-Display-for-Height"],[4961,"impl-Debug-for-Time"],[4962,"impl-Display-for-Time"],[4963,"impl-Debug-for-TimeOverflowError"],[4964,"impl-Display-for-TimeOverflowError"],[4965,"impl-Debug-for-LockTime"],[4966,"impl-Display-for-LockTime"],[4967,"impl-Debug-for-DisabledLockTimeError"],[4968,"impl-Display-for-DisabledLockTimeError"],[4969,"impl-Debug-for-IncompatibleHeightError"],[4970,"impl-Display-for-IncompatibleHeightError"],[4971,"impl-Debug-for-IncompatibleTimeError"],[4972,"impl-Display-for-IncompatibleTimeError"],[4977,"impl-From%3CHeight%3E-for-LockTime"],[4978,"impl-From%3CRelLockTime%3E-for-LockTime"],[4979,"impl-From%3CTime%3E-for-LockTime"],[5055,"impl-TryFrom%3C%26str%3E-for-Height"],[5056,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[5057,"impl-TryFrom%3CString%3E-for-Height"],[5060,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[5061,"impl-TryFrom%3CString%3E-for-Time"],[5062,"impl-TryFrom%3C%26str%3E-for-Time"],[5422,"impl-AsMut%3CPushBytes%3E-for-PushBytes"],[5423,"impl-AsMut%3C%5Bu8%5D%3E-for-PushBytes"],[5428,"impl-AsRef%3CPushBytes%3E-for-PushBytes"],[5429,"impl-AsRef%3C%5Bu8%5D%3E-for-PushBytes"],[5496,"impl-Display-for-Builder"],[5497,"impl-Debug-for-Builder"],[5503,"impl-Display-for-PushBytesError"],[5504,"impl-Debug-for-PushBytesError"],[5505,"impl-Display-for-Error"],[5506,"impl-Debug-for-Error"],[5513,"impl-From%3C%26%5Bu8;+52%5D%3E-for-%26PushBytes"],[5514,"impl-From%3C%26mut+%5Bu8;+24%5D%3E-for-%26mut+PushBytes"],[5515,"impl-From%3C%26mut+%5Bu8;+59%5D%3E-for-%26mut+PushBytes"],[5516,"impl-From%3C%26mut+%5Bu8;+22%5D%3E-for-%26mut+PushBytes"],[5517,"impl-From%3C%26mut+%5Bu8;+76%5D%3E-for-%26mut+PushBytes"],[5518,"impl-From%3C%26%5Bu8;+32%5D%3E-for-%26PushBytes"],[5519,"impl-From%3C%26mut+%5Bu8;+58%5D%3E-for-%26mut+PushBytes"],[5520,"impl-From%3C%26%5Bu8;+1%5D%3E-for-%26PushBytes"],[5521,"impl-From%3C%26mut+%5Bu8;+66%5D%3E-for-%26mut+PushBytes"],[5522,"impl-From%3C%26mut+%5Bu8;+31%5D%3E-for-%26mut+PushBytes"],[5523,"impl-From%3C%26%5Bu8;+50%5D%3E-for-%26PushBytes"],[5524,"impl-From%3C%26mut+%5Bu8;+43%5D%3E-for-%26mut+PushBytes"],[5525,"impl-From%3C%26mut+%5Bu8;+52%5D%3E-for-%26mut+PushBytes"],[5526,"impl-From%3C%26mut+%5Bu8;+21%5D%3E-for-%26mut+PushBytes"],[5527,"impl-From%3C%26%5Bu8;+62%5D%3E-for-%26PushBytes"],[5528,"impl-From%3C%26mut+%5Bu8;+55%5D%3E-for-%26mut+PushBytes"],[5529,"impl-From%3C%26mut+%5Bu8;+7%5D%3E-for-%26mut+PushBytes"],[5530,"impl-From%3C%26%5Bu8;+7%5D%3E-for-%26PushBytes"],[5531,"impl-From%3C%26mut+%5Bu8;+65%5D%3E-for-%26mut+PushBytes"],[5532,"impl-From%3C%26%5Bu8;+31%5D%3E-for-%26PushBytes"],[5533,"impl-From%3C%26mut+%5Bu8;+2%5D%3E-for-%26mut+PushBytes"],[5534,"impl-From%3C%26%5Bu8;+24%5D%3E-for-%26PushBytes"],[5535,"impl-From%3C%26mut+%5Bu8;+44%5D%3E-for-%26mut+PushBytes"],[5536,"impl-From%3C%26%5Bu8;+15%5D%3E-for-%26PushBytes"],[5537,"impl-From%3C%26mut+%5Bu8;+72%5D%3E-for-%26mut+PushBytes"],[5538,"impl-From%3C%26%5Bu8;+8%5D%3E-for-%26PushBytes"],[5539,"impl-From%3C%26%5Bu8;+0%5D%3E-for-%26PushBytes"],[5540,"impl-From%3C%26mut+%5Bu8;+60%5D%3E-for-%26mut+PushBytes"],[5541,"impl-From%3C%26%5Bu8;+14%5D%3E-for-%26PushBytes"],[5542,"impl-From%3C%26mut+%5Bu8;+4%5D%3E-for-%26mut+PushBytes"],[5543,"impl-From%3C%26mut+%5Bu8;+15%5D%3E-for-%26mut+PushBytes"],[5544,"impl-From%3C%26%5Bu8;+33%5D%3E-for-%26PushBytes"],[5545,"impl-From%3C%26%5Bu8;+60%5D%3E-for-%26PushBytes"],[5546,"impl-From%3C%26%5Bu8;+13%5D%3E-for-%26PushBytes"],[5547,"impl-From%3C%26%5Bu8;+2%5D%3E-for-%26PushBytes"],[5548,"impl-From%3C%26%5Bu8;+41%5D%3E-for-%26PushBytes"],[5549,"impl-From%3C%26mut+%5Bu8;+57%5D%3E-for-%26mut+PushBytes"],[5550,"impl-From%3C%26mut+%5Bu8;+0%5D%3E-for-%26mut+PushBytes"],[5551,"impl-From%3C%26mut+%5Bu8;+32%5D%3E-for-%26mut+PushBytes"],[5552,"impl-From%3C%26mut+%5Bu8;+71%5D%3E-for-%26mut+PushBytes"],[5553,"impl-From%3C%26mut+%5Bu8;+53%5D%3E-for-%26mut+PushBytes"],[5554,"impl-From%3C%26mut+%5Bu8;+17%5D%3E-for-%26mut+PushBytes"],[5555,"impl-From%3C%26%5Bu8;+45%5D%3E-for-%26PushBytes"],[5556,"impl-From%3C%26%5Bu8;+30%5D%3E-for-%26PushBytes"],[5557,"impl-From%3C%26mut+%5Bu8;+27%5D%3E-for-%26mut+PushBytes"],[5558,"impl-From%3C%26%5Bu8;+67%5D%3E-for-%26PushBytes"],[5559,"impl-From%3C%26mut+%5Bu8;+16%5D%3E-for-%26mut+PushBytes"],[5560,"impl-From%3C%26%5Bu8;+58%5D%3E-for-%26PushBytes"],[5561,"impl-From%3C%26%5Bu8;+63%5D%3E-for-%26PushBytes"],[5562,"impl-From%3C%26mut+%5Bu8;+14%5D%3E-for-%26mut+PushBytes"],[5563,"impl-From%3C%26%5Bu8;+4%5D%3E-for-%26PushBytes"],[5564,"impl-From%3C%26mut+%5Bu8;+67%5D%3E-for-%26mut+PushBytes"],[5565,"impl-From%3C%26mut+%5Bu8;+11%5D%3E-for-%26mut+PushBytes"],[5566,"impl-From%3C%26mut+%5Bu8;+74%5D%3E-for-%26mut+PushBytes"],[5567,"impl-From%3C%26%5Bu8;+65%5D%3E-for-%26PushBytes"],[5568,"impl-From%3C%26mut+%5Bu8;+28%5D%3E-for-%26mut+PushBytes"],[5569,"impl-From%3C%26%5Bu8;+29%5D%3E-for-%26PushBytes"],[5570,"impl-From%3C%26mut+%5Bu8;+48%5D%3E-for-%26mut+PushBytes"],[5571,"impl-From%3C%26mut+%5Bu8;+34%5D%3E-for-%26mut+PushBytes"],[5572,"impl-From%3C%26%5Bu8;+28%5D%3E-for-%26PushBytes"],[5573,"impl-From%3C%26mut+%5Bu8;+6%5D%3E-for-%26mut+PushBytes"],[5574,"impl-From%3C%26mut+%5Bu8;+8%5D%3E-for-%26mut+PushBytes"],[5575,"impl-From%3C%26%5Bu8;+26%5D%3E-for-%26PushBytes"],[5576,"impl-From%3C%26%5Bu8;+53%5D%3E-for-%26PushBytes"],[5577,"impl-From%3C%26mut+%5Bu8;+9%5D%3E-for-%26mut+PushBytes"],[5578,"impl-From%3C%26mut+%5Bu8;+75%5D%3E-for-%26mut+PushBytes"],[5579,"impl-From%3C%26%5Bu8;+3%5D%3E-for-%26PushBytes"],[5580,"impl-From%3C%26%5Bu8;+6%5D%3E-for-%26PushBytes"],[5581,"impl-From%3C%26mut+%5Bu8;+20%5D%3E-for-%26mut+PushBytes"],[5582,"impl-From%3C%26%5Bu8;+20%5D%3E-for-%26PushBytes"],[5583,"impl-From%3C%26mut+%5Bu8;+29%5D%3E-for-%26mut+PushBytes"],[5584,"impl-From%3C%26mut+%5Bu8;+33%5D%3E-for-%26mut+PushBytes"],[5585,"impl-From%3C%26%5Bu8;+17%5D%3E-for-%26PushBytes"],[5586,"impl-From%3C%26%5Bu8;+48%5D%3E-for-%26PushBytes"],[5587,"impl-From%3C%26mut+%5Bu8;+12%5D%3E-for-%26mut+PushBytes"],[5588,"impl-From%3C%26%5Bu8;+54%5D%3E-for-%26PushBytes"],[5589,"impl-From%3C%26%5Bu8;+5%5D%3E-for-%26PushBytes"],[5590,"impl-From%3C%26%5Bu8;+36%5D%3E-for-%26PushBytes"],[5591,"impl-From%3C%26mut+%5Bu8;+39%5D%3E-for-%26mut+PushBytes"],[5592,"impl-From%3C%26%5Bu8;+57%5D%3E-for-%26PushBytes"],[5593,"impl-From%3C%26%5Bu8;+47%5D%3E-for-%26PushBytes"],[5594,"impl-From%3C%26%5Bu8;+16%5D%3E-for-%26PushBytes"],[5595,"impl-From%3C%26%5Bu8;+76%5D%3E-for-%26PushBytes"],[5596,"impl-From%3C%26mut+%5Bu8;+18%5D%3E-for-%26mut+PushBytes"],[5597,"impl-From%3C%26mut+%5Bu8;+61%5D%3E-for-%26mut+PushBytes"],[5598,"impl-From%3C%26mut+%5Bu8;+45%5D%3E-for-%26mut+PushBytes"],[5599,"impl-From%3C%26%5Bu8;+43%5D%3E-for-%26PushBytes"],[5600,"impl-From%3C%26%5Bu8;+51%5D%3E-for-%26PushBytes"],[5601,"impl-From%3C%26mut+%5Bu8;+40%5D%3E-for-%26mut+PushBytes"],[5602,"impl-From%3C%26%5Bu8;+34%5D%3E-for-%26PushBytes"],[5603,"impl-From%3C%26mut+%5Bu8;+13%5D%3E-for-%26mut+PushBytes"],[5604,"impl-From%3C%26mut+%5Bu8;+63%5D%3E-for-%26mut+PushBytes"],[5605,"impl-From%3C%26mut+%5Bu8;+41%5D%3E-for-%26mut+PushBytes"],[5606,"impl-From%3C%26%5Bu8;+12%5D%3E-for-%26PushBytes"],[5607,"impl-From%3C%26mut+%5Bu8;+1%5D%3E-for-%26mut+PushBytes"],[5608,"impl-From%3C%26%5Bu8;+74%5D%3E-for-%26PushBytes"],[5609,"impl-From%3C%26mut+%5Bu8;+46%5D%3E-for-%26mut+PushBytes"],[5610,"impl-From%3C%26%5Bu8;+42%5D%3E-for-%26PushBytes"],[5611,"impl-From%3C%26mut+%5Bu8;+54%5D%3E-for-%26mut+PushBytes"],[5612,"impl-From%3C%26mut+%5Bu8;+62%5D%3E-for-%26mut+PushBytes"],[5613,"impl-From%3C%26%5Bu8;+70%5D%3E-for-%26PushBytes"],[5614,"impl-From%3C%26%5Bu8;+44%5D%3E-for-%26PushBytes"],[5615,"impl-From%3C%26%5Bu8;+61%5D%3E-for-%26PushBytes"],[5616,"impl-From%3C%26mut+%5Bu8;+49%5D%3E-for-%26mut+PushBytes"],[5617,"impl-From%3C%26mut+%5Bu8;+56%5D%3E-for-%26mut+PushBytes"],[5618,"impl-From%3C%26mut+%5Bu8;+3%5D%3E-for-%26mut+PushBytes"],[5619,"impl-From%3C%26mut+%5Bu8;+47%5D%3E-for-%26mut+PushBytes"],[5620,"impl-From%3C%26%5Bu8;+10%5D%3E-for-%26PushBytes"],[5621,"impl-From%3C%26mut+%5Bu8;+68%5D%3E-for-%26mut+PushBytes"],[5622,"impl-From%3C%26%5Bu8;+18%5D%3E-for-%26PushBytes"],[5623,"impl-From%3C%26%5Bu8;+55%5D%3E-for-%26PushBytes"],[5624,"impl-From%3C%26%5Bu8;+73%5D%3E-for-%26PushBytes"],[5625,"impl-From%3C%26%5Bu8;+11%5D%3E-for-%26PushBytes"],[5626,"impl-From%3C%26%5Bu8;+25%5D%3E-for-%26PushBytes"],[5627,"impl-From%3C%26%5Bu8;+23%5D%3E-for-%26PushBytes"],[5628,"impl-From%3C%26mut+%5Bu8;+42%5D%3E-for-%26mut+PushBytes"],[5629,"impl-From%3C%26%5Bu8;+59%5D%3E-for-%26PushBytes"],[5630,"impl-From%3C%26mut+%5Bu8;+26%5D%3E-for-%26mut+PushBytes"],[5631,"impl-From%3C%26mut+%5Bu8;+70%5D%3E-for-%26mut+PushBytes"],[5632,"impl-From%3C%26mut+%5Bu8;+23%5D%3E-for-%26mut+PushBytes"],[5633,"impl-From%3C%26mut+%5Bu8;+30%5D%3E-for-%26mut+PushBytes"],[5634,"impl-From%3C%26mut+%5Bu8;+35%5D%3E-for-%26mut+PushBytes"],[5635,"impl-From%3C%26%5Bu8;+49%5D%3E-for-%26PushBytes"],[5636,"impl-From%3C%26%5Bu8;+75%5D%3E-for-%26PushBytes"],[5637,"impl-From%3C%26mut+%5Bu8;+51%5D%3E-for-%26mut+PushBytes"],[5638,"impl-From%3C%26%5Bu8;+40%5D%3E-for-%26PushBytes"],[5639,"impl-From%3C%26%5Bu8;+35%5D%3E-for-%26PushBytes"],[5640,"impl-From%3C%26%5Bu8;+64%5D%3E-for-%26PushBytes"],[5641,"impl-From%3C%26mut+%5Bu8;+5%5D%3E-for-%26mut+PushBytes"],[5642,"impl-From%3C%26%5Bu8;+9%5D%3E-for-%26PushBytes"],[5643,"impl-From%3C%26%5Bu8;+71%5D%3E-for-%26PushBytes"],[5644,"impl-From%3C%26%5Bu8;+27%5D%3E-for-%26PushBytes"],[5645,"impl-From%3C%26%5Bu8;+19%5D%3E-for-%26PushBytes"],[5646,"impl-From%3C%26%5Bu8;+39%5D%3E-for-%26PushBytes"],[5647,"impl-From%3C%26%5Bu8;+38%5D%3E-for-%26PushBytes"],[5648,"impl-From%3C%26mut+%5Bu8;+73%5D%3E-for-%26mut+PushBytes"],[5649,"impl-From%3C%26mut+%5Bu8;+36%5D%3E-for-%26mut+PushBytes"],[5650,"impl-From%3C%26%5Bu8;+46%5D%3E-for-%26PushBytes"],[5651,"impl-From%3C%26mut+%5Bu8;+19%5D%3E-for-%26mut+PushBytes"],[5652,"impl-From%3C%26%5Bu8;+69%5D%3E-for-%26PushBytes"],[5653,"impl-From%3C%26%5Bu8;+68%5D%3E-for-%26PushBytes"],[5654,"impl-From%3C%26%5Bu8;+66%5D%3E-for-%26PushBytes"],[5655,"impl-From%3C%26mut+%5Bu8;+50%5D%3E-for-%26mut+PushBytes"],[5656,"impl-From%3C%26%5Bu8;+21%5D%3E-for-%26PushBytes"],[5657,"impl-From%3C%26mut+%5Bu8;+10%5D%3E-for-%26mut+PushBytes"],[5658,"impl-From%3C%26mut+%5Bu8;+25%5D%3E-for-%26mut+PushBytes"],[5659,"impl-From%3C%26mut+%5Bu8;+64%5D%3E-for-%26mut+PushBytes"],[5660,"impl-From%3C%26%5Bu8;+56%5D%3E-for-%26PushBytes"],[5661,"impl-From%3C%26mut+%5Bu8;+69%5D%3E-for-%26mut+PushBytes"],[5662,"impl-From%3C%26mut+%5Bu8;+37%5D%3E-for-%26mut+PushBytes"],[5663,"impl-From%3C%26%5Bu8;+37%5D%3E-for-%26PushBytes"],[5664,"impl-From%3C%26%5Bu8;+22%5D%3E-for-%26PushBytes"],[5665,"impl-From%3C%26%5Bu8;+72%5D%3E-for-%26PushBytes"],[5666,"impl-From%3C%26mut+%5Bu8;+38%5D%3E-for-%26mut+PushBytes"],[5667,"impl-From%3C%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5668,"impl-From%3C%26%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5669,"impl-From%3C%26%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5670,"impl-From%3C%26%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5671,"impl-From%3C%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5672,"impl-From%3C%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5673,"impl-From%3CPubkeyHash%3E-for-PushBytesBuf"],[5674,"impl-From%3C%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5675,"impl-From%3CScriptHash%3E-for-PushBytesBuf"],[5676,"impl-From%3C%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5677,"impl-From%3C%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5678,"impl-From%3C%26%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5679,"impl-From%3C%26%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5680,"impl-From%3CWScriptHash%3E-for-PushBytesBuf"],[5681,"impl-From%3C%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5682,"impl-From%3C%26%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5683,"impl-From%3C%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5684,"impl-From%3C%26%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5685,"impl-From%3C%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5686,"impl-From%3C%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5687,"impl-From%3C%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5688,"impl-From%3C%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5689,"impl-From%3C%26%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5690,"impl-From%3C%26%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5691,"impl-From%3C%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5692,"impl-From%3C%26%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5693,"impl-From%3C%26%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5694,"impl-From%3C%26%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5695,"impl-From%3C%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5696,"impl-From%3C%26%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5697,"impl-From%3C%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5698,"impl-From%3C%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5699,"impl-From%3C%26%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5700,"impl-From%3C%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5701,"impl-From%3C%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5702,"impl-From%3C%26%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5703,"impl-From%3C%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5704,"impl-From%3C%26%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5705,"impl-From%3C%26%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5706,"impl-From%3C%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5707,"impl-From%3C%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5708,"impl-From%3C%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5709,"impl-From%3C%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5710,"impl-From%3C%26%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5711,"impl-From%3C%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5712,"impl-From%3C%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5713,"impl-From%3C%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5714,"impl-From%3C%26%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5715,"impl-From%3C%26%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5716,"impl-From%3C%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5717,"impl-From%3C%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5718,"impl-From%3C%26%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5719,"impl-From%3C%26%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5720,"impl-From%3C%26%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5721,"impl-From%3C%26%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5722,"impl-From%3C%26%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5723,"impl-From%3C%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5725,"impl-From%3C%26%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5726,"impl-From%3C%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5727,"impl-From%3C%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5728,"impl-From%3C%26%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5729,"impl-From%3C%26%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5730,"impl-From%3C%26%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5731,"impl-From%3C%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5732,"impl-From%3C%26%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5733,"impl-From%3C%26%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5734,"impl-From%3C%26%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5735,"impl-From%3C%26%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5736,"impl-From%3C%26%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5737,"impl-From%3C%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5738,"impl-From%3C%26%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5739,"impl-From%3C%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5740,"impl-From%3C%26%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5741,"impl-From%3C%26%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5742,"impl-From%3C%26%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5743,"impl-From%3C%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5744,"impl-From%3C%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5745,"impl-From%3C%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5746,"impl-From%3C%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5747,"impl-From%3C%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5748,"impl-From%3C%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5749,"impl-From%3C%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5750,"impl-From%3C%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5751,"impl-From%3C%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5752,"impl-From%3C%26%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5753,"impl-From%3C%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5754,"impl-From%3C%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5755,"impl-From%3C%26%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5756,"impl-From%3C%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5757,"impl-From%3C%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5758,"impl-From%3C%26%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5759,"impl-From%3C%26%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5760,"impl-From%3C%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5761,"impl-From%3C%26%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5762,"impl-From%3C%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5763,"impl-From%3C%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5764,"impl-From%3C%26%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5765,"impl-From%3C%26%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5766,"impl-From%3C%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5767,"impl-From%3C%26%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5768,"impl-From%3C%26%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5769,"impl-From%3C%26%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5770,"impl-From%3C%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5771,"impl-From%3C%26%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5772,"impl-From%3C%26%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5773,"impl-From%3C%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5774,"impl-From%3C%26%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5775,"impl-From%3C%26%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5776,"impl-From%3C%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5777,"impl-From%3C%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5778,"impl-From%3C%26%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5779,"impl-From%3C%26%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5780,"impl-From%3C%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5781,"impl-From%3C%26%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5782,"impl-From%3C%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5783,"impl-From%3C%26%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5784,"impl-From%3C%26%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5785,"impl-From%3C%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5786,"impl-From%3C%26%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5787,"impl-From%3C%26%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5788,"impl-From%3C%26%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5789,"impl-From%3C%26%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5790,"impl-From%3C%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5791,"impl-From%3C%26%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5792,"impl-From%3C%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5793,"impl-From%3C%26%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5794,"impl-From%3C%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5795,"impl-From%3C%26%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5796,"impl-From%3C%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5797,"impl-From%3C%26%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5798,"impl-From%3C%26%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5799,"impl-From%3C%26%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5800,"impl-From%3C%26%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5801,"impl-From%3C%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5802,"impl-From%3C%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5803,"impl-From%3C%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5804,"impl-From%3CWPubkeyHash%3E-for-PushBytesBuf"],[5805,"impl-From%3C%26%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5806,"impl-From%3C%26%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5807,"impl-From%3C%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5808,"impl-From%3C%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5809,"impl-From%3C%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5810,"impl-From%3C%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5811,"impl-From%3C%26%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5812,"impl-From%3C%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5813,"impl-From%3C%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5814,"impl-From%3C%26%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5815,"impl-From%3C%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5816,"impl-From%3C%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5817,"impl-From%3C%26%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5818,"impl-From%3C%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5819,"impl-From%3C%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5820,"impl-From%3C%26%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5821,"impl-From%3C%26%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5822,"impl-From%3C%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5823,"impl-From%3C%26%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5824,"impl-From%3C%26%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5825,"impl-From%3C%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5828,"impl-From%3CInfallible%3E-for-Error"],[5829,"impl-From%3CUintError%3E-for-Error"],[5832,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-PushBytes"],[5833,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-PushBytes"],[5834,"impl-Index%3CRange%3Cusize%3E%3E-for-PushBytes"],[5835,"impl-Index%3Cusize%3E-for-PushBytes"],[5836,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-PushBytes"],[5837,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-PushBytes"],[5838,"impl-Index%3CRangeFull%3E-for-PushBytes"],[5839,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-PushBytes"],[5918,"impl-TryFrom%3C%26%5Bu8%5D%3E-for-%26PushBytes"],[5919,"impl-TryFrom%3C%26mut+%5Bu8%5D%3E-for-%26mut+PushBytes"],[5966,"impl-Display-for-Error"],[5967,"impl-Debug-for-Error"],[6024,"impl-Display-for-FromStrError"],[6025,"impl-Debug-for-FromStrError"],[6026,"impl-Display-for-TryFromInstructionError"],[6027,"impl-Debug-for-TryFromInstructionError"],[6028,"impl-Display-for-TryFromError"],[6029,"impl-Debug-for-TryFromError"],[6030,"impl-From%3CInfallible%3E-for-FromStrError"],[6032,"impl-From%3CParseIntError%3E-for-FromStrError"],[6033,"impl-From%3CTryFromError%3E-for-FromStrError"],[6034,"impl-From%3CTryFromError%3E-for-TryFromInstructionError"],[6036,"impl-From%3CInfallible%3E-for-TryFromInstructionError"],[6131,"impl-Display-for-ParseOutPointError"],[6132,"impl-Debug-for-ParseOutPointError"],[6133,"impl-Debug-for-InputsIndexError"],[6134,"impl-Display-for-InputsIndexError"],[6135,"impl-Debug-for-OutputsIndexError"],[6136,"impl-Display-for-OutputsIndexError"],[6137,"impl-Debug-for-IndexOutOfBoundsError"],[6138,"impl-Display-for-IndexOutOfBoundsError"],[6139,"impl-Display-for-Version"],[6140,"impl-Debug-for-Version"],[6285,"impl-Debug-for-DecodeError%3CE%3E"],[6286,"impl-Display-for-DecodeError%3CE%3E"],[6287,"impl-From%3CNetwork%3E-for-%26Params"],[6288,"impl-From%3C%26Network%3E-for-%26Params"],[6289,"impl-From%3CNetwork%3E-for-Params"],[6290,"impl-From%3C%26Network%3E-for-Params"],[6378,"impl-Display-for-Error"],[6379,"impl-Debug-for-Error"],[6380,"impl-Display-for-FromHexError"],[6381,"impl-Debug-for-FromHexError"],[6383,"impl-From%3CInfallible%3E-for-Error"],[6385,"impl-From%3CError%3E-for-Error"],[6568,"impl-AsRef%3C%5Bu8%5D%3E-for-SerializedSignature"],[6569,"impl-AsRef%3CPushBytes%3E-for-SerializedSignature"],[6596,"impl-Display-for-Signature"],[6597,"impl-Debug-for-Signature"],[6598,"impl-UpperHex-for-SerializedSignature"],[6599,"impl-LowerHex-for-SerializedSignature"],[6600,"impl-Display-for-SerializedSignature"],[6601,"impl-Debug-for-SerializedSignature"],[6602,"impl-Debug-for-Error"],[6603,"impl-Display-for-Error"],[6606,"impl-From%3CInfallible%3E-for-Error"],[6607,"impl-From%3CNonStandardSighashTypeError%3E-for-Error"],[6608,"impl-From%3CError%3E-for-Error"],[6609,"impl-From%3CHexToBytesError%3E-for-Error"],[6620,"impl-Signature"],[6621,"impl-Serialize-for-Signature"],[6684,"impl-Debug-for-PrefixedHexError"],[6685,"impl-Display-for-PrefixedHexError"],[6686,"impl-Display-for-UnprefixedHexError"],[6687,"impl-Debug-for-UnprefixedHexError"],[6688,"impl-Debug-for-MissingPrefixError"],[6689,"impl-Display-for-MissingPrefixError"],[6690,"impl-Debug-for-ContainsPrefixError"],[6691,"impl-Display-for-ContainsPrefixError"],[6693,"impl-From%3CParseIntError%3E-for-PrefixedHexError"],[6694,"impl-From%3CMissingPrefixError%3E-for-PrefixedHexError"],[6696,"impl-From%3CContainsPrefixError%3E-for-UnprefixedHexError"],[6697,"impl-From%3CParseIntError%3E-for-UnprefixedHexError"],[6783,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::hash160::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[6784,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[6796,"impl-Debug-for-Hash"],[6797,"impl-UpperHex-for-Hash"],[6798,"impl-Display-for-Hash"],[6799,"impl-LowerHex-for-Hash"],[6801,"impl-From%3CWPubkeyHash%3E-for-Hash"],[6802,"impl-From%3CPubkeyHash%3E-for-Hash"],[6803,"impl-From%3CXKeyIdentifier%3E-for-Hash"],[6804,"impl-From%3CScriptHash%3E-for-Hash"],[6888,"impl-Display-for-HexToBytesError"],[6889,"impl-Debug-for-HexToBytesError"],[6890,"impl-Display-for-InvalidCharError"],[6891,"impl-Debug-for-InvalidCharError"],[6892,"impl-Debug-for-OddLengthStringError"],[6893,"impl-Display-for-OddLengthStringError"],[6894,"impl-Debug-for-HexToArrayError"],[6895,"impl-Display-for-HexToArrayError"],[6900,"impl-From%3COddLengthStringError%3E-for-HexToBytesError"],[6902,"impl-From%3CInvalidCharError%3E-for-HexToBytesError"],[6905,"impl-From%3CInvalidLengthError%3E-for-HexToArrayError"],[6907,"impl-From%3CInvalidCharError%3E-for-HexToArrayError"],[7017,"impl-Debug-for-DisplayByteSlice%3C\'a%3E"],[7018,"impl-Display-for-DisplayByteSlice%3C\'a%3E"],[7019,"impl-LowerHex-for-DisplayByteSlice%3C\'a%3E"],[7020,"impl-UpperHex-for-DisplayByteSlice%3C\'a%3E"],[7021,"impl-Display-for-DisplayArray%3C\'a,+LEN%3E"],[7022,"impl-Debug-for-DisplayArray%3C\'a,+LEN%3E"],[7023,"impl-LowerHex-for-DisplayArray%3C\'a,+LEN%3E"],[7024,"impl-UpperHex-for-DisplayArray%3C\'a,+LEN%3E"],[7062,"impl-Display-for-InvalidLengthError"],[7063,"impl-Debug-for-InvalidLengthError"],[7111,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::ripemd160::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[7112,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[7139,"impl-Write-for-HashEngine"],[7140,"impl-Write-for-HashEngine"],[7141,"impl-UpperHex-for-Hash"],[7142,"impl-Debug-for-Hash"],[7143,"impl-Display-for-Hash"],[7144,"impl-LowerHex-for-Hash"],[7176,"impl-Write-for-HashEngine"],[7177,"impl-Write-for-HashEngine"],[7362,"impl-Debug-for-Unexpected%3C\'a%3E"],[7363,"impl-Display-for-Unexpected%3C\'a%3E"],[7594,"impl-Error-for-Error"],[7595,"impl-Error-for-Error"],[8477,"impl-Display-for-Error"],[8478,"impl-Debug-for-Error"],[8617,"impl-MapAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8618,"impl-SeqAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8815,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8816,"impl-dyn+Error+%2B+Send"],[8817,"impl-dyn+Error"],[8818,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8819,"impl-dyn+Error+%2B+Send"],[8820,"impl-dyn+Error"],[8821,"impl-dyn+Error+%2B+Send"],[8822,"impl-dyn+Error"],[8823,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8831,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8832,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8833,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8834,"impl-SerializeMap-for-Impossible%3COk,+Error%3E"],[8835,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8836,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8837,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8840,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8841,"impl-dyn+Error"],[8842,"impl-dyn+Error+%2B+Send"],[8851,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8852,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8860,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8861,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8862,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8863,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8911,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[8912,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha1::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8939,"impl-Write-for-HashEngine"],[8940,"impl-Write-for-HashEngine"],[8941,"impl-UpperHex-for-Hash"],[8942,"impl-LowerHex-for-Hash"],[8943,"impl-Display-for-Hash"],[8944,"impl-Debug-for-Hash"],[8975,"impl-Write-for-HashEngine"],[8976,"impl-Write-for-HashEngine"],[8982,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256::%7Bimpl%2320%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8983,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9025,"impl-Write-for-HashEngine"],[9026,"impl-Write-for-HashEngine"],[9027,"impl-Display-for-Hash"],[9028,"impl-UpperHex-for-Hash"],[9029,"impl-LowerHex-for-Hash"],[9030,"impl-Debug-for-Hash"],[9031,"impl-LowerHex-for-Midstate"],[9032,"impl-Debug-for-Midstate"],[9033,"impl-UpperHex-for-Midstate"],[9034,"impl-Display-for-Midstate"],[9035,"impl-From%3CDescriptorId%3E-for-Hash"],[9037,"impl-From%3CWScriptHash%3E-for-Hash"],[9089,"impl-Write-for-HashEngine"],[9090,"impl-Write-for-HashEngine"],[9094,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9095,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256d::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9109,"impl-LowerHex-for-Hash"],[9110,"impl-Debug-for-Hash"],[9111,"impl-Display-for-Hash"],[9112,"impl-UpperHex-for-Hash"],[9113,"impl-From%3CFilterHash%3E-for-Hash"],[9114,"impl-From%3CLegacySighash%3E-for-Hash"],[9115,"impl-From%3CWitnessMerkleNode%3E-for-Hash"],[9116,"impl-From%3CWtxid%3E-for-Hash"],[9117,"impl-From%3CWitnessCommitment%3E-for-Hash"],[9119,"impl-From%3CTxMerkleNode%3E-for-Hash"],[9120,"impl-From%3CBlockHash%3E-for-Hash"],[9121,"impl-From%3CFilterHeader%3E-for-Hash"],[9122,"impl-From%3CTxid%3E-for-Hash"],[9123,"impl-From%3CSegwitV0Sighash%3E-for-Hash"],[9124,"impl-From%3CHash%3E-for-Hash"],[9148,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256t::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash%3CT%3E"],[9149,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash%3CT%3E"],[9163,"impl-Display-for-Hash%3CT%3E"],[9164,"impl-Debug-for-Hash%3CT%3E"],[9165,"impl-LowerHex-for-Hash%3CT%3E"],[9166,"impl-UpperHex-for-Hash%3CT%3E"],[9167,"impl-From%3CTapTweakHash%3E-for-Hash%3CTapTweakTag%3E"],[9169,"impl-From%3CTapLeafHash%3E-for-Hash%3CTapLeafTag%3E"],[9170,"impl-From%3CTapSighash%3E-for-Hash%3CTapSighashTag%3E"],[9171,"impl-From%3CTapNodeHash%3E-for-Hash%3CTapBranchTag%3E"],[9195,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha384::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9196,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9213,"impl-Debug-for-Hash"],[9214,"impl-Display-for-Hash"],[9215,"impl-LowerHex-for-Hash"],[9216,"impl-UpperHex-for-Hash"],[9251,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9252,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9279,"impl-Write-for-HashEngine"],[9280,"impl-Write-for-HashEngine"],[9281,"impl-UpperHex-for-Hash"],[9282,"impl-Display-for-Hash"],[9283,"impl-Debug-for-Hash"],[9284,"impl-LowerHex-for-Hash"],[9315,"impl-Write-for-HashEngine"],[9316,"impl-Write-for-HashEngine"],[9321,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9322,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512_256::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9339,"impl-Display-for-Hash"],[9340,"impl-Debug-for-Hash"],[9341,"impl-LowerHex-for-Hash"],[9342,"impl-UpperHex-for-Hash"],[9378,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::siphash24::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9379,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9411,"impl-Write-for-HashEngine"],[9412,"impl-Write-for-HashEngine"],[9413,"impl-Display-for-Hash"],[9414,"impl-Debug-for-Hash"],[9415,"impl-LowerHex-for-Hash"],[9416,"impl-UpperHex-for-Hash"],[9463,"impl-Write-for-HashEngine"],[9464,"impl-Write-for-HashEngine"],[9514,"impl-BufRead-for-FromStd%3CT%3E"],[9515,"impl-BufRead-for-FromStd%3CT%3E"],[9516,"impl-BufRead-for-ToStd%3CT%3E"],[9517,"impl-BufRead-for-ToStd%3CT%3E"],[9555,"impl-BufRead-for-FromStd%3CT%3E"],[9556,"impl-BufRead-for-FromStd%3CT%3E"],[9557,"impl-BufRead-for-ToStd%3CT%3E"],[9558,"impl-BufRead-for-ToStd%3CT%3E"],[9562,"impl-Write-for-FromStd%3CT%3E"],[9563,"impl-Write-for-FromStd%3CT%3E"],[9564,"impl-Write-for-ToStd%3CT%3E"],[9565,"impl-Write-for-ToStd%3CT%3E"],[9566,"impl-Write-for-Sink"],[9567,"impl-Write-for-Sink"],[9568,"impl-Display-for-Error"],[9569,"impl-Debug-for-Error"],[9576,"impl-From%3CError%3E-for-Error"],[9577,"impl-From%3CErrorKind%3E-for-Error"],[9612,"impl-Read-for-FromStd%3CT%3E"],[9613,"impl-Read-for-FromStd%3CT%3E"],[9614,"impl-Read-for-ToStd%3CT%3E"],[9615,"impl-Read-for-ToStd%3CT%3E"],[9622,"impl-Read-for-FromStd%3CT%3E"],[9623,"impl-Read-for-FromStd%3CT%3E"],[9624,"impl-Read-for-ToStd%3CT%3E"],[9625,"impl-Read-for-ToStd%3CT%3E"],[9700,"impl-Write-for-FromStd%3CT%3E"],[9701,"impl-Write-for-FromStd%3CT%3E"],[9702,"impl-Write-for-ToStd%3CT%3E"],[9703,"impl-Write-for-ToStd%3CT%3E"],[9704,"impl-Write-for-Sink"],[9705,"impl-Write-for-Sink"],[9706,"impl-Write-for-FromStd%3CT%3E"],[9707,"impl-Write-for-FromStd%3CT%3E"],[9708,"impl-Write-for-ToStd%3CT%3E"],[9709,"impl-Write-for-ToStd%3CT%3E"],[9711,"impl-Write-for-Sink"],[9712,"impl-Write-for-Sink"],[9874,"impl-LowerHex-for-TweakedPublicKey"],[9875,"impl-Debug-for-TweakedPublicKey"],[9876,"impl-Display-for-TweakedPublicKey"],[9878,"impl-Debug-for-FromSliceError"],[9879,"impl-Display-for-FromSliceError"],[9880,"impl-Debug-for-FromWifError"],[9881,"impl-Display-for-FromWifError"],[9882,"impl-Display-for-ParsePublicKeyError"],[9883,"impl-Debug-for-ParsePublicKeyError"],[9884,"impl-Debug-for-ParseCompressedPublicKeyError"],[9885,"impl-Display-for-ParseCompressedPublicKeyError"],[9886,"impl-Display-for-UncompressedPublicKeyError"],[9887,"impl-Debug-for-UncompressedPublicKeyError"],[9888,"impl-Debug-for-InvalidBase58PayloadLengthError"],[9889,"impl-Display-for-InvalidBase58PayloadLengthError"],[9890,"impl-Display-for-InvalidAddressVersionError"],[9891,"impl-Debug-for-InvalidAddressVersionError"],[9900,"impl-From%3CError%3E-for-FromSliceError"],[9901,"impl-From%3CInfallible%3E-for-FromSliceError"],[9903,"impl-From%3CInfallible%3E-for-FromWifError"],[9905,"impl-From%3CError%3E-for-FromWifError"],[9906,"impl-From%3CInvalidAddressVersionError%3E-for-FromWifError"],[9907,"impl-From%3CError%3E-for-FromWifError"],[9908,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-FromWifError"],[9909,"impl-From%3CFromSliceError%3E-for-ParsePublicKeyError"],[9911,"impl-From%3CInfallible%3E-for-ParsePublicKeyError"],[9912,"impl-From%3CError%3E-for-ParseCompressedPublicKeyError"],[9913,"impl-From%3CHexToArrayError%3E-for-ParseCompressedPublicKeyError"],[9915,"impl-From%3CInfallible%3E-for-ParseCompressedPublicKeyError"],[9979,"impl-TweakedPublicKey"],[9980,"impl-Serialize-for-TweakedPublicKey"],[10028,"impl-TryFrom%3Cu8%3E-for-Parity"],[10029,"impl-TryFrom%3Ci32%3E-for-Parity"],[10117,"impl-Debug-for-MerkleBlockError"],[10118,"impl-Display-for-MerkleBlockError"],[10167,"impl-Display-for-ParseNetworkError"],[10168,"impl-Debug-for-ParseNetworkError"],[10169,"impl-Display-for-UnknownChainHashError"],[10170,"impl-Debug-for-UnknownChainHashError"],[10214,"impl-AsMut%3C%5Bu8%5D%3E-for-Magic"],[10215,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10216,"impl-AsRef%3C%5Bu8%5D%3E-for-Magic"],[10217,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Magic"],[10225,"impl-Borrow%3C%5Bu8%5D%3E-for-Magic"],[10226,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Magic"],[10232,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10233,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Magic"],[10271,"impl-Display-for-ServiceFlags"],[10272,"impl-Debug-for-ServiceFlags"],[10273,"impl-UpperHex-for-ServiceFlags"],[10274,"impl-LowerHex-for-ServiceFlags"],[10275,"impl-Display-for-Magic"],[10276,"impl-UpperHex-for-Magic"],[10277,"impl-LowerHex-for-Magic"],[10278,"impl-Debug-for-Magic"],[10279,"impl-Display-for-ParseMagicError"],[10280,"impl-Debug-for-ParseMagicError"],[10281,"impl-Display-for-UnknownMagicError"],[10282,"impl-Debug-for-UnknownMagicError"],[10486,"impl-Display-for-CommandString"],[10487,"impl-Debug-for-CommandString"],[10488,"impl-Debug-for-CommandStringError"],[10489,"impl-Display-for-CommandStringError"],[10512,"impl-TryFrom%3CString%3E-for-CommandString"],[10513,"impl-TryFrom%3C%26str%3E-for-CommandString"],[10514,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-CommandString"],[10987,"impl-Debug-for-ParseIntError"],[10988,"impl-Display-for-ParseIntError"],[11197,"impl-Display-for-Error"],[11198,"impl-Debug-for-Error"],[11202,"impl-Debug-for-GetKeyError"],[11203,"impl-Display-for-GetKeyError"],[11206,"impl-Debug-for-SignError"],[11207,"impl-Display-for-SignError"],[11208,"impl-Debug-for-ExtractTxError"],[11209,"impl-Display-for-ExtractTxError"],[11210,"impl-Display-for-IndexOutOfBoundsError"],[11211,"impl-Debug-for-IndexOutOfBoundsError"],[11212,"impl-Display-for-PsbtParseError"],[11213,"impl-Debug-for-PsbtParseError"],[11214,"impl-Debug-for-PsbtSighashType"],[11215,"impl-Display-for-PsbtSighashType"],[11217,"impl-From%3CFromSliceError%3E-for-Error"],[11218,"impl-From%3CError%3E-for-Error"],[11219,"impl-From%3CError%3E-for-Error"],[11221,"impl-From%3CInfallible%3E-for-Error"],[11225,"impl-From%3CInfallible%3E-for-GetKeyError"],[11226,"impl-From%3CError%3E-for-GetKeyError"],[11230,"impl-From%3CIndexOutOfBoundsError%3E-for-SignError"],[11231,"impl-From%3CP2wpkhError%3E-for-SignError"],[11233,"impl-From%3CInfallible%3E-for-SignError"],[11234,"impl-From%3CTaprootError%3E-for-SignError"],[11241,"impl-From%3CTapSighashType%3E-for-PsbtSighashType"],[11242,"impl-From%3CEcdsaSighashType%3E-for-PsbtSighashType"],[11434,"impl-Display-for-Key"],[11435,"impl-Debug-for-Key"],[11645,"impl-Debug-for-PublicKey"],[11646,"impl-Display-for-PublicKey"],[11647,"impl-LowerHex-for-PublicKey"],[11648,"impl-Display-for-InvalidParityValue"],[11649,"impl-Debug-for-InvalidParityValue"],[11651,"impl-Debug-for-Message"],[11652,"impl-LowerHex-for-Message"],[11653,"impl-Display-for-Message"],[11654,"impl-Display-for-Error"],[11655,"impl-Debug-for-Error"],[11662,"impl-From%3CKeypair%3E-for-SecretKey"],[11663,"impl-From%3C%26Keypair%3E-for-SecretKey"],[11665,"impl-From%3CT%3E-for-SecretKey"],[11666,"impl-From%3CPublicKey%3E-for-PublicKey"],[11667,"impl-From%3C%26Keypair%3E-for-PublicKey"],[11668,"impl-From%3CKeypair%3E-for-PublicKey"],[11674,"impl-From%3CT%3E-for-Message"],[11675,"impl-From%3CTapSighash%3E-for-Message"],[11676,"impl-From%3CLegacySighash%3E-for-Message"],[11677,"impl-From%3CSegwitV0Sighash%3E-for-Message"],[11749,"impl-Serialize-for-PublicKey"],[11750,"impl-PublicKey"],[11914,"impl-PartialEq-for-SerializedSignature"],[11915,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[11928,"impl-Display-for-SerializedSignature"],[11929,"impl-Debug-for-SerializedSignature"],[11930,"impl-Display-for-Signature"],[11931,"impl-Debug-for-Signature"],[11935,"impl-From%3CSignature%3E-for-SerializedSignature"],[11936,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[11954,"impl-IntoIterator-for-SerializedSignature"],[11955,"impl-IntoIterator-for-%26SerializedSignature"],[11961,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[11962,"impl-PartialOrd-for-SerializedSignature"],[11981,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[11983,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[12050,"impl-LowerHex-for-ElligatorSwift"],[12051,"impl-Debug-for-ElligatorSwift"],[12052,"impl-Display-for-ElligatorSwift"],[12451,"impl-Write-for-HmacEngine%3CT%3E"],[12452,"impl-Write-for-HmacEngine%3CT%3E"],[12453,"impl-Display-for-FromSliceError"],[12454,"impl-Debug-for-FromSliceError"],[12455,"impl-Debug-for-Hmac%3CT%3E"],[12456,"impl-LowerHex-for-Hmac%3CT%3E"],[12457,"impl-Display-for-Hmac%3CT%3E"],[12474,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12475,"impl-Index%3CRangeFull%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%3Cusize%3E-for-Hmac%3CT%3E"],[12513,"impl-Write-for-HmacEngine%3CT%3E"],[12514,"impl-Write-for-HmacEngine%3CT%3E"],[12530,"impl-Display-for-Error"],[12531,"impl-Debug-for-Error"],[12533,"impl-From%3CNonZero%3Cu32%3E%3E-for-Error"],[12534,"impl-From%3CError%3E-for-Error"],[12645,"impl-Display-for-BernoulliError"],[12646,"impl-Debug-for-BernoulliError"],[12654,"impl-Display-for-WeightedError"],[12655,"impl-Debug-for-WeightedError"],[12669,"impl-From%3CRangeInclusive%3CX%3E%3E-for-Uniform%3CX%3E"],[12670,"impl-From%3CRange%3CX%3E%3E-for-Uniform%3CX%3E"],[12697,"impl-Distribution%3Cf32%3E-for-OpenClosed01"],[12698,"impl-Distribution%3Cf64%3E-for-OpenClosed01"],[12699,"impl-Distribution%3Cf64%3E-for-Open01"],[12700,"impl-Distribution%3Cf32%3E-for-Open01"],[12705,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2345%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12706,"impl-Distribution%3Cbool%3E-for-Standard"],[12707,"impl-Distribution%3Ci8%3E-for-Standard"],[12708,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G)%3E-for-Standard"],[12709,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2334%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12710,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2355%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12711,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2337%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12712,"impl-Distribution%3COption%3CT%3E%3E-for-Standard"],[12713,"impl-Distribution%3C%5BT;+32%5D%3E-for-Standard"],[12714,"impl-Distribution%3C(A,)%3E-for-Standard"],[12715,"impl-Distribution%3Cu64%3E-for-Standard"],[12716,"impl-Distribution%3CWrapping%3CT%3E%3E-for-Standard"],[12717,"impl-Distribution%3Cu32%3E-for-Standard"],[12718,"impl-Distribution%3Cu8%3E-for-Standard"],[12719,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2330%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12720,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2344%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12721,"impl-Distribution%3Cf32%3E-for-Standard"],[12722,"impl-Distribution%3C(A,+B,+C)%3E-for-Standard"],[12723,"impl-Distribution%3CNonZero%3Cu64%3E%3E-for-Standard"],[12724,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K,+L)%3E-for-Standard"],[12725,"impl-Distribution%3Cisize%3E-for-Standard"],[12726,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2326%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12727,"impl-Distribution%3C()%3E-for-Standard"],[12728,"impl-Distribution%3C(A,+B,+C,+D,+E,+F)%3E-for-Standard"],[12729,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12730,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12731,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K)%3E-for-Standard"],[12732,"impl-Distribution%3Cu16%3E-for-Standard"],[12733,"impl-Distribution%3C(A,+B,+C,+D,+E)%3E-for-Standard"],[12734,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2354%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12735,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2353%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12736,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2332%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12737,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2328%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12738,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H)%3E-for-Standard"],[12739,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2339%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12740,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2333%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12741,"impl-Distribution%3Ci16%3E-for-Standard"],[12742,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2325%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12743,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2348%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12744,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2352%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12745,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2347%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12746,"impl-Distribution%3C(A,+B)%3E-for-Standard"],[12747,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I)%3E-for-Standard"],[12748,"impl-Distribution%3CNonZero%3Cu128%3E%3E-for-Standard"],[12749,"impl-Distribution%3CNonZero%3Cu8%3E%3E-for-Standard"],[12750,"impl-Distribution%3CNonZero%3Cusize%3E%3E-for-Standard"],[12751,"impl-Distribution%3Ci128%3E-for-Standard"],[12752,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2346%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12753,"impl-Distribution%3Ci64%3E-for-Standard"],[12754,"impl-Distribution%3CNonZero%3Cu16%3E%3E-for-Standard"],[12755,"impl-Distribution%3Cchar%3E-for-Standard"],[12756,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2342%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12757,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2341%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12758,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12759,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2340%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12760,"impl-Distribution%3Cu128%3E-for-Standard"],[12761,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12762,"impl-Distribution%3Ci32%3E-for-Standard"],[12763,"impl-Distribution%3CNonZero%3Cu32%3E%3E-for-Standard"],[12764,"impl-Distribution%3Cusize%3E-for-Standard"],[12765,"impl-Distribution%3C(A,+B,+C,+D)%3E-for-Standard"],[12766,"impl-Distribution%3Cf64%3E-for-Standard"],[12767,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2335%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12768,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2350%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12769,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2351%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12770,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J)%3E-for-Standard"],[12771,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2331%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12772,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12773,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2338%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"],[12886,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12887,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12888,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12889,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12890,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12891,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12892,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12893,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12894,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12895,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12896,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12897,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12899,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12900,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12903,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12904,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12905,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12906,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12907,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12908,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12909,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12910,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12911,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12912,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12913,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12914,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12916,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12917,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12920,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12921,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12922,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12923,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12924,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12925,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12926,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12927,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12928,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12929,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12930,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12931,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12933,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12934,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12938,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12939,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12940,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12941,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12942,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12943,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12944,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12945,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12946,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12947,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12948,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12949,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12950,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12951,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12953,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12954,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12955,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12956,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12957,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12958,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12959,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12960,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12961,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12962,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12963,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12964,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[13126,"impl-Debug-for-ReadError"],[13127,"impl-Display-for-ReadError"],[13229,"impl-From%3CVec%3Cusize%3E%3E-for-IndexVec"],[13230,"impl-From%3CVec%3Cu32%3E%3E-for-IndexVec"],[13278,"impl-Display-for-OutOfRangeError"],[13279,"impl-Debug-for-OutOfRangeError"],[13302,"impl-Display-for-Signature"],[13303,"impl-Debug-for-Signature"],[13304,"impl-LowerHex-for-Signature"],[13312,"impl-Signature"],[13313,"impl-Serialize-for-Signature"],[13477,"impl-Debug-for-PrevoutsSizeError"],[13478,"impl-Display-for-PrevoutsSizeError"],[13479,"impl-Debug-for-PrevoutsKindError"],[13480,"impl-Display-for-PrevoutsKindError"],[13481,"impl-Debug-for-PrevoutsIndexError"],[13482,"impl-Display-for-PrevoutsIndexError"],[13483,"impl-Debug-for-InvalidSighashTypeError"],[13484,"impl-Display-for-InvalidSighashTypeError"],[13485,"impl-Display-for-NonStandardSighashTypeError"],[13486,"impl-Debug-for-NonStandardSighashTypeError"],[13487,"impl-Debug-for-SighashTypeParseError"],[13488,"impl-Display-for-SighashTypeParseError"],[13490,"impl-Debug-for-TaprootError"],[13491,"impl-Display-for-TaprootError"],[13492,"impl-Display-for-P2wpkhError"],[13493,"impl-Debug-for-P2wpkhError"],[13494,"impl-Debug-for-SingleMissingOutputError"],[13495,"impl-Display-for-SingleMissingOutputError"],[13496,"impl-Display-for-AnnexError"],[13497,"impl-Debug-for-AnnexError"],[13498,"impl-Display-for-SigningDataError%3CE%3E"],[13499,"impl-Debug-for-SigningDataError%3CE%3E"],[13512,"impl-From%3CInfallible%3E-for-TaprootError"],[13513,"impl-From%3CInputsIndexError%3E-for-TaprootError"],[13514,"impl-From%3CPrevoutsKindError%3E-for-TaprootError"],[13515,"impl-From%3CPrevoutsSizeError%3E-for-TaprootError"],[13516,"impl-From%3CPrevoutsIndexError%3E-for-TaprootError"],[13518,"impl-From%3CInputsIndexError%3E-for-P2wpkhError"],[13520,"impl-From%3CInfallible%3E-for-P2wpkhError"],[13525,"impl-From%3CError%3E-for-SigningDataError%3CE%3E"],[13526,"impl-From%3CInfallible%3E-for-SigningDataError%3CE%3E"],[13691,"impl-Display-for-MessageSignatureError"],[13692,"impl-Debug-for-MessageSignatureError"],[13693,"impl-Debug-for-MessageSignature"],[13694,"impl-Display-for-MessageSignature"],[13695,"impl-From%3CError%3E-for-MessageSignatureError"],[13696,"impl-From%3CInfallible%3E-for-MessageSignatureError"],[13942,"impl-Debug-for-SigFromSliceError"],[13943,"impl-Display-for-SigFromSliceError"],[13947,"impl-Debug-for-IncompleteBuilderError"],[13948,"impl-Display-for-IncompleteBuilderError"],[13949,"impl-Display-for-HiddenNodesError"],[13950,"impl-Debug-for-HiddenNodesError"],[13957,"impl-Display-for-FutureLeafVersion"],[13958,"impl-Debug-for-FutureLeafVersion"],[13959,"impl-UpperHex-for-FutureLeafVersion"],[13960,"impl-LowerHex-for-FutureLeafVersion"],[13961,"impl-Debug-for-LeafVersion"],[13962,"impl-Display-for-LeafVersion"],[13963,"impl-LowerHex-for-LeafVersion"],[13964,"impl-UpperHex-for-LeafVersion"],[13965,"impl-Display-for-TaprootBuilderError"],[13966,"impl-Debug-for-TaprootBuilderError"],[13967,"impl-Display-for-TaprootError"],[13968,"impl-Debug-for-TaprootError"],[13973,"impl-From%3CError%3E-for-SigFromSliceError"],[13974,"impl-From%3CInfallible%3E-for-SigFromSliceError"],[13975,"impl-From%3CInvalidSighashTypeError%3E-for-SigFromSliceError"],[13976,"impl-From%3C%5BTapNodeHash;+124%5D%3E-for-TaprootMerkleBranch"],[13977,"impl-From%3C%5BTapNodeHash;+11%5D%3E-for-TaprootMerkleBranch"],[13978,"impl-From%3C%5BTapNodeHash;+31%5D%3E-for-TaprootMerkleBranch"],[13979,"impl-From%3C%5BTapNodeHash;+72%5D%3E-for-TaprootMerkleBranch"],[13980,"impl-From%3C%5BTapNodeHash;+44%5D%3E-for-TaprootMerkleBranch"],[13981,"impl-From%3C%5BTapNodeHash;+1%5D%3E-for-TaprootMerkleBranch"],[13982,"impl-From%3C%5BTapNodeHash;+102%5D%3E-for-TaprootMerkleBranch"],[13983,"impl-From%3C%5BTapNodeHash;+112%5D%3E-for-TaprootMerkleBranch"],[13984,"impl-From%3C%5BTapNodeHash;+121%5D%3E-for-TaprootMerkleBranch"],[13985,"impl-From%3C%5BTapNodeHash;+4%5D%3E-for-TaprootMerkleBranch"],[13986,"impl-From%3C%5BTapNodeHash;+91%5D%3E-for-TaprootMerkleBranch"],[13987,"impl-From%3C%5BTapNodeHash;+51%5D%3E-for-TaprootMerkleBranch"],[13988,"impl-From%3C%5BTapNodeHash;+48%5D%3E-for-TaprootMerkleBranch"],[13989,"impl-From%3C%5BTapNodeHash;+79%5D%3E-for-TaprootMerkleBranch"],[13990,"impl-From%3C%5BTapNodeHash;+66%5D%3E-for-TaprootMerkleBranch"],[13991,"impl-From%3C%5BTapNodeHash;+41%5D%3E-for-TaprootMerkleBranch"],[13992,"impl-From%3C%5BTapNodeHash;+18%5D%3E-for-TaprootMerkleBranch"],[13993,"impl-From%3C%5BTapNodeHash;+29%5D%3E-for-TaprootMerkleBranch"],[13994,"impl-From%3C%5BTapNodeHash;+128%5D%3E-for-TaprootMerkleBranch"],[13995,"impl-From%3C%5BTapNodeHash;+88%5D%3E-for-TaprootMerkleBranch"],[13996,"impl-From%3C%5BTapNodeHash;+84%5D%3E-for-TaprootMerkleBranch"],[13997,"impl-From%3C%5BTapNodeHash;+125%5D%3E-for-TaprootMerkleBranch"],[13998,"impl-From%3C%5BTapNodeHash;+97%5D%3E-for-TaprootMerkleBranch"],[13999,"impl-From%3C%5BTapNodeHash;+126%5D%3E-for-TaprootMerkleBranch"],[14000,"impl-From%3C%5BTapNodeHash;+19%5D%3E-for-TaprootMerkleBranch"],[14001,"impl-From%3C%5BTapNodeHash;+2%5D%3E-for-TaprootMerkleBranch"],[14002,"impl-From%3C%5BTapNodeHash;+42%5D%3E-for-TaprootMerkleBranch"],[14003,"impl-From%3C%5BTapNodeHash;+3%5D%3E-for-TaprootMerkleBranch"],[14004,"impl-From%3C%5BTapNodeHash;+98%5D%3E-for-TaprootMerkleBranch"],[14005,"impl-From%3C%5BTapNodeHash;+83%5D%3E-for-TaprootMerkleBranch"],[14006,"impl-From%3C%5BTapNodeHash;+68%5D%3E-for-TaprootMerkleBranch"],[14007,"impl-From%3C%5BTapNodeHash;+117%5D%3E-for-TaprootMerkleBranch"],[14008,"impl-From%3C%5BTapNodeHash;+107%5D%3E-for-TaprootMerkleBranch"],[14009,"impl-From%3C%5BTapNodeHash;+74%5D%3E-for-TaprootMerkleBranch"],[14010,"impl-From%3C%5BTapNodeHash;+21%5D%3E-for-TaprootMerkleBranch"],[14011,"impl-From%3C%5BTapNodeHash;+63%5D%3E-for-TaprootMerkleBranch"],[14012,"impl-From%3C%5BTapNodeHash;+10%5D%3E-for-TaprootMerkleBranch"],[14013,"impl-From%3C%5BTapNodeHash;+108%5D%3E-for-TaprootMerkleBranch"],[14014,"impl-From%3C%5BTapNodeHash;+43%5D%3E-for-TaprootMerkleBranch"],[14015,"impl-From%3C%5BTapNodeHash;+77%5D%3E-for-TaprootMerkleBranch"],[14016,"impl-From%3C%5BTapNodeHash;+101%5D%3E-for-TaprootMerkleBranch"],[14017,"impl-From%3C%5BTapNodeHash;+71%5D%3E-for-TaprootMerkleBranch"],[14018,"impl-From%3C%5BTapNodeHash;+30%5D%3E-for-TaprootMerkleBranch"],[14019,"impl-From%3C%5BTapNodeHash;+23%5D%3E-for-TaprootMerkleBranch"],[14020,"impl-From%3C%5BTapNodeHash;+9%5D%3E-for-TaprootMerkleBranch"],[14021,"impl-From%3C%5BTapNodeHash;+85%5D%3E-for-TaprootMerkleBranch"],[14022,"impl-From%3C%5BTapNodeHash;+46%5D%3E-for-TaprootMerkleBranch"],[14023,"impl-From%3C%5BTapNodeHash;+34%5D%3E-for-TaprootMerkleBranch"],[14024,"impl-From%3C%5BTapNodeHash;+35%5D%3E-for-TaprootMerkleBranch"],[14025,"impl-From%3C%5BTapNodeHash;+103%5D%3E-for-TaprootMerkleBranch"],[14026,"impl-From%3C%5BTapNodeHash;+122%5D%3E-for-TaprootMerkleBranch"],[14027,"impl-From%3C%5BTapNodeHash;+17%5D%3E-for-TaprootMerkleBranch"],[14028,"impl-From%3C%5BTapNodeHash;+75%5D%3E-for-TaprootMerkleBranch"],[14029,"impl-From%3C%5BTapNodeHash;+38%5D%3E-for-TaprootMerkleBranch"],[14030,"impl-From%3C%5BTapNodeHash;+104%5D%3E-for-TaprootMerkleBranch"],[14031,"impl-From%3C%5BTapNodeHash;+109%5D%3E-for-TaprootMerkleBranch"],[14032,"impl-From%3C%5BTapNodeHash;+120%5D%3E-for-TaprootMerkleBranch"],[14033,"impl-From%3C%5BTapNodeHash;+76%5D%3E-for-TaprootMerkleBranch"],[14034,"impl-From%3C%5BTapNodeHash;+6%5D%3E-for-TaprootMerkleBranch"],[14035,"impl-From%3C%5BTapNodeHash;+61%5D%3E-for-TaprootMerkleBranch"],[14036,"impl-From%3C%5BTapNodeHash;+20%5D%3E-for-TaprootMerkleBranch"],[14037,"impl-From%3C%5BTapNodeHash;+127%5D%3E-for-TaprootMerkleBranch"],[14038,"impl-From%3C%5BTapNodeHash;+54%5D%3E-for-TaprootMerkleBranch"],[14039,"impl-From%3C%5BTapNodeHash;+73%5D%3E-for-TaprootMerkleBranch"],[14040,"impl-From%3C%5BTapNodeHash;+100%5D%3E-for-TaprootMerkleBranch"],[14042,"impl-From%3C%5BTapNodeHash;+14%5D%3E-for-TaprootMerkleBranch"],[14043,"impl-From%3C%5BTapNodeHash;+82%5D%3E-for-TaprootMerkleBranch"],[14044,"impl-From%3C%5BTapNodeHash;+16%5D%3E-for-TaprootMerkleBranch"],[14045,"impl-From%3C%5BTapNodeHash;+86%5D%3E-for-TaprootMerkleBranch"],[14046,"impl-From%3C%5BTapNodeHash;+87%5D%3E-for-TaprootMerkleBranch"],[14047,"impl-From%3C%5BTapNodeHash;+115%5D%3E-for-TaprootMerkleBranch"],[14048,"impl-From%3C%5BTapNodeHash;+50%5D%3E-for-TaprootMerkleBranch"],[14049,"impl-From%3C%5BTapNodeHash;+111%5D%3E-for-TaprootMerkleBranch"],[14050,"impl-From%3C%5BTapNodeHash;+64%5D%3E-for-TaprootMerkleBranch"],[14051,"impl-From%3C%5BTapNodeHash;+32%5D%3E-for-TaprootMerkleBranch"],[14052,"impl-From%3C%5BTapNodeHash;+25%5D%3E-for-TaprootMerkleBranch"],[14053,"impl-From%3C%5BTapNodeHash;+119%5D%3E-for-TaprootMerkleBranch"],[14054,"impl-From%3C%5BTapNodeHash;+36%5D%3E-for-TaprootMerkleBranch"],[14055,"impl-From%3C%5BTapNodeHash;+90%5D%3E-for-TaprootMerkleBranch"],[14056,"impl-From%3C%5BTapNodeHash;+33%5D%3E-for-TaprootMerkleBranch"],[14057,"impl-From%3C%5BTapNodeHash;+7%5D%3E-for-TaprootMerkleBranch"],[14058,"impl-From%3C%5BTapNodeHash;+55%5D%3E-for-TaprootMerkleBranch"],[14059,"impl-From%3C%5BTapNodeHash;+8%5D%3E-for-TaprootMerkleBranch"],[14060,"impl-From%3C%5BTapNodeHash;+106%5D%3E-for-TaprootMerkleBranch"],[14061,"impl-From%3C%5BTapNodeHash;+69%5D%3E-for-TaprootMerkleBranch"],[14062,"impl-From%3C%5BTapNodeHash;+116%5D%3E-for-TaprootMerkleBranch"],[14063,"impl-From%3C%5BTapNodeHash;+15%5D%3E-for-TaprootMerkleBranch"],[14064,"impl-From%3C%5BTapNodeHash;+78%5D%3E-for-TaprootMerkleBranch"],[14065,"impl-From%3C%5BTapNodeHash;+58%5D%3E-for-TaprootMerkleBranch"],[14066,"impl-From%3C%5BTapNodeHash;+12%5D%3E-for-TaprootMerkleBranch"],[14067,"impl-From%3C%5BTapNodeHash;+49%5D%3E-for-TaprootMerkleBranch"],[14068,"impl-From%3C%5BTapNodeHash;+113%5D%3E-for-TaprootMerkleBranch"],[14069,"impl-From%3C%5BTapNodeHash;+60%5D%3E-for-TaprootMerkleBranch"],[14070,"impl-From%3C%5BTapNodeHash;+0%5D%3E-for-TaprootMerkleBranch"],[14071,"impl-From%3C%5BTapNodeHash;+70%5D%3E-for-TaprootMerkleBranch"],[14072,"impl-From%3C%5BTapNodeHash;+81%5D%3E-for-TaprootMerkleBranch"],[14073,"impl-From%3C%5BTapNodeHash;+5%5D%3E-for-TaprootMerkleBranch"],[14074,"impl-From%3C%5BTapNodeHash;+57%5D%3E-for-TaprootMerkleBranch"],[14075,"impl-From%3C%5BTapNodeHash;+95%5D%3E-for-TaprootMerkleBranch"],[14076,"impl-From%3C%5BTapNodeHash;+13%5D%3E-for-TaprootMerkleBranch"],[14077,"impl-From%3C%5BTapNodeHash;+59%5D%3E-for-TaprootMerkleBranch"],[14078,"impl-From%3C%5BTapNodeHash;+89%5D%3E-for-TaprootMerkleBranch"],[14079,"impl-From%3C%5BTapNodeHash;+93%5D%3E-for-TaprootMerkleBranch"],[14080,"impl-From%3C%5BTapNodeHash;+105%5D%3E-for-TaprootMerkleBranch"],[14081,"impl-From%3C%5BTapNodeHash;+114%5D%3E-for-TaprootMerkleBranch"],[14082,"impl-From%3C%5BTapNodeHash;+53%5D%3E-for-TaprootMerkleBranch"],[14083,"impl-From%3C%5BTapNodeHash;+65%5D%3E-for-TaprootMerkleBranch"],[14084,"impl-From%3C%5BTapNodeHash;+94%5D%3E-for-TaprootMerkleBranch"],[14085,"impl-From%3C%5BTapNodeHash;+99%5D%3E-for-TaprootMerkleBranch"],[14086,"impl-From%3C%5BTapNodeHash;+28%5D%3E-for-TaprootMerkleBranch"],[14087,"impl-From%3C%5BTapNodeHash;+47%5D%3E-for-TaprootMerkleBranch"],[14088,"impl-From%3C%5BTapNodeHash;+80%5D%3E-for-TaprootMerkleBranch"],[14089,"impl-From%3C%5BTapNodeHash;+123%5D%3E-for-TaprootMerkleBranch"],[14090,"impl-From%3C%5BTapNodeHash;+39%5D%3E-for-TaprootMerkleBranch"],[14091,"impl-From%3C%5BTapNodeHash;+26%5D%3E-for-TaprootMerkleBranch"],[14092,"impl-From%3C%5BTapNodeHash;+52%5D%3E-for-TaprootMerkleBranch"],[14093,"impl-From%3C%5BTapNodeHash;+37%5D%3E-for-TaprootMerkleBranch"],[14094,"impl-From%3C%5BTapNodeHash;+22%5D%3E-for-TaprootMerkleBranch"],[14095,"impl-From%3C%5BTapNodeHash;+118%5D%3E-for-TaprootMerkleBranch"],[14096,"impl-From%3C%5BTapNodeHash;+110%5D%3E-for-TaprootMerkleBranch"],[14097,"impl-From%3C%5BTapNodeHash;+92%5D%3E-for-TaprootMerkleBranch"],[14098,"impl-From%3C%5BTapNodeHash;+56%5D%3E-for-TaprootMerkleBranch"],[14099,"impl-From%3C%5BTapNodeHash;+24%5D%3E-for-TaprootMerkleBranch"],[14100,"impl-From%3C%5BTapNodeHash;+96%5D%3E-for-TaprootMerkleBranch"],[14101,"impl-From%3C%5BTapNodeHash;+27%5D%3E-for-TaprootMerkleBranch"],[14102,"impl-From%3C%5BTapNodeHash;+62%5D%3E-for-TaprootMerkleBranch"],[14103,"impl-From%3C%5BTapNodeHash;+45%5D%3E-for-TaprootMerkleBranch"],[14104,"impl-From%3C%5BTapNodeHash;+67%5D%3E-for-TaprootMerkleBranch"],[14105,"impl-From%3C%5BTapNodeHash;+40%5D%3E-for-TaprootMerkleBranch"],[14169,"impl-IntoIterator-for-%26mut+TaprootMerkleBranch"],[14170,"impl-IntoIterator-for-%26TaprootMerkleBranch"],[14171,"impl-IntoIterator-for-TaprootMerkleBranch"],[14220,"impl-Signature"],[14221,"impl-Serialize-for-Signature"],[14222,"impl-Serialize-for-TaprootMerkleBranch"],[14223,"impl-TaprootMerkleBranch"],[14227,"impl-Serialize-for-ControlBlock"],[14228,"impl-ControlBlock"],[14274,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[14276,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[14279,"impl-TryFrom%3CBox%3C%5BTapNodeHash%5D%3E%3E-for-TaprootMerkleBranch"],[14280,"impl-TryFrom%3CVec%3CTapNodeHash%3E%3E-for-TaprootMerkleBranch"],[14281,"impl-TryFrom%3C%26%5BTapNodeHash%5D%3E-for-TaprootMerkleBranch"],[14286,"impl-TryFrom%3CTaprootBuilder%3E-for-TapTree"],[14288,"impl-TryFrom%3CNodeInfo%3E-for-TapTree"],[14404,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[14405,"impl-PartialEq-for-SerializedSignature"],[14408,"impl-Display-for-SerializedSignature"],[14409,"impl-Debug-for-SerializedSignature"],[14411,"impl-From%3CSignature%3E-for-SerializedSignature"],[14412,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[14420,"impl-IntoIterator-for-SerializedSignature"],[14421,"impl-IntoIterator-for-%26SerializedSignature"],[14427,"impl-PartialOrd-for-SerializedSignature"],[14428,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[14469,"impl-From%3CChangeSet%3E-for-ChangeSet%3CA,+ChangeSet%3E"],[14470,"impl-From%3CChangeSet%3CA%3E%3E-for-ChangeSet%3CA,+IA%3E"],[14515,"impl-Indexer-for-KeychainTxOutIndex%3CK%3E"],[14516,"impl-KeychainTxOutIndex%3CK%3E"],[14535,"impl-Debug-for-InsertDescriptorError%3CK%3E"],[14536,"impl-Display-for-InsertDescriptorError%3CK%3E"],[14700,"impl-Debug-for-MissingGenesisError"],[14701,"impl-Display-for-MissingGenesisError"],[14702,"impl-Display-for-AlterCheckPointError"],[14703,"impl-Debug-for-AlterCheckPointError"],[14704,"impl-Display-for-CannotConnectError"],[14705,"impl-Debug-for-CannotConnectError"],[14706,"impl-Debug-for-ApplyHeaderError"],[14707,"impl-Display-for-ApplyHeaderError"],[14718,"impl-FromIterator%3C(u32,+Option%3CBlockHash%3E)%3E-for-ChangeSet"],[14719,"impl-FromIterator%3C(u32,+BlockHash)%3E-for-ChangeSet"],[14834,"impl-Display-for-SyncItem%3C\'i,+I%3E"],[14835,"impl-Debug-for-SyncItem%3C\'i,+I%3E"],[15006,"impl-Display-for-CalculateFeeError"],[15007,"impl-Debug-for-CalculateFeeError"]],"c":"OjAAAAEAAAAAADYAEAAAADUCNwJTBMoH4QflBwkILQrDCvYN+A35DfoNAA4CDgMOBA46EDsQPBA9ECISaxigGCAZLBmQHJccaiJvIhwmHSbfJ/QsAi0DLastui3LLWsubC5tLm4ueS61LioywDLBMsIyxTLIMjgzOTPWNVc3","e":"OjAAAAEAAAAAABYnEAAAAAAAjNh6+P//v///9/8HP99//z//36YVYs6GAABwQMR95Kf/+z/4//8f/H//HwAAAAAAAAAAAAAAAAAAAAAAAPDH///9/98XAAD4//////8DgP////////////////////8/NAAA+P////////////////////////8fAP//////5/f//////38P+If//////////////f////////////////9vAP/+//////////////////////8H2FHdbmud7tcpe9/rlCLCbAv8/x+A//8DIAAAAABA/9f8///n/////wEA+P//////f/z//z8AAAAAAAAAAAEAAAAgAAD4DwAAAAAA8P///////8D/AwAeAPjf//P//98h4P8A8P9/ADz4////////jwEAwMD8/////w8AhP////////////////////8B/////////wcM4P///////x8AAAAAAADA/////////////9////f0H+AAgP///////////w8AAAAAAN7/++D/w793wHjw8//w/P//////AT//x///94//+/84EAD8I4A/IN5QHf7HAAAwCPY//4B//ID//4H/BwD+HwAA/v8I/v8PAPz/wf8dHwD+fwHyPwD+/w8AAICDx8sA/gVgzv///v//v//////PAD8B8LX//f/9/wAA/v93OFAAAID/////AwAAADz8////DwDw//8Z4Of//x///6/GXcjfxwHQAAAEfOAP//zj/////x8AAACA////+f8fM8Ae/7/nAQCA+f+/aewnAAD+/////////ykOOAfA///H//////8HAPD/////+////38cAPgAAPz/D/7+////zx8AgP//5P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOP4/3/+/9////5P/P/////////////////////////////////f////////////////5/8FgAP4GwDA/z/8////PwD/9QcAAPD///8u+P9/AAAA////7////xQIAAT+///fjx8Y9wAAwg8A4C8CAAD/BwDwmwIA/w0AgP//AAAAAHwg+Af8//+PAPb+//8B/////5/nSPj7fwD+////3wb+//8HAAAAAADA//99fv8DAMD/7//+//6jFAGw+PnjP/7//x8L8MD/A9g/gL/xBwAADM//////kz///xcEAAAAAAAAAAAAAAAAAADw3wQAAABYHwAAwN+AkBSpKpEDAACA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8////wcAAAAAAADg////b/z/4f////////////////////////8fAAAAAIcAAH8AMOCBAAAgPMD/////kz///+P//+////9fYv0c//7/7///f39+//l//z2///z//5M////8////P/nz/z/////kz/8/3v////+PdBn2/38DAAAA/v/7//////f7DxYCAADg//f///z/0////+9/AwAAAADM/////////yDf/+///////59kfRcA8QEAwAcAbAB88P///f/////H/wcAPP/vAv49APz/D///AACA//////////8voQPAsP/9/z8A/P8/A/wfAAAAAAD//+H//x8C/n//DwD+////I0D+nwP8/7//HPDfD///7////+HhvX/vAf////////8P4AcAgP///x8Av////wEA/D/3P/4AAAAAAAAAAAAAAADA////////8/n////P//9fjF1OPgAAD+D4AfD/v/////8/7P8DAID///8fAzv3nwMAAAAA0ML/////////wT/8vv//////gTnxALD/cwAA8H9g2v///////9//AwDg32PUh4f//b+//18TeBg/eP7/Hx+/B/v///+Ah+P+PwgAwP8P/v///+AH//+A8P0AwCf8/7//+///////4W/fbv7Pu4f/A0D//v/v94ey+IIq//8PYNgAgCDxAADw//////////8HwACAQP/////////////8f//////P/wOA//8fgP9////+//n//f///wM/HwAAAAAA4P//fwz////4/wO8///+4x8GIJwe//8ADPP8P//12/9z/QEAAAAAAID///////////////////8fEL7KBwAAAPs//P//+///////9/8P4N//Q4D+HwAAAAAAAID5/////////////7D//P//////3////8P///////////v/////////xwgk+H8AAAAfAAB44P/AXvDH//8//nj9//9//v/P//8BP/49/f8/4v71DxD/zwDs9wAA0P//BxYEAAAg/+PgwJ8jgCMBAPz//+//n4AhAIv+//2/HwD8/wPw/f8UBAAAJHL4/wf//wEAAPn/+f/f//ETAAAAC9r84M8fAP5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","a":{"is_coin_base":[1970],"ntxid":[978],"read_to_end":[9648],"txid":[979],"wtxid":[981]}}],\ +["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","FullScanResponse","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResponse","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{{d{Bf}}{d{Bh}}}}}f}{{{Bj{BfBh}}}f}2222{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`}}}BbBd}{{{d{{Dj{c}}}}{d{hB`}}}Bb{BdEf}}{{{d{Dl}}{d{hB`}}}Bb}{{{d{{E`{c}}}}{d{hB`}}}BbBd}{{{d{{Eb{ce}}}}{d{hB`}}}BbBdBd}{cc{}}{{{Db{c}}}{{Dd{c}}}{}}11{{{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,"SyncResponse",116],[5,"FullScanResponse",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(%26u32,+%26BlockHash)%3E-for-BlockId"],[50,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[166,"impl-Debug-for-SyncItem%3C\'i,+I%3E"],[167,"impl-Display-for-SyncItem%3C\'i,+I%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIwAFQAKAAAADQATACIABwAtAAMAMgABADsAAQBHAAEATgACAFUAAgBbAA0AawAJAIAADwCaAAQAoAALAK0AAACwAAAAtgAAAM4AAADWAAIA3QAPAPIADwA="}],\ ["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,"FullScanResponse",26],[10,"Ord",27],[10,"Clone",28],[5,"FullScanRequest",26],[10,"Into",29],[1,"unit"],[17,"Item"],[10,"IntoIterator",30],[5,"SyncResponse",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,"FullScanResponse",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,"SyncResponse",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{}}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-Display-for-IterError"],[25,"impl-Debug-for-IterError"],[27,"impl-Display-for-AggregateChangesetsError%3CC%3E"],[28,"impl-Debug-for-AggregateChangesetsError%3CC%3E"],[29,"impl-Debug-for-FileError"],[30,"impl-Display-for-FileError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAC8ABwAMAAkAGAAHACIAAAAmAAAALAAAAC8AAQAzABgA"}],\ ["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":"GGFGKFPPPFGFGPPPPPRRPGPPEPPPPKGPGGFGPFPPPPPPPPPFPFFGPPPFGTTFKIFPNNONOONNNNNNNNONDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDOOOONNNNNNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNONCNOQNNNNNNNNNNNNNNNNNNNNNNNNNNNCCNDNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONMMNNNNNNNNNNNNNNNNNNNMNNOOONNNCONNNNNNNNNNNNONNNNDNNONNNNNNONNMMNNNNCNNNECONNNDDNNNNNNNOCENNNNNNOENNNNNNNNNNNNNNNNNNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNOOONONNNNNNNNNNNNNNNNNNNNOOHNNNNNNNNNNNNNNNNNNHOOOOOOOOOOOOOOOOFPKFIGFFPFFONNNNNNNNNNNNNNNNNNNNNNNNMNNNNHNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOPPPIGEGIKTIKRGFPPPPEKGPPPPTIPPPPPPPPPPNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNMNNMNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNONNNNNNNNNMNNNNCNNNNNNNNNNNMNNNCNNNNNNNNNNNNNNNNNNNONNNNNNNNNNHPPGPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNPPPGPFIPPIPPPPPPPPPPPGFGPPPPPGGPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNONNONNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFKIFFFFNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGPPGPPPPPPPGPPPPPPPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFIOONNNNNNNNNNNOONNNNNNPKGGGRRKGPKKFKPPPRGIPPPPPRPFPKGPPPFFGFPIPPPHMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNOONHNMNNHNMNNOONNNNNNMNNNNNMNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKMMMSHPPPPPPPKPPPPPPPPPPPPPPPPFKGGGFFFPGKPNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNMNNNMNONONNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOGGPPGPPPPPPFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","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_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","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"],[470,"bdk_wallet::AddForeignUtxoError"],[472,"bdk_wallet::ApplyBlockError"],[474,"bdk_wallet::LoadMismatch"],[481,"bdk_wallet::TxOrdering"],[483,"bdk_wallet::Utxo"],[486,"bdk_wallet::coin_selection"],[598,"bdk_wallet::coin_selection::Excess"],[603,"bdk_wallet::descriptor"],[863,"bdk_wallet::descriptor::checksum"],[864,"bdk_wallet::descriptor::error"],[897,"bdk_wallet::descriptor::policy"],[1056,"bdk_wallet::descriptor::policy::BuildSatisfaction"],[1059,"bdk_wallet::descriptor::policy::Satisfaction"],[1070,"bdk_wallet::descriptor::policy::SatisfiableItem"],[1080,"bdk_wallet::descriptor::template"],[1264,"bdk_wallet::error"],[1334,"bdk_wallet::error::CreateTxError"],[1340,"bdk_wallet::export"],[1363,"bdk_wallet::keys"],[1679,"bdk_wallet::psbt"],[1683,"bdk_wallet::rusqlite_impl"],[1685,"bdk_wallet::signer"],[1871,"bdk_wallet::signer::SignerContext"],[1872,"bdk_wallet::tx_builder"],[1986,"bdk_wallet::tx_builder::AddForeignUtxoError"],[1988,"bdk_wallet::tx_builder::TxOrdering"],[1990,"bdk_chain::balance"],[1991,"bdk_wallet::wallet"],[1992,"bdk_wallet::types"],[1993,"bdk_wallet::wallet::signer"],[1994,"alloc::sync"],[1995,"bitcoin::blockdata::script::owned"],[1996,"bdk_core"],[1997,"core::iter::traits::iterator"],[1998,"core::clone"],[1999,"alloc::collections::btree::map"],[2000,"bitcoin::blockdata::block"],[2001,"bdk_chain::local_chain"],[2002,"core::result"],[2003,"bdk_core::block_id"],[2004,"bitcoin::blockdata::transaction"],[2005,"core::convert"],[2006,"core::iter::traits::collect"],[2007,"bdk_chain::tx_graph"],[2008,"bdk_wallet::wallet::coin_selection"],[2009,"bdk_wallet::wallet::tx_builder"],[2010,"bdk_wallet::wallet::error"],[2011,"bitcoin_units::amount"],[2012,"bitcoin_units::fee_rate"],[2013,"bdk_wallet::wallet::params"],[2014,"bitcoin::network"],[2015,"bdk_core::checkpoint"],[2016,"bdk_wallet::wallet::changeset"],[2017,"core::cmp"],[2018,"bdk_wallet::wallet::persisted"],[2019,"core::marker"],[2020,"core::option"],[2021,"alloc::string"],[2022,"serde::de"],[2023,"bitcoin::psbt"],[2024,"core::fmt"],[2025,"bdk_chain::indexer::keychain_txout"],[2026,"bdk_chain::indexed_tx_graph"],[2027,"bdk_core::spk_client"],[2028,"rusqlite::transaction"],[2029,"rusqlite"],[2030,"bitcoin::psbt::map::input"],[2031,"core::hash"],[2032,"core::future::future"],[2033,"alloc::boxed"],[2034,"core::pin"],[2035,"bdk_wallet::wallet::utils"],[2036,"bitcoin::blockdata::script::borrowed"],[2037,"miniscript::descriptor"],[2038,"core::iter::traits::double_ended"],[2039,"secp256k1::context::alloc_only"],[2040,"secp256k1"],[2041,"serde::ser"],[2042,"alloc::vec"],[2043,"core::ops::function"],[2044,"core::any"],[2045,"rand_core"],[2046,"core::default"],[2047,"bitcoin::address"],[2048,"miniscript"],[2049,"miniscript::miniscript::private"],[2050,"miniscript::miniscript::decode"],[2051,"miniscript::miniscript::context"],[2052,"miniscript::iter::tree"],[2053,"miniscript::descriptor::key"],[2054,"miniscript::miniscript::satisfy"],[2055,"miniscript::plan"],[2056,"bitcoin_hashes::sha256"],[2057,"miniscript::miniscript::hash256"],[2058,"bitcoin_hashes::ripemd160"],[2059,"bitcoin_hashes::hash160"],[2060,"bitcoin::crypto::key"],[2061,"secp256k1::context"],[2062,"bdk_chain::descriptor_ext"],[2063,"miniscript::blanket_traits"],[2064,"miniscript::miniscript::analyzable"],[2065,"core::ops::range"],[2066,"miniscript::descriptor::bare"],[2067,"miniscript::descriptor::sh"],[2068,"miniscript::descriptor::tr"],[2069,"miniscript::descriptor::segwitv0"],[2070,"miniscript::miniscript::types"],[2071,"miniscript::miniscript::types::extra_props"],[2072,"miniscript::expression"],[2073,"miniscript::miniscript::iter"],[2074,"miniscript::policy::semantic"],[2075,"miniscript::policy"],[2076,"bitcoin_units::weight"],[2077,"base58ck::error"],[2078,"bitcoin::bip32"],[2079,"hex_conservative::error"],[2080,"bitcoin::psbt::error"],[2081,"bdk_wallet::wallet::export"],[2082,"miniscript::descriptor::sortedmulti"],[2083,"core::str::traits"],[2084,"rusqlite::error"],[2085,"bitcoin::blockdata::script::push_bytes::primitive"],[2086,"bitcoin::blockdata::locktime::absolute"],[2087,"bdk_chain"],[2088,"bdk_chain::rusqlite_impl"]],"i":[0,0,0,0,0,0,74,261,261,0,0,0,0,262,51,51,63,64,52,55,5,0,45,64,0,5,61,259,259,0,0,72,0,0,0,0,45,0,63,63,63,63,259,64,261,61,51,0,262,0,0,0,74,260,262,0,0,46,46,0,0,0,0,72,1,3,47,3,66,66,3,3,3,3,3,5,5,3,66,3,0,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,3,3,3,3,3,0,27,87,43,46,39,39,3,1,5,43,44,45,46,27,47,1,5,43,44,45,46,27,47,5,0,1,50,3,50,3,49,49,49,3,1,39,46,27,50,47,50,3,43,3,0,39,46,0,3,1,5,43,46,1,5,43,44,45,46,61,47,63,64,1,1,5,5,43,43,44,44,45,45,47,47,0,0,39,0,3,1,1,5,43,44,45,46,50,72,72,61,61,51,51,3,27,47,47,63,63,64,74,74,0,1,49,39,5,43,44,45,46,46,46,46,46,50,72,61,61,51,3,27,27,27,47,63,63,64,74,46,49,3,3,3,3,5,43,1,47,46,46,52,55,3,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,95,46,3,43,43,47,3,49,39,0,27,3,3,3,3,50,3,50,39,39,39,3,3,46,49,39,3,46,0,49,3,46,49,39,49,3,3,45,43,5,3,52,55,50,50,46,3,0,3,3,3,0,0,44,3,3,45,0,0,1,5,43,46,3,3,3,66,0,0,3,3,3,3,3,3,66,0,1,5,43,44,45,46,27,47,1,72,61,51,47,63,74,1,3,3,66,1,1,66,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,0,3,46,87,27,45,43,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,3,3,1,44,0,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,0,265,265,266,266,267,268,269,269,267,268,269,270,270,271,271,271,0,123,0,0,0,0,0,0,123,0,0,115,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,116,117,118,119,115,116,117,118,119,120,116,117,118,119,0,116,117,118,119,115,115,115,121,121,115,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,123,121,116,117,118,119,121,115,118,121,121,115,116,117,118,119,115,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,123,121,116,117,118,119,272,273,273,272,273,97,274,125,0,0,0,0,0,0,131,0,0,133,0,0,135,97,274,125,0,0,0,97,274,125,135,131,0,97,274,125,97,274,125,97,274,125,135,125,152,153,131,131,125,125,152,153,131,125,152,153,131,131,131,131,0,133,152,153,133,153,133,133,152,153,133,152,153,133,133,152,153,133,152,153,133,152,153,0,125,152,153,131,125,152,153,131,125,152,153,131,131,125,125,125,125,125,125,131,125,131,125,152,153,131,125,125,152,152,153,153,131,131,0,125,131,131,162,125,131,125,125,125,152,153,131,131,125,131,125,125,125,125,125,125,125,152,153,131,131,131,125,131,131,131,125,131,131,131,125,125,131,131,125,125,152,153,131,125,152,153,131,131,125,53,97,125,125,131,131,131,125,131,131,133,152,153,131,125,131,125,133,152,153,125,125,125,125,125,125,125,125,125,125,125,125,125,125,131,133,131,125,131,131,125,152,153,131,133,152,153,125,125,0,131,125,131,125,131,131,125,125,131,125,131,133,152,153,131,0,125,152,153,131,125,131,125,133,133,125,131,125,152,153,131,125,152,153,131,131,125,152,153,131,125,125,152,153,131,131,0,56,56,0,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,199,192,192,0,200,0,0,199,198,0,199,199,192,192,192,199,200,163,192,200,200,0,0,0,163,163,198,199,199,0,0,199,199,199,198,198,199,200,102,201,192,163,198,199,200,102,201,192,163,198,199,200,102,201,163,198,199,200,102,201,163,102,201,201,198,199,200,102,201,192,198,198,199,199,200,200,102,102,201,201,192,192,198,199,200,102,201,192,192,163,198,199,200,200,102,102,201,192,163,102,198,201,199,102,198,199,200,102,201,192,163,199,200,201,102,201,102,102,198,199,200,102,201,201,198,199,200,102,201,163,192,198,199,200,102,201,192,163,198,199,200,102,201,192,163,198,199,200,102,201,192,163,198,199,200,102,201,192,163,275,275,275,276,277,278,277,278,277,278,277,278,277,278,279,280,281,282,283,284,284,283,285,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,202,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,203,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,0,85,219,0,85,85,35,85,35,85,85,0,85,85,85,85,85,219,85,85,85,85,35,35,85,35,219,85,85,219,85,35,219,85,35,219,219,219,219,85,85,35,35,219,85,85,85,85,85,85,35,219,85,35,219,219,85,35,219,85,35,219,85,35,219,85,35,219,85,35,287,288,288,289,290,287,0,0,291,221,221,221,221,221,221,221,221,221,221,221,221,291,221,221,221,221,221,221,221,196,0,0,0,0,237,237,0,0,228,0,0,0,0,196,196,196,133,0,0,130,196,196,184,135,237,231,0,231,0,0,130,135,184,0,0,0,0,130,0,228,184,135,0,292,135,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,223,133,133,133,133,133,133,133,133,133,224,130,225,223,135,184,226,227,228,224,130,225,223,135,184,226,227,228,223,135,226,228,225,225,224,135,135,223,130,196,223,135,184,226,227,228,130,130,223,223,135,135,184,184,226,226,227,227,228,228,229,130,225,196,196,223,223,135,135,184,184,226,227,228,223,231,231,231,224,229,130,225,196,196,196,223,135,135,184,226,227,228,229,229,135,184,223,135,135,237,239,239,237,237,239,231,135,223,135,226,228,231,224,229,130,225,196,223,135,184,226,227,228,135,205,211,224,224,229,135,184,211,231,224,224,135,184,231,231,135,292,130,135,184,292,130,292,130,135,135,223,226,227,223,0,135,133,223,223,0,223,133,223,135,226,227,133,229,223,135,226,228,133,223,223,223,223,135,133,223,0,224,130,225,223,135,184,226,227,228,184,196,223,135,184,133,133,223,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,0,245,245,245,0,0,251,247,251,67,247,251,67,0,67,67,67,248,67,67,67,67,67,67,67,251,247,67,248,67,0,0,0,0,0,0,0,0,248,0,0,67,86,66,66,86,66,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,86,247,248,249,6,86,66,251,247,248,249,6,86,66,251,247,6,6,86,66,251,249,252,252,249,249,249,247,248,6,251,247,247,248,248,6,6,251,251,86,247,67,67,248,249,6,86,66,251,247,247,247,67,248,249,6,86,66,251,247,252,249,249,249,86,247,67,248,249,6,86,66,251,249,86,247,6,86,256,249,249,249,7,249,66,86,66,247,248,249,6,86,66,251,67,66,66,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,293,0,0,261,261,0,262,259,259,259,261,262,0,0,260,262,34,34,34,34,34,34,34,34,34,34,260,259,262,261,34,260,259,262,261,34,34,262,261,34,262,261,261,34,34,262,261,34,34,34,261,261,261,34,34,34,34,34,260,260,259,259,262,261,34,260,259,262,261,261,34,34,260,259,262,261,34,34,34,34,34,261,34,34,34,34,262,262,34,262,261,260,259,34,260,259,262,261,34,260,259,262,261,34,260,259,262,261,34,34,34,260,259,262,261,265,265,270,270],"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}}cC`}{{Bf{AbBd}}}{{Bn{Cf}}}}{{{h{j}}}Ch}{{{h{j}}}{{h{{Cj{Ch}}}}}}{{{h{f}}}{{h{{Cn{Cl}}}}}}`{{{h{f}}}b}`{{{h{c}}}{{h{e}}}{}{}}00000000000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000000000{{{h{df}}D`}{{Bf{{Dd{Db}}Df}}}}{{{h{df}}}{{Dd{Db}}}}{{{h{f}}{h{Bl}}}{{Bf{DhDj}}}}{{{h{f}}{h{Bl}}}{{Bf{DlDj}}}}{{{h{df}}{h{Bl}}}Ab}`````{{DnE`}Dn}{{DnEb}Dn}{{{h{f}}}Ed}{{{h{b}}}b}{{{h{j}}}j}{{{h{Ef}}}Ef}{{{h{Eh}}}Eh}{{{h{Ej}}}Ej}{{{h{El}}}El}{{{h{Cf}}}Cf}{{{h{En}}}En}{{{h{c}}{h{de}}}Ab{}{}}0000000{{{h{j}}{h{j}}}F`}``{{{h{dc}}Fb}{{Bf{{Fd{c}}Ff}}}Fh}{{cc}Fb{FjFlAl}}{{{h{dc}}Fb}{{Bf{{Fd{c}}Ff}}}Fn}{cFb{FjFlAl}}{{Fb{h{dc}}}{{Bf{{Fd{c}}Ff}}}Fh}{{Fb{h{dc}}}{{Bf{{Fd{c}}Ff}}}Fn}{Fb{{Bf{fG`}}}}0{{}b}{{}Dn}{{}El}{{}Cf}{{{h{{Fd{c}}}}}{{h{e}}}{}{}}{{{h{En}}}{{h{c}}}{}}{{{h{d{Fd{c}}}}}{{h{de}}}{}{}}{{{h{f}}j}{{Gb{Bb}}}}`{{{h{f}}Af}{{Gb{{Cb{jBb}}}}}}`{{Dnj{Gb{c}}}Dn{FjFl}}``{{{h{f}}j}Gd}{c{{Bf{b}}}Gf}{c{{Bf{j}}}Gf}{c{{Bf{Ef}}}Gf}{c{{Bf{El}}}Gf}{{{h{b}}{h{b}}}Gh}{{{h{j}}{h{j}}}Gh}{{{h{Ef}}{h{Ef}}}Gh}{{{h{Eh}}{h{Eh}}}Gh}{{{h{Ej}}{h{Ej}}}Gh}{{{h{El}}{h{El}}}Gh}{{{h{{Gj{c}}}}{h{{Gj{c}}}}}GhGl}{{{h{En}}{h{En}}}Gh}{{{h{Gn}}{h{Gn}}}Gh}{{{h{H`}}{h{H`}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000``{DnDn}`{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}{{{h{b}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{j}}{h{dHh}}}Hl}{{{h{Ef}}{h{dHh}}}Hl}{{{h{Eh}}{h{dHh}}}Hl}{{{h{Ej}}{h{dHh}}}Hl}{{{h{El}}{h{dHh}}}Hl}{{{h{{Fd{c}}}}{h{dHh}}}HlHn}{{{h{I`}}{h{dHh}}}Hl}0{{{h{{Gj{c}}}}{h{dHh}}}HlHn}{{{h{{Gj{c}}}}{h{dHh}}}HlIb}{{{h{{Ff{c}}}}{h{dHh}}}HlIb}{{{h{{Ff{c}}}}{h{dHh}}}HlHn}{{{h{f}}{h{dHh}}}Hl}{{{h{Cf}}{h{dHh}}}Hl}{{{h{En}}{h{dHh}}}Hl}0{{{h{Gn}}{h{dHh}}}Hl}0{{{h{H`}}{h{dHh}}}Hl}{{{h{Id}}{h{dHh}}}Hl}0`{cc{}}000000{IfEl}{{{Ih{Cl}}}El}2{IjEl}{{{Il{ClIf}}}El}44{H`{{Gj{c}}}{}}555{InCf}{{{J`{j}}}Cf}777{H`Gn}88{{{h{Jb}}}{{Jd{El}}}}{{FbE`}Fb}{{{h{f}}Ef{Gb{Jf}}Gh}{{Bf{JhJj}}}}{{{h{f}}j}{{A`{Jl}}}}{{{h{f}}D`}{{Gb{Jn}}}}{{{h{f}}K`}{{Gb{Ef}}}}{{{h{j}}{h{dc}}}AbKb}{{{h{Ef}}{h{dc}}}AbKb}```{{{h{Jb}}}{{Jd{Ab}}}}{{{h{d{Fh{}{{Kd{c}}}}}}}{{Bf{Elc}}}{}}{{{h{d{Fn{}{{Kd{c}}}}}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{df}}K`Kl}Ab}{ce{}{}}00000000000000000{{{h{Kn}}{h{L`}}}Gh}{{{h{El}}}Gh}{{{h{f}}Af}Gh}```{{{h{f}}}{{`{{Aj{}{{Ad{{Cb{j{h{Lb}}}}}}}}}}}}{{FbjLd}Fb}{{DnjLd}Dn}``{{{h{f}}}Lf}{{{h{f}}}{{`{{Aj{}{{Ad{Ef}}}}}}}}0{{{h{f}}j}{{`{{Lh{}{{Ad{En}}}}}}}}{{{h{dc}}Dn}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fh}{{}Dn}{{{h{dc}}Dn}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fn}{{Dn{h{dc}}}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fh}{{Dn{h{dc}}}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fn}{{DnEl}{{Bf{{Gb{f}}Gn}}}}{{ElDn}{{Bf{{Gb{f}}Gn}}}}{{{h{f}}}{{h{Lj}}}}`{{FbBb}Fb}{{DnBb}Dn}{{{h{df}}jBb}Gh}{{{h{dEl}}El}Ab}`{{FbEb}Fb}{{{h{f}}}Eb}`{{cc}Fb{FjFl}}={cFb{FjFl}}{{{h{f}}j}Bb}{{{h{df}}j}En}{{{h{Ej}}}K`}`{{{h{j}}{h{j}}}{{Gb{F`}}}}{{{h{f}}jBb}En}{{{h{d{Fh{}{{Kd{c}}}}}}{h{El}}}{{Bf{Abc}}}{}}{{{h{d{Fn{}{{Kd{c}}}}}}{h{El}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{d{Fd{c}}}}{h{dc}}}{{Bf{Gh}}}Fh}{{{h{d{Fd{c}}}}{h{dc}}}{{Bf{Gh}}}Fn}{{{h{El}}{h{Jb}}}{{Jd{Ab}}}}{{{h{f}}j}{{Bf{{Gb{Ll}}G`}}}}`{{{h{f}}j}{{h{Lb}}}}{{{h{df}}jBb}{{`{{Aj{}{{Ad{En}}}}}}}};```{{{h{f}}}{{h{{M`{Ln}}}}}}{{{h{f}}{h{Bl}}}{{Cb{DhDh}}}}{{{h{Ej}}}{{Gb{Mb}}}}``{{{h{b}}c}BfMd}{{{h{j}}c}BfMd}{{{h{Ef}}c}BfMd}{{{h{El}}c}BfMd}{{{h{df}}jLd}Ab}{{{h{df}}c}Ab{{Cd{}{{Ad{{Cb{jLd}}}}}}}}{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}```{{{h{f}}}{{h{{Mf{j}}}}}}{{{h{f}}}{{Gb{{h{El}}}}}}{{{h{df}}}{{Gb{{h{dEl}}}}}}{{{h{f}}}{{Mh{j}}}}{{{h{f}}}{{Mj{{Cb{jBb}}}}}}{{{h{df}}}{{Gb{El}}}}``{{{h{c}}}e{}{}}0000000{{{h{c}}}Gd{}}000000{{{h{b}}}Dh}{{{h{f}}}{{`{{Aj{}{{Ad{Jn}}}}}}}}{{{h{f}}c}{{Ml{Jn}}}{{N`{{h{Jn}}{h{Jn}}}{{Mn{F`}}}}}}``2`{c{{Bf{e}}}{}{}}00000000000000000000000000000000000`{{{h{f}}}{{h{{Cn{Cl}}}}}}```{{{h{Ej}}}{{h{Kl}}}}`{{{h{c}}}Nb{}}00000000000000000{{{h{f}}j}{{`{{Aj{}{{Ad{{Ah{Af}}}}}}Al}}}}{{{h{df}}jBb}Gh}``{{}{{h{Nd}}}}{ce{}{}}00000000000000000{{c{Gb{c}}Eb{h{{M`{Ln}}}}}{{Bf{GdG`}}}Fj}````````````````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{dc}}}{{h{de}}}{}{}}000000{{{h{Nf}}}Nf}{{{h{Nh}}}Nh}{{{h{Nj}}}Nj}{{{h{{Nl{c}}}}}{{Nl{c}}}Al}{{{h{Nn}}}Nn}{{{h{c}}{h{de}}}Ab{}{}}0000{{{h{O`}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{{h{Nh}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{{h{Nj}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{{h{{Nl{c}}}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{de}}}{{Bf{ObNf}}}O`Od}{{{h{Nn}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{C`Dl{h{L`}}}Of}{{}Nh}{{}Nj}{{}{{Nl{c}}}Oh}{{}Nn}{{{h{Nf}}{h{Nf}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0``{{{h{Nf}}{h{dHh}}}Hl}0{{{h{Of}}{h{dHh}}}Hl}{{{h{Ob}}{h{dHh}}}Hl}{{{h{Nh}}{h{dHh}}}Hl}{{{h{Nj}}{h{dHh}}}Hl}{{{h{{Nl{c}}}}{h{dHh}}}HlHn}{{{h{Nn}}{h{dHh}}}Hl}{cc{}}000000{ce{}{}}000000{{{h{Ob}}}C`}`{{C`c}{{Nl{c}}}{}}`1{{{h{c}}}e{}{}}0000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nb{}}0000006666666```````````````````````````````````````````{{{h{{Oj{c}}}}Eb}{{Bf{OlOn}}}{A@`A@b}}{{}A@d}0{{{h{{A@f{ce}}}}}{{h{{A@h{ce}}}}}A@`A@j}{{{h{{h{{A@f{ce}}}}}}}{{A@l{{h{{A@f{ce}}}}}}}A@`A@j}{{{h{{Oj{A@n}}}}Bb}{{Bf{{Oj{AA`}}AAb}}}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{dc}}}{{h{de}}}{}{}}000{{{h{{A@f{ce}}}}}{{Ml{{h{{A@f{ce}}}}}}}A@`A@j}{{{h{{A@f{ce}}}}{h{g}}}{{AAf{{AAd{c}}}}}{A@bA@`}A@j{{AAh{c}}}}0`{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{A@f{cAC`}}}}}{{Bf{AbAAl}}}A@`}{{{h{{A@f{cACb}}}}}{{Bf{AbAAl}}}A@`}2022102102{{{h{c}}}{{Bf{AbAAl}}}A@`}00{{{h{{A@h{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{A@h{cAC`}}}}}{{Bf{AbAAl}}}A@`}{{{h{{A@h{cACb}}}}}{{Bf{AbAAl}}}A@`}{{{h{{Cj{{Ml{Ch}}}}}}}{{Bf{AbAAl}}}}00`{{{h{{Oj{c}}}}}{{Oj{c}}}{AlA@`}}{{{h{AC`}}}AC`}{{{h{ACb}}}ACb}{{{h{{A@f{ce}}}}}{{A@f{ce}}}{AlA@`}{AlA@j}}{{{h{c}}{h{de}}}Ab{}{}}000{{{h{{Oj{c}}}}{h{{Oj{c}}}}}F`{ACdA@`}}{{{h{AC`}}{h{AC`}}}F`}{{{h{ACb}}{h{ACb}}}F`}{{{h{{A@f{ce}}}}{h{{A@f{ce}}}}}F`A@`A@j}{{{h{{A@f{ce}}}}}GhA@`A@j}{{{h{{Oj{A@n}}}}Bb}{{Bf{{Oj{AA`}}AAb}}}}{{{h{{Oj{A@n}}}}{h{{M`{c}}}}Bb}{{Bf{{Oj{ACf}}AAb}}}ACh}{{{h{{Oj{AA`}}}}{h{{M`{c}}}}}{{Bf{{Oj{ACf}}AAb}}}ACh}{{{h{{Oj{c}}}}}ACjA@`}{{{h{{Oj{A@n}}}}}ACl}{c{{Bf{{Oj{e}}}}}GfACn}{c{{Bf{{A@f{eg}}}}}GfACnA@j}{{{h{{Oj{A@n}}}}}C`}{{{h{{A@f{ce}}}}}Af{A@bA@`}A@j}{{{h{{Oj{c}}}}{h{{Oj{c}}}}}Gh{GlA@`}}{{{h{AC`}}{h{AC`}}}Gh}{{{h{ACb}}{h{ACb}}}Gh}{{{h{{A@f{ce}}}}{h{{A@f{ce}}}}}GhA@`A@j}{{{h{c}}{h{e}}}Gh{}{}}0000000`{{{h{{Oj{c}}}}}{{Bf{AfOn}}}{A@`A@b}}`{{{h{{A@f{ce}}}}{h{AD`}}}{{Bf{AbADb}}}A@`A@j}{{{h{ADd}}{h{Jl}}ADf{h{{M`{Ln}}}}}{{Bf{{Gb{Ll}}G`}}}}{{{h{{Oj{A@n}}}}{h{Jl}}ADf{h{{M`{Ln}}}}}{{Bf{{Gb{Ll}}G`}}}}{{{h{{A@f{A@nc}}}}{h{Jl}}ADf{h{{M`{Ln}}}}}{{Bf{{Gb{Ll}}G`}}}A@j}{{{h{{Oj{A@n}}}}{h{{M`{c}}}}{h{L`}}{ADh{Bb}}}{{Bf{{Gb{{Cb{Bb{Oj{ACf}}}}}}AAb}}}ACh}{{{h{{Oj{c}}}}{h{dHh}}}{{Bf{AbHj}}}A@`}0{{{h{AC`}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ACb}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{A@f{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@`A@j}0{{{h{{Oj{c}}}}e}GhA@`{{N`{{h{c}}}{{Mn{Gh}}}}}}{{{h{{A@f{ce}}}}g}GhA@`A@j{{N`{{h{c}}}{{Mn{Gh}}}}}}{{{ADj{c}}}{{Oj{c}}}A@`}{{{ADl{c}}}{{Oj{c}}}A@`}{{{ADn{c}}}{{Oj{c}}}A@`}{{{AE`{c}}}{{Oj{c}}}A@`}{{{AEb{c}}}{{Oj{c}}}A@`}{{{AEd{c}}}{{Oj{c}}}A@`}{cc{}}000{{{A@h{ce}}}{{Bf{{A@f{ce}}On}}}A@`A@j}{{{A@h{ce}}AEfAEh}{{A@f{ce}}}A@`A@j}{{{h{Nd}}}{{Bf{{Oj{c}}On}}}ACn}{{{h{Nd}}}{{Bf{{A@f{ce}}On}}}ACnA@j}{{{h{Nd}}{h{AD`}}}{{Bf{{A@f{ce}}On}}}ACnA@j}1{{{h{AEj}}}{{Bf{{Oj{c}}On}}}ACn}{{{h{AEj}}}{{Bf{{A@f{ce}}On}}}ACnA@j}{{{h{{A@f{ce}}}}AEl}{{Gb{{h{{A@f{ce}}}}}}}A@`A@j}{{{h{{A@f{ce}}}}AEl}{{Gb{c}}}A@`A@j}{{{h{{Oj{c}}}}e}{{Bf{{Cb{{Ml{{Ml{Ch}}}}Af}}On}}}{A@`A@b}{{AEn{c}}}}0{{{h{{A@f{ce}}}}}GhA@`A@j}0{{{h{{Oj{A@n}}}}}Gh}{{{h{{Oj{c}}}}{h{de}}}Ab{AF`A@`}Kb}{{{h{AC`}}{h{dc}}}AbKb}{{{h{ACb}}{h{dc}}}AbKb}{{{h{{A@f{ce}}}}{h{dg}}}AbA@`A@jKb}{ce{}{}}000{{{A@f{ce}}}{{A@h{ce}}}A@`A@j}{{{Oj{A@n}}}{{Bf{{Ml{{Oj{A@n}}}}On}}}}{{Fj{h{{M`{Ln}}}}Eb}{{Bf{{Cb{LbLd}}G`}}}}{{Lb{h{{M`{Ln}}}}Eb}{{Bf{{Cb{LbLd}}G`}}}}99:{{{h{{A@f{ce}}}}}{{AFb{ce}}}A@`A@j}{{{h{{A@f{ce}}}}}{{AFd{ce}}}A@`A@j}{{{h{{Oj{c}}}}}{{Bf{{AFf{c}}On}}}A@`}{{{h{{A@f{ce}}}}}{{Bf{{AFf{c}}On}}}A@`A@j}{{{h{{A@f{ce}}}}}{{Bf{AbAFh}}}A@`A@j}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Gb{AEl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{A@f{cAC`}}}}}{{Gb{AEl}}}A@`}{{{h{{A@f{cACb}}}}}{{Gb{AEl}}}A@`}{{{h{{A@f{ce}}}}}{{Bf{AElOn}}}A@`A@j}{{{h{{Oj{c}}}}}{{Bf{AElOn}}}A@`}1{{{h{{Oj{c}}}}}{{Bf{AFjOn}}}A@`}{{}{{h{Nd}}}}00{{{A@f{cAFl}}}{{Bf{{Oj{c}}On}}}A@`}{c{{Oj{c}}}A@`}{c{{Bf{{Oj{c}}On}}}A@`}{{{A@f{cAC`}}}{{Bf{{Oj{c}}On}}}A@`}{{AEl{Ml{c}}}{{Bf{{Oj{c}}On}}}A@`}{{{AEb{c}}}{{Oj{c}}}A@`}{{{AEd{c}}}{{Oj{c}}}A@`}4{{{A@f{cACb}}}{{Bf{{Oj{c}}On}}}A@`}3{{c{Gb{{AFn{c}}}}}{{Bf{{Oj{c}}On}}}A@`}614`{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{L`}}}{{Bf{{A@f{c}}On}}}A@j}{{{h{{M`{c}}}}{h{Nd}}}{{Bf{{Cb{{Oj{A@n}}{An{A@nAG`}}}}On}}}AGb}1{{{h{L`}}{h{AD`}}}{{Bf{{A@f{c}}On}}}A@j}{{{h{{Oj{c}}}}{h{{Oj{c}}}}}{{Gb{F`}}}{AGdA@`}}{{{h{AC`}}{h{AC`}}}{{Gb{F`}}}}{{{h{ACb}}{h{ACb}}}{{Gb{F`}}}}{{{h{{A@f{ce}}}}{h{{A@f{ce}}}}}{{Gb{F`}}}A@`A@j}{{{h{c}}}AElA@`}00{{{Oj{AA`}}{h{c}}}{{Bf{AGf{Oj{AA`}}}}}{{AAh{AA`}}}}0`{{{h{{A@f{ce}}}}}GhA@`A@j}{{{h{{Oj{c}}}}}{{Bf{AbOn}}}A@`}{{{h{{A@f{ce}}}}}{{Bf{AbADb}}}A@`A@j}{{{h{{Oj{c}}}}{h{dAGh}}e}{{Bf{AbOn}}}{A@`A@b}{{AEn{c}}}}{{{h{{A@f{ce}}}}g}{{Bf{{Ml{{Ml{Ch}}}}On}}}{A@bA@`}A@j{{AEn{c}}}}0{{{h{{Oj{c}}}}}{{Bf{AfOn}}}{A@`A@b}}{{{h{{Oj{c}}}}}Af{A@`A@b}}{{{h{{A@f{ce}}}}}AElA@`A@j}{{{h{{Oj{c}}}}e}BfA@`Md}{{{h{{A@f{ce}}}}g}BfA@`A@jMd}{{}AGj}00{{{h{{A@f{ce}}}}{h{{An{ABlc}}}}}{{A@f{ce}}}A@`A@j}`{{{h{c}}}e{}{}}000{{{h{c}}}Gd{}}0{{{h{{Oj{A@n}}}}{h{{An{A@nAG`}}}}}Gd}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}0{{{h{{Oj{c}}}}{h{di}}}{{Bf{{AGl{g}}}}}A@`A@`{}{{AGn{ceg}}}}{{{h{{A@f{ce}}}}{h{dk}}}{{Bf{{AGl{i}}}}}A@`A@jA@`{}{{AGn{cgi}}}}{c{{Bf{e}}}{}{}}0000000`{{{h{c}}}Nb{}}000={ce{}{}}000{{{h{{A@f{ce}}}}}GhA@`A@j}{{{h{Nd}}}{{Bf{GdG`}}}}``````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{G`}}{h{G`}}}Gh}{{{h{G`}}{h{dHh}}}Hl}0{OnG`}{AH`G`}{AHbG`}{AHdG`}{AHfG`}{cc{}}{AHhG`}{AHjG`}>{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0{{{h{c}}}Nb{}}{ce{}{}}```````````````````````````````````???????>>>>>>>{{{h{AHl}}}AHl}{{{h{AHn}}}AHn}{{{h{AI`}}}AI`}{{{h{Ll}}}Ll}{{{h{AIb}}}AIb}{{{h{ADf}}}ADf}{{{h{c}}{h{de}}}Ab{}{}}00000``{{}AIb}{{{h{AHl}}{h{AHl}}}Gh}{{{h{AHn}}{h{AHn}}}Gh}{{{h{AI`}}{h{AI`}}}Gh}{{{h{Ll}}{h{Ll}}}Gh}{{{h{AIb}}{h{AIb}}}Gh}{{{h{AH`}}{h{AH`}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000{{{h{AHl}}{h{dHh}}}Hl}{{{h{AHn}}{h{dHh}}}Hl}{{{h{AI`}}{h{dHh}}}Hl}{{{h{Ll}}{h{dHh}}}Hl}{{{h{AIb}}{h{dHh}}}Hl}{{{h{AH`}}{h{dHh}}}Hl}0{{{h{ADf}}{h{dHh}}}Hl}{cc{}}0{GhAI`}11{AHnLl}222{{{h{Ll}}{h{{An{Gd{Ml{AEl}}}}}}}{{Bf{AIbAH`}}}}{{{h{AHl}}{h{dc}}}AbKb}{{{h{AIb}}{h{dc}}}AbKb}{{{h{AHn}}}Gd}`{ce{}{}}000000{{{h{AHn}}}Gh}{{{h{AI`}}}Gh}{{{h{AIb}}}Gh}`{{{h{AIb}}{h{AIb}}}{{Gb{F`}}}}{{{h{Ll}}}Gh}`{{{h{AHl}}c}BfMd}{{{h{AHn}}c}BfMd}{{{h{AI`}}c}BfMd}{{{h{Ll}}c}BfMd}{{{h{AIb}}c}BfMd}`{{{h{c}}}e{}{}}00000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nb{}}000000>>>>>>>``````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000{{AIdEb}{{Bf{AIfG`}}}}{{{AIh{c}}Eb}{{Bf{AIfG`}}}{{AIj{AC`}}}}{{{AIl{c}}Eb}{{Bf{AIfG`}}}{{AIj{ACb}}}}{{{AIn{c}}Eb}{{Bf{AIfG`}}}{{AIj{ACb}}}}{{{AJ`{c}}Eb}{{Bf{AIfG`}}}{{AIj{AJb}}}}{{{AJd{c}}Eb}{{Bf{AIfG`}}}{{AJf{AC`}}}}{{{AJh{c}}Eb}{{Bf{AIfG`}}}{{AJf{AC`}}}}{{{AJj{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AJl{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AJn{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AK`{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AKb{c}}Eb}{{Bf{AIfG`}}}{{AJf{AJb}}}}{{{AKd{c}}Eb}{{Bf{AIfG`}}}{{AJf{AJb}}}}{{{h{{AIh{c}}}}}{{AIh{c}}}{Al{AIj{AC`}}}}{{{h{{AIl{c}}}}}{{AIl{c}}}{Al{AIj{ACb}}}}{{{h{{AIn{c}}}}}{{AIn{c}}}{Al{AIj{ACb}}}}{{{h{{AJ`{c}}}}}{{AJ`{c}}}{Al{AIj{AJb}}}}{{{h{{AJd{c}}}}}{{AJd{c}}}{Al{AJf{AC`}}}}{{{h{{AJh{c}}}}}{{AJh{c}}}{Al{AJf{AC`}}}}{{{h{{AJj{c}}}}}{{AJj{c}}}{Al{AJf{ACb}}}}{{{h{{AJl{c}}}}}{{AJl{c}}}{Al{AJf{ACb}}}}{{{h{{AJn{c}}}}}{{AJn{c}}}{Al{AJf{ACb}}}}{{{h{{AK`{c}}}}}{{AK`{c}}}{Al{AJf{ACb}}}}{{{h{{AKb{c}}}}}{{AKb{c}}}{Al{AJf{AJb}}}}{{{h{{AKd{c}}}}}{{AKd{c}}}{Al{AJf{AJb}}}}{{{h{c}}{h{de}}}Ab{}{}}00000000000{{{h{{AIh{c}}}}{h{dHh}}}Hl{Hn{AIj{AC`}}}}{{{h{{AIl{c}}}}{h{dHh}}}Hl{Hn{AIj{ACb}}}}{{{h{{AIn{c}}}}{h{dHh}}}Hl{Hn{AIj{ACb}}}}{{{h{{AJ`{c}}}}{h{dHh}}}Hl{Hn{AIj{AJb}}}}{{{h{{AJd{c}}}}{h{dHh}}}Hl{Hn{AJf{AC`}}}}{{{h{{AJh{c}}}}{h{dHh}}}Hl{Hn{AJf{AC`}}}}{{{h{{AJj{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AJl{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AJn{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AK`{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AKb{c}}}}{h{dHh}}}Hl{Hn{AJf{AJb}}}}{{{h{{AKd{c}}}}{h{dHh}}}Hl{Hn{AJf{AJb}}}}{cc{}}00000000000{ce{}{}}00000000000{{AIf{h{{M`{Ln}}}}Eb}{{Bf{{Cb{LbLd}}G`}}}}{{c{h{{M`{Ln}}}}Eb}{{Bf{{Cb{{Oj{A@n}}{An{A@nAG`}}}}G`}}}{}}00000000000{{{h{c}}}e{}{}}00000000000{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nb{}}00000000000555555555555`````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{dc}}}{{h{de}}}{}{}}00{{{h{AKf}}}AKf}{{{h{c}}{h{de}}}Ab{}{}}{{{h{AKf}}{h{dHh}}}Hl}0{{{h{Jj}}{h{dHh}}}Hl}0{{{h{Df}}{h{dHh}}}Hl}0={AKfJj}{AH`Jj}{NfJj}{AKhJj}{cc{}}{G`Jj}1{ce{}{}}00{{{h{c}}}e{}{}}{{{h{c}}}Gd{}}00{c{{Bf{e}}}{}{}}00000{{{h{c}}}Nb{}}00444``````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{AKj}}}{{Gb{Gd}}}}{{{h{AKj}}}Gd}{c{{Bf{AKj}}}Gf}{{{h{f}}{h{Nd}}Gh}{{Bf{AKj{h{Nd}}}}}}{{{h{AKj}}{h{dHh}}}Hl}0={{{h{Nd}}}{{Bf{AKjc}}}{}}<``{{{h{AKj}}c}BfMd};::9=```````````````````````````````````````````{{}AKl}{{}A@d}{{A@nBb}{{Bf{AA`AAb}}}};;;;;;;;;;;;::::::::::::{{{h{{AKn{ce}}}}{h{g}}}{{AAf{{AAd{c}}}}}{A@bA@`}A@j{{AAh{c}}}}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}00000{{{h{c}}}{{Bf{AbAAl}}}A@`}{{{h{{A@h{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{Cj{{Ml{Ch}}}}}}}{{Bf{AbAAl}}}}{{{h{{AL`{ce}}}}}{{AL`{ce}}}AlA@j}{{{h{A@d}}}A@d}{{{h{ALb}}}ALb}{{{h{{AKn{ce}}}}}{{AKn{ce}}}{AlA@`}{AlA@j}}{{{h{A@n}}}A@n}{{{h{AG`}}}AG`}{{{h{ALd}}}ALd}{{{h{ALf}}}ALf}{{{h{ALh}}}ALh}{{{h{c}}{h{de}}}Ab{}{}}00000000{{{h{{AKn{ce}}}}{h{{AKn{ce}}}}}F`{ACdA@`}{ACdA@j}}{{{h{A@n}}{h{A@n}}}F`}{{{h{ALd}}{h{ALd}}}F`}{{{h{ALh}}{h{ALh}}}F`}`{{}ALb}{{{h{{AL`{ce}}}}}{{h{g}}}{}A@j{}}{{A@nBb}{{Bf{AA`AAb}}}}{c{{Bf{A@n}}}Gf}{{{h{{AKn{ce}}}}}Af{A@bA@`}A@j}{{{h{A@d}}{h{A@d}}}Gh}{{{h{AHh}}{h{AHh}}}Gh}{{{h{{AKn{ce}}}}{h{{AKn{ce}}}}}Gh{GlA@`}{GlA@j}}{{{h{A@n}}{h{A@n}}}Gh}{{{h{AG`}}{h{AG`}}}Gh}{{{h{ALd}}{h{ALd}}}Gh}{{{h{ALf}}{h{ALf}}}Gh}{{{h{ALh}}{h{ALh}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000000000{{{h{{ALj{c}}}}{h{dHh}}}Hl{HnA@j}}{{{h{A@d}}{h{dHh}}}Hl}{{{h{ALb}}{h{dHh}}}Hl}{{{h{AHh}}{h{dHh}}}Hl}0{{{h{{AKn{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@`A@j}0{{{h{A@n}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{AG`}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{ALd}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALf}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALh}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{AKn{ce}}}}g}GhA@`A@j{{N`{{h{c}}}{{Mn{Gh}}}}}}{ALl{{ALn{c}}}A@j}{cc{}}{AM`{{ALn{c}}}A@j}1111{AHfAHh}2{OnAHh}33{AA`A@n}4444{{A@nAKl}{{ALj{c}}}A@j}{{AG`AKl}{{ALj{c}}}A@j}{{{h{Nd}}}{{Bf{A@n}}}}{{{h{Nd}}}{{Bf{AG`}}}}{{{h{AEj}}}{{Bf{{AKn{ce}}On}}}{AMbA@`}A@j}{{{h{A@n}}}{{Gb{AMd}}}}{{{h{A@n}}}{{Ml{AMd}}}}{c{{Bf{{AL`{{AMj{}{{AMf{e}}{AMh{c}}{Kd{g}}}}i}}g}}}{}{{AMl{{Cj{Ch}}}}Oh}HnA@j}{{}{{Bf{{AL`{AMnc}}e}}}A@j{}}{{{h{dc}}}{{Bf{{AL`{AMne}}g}}}{AN`Od}A@j{}}{{c{h{de}}}{{Bf{{AL`{{AMj{}{{AMf{g}}{AMh{c}}{Kd{i}}}}k}}i}}}{}{AN`Od}{{AMl{{Cj{Ch}}}}Oh}HnA@j}{{ce}{{Bf{{AL`{{AMj{}{{AMf{e}}{AMh{c}}{Kd{g}}}}i}}g}}}{}{{AMl{{Cj{Ch}}}}Oh}HnA@j}{c{{Bf{{AL`{AMne}}g}}}{}A@j{}}{{{h{{ALn{c}}}}}GhA@j}{{{h{A@n}}}Gh}{{{h{{AKn{ce}}}}{h{dg}}}Ab{AF`A@`}{AF`A@j}Kb}{{{h{A@n}}{h{dc}}}AbKb}{{{h{ALd}}{h{dc}}}AbKb}{{{h{ALh}}{h{dc}}}AbKb}{ce{}{}}00000000000{A@nANb}{AIj{{Bf{{ALj{c}}AHh}}}A@j}{{AJf{Gb{ANd}}AMd}{{Bf{{ALj{c}}AHh}}}A@j}{{{AL`{ec}}{Gb{ANd}}AMd}{{Bf{{ALj{c}}AHh}}}A@j{{AJf{c}}}}{{{AL`{ec}}}{{Bf{{ALj{c}}AHh}}}A@j{{AIj{c}}}}{{{ALj{c}}}{{Bf{{ALj{c}}AHh}}}A@j}{A@n{{Bf{{ALj{c}}AHh}}}A@j}{AG`{{Bf{{ALj{c}}AHh}}}A@j}{AJf{{Bf{{ALn{c}}AHh}}}A@j}{{{ALn{c}}}{{Bf{{ALn{c}}AHh}}}A@j}{{{AL`{ec}}}{{Bf{{ALn{c}}AHh}}}A@j{{AJf{c}}}}{{{AL`{ce}}}c{}A@j}{A@n{{Ml{A@n}}}}{AG`{{Ml{AG`}}}}{{{ALn{c}}Eb}{{Gb{ALl}}}A@j}{{{ALn{c}}Eb{h{{M`{e}}}}}AM`A@jAGb}{{{h{A@n}}}Gh}{{}Gh}{{{h{A@d}}}Gh}2{{{h{AG`}}}Gh}212133{{{h{{AKn{ce}}}}}AElA@`A@j}``{{{h{{AKn{ce}}}}}{{Bf{{AFf{c}}On}}}A@`A@j}{{}AKl}{{{h{A@n}}}ANf}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Gb{AEl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}44{{{h{AKl}}{h{AKl}}}AKl}5{{}{{h{Nd}}}}{{AEl{Ml{c}}}{{Bf{{AKn{ce}}On}}}A@`A@j}{{{h{A@n}}}AEl}``{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{ALj{c}}AKl}{{ALj{c}}}A@j}{{{h{{AKn{ce}}}}{h{{AKn{ce}}}}}{{Gb{F`}}}{AGdA@`}{AGdA@j}}{{{h{A@n}}{h{A@n}}}{{Gb{F`}}}}{{{h{ALd}}{h{ALd}}}{{Gb{F`}}}}{{{h{ALh}}{h{ALh}}}{{Gb{F`}}}}{{{h{c}}}AElA@`}{{{h{{AKn{ce}}}}}{{h{{Cj{c}}}}}A@`A@j}{{{h{{AKn{ce}}}}}{{Bf{AbOn}}}A@`A@j}{{{h{{AKn{ce}}}}g}{{Bf{{Ml{{Ml{Ch}}}}On}}}{A@bA@`}A@j{{AEn{c}}}}{{{h{{AKn{ce}}}}}AElA@`A@j}{{{h{A@n}}c}BfMd}{{}AGj}{{{h{{AKn{ce}}}}}{{A@h{ce}}}{A@bA@`}A@j}{{}AKl}{{{h{c}}}e{}{}}00000000{{{h{AG`}}{h{{M`{c}}}}}{{Bf{A@nANh}}}AGb}{{{h{c}}}Gd{}}000{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}0{{{h{{AKn{ce}}}}{h{dk}}}{{Bf{{AKn{ge}}{AGl{i}}}}}A@`A@jA@`{}{{AGn{cgi}}}}{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nb{}}00000000000{ce{}{}}00000000000`{{{h{ANj}}}{{Gb{Dh}}}}{{{h{ANj}}}{{Gb{Dl}}}}{{{h{ANj}}AEl}{{Gb{Kl}}}}`{{{h{Jb}}{h{Nd}}{h{{Cj{{h{{Cj{{h{Nd}}}}}}}}}}}{{Bf{AbANl}}}}````````````````````````````````````{{{h{dJl}}ANnl{A`{n}}}{{Gb{{A`{n}}}}}}``{{{h{Jl}}{h{{M`{Ln}}}}}Ld}`{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{dc}}}{{h{de}}}{}{}}0000000{{Ld{h{{Oj{A@n}}}}{h{{M`{Ln}}}}}Jl}{{{h{ANn}}}ANn}{{{h{AO`}}}AO`}{{{h{{AOb{c}}}}}{{AOb{c}}}{AlAOdHnAl}}{{{h{l}}}l}{{{h{Jl}}}Jl}{{{h{Hd}}}Hd}{{{h{AOf}}}AOf}{{{h{c}}{h{de}}}Ab{}{}}000000{{{h{ANn}}{h{ANn}}}F`}{{{h{l}}{h{l}}}F`}{{}l}{{}Jl}{{}Hd}{{}AOf}{{{h{{AOb{c}}}}}{{h{e}}}{AOdHnAl}{}}{{{h{AOh}}}{{Gb{AG`}}}}0{{{h{{AOb{{AOj{ALl}}}}}}}{{Gb{AG`}}}}{{{h{{AOb{AOl}}}}}{{Gb{AG`}}}}{{{h{{AOb{{AOn{ALl}}}}}}}{{Gb{AG`}}}}{{{h{ANn}}{h{ANn}}}Gh}{{{h{AO`}}{h{AO`}}}Gh}{{{h{l}}{h{l}}}Gh}{{{h{AOf}}{h{AOf}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000{{{h{Jl}}ANn}{{Gb{{h{{A`{n}}}}}}}}{{{h{ANn}}{h{dHh}}}Hl}{{{h{Hf}}{h{dHh}}}Hl}0{{{h{AO`}}{h{dHh}}}Hl}{{{h{{AOb{c}}}}{h{dHh}}}Hl{HnAOdHnAl}}{{{h{l}}{h{dHh}}}Hl}{{{h{Jl}}{h{dHh}}}Hl}{{{h{Hd}}{h{dHh}}}Hl}{{{h{AOf}}{h{dHh}}}Hl}{cc{}}{ABlANn}{ANfANn}2222222{{{h{ANn}}{h{dc}}}AbKb}{{{h{AOh}}{h{{M`{Ln}}}}}ANn}{{{h{{AOb{{AOj{ALl}}}}}}{h{{M`{Ln}}}}}ANn}{{{h{{AOb{{AOn{ALl}}}}}}{h{{M`{Ln}}}}}ANn}{{{h{{AOb{AOl}}}}{h{{M`{Ln}}}}}ANn}{{{h{Jl}}}{{Ml{{h{ANn}}}}}}{ce{}{}}0000000{{cAO`}{{AOb{c}}}{AOdHnAl}}{{}Jl}{{{h{ANn}}{h{ANn}}}{{Gb{F`}}}}{{{h{l}}{h{l}}}{{Gb{F`}}}}{{{h{dJl}}ANnl}{{Gb{{A`{n}}}}}}{{{h{B@`}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{{AOb{{AOj{ALl}}}}}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{{AOb{{AOn{ALl}}}}}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{{AOb{AOl}}}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{n}}{h{dHb}}{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{c}}{h{dHb}}{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}{}}`{{{h{Jl}}}{{Ml{{h{{A`{n}}}}}}}}`{{{h{c}}}e{}{}}000000{{{h{c}}}Gd{}}``{c{{Bf{e}}}{}{}}000000000000000{{{h{c}}}Nb{}}0000000{ce{}{}}0000000````````````````{{{h{d{Dd{c}}}}{h{e}}}{{h{d{Dd{c}}}}}{}{{B@d{B@b}}}}{{{h{d{Dd{c}}}}K`JhAFj}{{Bf{{h{d{Dd{c}}}}B@f}}}{}}{{{h{d{Dd{c}}}}K`JhAFjMb}{{Bf{{h{d{Dd{c}}}}B@f}}}{}}{{{h{d{Dd{c}}}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}AfDh}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}K`}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}K`}{{Bf{{h{d{Dd{c}}}}B@h}}}{}}{{{h{d{Dd{c}}}}{h{{Cj{K`}}}}}{{Bf{{h{d{Dd{c}}}}B@h}}}{}}{{{h{d{Dd{c}}}}Gh}{{h{d{Dd{c}}}}}{}}{{{h{c}}}{{h{e}}}{}{}}0000{{{h{dc}}}{{h{de}}}{}{}}0000{{{h{d{Dd{c}}}}B@j}{{h{d{Dd{c}}}}}{}}{{{h{{Dd{c}}}}}{{Dd{c}}}Al}{{{h{B@l}}}B@l}{{{h{B@j}}}B@j}{{{h{c}}{h{de}}}Ab{}{}}00{{{h{B@j}}{h{B@j}}}F`}{{{Dd{c}}e}{{Dd{e}}}{}O`}{{{h{d{Dd{c}}}}Bb}{{h{d{Dd{c}}}}}{}}{{}B@l}{{}B@j}{{{h{d{Dd{c}}}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Af}{{h{d{Dd{c}}}}}{}}1{{{h{B@j}}{h{B@j}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0{{{h{d{Dd{c}}}}Dh}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Dl}{{h{d{Dd{c}}}}}{}}{{{Dd{c}}}{{Bf{HbJj}}}O`}{{{Dd{c}}{h{de}}}{{Bf{HbJj}}}O`Od}{{{h{{Dd{c}}}}{h{dHh}}}HlHn}{{{h{B@h}}{h{dHh}}}Hl}0{{{h{B@f}}{h{dHh}}}Hl}0{{{h{B@l}}{h{dHh}}}Hl}{{{h{B@j}}{h{dHh}}}Hl}{cc{}}0000{{{h{B@j}}{h{dc}}}AbKb}>{ce{}{}}0000?{{{h{d{Dd{c}}}}B@n}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}}{{h{d{Dd{c}}}}}{}}0{{{h{d{Dd{c}}}}B@l}{{h{d{Dd{c}}}}}{}}{{{h{B@j}}{h{B@j}}}{{Gb{F`}}}}{{{h{d{Dd{c}}}}{An{Gd{Ml{AEl}}}}j}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Mb}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}{Ml{{Cb{AfDh}}}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Jf}{{h{d{Dd{c}}}}}{}}{{{h{B@l}}{h{dBl}}}Ab}{{{h{B@l}}{h{dBl}}{h{dc}}}AbOd}{{{h{c}}}e{}{}}00{{{h{c}}}Gd{}}0{c{{Bf{e}}}{}{}}000000000{{{h{c}}}Nb{}}0000{{{h{d{Dd{c}}}}{Ml{K`}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}BA`}{{h{d{Dd{c}}}}}{}}{ce{}{}}0000````","D":"GCf","p":[[5,"Balance",0,1990],[0,"mut"],[5,"Wallet",0,1991],[1,"reference"],[6,"KeychainKind",0,1992],[5,"SignerOrdering",1685,1993],[10,"TransactionSigner",1685,1993],[5,"Arc",1994],[1,"unit"],[17,"Item"],[5,"ScriptBuf",1995],[8,"Indexed",1996],[10,"Iterator",1997],[10,"Clone",1998],[5,"BTreeMap",1999],[5,"Block",2000],[1,"u32"],[5,"CannotConnectError",2001],[6,"Result",2002],[5,"BlockId",2003],[6,"ApplyHeaderError",2001],[5,"Transaction",2004],[10,"Into",2005],[1,"u64"],[1,"tuple"],[10,"IntoIterator",2006],[5,"Update",0,1991],[1,"u8"],[1,"slice"],[5,"ConfirmationBlockTime",2003],[5,"TxGraph",2007],[5,"Txid",2004],[8,"DefaultCoinSelectionAlgorithm",486,2008],[5,"TxBuilder",1872,2009],[6,"BuildFeeBumpError",1264,2010],[5,"Amount",2011],[6,"CalculateFeeError",2007],[5,"FeeRate",2012],[5,"LoadParams",0,2013],[5,"BlockHash",2000],[6,"Network",2014],[5,"CheckPointIter",2015],[5,"LocalOutput",0,1992],[5,"WeightedUtxo",0,1992],[6,"Utxo",0,1992],[5,"ChangeSet",0,2016],[5,"AddressInfo",0,1991],[6,"Ordering",2017],[5,"CreateParams",0,2013],[5,"PersistedWallet",0,2018],[6,"CreateWithPersistError",0,2018],[10,"WalletPersister",0,2018],[10,"IntoWalletDescriptor",603],[10,"Send",2019],[10,"AsyncWalletPersister",0,2018],[6,"Error",864],[6,"Option",2020],[5,"String",2021],[10,"Deserializer",2022],[1,"bool"],[6,"LoadWithPersistError",0,2018],[10,"PartialEq",2017],[6,"LoadError",0,1991],[6,"LoadMismatch",0,1991],[5,"Psbt",2023],[5,"SignOptions",1685,1993],[6,"SignerError",1685,1993],[5,"Formatter",2024],[5,"Error",2024],[8,"Result",2024],[10,"Debug",2024],[6,"FileStoreError",0,2018],[10,"Display",2024],[6,"ApplyBlockError",0,1991],[5,"ChangeSet",2025],[5,"ChangeSet",2007],[5,"ChangeSet",2001],[5,"ChangeSet",2026],[5,"SyncResponse",2027],[5,"FullScanResponse",2027],[5,"Transaction",2028],[8,"Result",2029],[5,"PsbtSighashType",2030],[5,"Input",2030],[6,"CreateTxError",1264,2010],[5,"SignersContainer",1685,1993],[8,"WalletTx",0,1991],[5,"OutPoint",2004],[10,"Hasher",2031],[17,"Error"],[10,"Future",2032],[5,"Box",2033],[5,"Pin",2034],[5,"TxOut",2004],[10,"IsDust",0,2035],[5,"Script",2036],[8,"ExtendedDescriptor",603],[8,"KeyMap",1363,2037],[5,"CheckPoint",2015],[10,"DoubleEndedIterator",2038],[5,"LocalChain",2001],[5,"Policy",897],[6,"All",2039],[5,"Secp256k1",2040],[5,"Sequence",2004],[10,"Serializer",2041],[5,"KeychainTxOutIndex",2025],[5,"FullScanRequestBuilder",2027],[5,"SyncRequestBuilder",2027],[5,"Vec",2042],[17,"Output"],[10,"FnMut",2043],[5,"TypeId",2044],[1,"str"],[5,"InsufficientFunds",486,2008],[5,"LargestFirstCoinSelection",486,2008],[5,"OldestFirstCoinSelection",486,2008],[5,"BranchAndBoundCoinSelection",486,2008],[5,"SingleRandomDraw",486,2008],[10,"CoinSelectionAlgorithm",486,2008],[5,"CoinSelectionResult",486,2008],[10,"RngCore",2045],[6,"Excess",486,2008],[10,"Default",2046],[6,"Descriptor",603,2037],[5,"Address",2047],[6,"Error",2048],[10,"MiniscriptKey",2048],[10,"ToPublicKey",2048],[6,"ScriptContextEnum",1363],[5,"Miniscript",603,2049],[6,"Terminal",2050],[10,"ScriptContext",1363,2051],[6,"Tree",2052],[6,"DescriptorPublicKey",1363,2053],[5,"DefiniteDescriptorKey",2053],[6,"ConversionError",2053],[6,"Placeholder",2054],[5,"Satisfaction",2054],[10,"AssetProvider",2055],[17,"Key"],[6,"ScriptContextError",2051],[17,"Sha256"],[5,"Hash",2056],[17,"Hash256"],[5,"Hash",2057],[17,"Ripemd160"],[5,"Hash",2058],[17,"Hash160"],[5,"Hash",2059],[10,"ParseableKey",2050],[6,"Legacy",603,2051],[6,"Segwitv0",603,2051],[10,"Ord",2017],[5,"PublicKey",2060],[10,"Verification",2061],[6,"DescriptorType",2037],[5,"DescriptorId",2062],[10,"FromStrKey",2063],[5,"ExtParams",2064],[6,"AnalysisError",2064],[10,"ExtractPolicy",603],[6,"BuildSatisfaction",897],[5,"Range",2065],[5,"Pkh",2066],[5,"Sh",2067],[5,"Tr",2068],[5,"Bare",2066],[5,"Wpkh",2069],[5,"Wsh",2069],[5,"Type",2070],[5,"ExtData",2071],[5,"Tree",2072],[1,"usize"],[10,"Satisfier",2054],[10,"Hash",2031],[5,"Iter",2073],[5,"PkIter",2073],[6,"Policy",2074],[6,"LiftError",2075],[5,"Weight",2076],[6,"BareCtx",2051],[6,"TapTree",2068],[6,"DescriptorSecretKey",1363,2053],[10,"Signing",2061],[10,"PartialOrd",2017],[5,"Plan",2055],[5,"TxIn",2004],[6,"SigType",2051],[6,"TranslateErr",2048],[10,"Translator",2048],[6,"PolicyError",897],[6,"ParsePublicKeyError",2060],[6,"Error",2077],[6,"Error",2078],[6,"KeyError",1363],[6,"HexToBytesError",2079],[6,"PkOrF",897],[6,"SatisfiableItem",897],[6,"Satisfaction",897],[5,"Condition",897],[10,"DescriptorTemplate",1080],[8,"DescriptorTemplateOut",1080],[5,"P2Pkh",1080],[10,"IntoDescriptorKey",1363],[5,"P2Wpkh_P2Sh",1080],[5,"P2Wpkh",1080],[5,"P2TR",1080],[6,"Tap",2051],[5,"Bip44",1080],[10,"DerivableKey",1363],[5,"Bip44Public",1080],[5,"Bip49",1080],[5,"Bip49Public",1080],[5,"Bip84",1080],[5,"Bip84Public",1080],[5,"Bip86",1080],[5,"Bip86Public",1080],[6,"MiniscriptPsbtError",1264,2010],[6,"Error",2080],[5,"FullyNodedExport",1340,2081],[8,"ValidNetworks",1363],[5,"SortedMultiVec",1363,2082],[5,"GeneratedKey",1363],[5,"PrivateKeyGenerateOptions",1363],[5,"SinglePub",1363,2053],[5,"SinglePriv",1363,2053],[6,"SinglePubKey",1363,2053],[6,"DescriptorKey",1363],[5,"Xpriv",2078],[6,"ExtendedKey",1363],[5,"Xpub",2078],[10,"FromStr",2083],[5,"DerivationPath",2078],[17,"Entropy"],[17,"Options"],[10,"GeneratableKey",1363],[10,"AsMut",2005],[10,"GeneratableDefaultOptions",1363],[10,"CryptoRng",2045],[5,"Assets",2055],[8,"KeySource",2078],[5,"Fingerprint",2078],[5,"DescriptorKeyParseError",2053],[10,"PsbtUtils",1679],[6,"Error",2084],[6,"SignerId",1685,1993],[6,"SignerContext",1685,1993],[5,"SignerWrapper",1685,1993],[10,"Sized",2019],[6,"TapLeavesOptions",1685,1993],[10,"SignerCommon",1685,1993],[5,"DescriptorXKey",2053],[5,"PrivateKey",2060],[5,"DescriptorMultiXKey",2053],[10,"InputSigner",1685,1993],[5,"PushBytes",2085],[10,"AsRef",2005],[6,"AddForeignUtxoError",1872,2009],[6,"AddUtxoError",1872,2009],[6,"ChangeSpendPolicy",1872,2009],[6,"TxOrdering",1872,2009],[6,"LockTime",2086],[1,"i32"],[15,"InvalidTxid",1986],[15,"UnexpectedConnectedToHash",472],[15,"Network",474],[15,"Genesis",474],[15,"Descriptor",474],[15,"Custom",1988],[15,"Foreign",483],[15,"Change",598],[15,"NoChange",598],[8,"DerivedDescriptor",603],[15,"PsbtTimelocks",1056],[15,"Complete",1059],[15,"Partial",1059],[15,"PartialComplete",1059],[15,"Sha256Preimage",1070],[15,"Hash256Preimage",1070],[15,"Ripemd160Preimage",1070],[15,"Hash160Preimage",1070],[15,"Thresh",1070],[15,"Multisig",1070],[15,"AbsoluteTimelock",1070],[15,"RelativeTimelock",1070],[15,"RbfSequenceCsv",1334],[15,"LockTime",1334],[15,"FeeTooLow",1334],[15,"FeeRateTooLow",1334],[8,"WalletExport",1340],[10,"ExtScriptContext",1363],[15,"Tap",1871]],"r":[[0,2009],[1,2009],[2,1991],[3,1991],[4,2018],[5,1990],[9,2016],[10,2009],[11,2013],[12,2018],[21,2018],[24,603],[29,2035],[30,1992],[32,1991],[33,1991],[34,2013],[35,2018],[37,1992],[47,2018],[49,1993],[50,2009],[51,2009],[55,1991],[56,1992],[59,1991],[60,2018],[61,1991],[62,1992],[147,1991],[198,1991],[199,1991],[338,2087],[353,1991],[354,1991],[362,603],[421,1991],[469,1991],[486,2008],[488,2008],[489,2008],[490,2008],[491,2008],[492,2008],[493,2008],[495,2008],[496,2008],[527,2008],[607,2037],[609,2053],[616,2051],[617,2049],[622,897],[623,2051],[624,2051],[658,863],[1264,2010],[1267,2010],[1275,2010],[1340,2081],[1341,2081],[1366,2053],[1367,2053],[1382,2037],[1392,2051],[1397,2053],[1398,2053],[1399,2053],[1400,2082],[1683,2088],[1684,2088],[1692,1993],[1709,1993],[1710,1993],[1711,1993],[1712,1993],[1713,1993],[1714,1993],[1715,1993],[1716,1993],[1718,1993],[1719,1993],[1872,2009],[1873,2009],[1876,2009],[1883,2009],[1884,2009]],"b":[[203,"impl-Debug-for-Balance"],[204,"impl-Display-for-Balance"],[211,"impl-Debug-for-FileStoreError"],[212,"impl-Display-for-FileStoreError"],[213,"impl-Debug-for-LoadWithPersistError%3CE%3E"],[214,"impl-Display-for-LoadWithPersistError%3CE%3E"],[215,"impl-Display-for-CreateWithPersistError%3CE%3E"],[216,"impl-Debug-for-CreateWithPersistError%3CE%3E"],[219,"impl-Debug-for-AddressInfo"],[220,"impl-Display-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%3E-for-ChangeSet"],[235,"impl-From%3CChangeSet%3CConfirmationBlockTime%3E%3E-for-ChangeSet"],[237,"impl-From%3CChangeSet%3E-for-ChangeSet"],[238,"impl-From%3CChangeSet%3CConfirmationBlockTime,+ChangeSet%3E%3E-for-ChangeSet"],[245,"impl-From%3CSyncResponse%3E-for-Update"],[246,"impl-From%3CFullScanResponse%3CKeychainKind%3E%3E-for-Update"],[537,"impl-Display-for-InsufficientFunds"],[538,"impl-Debug-for-InsufficientFunds"],[696,"impl-Descriptor%3CDescriptorPublicKey%3E"],[697,"impl-Descriptor%3CDefiniteDescriptorKey%3E"],[724,"impl-Display-for-Descriptor%3CPk%3E"],[725,"impl-Debug-for-Descriptor%3CPk%3E"],[728,"impl-Display-for-Miniscript%3CPk,+Ctx%3E"],[729,"impl-Debug-for-Miniscript%3CPk,+Ctx%3E"],[732,"impl-From%3CPkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[733,"impl-From%3CSh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[734,"impl-From%3CTr%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[735,"impl-From%3CBare%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[736,"impl-From%3CWpkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[737,"impl-From%3CWsh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[881,"impl-Debug-for-Error"],[882,"impl-Display-for-Error"],[883,"impl-From%3CError%3E-for-Error"],[884,"impl-From%3CPolicyError%3E-for-Error"],[885,"impl-From%3CParsePublicKeyError%3E-for-Error"],[886,"impl-From%3CError%3E-for-Error"],[887,"impl-From%3CError%3E-for-Error"],[889,"impl-From%3CKeyError%3E-for-Error"],[890,"impl-From%3CHexToBytesError%3E-for-Error"],[984,"impl-Debug-for-PolicyError"],[985,"impl-Display-for-PolicyError"],[1301,"impl-Debug-for-MiniscriptPsbtError"],[1302,"impl-Display-for-MiniscriptPsbtError"],[1303,"impl-Display-for-CreateTxError"],[1304,"impl-Debug-for-CreateTxError"],[1305,"impl-Display-for-BuildFeeBumpError"],[1306,"impl-Debug-for-BuildFeeBumpError"],[1308,"impl-From%3CMiniscriptPsbtError%3E-for-CreateTxError"],[1309,"impl-From%3CPolicyError%3E-for-CreateTxError"],[1310,"impl-From%3CInsufficientFunds%3E-for-CreateTxError"],[1311,"impl-From%3CError%3E-for-CreateTxError"],[1313,"impl-From%3CError%3E-for-CreateTxError"],[1350,"impl-Debug-for-FullyNodedExport"],[1351,"impl-Display-for-FullyNodedExport"],[1496,"impl-Display-for-KeyError"],[1497,"impl-Debug-for-KeyError"],[1498,"impl-Debug-for-SortedMultiVec%3CPk,+Ctx%3E"],[1499,"impl-Display-for-SortedMultiVec%3CPk,+Ctx%3E"],[1500,"impl-Display-for-DescriptorPublicKey"],[1501,"impl-Debug-for-DescriptorPublicKey"],[1502,"impl-Debug-for-DescriptorSecretKey"],[1503,"impl-Display-for-DescriptorSecretKey"],[1508,"impl-From%3CXpriv%3E-for-ExtendedKey%3CCtx%3E"],[1510,"impl-From%3CXpub%3E-for-ExtendedKey%3CCtx%3E"],[1515,"impl-From%3CError%3E-for-KeyError"],[1517,"impl-From%3CError%3E-for-KeyError"],[1559,"impl-DerivableKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1560,"impl-IntoDescriptorKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1766,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1767,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1768,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1783,"impl-Debug-for-SignerError"],[1784,"impl-Display-for-SignerError"],[1792,"impl-From%3CHash%3E-for-SignerId"],[1793,"impl-From%3CFingerprint%3E-for-SignerId"],[1803,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1804,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1805,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1821,"impl-InputSigner-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1822,"impl-InputSigner-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1823,"impl-InputSigner-for-SignerWrapper%3CPrivateKey%3E"],[1929,"impl-Display-for-AddUtxoError"],[1930,"impl-Debug-for-AddUtxoError"],[1931,"impl-Debug-for-AddForeignUtxoError"],[1932,"impl-Display-for-AddForeignUtxoError"]],"c":"OjAAAAEAAAAAAAUAEAAAALgCAgMOAz4FvQUlBg==","e":"OzAAAAEAACsEgQAZAAAAQQAAAE0AAQBRACQAewAAAIMAEACeAAYArQAZAMoAAADMABYA6wABAO4AAQDyAAAA9gABAPsAAAAEAQEAIAEAADsBAABGAQAAUgEAAFgBBQBjAQAAawEPAIIBIwCtAREAxAERAPMBFwAMAgMAEQIGABoCBwA1AiEAYQIAAG8CAACDAgEAhgIAAIgCBwCTAgAAlQIBAJgCAACbAgEAngIBAKICAQClAgEAqAIBAKsCCwC8AgMAwQILANICAQDVAg0A6QIAAPYCAwABAwAABwMBAAsDAQASAwEAKAMDAC0DAQA7AwEAPgMBAEIDBQBNAwcAVgMDAFsDAwBvAwkAegMBAH0DBAClAxkAwQMaAN4DAADhAwAA5gMBAPUDAAD4AwQA/gMiAEcEFwBgBC8AqARIAA4FDQAdBQMAIgUAACcFDwBBBQEARQUAAEcFAQBKBQAATgUFAIIFFwCkBRUAuwUBAL4FAADABSUA5wUAAOwFAADuBQAA8QUAAPgFAQAFBgMAFQYAABgGBAAeBgEALgYBADMGAAA9BgAAQgYDAEsGAABPBggAWQYDAGAGLwC/Bg8A0AYUAOcGDgD3BggAAQcBAAoHAAAMBwIAGgcBAB4HAgAiBwAAJgcHADAHHwBpBwkAdAcGAH0HAQCCBwIAiQcGAJUHAAChBwAAqAcTAL4HBAA="}],\ +["bdk_wallet",{"t":"GGFGKFPPPFGFGPPPPPRRPGPPEPPPPKGPGGFGPFPPPPPPPPPFPFFGPPPFGTTFKIFPNNONOONNNNNNNNONDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDOOOONNNNNNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNONCNOQNNNNNNNNNNNNNNNNNNNNNNNNNNNCCNDNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONMMNNNNNNNNNNNNNNNNNNNMNNOOONNNCONNNNNNNNNNNNONNNNDNNONNNNNNONNMMNNNNCNNNECONNNDDNNNNNNNOCENNNNNNOENNNNNNNNNNNNNNNNNNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNOOONONNNNNNNNNNNNNNNNNNNNOOHNNNNNNNNNNNNNNNNNNHOOOOOOOOOOOOOOOOFPKFIGFFPFFONNNNNNNNNNNNNNNNNNNNNNNNMNNNNHNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOPPPIGEGIKTIKRGFPPPPEKGPPPPTIPPPPPPPPPPNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNMNNMNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNONNNNNNNNNMNNNNCNNNNNNNNNNNMNNNCNNNNNNNNNNNNNNNNNNNONNNNNNNNNNHPPGPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNPPPGPFIPPIPPPPPPPPPPPGFGPPPPPGGPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNONNONNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFKIFFFFNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGPPGPPPPPPPGPPPPPPPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFIOONNNNNNNNNNNOONNNNNNPKGGGRRKGPKKFKPPPRGIPPPPPRPFPKGPPPFFGFPIPPPHMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNOONHNMNNHNMNNOONNNNNNMNNNNNMNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKMMMSHPPPPPPPKPPPPPPPPPPPPPPPPFKGGGFFFPGKPNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNMNNNMNONONNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOGGPPGPPPPPPFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","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_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","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"],[470,"bdk_wallet::AddForeignUtxoError"],[472,"bdk_wallet::ApplyBlockError"],[474,"bdk_wallet::LoadMismatch"],[481,"bdk_wallet::TxOrdering"],[483,"bdk_wallet::Utxo"],[486,"bdk_wallet::coin_selection"],[598,"bdk_wallet::coin_selection::Excess"],[603,"bdk_wallet::descriptor"],[863,"bdk_wallet::descriptor::checksum"],[864,"bdk_wallet::descriptor::error"],[897,"bdk_wallet::descriptor::policy"],[1056,"bdk_wallet::descriptor::policy::BuildSatisfaction"],[1059,"bdk_wallet::descriptor::policy::Satisfaction"],[1070,"bdk_wallet::descriptor::policy::SatisfiableItem"],[1080,"bdk_wallet::descriptor::template"],[1264,"bdk_wallet::error"],[1334,"bdk_wallet::error::CreateTxError"],[1340,"bdk_wallet::export"],[1363,"bdk_wallet::keys"],[1679,"bdk_wallet::psbt"],[1683,"bdk_wallet::rusqlite_impl"],[1685,"bdk_wallet::signer"],[1871,"bdk_wallet::signer::SignerContext"],[1872,"bdk_wallet::tx_builder"],[1986,"bdk_wallet::tx_builder::AddForeignUtxoError"],[1988,"bdk_wallet::tx_builder::TxOrdering"],[1990,"bdk_chain::balance"],[1991,"bdk_wallet::wallet"],[1992,"bdk_wallet::types"],[1993,"bdk_wallet::wallet::signer"],[1994,"alloc::sync"],[1995,"bitcoin::blockdata::script::owned"],[1996,"bdk_core"],[1997,"core::iter::traits::iterator"],[1998,"core::clone"],[1999,"alloc::collections::btree::map"],[2000,"bitcoin::blockdata::block"],[2001,"bdk_chain::local_chain"],[2002,"core::result"],[2003,"bdk_core::block_id"],[2004,"bitcoin::blockdata::transaction"],[2005,"core::convert"],[2006,"core::iter::traits::collect"],[2007,"bdk_chain::tx_graph"],[2008,"bdk_wallet::wallet::coin_selection"],[2009,"bdk_wallet::wallet::tx_builder"],[2010,"bdk_wallet::wallet::error"],[2011,"bitcoin_units::amount"],[2012,"bitcoin_units::fee_rate"],[2013,"bdk_wallet::wallet::params"],[2014,"bitcoin::network"],[2015,"bdk_core::checkpoint"],[2016,"bdk_wallet::wallet::changeset"],[2017,"core::cmp"],[2018,"bdk_wallet::wallet::persisted"],[2019,"core::marker"],[2020,"core::option"],[2021,"alloc::string"],[2022,"serde::de"],[2023,"bitcoin::psbt"],[2024,"core::fmt"],[2025,"bdk_chain::indexer::keychain_txout"],[2026,"bdk_chain::indexed_tx_graph"],[2027,"bdk_core::spk_client"],[2028,"rusqlite::transaction"],[2029,"rusqlite"],[2030,"bitcoin::psbt::map::input"],[2031,"core::hash"],[2032,"core::future::future"],[2033,"alloc::boxed"],[2034,"core::pin"],[2035,"bdk_wallet::wallet::utils"],[2036,"bitcoin::blockdata::script::borrowed"],[2037,"miniscript::descriptor"],[2038,"core::iter::traits::double_ended"],[2039,"secp256k1::context::alloc_only"],[2040,"secp256k1"],[2041,"serde::ser"],[2042,"alloc::vec"],[2043,"core::ops::function"],[2044,"core::any"],[2045,"rand_core"],[2046,"core::default"],[2047,"bitcoin::address"],[2048,"miniscript"],[2049,"miniscript::miniscript::private"],[2050,"miniscript::miniscript::decode"],[2051,"miniscript::miniscript::context"],[2052,"miniscript::iter::tree"],[2053,"miniscript::descriptor::key"],[2054,"miniscript::miniscript::satisfy"],[2055,"miniscript::plan"],[2056,"bitcoin_hashes::sha256"],[2057,"miniscript::miniscript::hash256"],[2058,"bitcoin_hashes::ripemd160"],[2059,"bitcoin_hashes::hash160"],[2060,"bitcoin::crypto::key"],[2061,"secp256k1::context"],[2062,"bdk_chain::descriptor_ext"],[2063,"miniscript::blanket_traits"],[2064,"miniscript::miniscript::analyzable"],[2065,"core::ops::range"],[2066,"miniscript::descriptor::sh"],[2067,"miniscript::descriptor::segwitv0"],[2068,"miniscript::descriptor::bare"],[2069,"miniscript::descriptor::tr"],[2070,"miniscript::miniscript::types"],[2071,"miniscript::miniscript::types::extra_props"],[2072,"miniscript::expression"],[2073,"miniscript::miniscript::iter"],[2074,"miniscript::policy::semantic"],[2075,"miniscript::policy"],[2076,"bitcoin_units::weight"],[2077,"bitcoin::bip32"],[2078,"base58ck::error"],[2079,"hex_conservative::error"],[2080,"bitcoin::psbt::error"],[2081,"bdk_wallet::wallet::export"],[2082,"miniscript::descriptor::sortedmulti"],[2083,"core::str::traits"],[2084,"rusqlite::error"],[2085,"bitcoin::blockdata::script::push_bytes::primitive"],[2086,"bitcoin::blockdata::locktime::absolute"],[2087,"bdk_chain"],[2088,"bdk_chain::rusqlite_impl"]],"i":[0,0,0,0,0,0,74,261,261,0,0,0,0,262,51,51,63,64,52,55,5,0,45,64,0,5,61,259,259,0,0,72,0,0,0,0,45,0,63,63,63,63,259,64,261,61,51,0,262,0,0,0,74,260,262,0,0,46,46,0,0,0,0,72,1,3,47,3,66,66,3,3,3,3,3,5,5,3,66,3,0,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,3,3,3,3,3,0,27,87,43,46,39,39,3,1,5,43,44,45,46,27,47,1,5,43,44,45,46,27,47,5,0,1,50,3,50,3,49,49,49,3,1,39,46,27,50,47,50,3,43,3,0,39,46,0,3,1,5,43,46,1,5,43,44,45,46,61,47,63,64,1,1,5,5,43,43,44,44,45,45,47,47,0,0,39,0,3,1,1,5,43,44,45,46,50,72,72,61,61,51,51,3,27,47,47,63,63,64,74,74,0,1,49,39,5,43,44,45,46,46,46,46,46,50,72,61,61,51,3,27,27,27,47,63,63,64,74,46,49,3,3,3,3,5,43,1,47,46,46,52,55,3,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,95,46,3,43,43,47,3,49,39,0,27,3,3,3,3,50,3,50,39,39,39,3,3,46,49,39,3,46,0,49,3,46,49,39,49,3,3,45,43,5,3,52,55,50,50,46,3,0,3,3,3,0,0,44,3,3,45,0,0,1,5,43,46,3,3,3,66,0,0,3,3,3,3,3,3,66,0,1,5,43,44,45,46,27,47,1,72,61,51,47,63,74,1,3,3,66,1,1,66,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,0,3,46,87,27,45,43,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,3,3,1,44,0,1,49,39,5,43,44,45,46,50,72,61,51,3,27,47,63,64,74,0,265,265,266,266,267,268,269,269,267,268,269,270,270,271,271,271,0,123,0,0,0,0,0,0,123,0,0,115,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,116,117,118,119,115,116,117,118,119,120,116,117,118,119,0,116,117,118,119,115,115,115,121,121,115,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,123,121,116,117,118,119,121,115,118,121,121,115,116,117,118,119,115,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,123,121,116,117,118,119,115,123,121,116,117,118,119,272,273,273,272,273,97,274,125,0,0,0,0,0,0,131,0,0,133,0,0,135,97,274,125,0,0,0,97,274,125,135,131,0,97,274,125,97,274,125,97,274,125,135,125,152,153,131,131,125,125,152,153,131,125,152,153,131,131,131,131,0,133,152,153,133,153,133,133,152,153,133,152,153,133,133,152,153,133,152,153,133,152,153,0,125,152,153,131,125,152,153,131,125,152,153,131,131,125,125,125,125,125,125,131,125,131,125,152,153,131,125,125,152,152,153,153,131,131,0,125,131,131,162,125,131,125,125,125,152,153,131,131,125,131,125,125,125,125,125,125,125,152,153,131,131,131,125,131,131,131,125,131,131,131,125,125,131,131,125,125,152,153,131,125,152,153,131,131,125,53,97,125,125,131,131,131,125,131,131,133,152,153,131,125,131,125,133,152,153,125,125,125,125,125,125,125,125,125,125,125,125,125,125,131,133,131,125,131,131,125,152,153,131,133,152,153,125,125,0,131,125,131,125,131,131,125,125,131,125,131,133,152,153,131,0,125,152,153,131,125,131,125,133,133,125,131,125,152,153,131,125,152,153,131,131,125,152,153,131,125,125,152,153,131,131,0,56,56,0,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,199,194,194,0,200,0,0,199,198,0,199,199,194,194,194,199,200,163,194,200,200,0,0,0,163,163,198,199,199,0,0,199,199,199,198,198,199,200,102,201,194,163,198,199,200,102,201,194,163,198,199,200,102,201,163,198,199,200,102,201,163,102,201,201,198,199,200,102,201,194,198,198,199,199,200,200,102,102,201,201,194,194,198,199,200,102,201,194,194,163,198,199,200,200,102,102,201,194,163,102,198,201,199,102,198,199,200,102,201,194,163,199,200,201,102,201,102,102,198,199,200,102,201,201,198,199,200,102,201,163,194,198,199,200,102,201,194,163,198,199,200,102,201,194,163,198,199,200,102,201,194,163,198,199,200,102,201,194,163,275,275,275,276,277,278,277,278,277,278,277,278,277,278,279,280,281,282,283,284,284,283,285,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,202,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,203,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,204,206,207,208,210,212,213,214,215,216,217,218,0,85,219,0,85,85,35,85,35,85,85,0,85,85,85,85,85,219,85,85,85,85,35,35,85,35,219,85,85,219,85,35,219,85,35,219,219,219,219,85,85,35,35,219,85,85,85,85,85,85,35,219,85,35,219,219,85,35,219,85,35,219,85,35,219,85,35,219,85,35,287,288,288,289,290,287,0,0,291,221,221,221,221,221,221,221,221,221,221,221,221,291,221,221,221,221,221,221,221,196,0,0,0,0,237,237,0,0,228,0,0,0,0,196,196,196,133,0,0,130,196,196,184,135,237,231,0,231,0,0,130,135,184,0,0,0,0,130,0,228,184,135,0,292,135,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,223,133,133,133,133,133,133,133,133,133,224,130,225,223,135,184,226,227,228,224,130,225,223,135,184,226,227,228,223,135,226,228,225,225,224,135,135,223,130,196,223,135,184,226,227,228,130,130,223,223,135,135,184,184,226,226,227,227,228,228,229,130,225,196,196,223,223,135,135,184,184,226,227,228,223,231,231,231,224,229,130,225,196,196,196,223,135,135,184,226,227,228,229,229,135,184,223,135,135,237,239,239,237,237,239,231,135,223,135,226,228,231,224,229,130,225,196,223,135,184,226,227,228,135,205,211,224,224,229,135,184,211,231,224,224,135,184,231,231,135,292,130,135,184,292,130,292,130,135,135,223,226,227,223,0,135,133,223,223,0,223,133,223,135,226,227,133,229,223,135,226,228,133,223,223,223,223,135,133,223,0,224,130,225,223,135,184,226,227,228,184,196,223,135,184,133,133,223,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,231,224,229,130,225,196,223,135,184,226,227,228,0,245,245,245,0,0,251,247,251,67,247,251,67,0,67,67,67,248,67,67,67,67,67,67,67,251,247,67,248,67,0,0,0,0,0,0,0,0,248,0,0,67,86,66,66,86,66,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,86,247,248,249,6,86,66,251,247,248,249,6,86,66,251,247,6,6,86,66,251,249,252,252,249,249,249,247,248,6,251,247,247,248,248,6,6,251,251,86,247,67,67,248,249,6,86,66,251,247,247,247,67,248,249,6,86,66,251,247,252,249,249,249,86,247,67,248,249,6,86,66,251,249,86,247,6,86,256,249,249,249,7,249,66,86,66,247,248,249,6,86,66,251,67,66,66,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,247,67,248,249,6,86,66,251,293,0,0,261,261,0,262,259,259,259,261,262,0,0,260,262,34,34,34,34,34,34,34,34,34,34,260,259,262,261,34,260,259,262,261,34,34,262,261,34,262,261,261,34,34,262,261,34,34,34,261,261,261,34,34,34,34,34,260,260,259,259,262,261,34,260,259,262,261,261,34,34,260,259,262,261,34,34,34,34,34,261,34,34,34,34,262,262,34,262,261,260,259,34,260,259,262,261,34,260,259,262,261,34,260,259,262,261,34,34,34,260,259,262,261,265,265,270,270],"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}}cC`}{{Bf{AbBd}}}{{Bn{Cf}}}}{{{h{j}}}Ch}{{{h{j}}}{{h{{Cj{Ch}}}}}}{{{h{f}}}{{h{{Cn{Cl}}}}}}`{{{h{f}}}b}`{{{h{c}}}{{h{e}}}{}{}}00000000000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000000000{{{h{df}}D`}{{Bf{{Dd{Db}}Df}}}}{{{h{df}}}{{Dd{Db}}}}{{{h{f}}{h{Bl}}}{{Bf{DhDj}}}}{{{h{f}}{h{Bl}}}{{Bf{DlDj}}}}{{{h{df}}{h{Bl}}}Ab}`````{{DnE`}Dn}{{DnEb}Dn}{{{h{f}}}Ed}{{{h{b}}}b}{{{h{j}}}j}{{{h{Ef}}}Ef}{{{h{Eh}}}Eh}{{{h{Ej}}}Ej}{{{h{El}}}El}{{{h{Cf}}}Cf}{{{h{En}}}En}{{{h{c}}{h{de}}}Ab{}{}}0000000{{{h{j}}{h{j}}}F`}``{{{h{dc}}Fb}{{Bf{{Fd{c}}Ff}}}Fh}{{cc}Fb{FjFlAl}}{{{h{dc}}Fb}{{Bf{{Fd{c}}Ff}}}Fn}{cFb{FjFlAl}}{{Fb{h{dc}}}{{Bf{{Fd{c}}Ff}}}Fh}{{Fb{h{dc}}}{{Bf{{Fd{c}}Ff}}}Fn}{Fb{{Bf{fG`}}}}0{{}b}{{}Dn}{{}El}{{}Cf}{{{h{{Fd{c}}}}}{{h{e}}}{}{}}{{{h{En}}}{{h{c}}}{}}{{{h{d{Fd{c}}}}}{{h{de}}}{}{}}{{{h{f}}j}{{Gb{Bb}}}}`{{{h{f}}Af}{{Gb{{Cb{jBb}}}}}}`{{Dnj{Gb{c}}}Dn{FjFl}}``{{{h{f}}j}Gd}{c{{Bf{b}}}Gf}{c{{Bf{j}}}Gf}{c{{Bf{Ef}}}Gf}{c{{Bf{El}}}Gf}{{{h{b}}{h{b}}}Gh}{{{h{j}}{h{j}}}Gh}{{{h{Ef}}{h{Ef}}}Gh}{{{h{Eh}}{h{Eh}}}Gh}{{{h{Ej}}{h{Ej}}}Gh}{{{h{El}}{h{El}}}Gh}{{{h{{Gj{c}}}}{h{{Gj{c}}}}}GhGl}{{{h{En}}{h{En}}}Gh}{{{h{Gn}}{h{Gn}}}Gh}{{{h{H`}}{h{H`}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000``{DnDn}`{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}{{{h{b}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{j}}{h{dHh}}}Hl}{{{h{Ef}}{h{dHh}}}Hl}{{{h{Eh}}{h{dHh}}}Hl}{{{h{Ej}}{h{dHh}}}Hl}{{{h{El}}{h{dHh}}}Hl}{{{h{{Fd{c}}}}{h{dHh}}}HlHn}{{{h{I`}}{h{dHh}}}Hl}0{{{h{{Gj{c}}}}{h{dHh}}}HlIb}{{{h{{Gj{c}}}}{h{dHh}}}HlHn}{{{h{{Ff{c}}}}{h{dHh}}}HlIb}{{{h{{Ff{c}}}}{h{dHh}}}HlHn}{{{h{f}}{h{dHh}}}Hl}{{{h{Cf}}{h{dHh}}}Hl}{{{h{En}}{h{dHh}}}Hl}0{{{h{Gn}}{h{dHh}}}Hl}0{{{h{H`}}{h{dHh}}}Hl}{{{h{Id}}{h{dHh}}}Hl}0`{cc{}}000000{{{Ih{ClIf}}}El}{IfEl}{IjEl}{{{Il{Cl}}}El}444{H`{{Gj{c}}}{}}555{InCf}{{{J`{j}}}Cf}77{H`Gn}888{{{h{Jb}}}{{Jd{El}}}}{{FbE`}Fb}{{{h{f}}Ef{Gb{Jf}}Gh}{{Bf{JhJj}}}}{{{h{f}}j}{{A`{Jl}}}}{{{h{f}}D`}{{Gb{Jn}}}}{{{h{f}}K`}{{Gb{Ef}}}}{{{h{j}}{h{dc}}}AbKb}{{{h{Ef}}{h{dc}}}AbKb}```{{{h{Jb}}}{{Jd{Ab}}}}{{{h{d{Fh{}{{Kd{c}}}}}}}{{Bf{Elc}}}{}}{{{h{d{Fn{}{{Kd{c}}}}}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{df}}K`Kl}Ab}{ce{}{}}00000000000000000{{{h{Kn}}{h{L`}}}Gh}{{{h{El}}}Gh}{{{h{f}}Af}Gh}```{{{h{f}}}{{`{{Aj{}{{Ad{{Cb{j{h{Lb}}}}}}}}}}}}{{FbjLd}Fb}{{DnjLd}Dn}``{{{h{f}}}Lf}{{{h{f}}}{{`{{Aj{}{{Ad{Ef}}}}}}}}0{{{h{f}}j}{{`{{Lh{}{{Ad{En}}}}}}}}{{{h{dc}}Dn}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fh}{{}Dn}{{{h{dc}}Dn}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fn}{{Dn{h{dc}}}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fh}{{Dn{h{dc}}}{{Bf{{Gb{{Fd{c}}}}Gj}}}Fn}{{DnEl}{{Bf{{Gb{f}}Gn}}}}{{ElDn}{{Bf{{Gb{f}}Gn}}}}{{{h{f}}}{{h{Lj}}}}`{{FbBb}Fb}{{DnBb}Dn}{{{h{df}}jBb}Gh}{{{h{dEl}}El}Ab}`{{FbEb}Fb}{{{h{f}}}Eb}`{{cc}Fb{FjFl}}={cFb{FjFl}}{{{h{f}}j}Bb}{{{h{df}}j}En}{{{h{Ej}}}K`}`{{{h{j}}{h{j}}}{{Gb{F`}}}}{{{h{f}}jBb}En}{{{h{d{Fh{}{{Kd{c}}}}}}{h{El}}}{{Bf{Abc}}}{}}{{{h{d{Fn{}{{Kd{c}}}}}}{h{El}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{d{Fd{c}}}}{h{dc}}}{{Bf{Gh}}}Fh}{{{h{d{Fd{c}}}}{h{dc}}}{{Bf{Gh}}}Fn}{{{h{El}}{h{Jb}}}{{Jd{Ab}}}}{{{h{f}}j}{{Bf{{Gb{Ll}}G`}}}}`{{{h{f}}j}{{h{Lb}}}}{{{h{df}}jBb}{{`{{Aj{}{{Ad{En}}}}}}}};```{{{h{f}}}{{h{{M`{Ln}}}}}}{{{h{f}}{h{Bl}}}{{Cb{DhDh}}}}{{{h{Ej}}}{{Gb{Mb}}}}``{{{h{b}}c}BfMd}{{{h{j}}c}BfMd}{{{h{Ef}}c}BfMd}{{{h{El}}c}BfMd}{{{h{df}}jLd}Ab}{{{h{df}}c}Ab{{Cd{}{{Ad{{Cb{jLd}}}}}}}}{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}```{{{h{f}}}{{h{{Mf{j}}}}}}{{{h{f}}}{{Gb{{h{El}}}}}}{{{h{df}}}{{Gb{{h{dEl}}}}}}{{{h{f}}}{{Mh{j}}}}{{{h{f}}}{{Mj{{Cb{jBb}}}}}}{{{h{df}}}{{Gb{El}}}}``{{{h{c}}}e{}{}}0000000{{{h{c}}}Gd{}}000000{{{h{b}}}Dh}{{{h{f}}}{{`{{Aj{}{{Ad{Jn}}}}}}}}{{{h{f}}c}{{Ml{Jn}}}{{N`{{h{Jn}}{h{Jn}}}{{Mn{F`}}}}}}``2`{c{{Bf{e}}}{}{}}00000000000000000000000000000000000`{{{h{f}}}{{h{{Cn{Cl}}}}}}```{{{h{Ej}}}{{h{Kl}}}}`{{{h{c}}}Nb{}}00000000000000000{{{h{f}}j}{{`{{Aj{}{{Ad{{Ah{Af}}}}}}Al}}}}{{{h{df}}jBb}Gh}``{{}{{h{Nd}}}}{ce{}{}}00000000000000000{{c{Gb{c}}Eb{h{{M`{Ln}}}}}{{Bf{GdG`}}}Fj}````````````````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{dc}}}{{h{de}}}{}{}}000000{{{h{Nf}}}Nf}{{{h{Nh}}}Nh}{{{h{Nj}}}Nj}{{{h{{Nl{c}}}}}{{Nl{c}}}Al}{{{h{Nn}}}Nn}{{{h{c}}{h{de}}}Ab{}{}}0000{{{h{O`}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{{h{Nh}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{{h{Nj}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{{h{{Nl{c}}}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{de}}}{{Bf{ObNf}}}O`Od}{{{h{Nn}}{Ml{Eh}}{Ml{Eh}}DlC`{h{L`}}{h{dc}}}{{Bf{ObNf}}}Od}{{C`Dl{h{L`}}}Of}{{}Nh}{{}Nj}{{}{{Nl{c}}}Oh}{{}Nn}{{{h{Nf}}{h{Nf}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0``{{{h{Nf}}{h{dHh}}}Hl}0{{{h{Of}}{h{dHh}}}Hl}{{{h{Ob}}{h{dHh}}}Hl}{{{h{Nh}}{h{dHh}}}Hl}{{{h{Nj}}{h{dHh}}}Hl}{{{h{{Nl{c}}}}{h{dHh}}}HlHn}{{{h{Nn}}{h{dHh}}}Hl}{cc{}}000000{ce{}{}}000000{{{h{Ob}}}C`}`{{C`c}{{Nl{c}}}{}}`1{{{h{c}}}e{}{}}0000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nb{}}0000006666666```````````````````````````````````````````{{{h{{Oj{c}}}}Eb}{{Bf{OlOn}}}{A@`A@b}}{{}A@d}0{{{h{{A@f{ce}}}}}{{h{{A@h{ce}}}}}A@`A@j}{{{h{{h{{A@f{ce}}}}}}}{{A@l{{h{{A@f{ce}}}}}}}A@`A@j}{{{h{{Oj{A@n}}}}Bb}{{Bf{{Oj{AA`}}AAb}}}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{dc}}}{{h{de}}}{}{}}000{{{h{{A@f{ce}}}}}{{Ml{{h{{A@f{ce}}}}}}}A@`A@j}{{{h{{A@f{ce}}}}{h{g}}}{{AAf{{AAd{c}}}}}{A@bA@`}A@j{{AAh{c}}}}0`{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{A@f{cAC`}}}}}{{Bf{AbAAl}}}A@`}{{{h{{A@f{cACb}}}}}{{Bf{AbAAl}}}A@`}2022102102{{{h{c}}}{{Bf{AbAAl}}}A@`}00{{{h{{A@h{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{A@h{cAC`}}}}}{{Bf{AbAAl}}}A@`}{{{h{{A@h{cACb}}}}}{{Bf{AbAAl}}}A@`}{{{h{{Cj{{Ml{Ch}}}}}}}{{Bf{AbAAl}}}}00`{{{h{{Oj{c}}}}}{{Oj{c}}}{AlA@`}}{{{h{AC`}}}AC`}{{{h{ACb}}}ACb}{{{h{{A@f{ce}}}}}{{A@f{ce}}}{AlA@`}{AlA@j}}{{{h{c}}{h{de}}}Ab{}{}}000{{{h{{Oj{c}}}}{h{{Oj{c}}}}}F`{ACdA@`}}{{{h{AC`}}{h{AC`}}}F`}{{{h{ACb}}{h{ACb}}}F`}{{{h{{A@f{ce}}}}{h{{A@f{ce}}}}}F`A@`A@j}{{{h{{A@f{ce}}}}}GhA@`A@j}{{{h{{Oj{A@n}}}}Bb}{{Bf{{Oj{AA`}}AAb}}}}{{{h{{Oj{AA`}}}}{h{{M`{c}}}}}{{Bf{{Oj{ACf}}AAb}}}ACh}{{{h{{Oj{A@n}}}}{h{{M`{c}}}}Bb}{{Bf{{Oj{ACf}}AAb}}}ACh}{{{h{{Oj{c}}}}}ACjA@`}{{{h{{Oj{A@n}}}}}ACl}{c{{Bf{{Oj{e}}}}}GfACn}{c{{Bf{{A@f{eg}}}}}GfACnA@j}{{{h{{Oj{A@n}}}}}C`}{{{h{{A@f{ce}}}}}Af{A@bA@`}A@j}{{{h{{Oj{c}}}}{h{{Oj{c}}}}}Gh{GlA@`}}{{{h{AC`}}{h{AC`}}}Gh}{{{h{ACb}}{h{ACb}}}Gh}{{{h{{A@f{ce}}}}{h{{A@f{ce}}}}}GhA@`A@j}{{{h{c}}{h{e}}}Gh{}{}}0000000`{{{h{{Oj{c}}}}}{{Bf{AfOn}}}{A@`A@b}}`{{{h{{A@f{ce}}}}{h{AD`}}}{{Bf{AbADb}}}A@`A@j}{{{h{ADd}}{h{Jl}}ADf{h{{M`{Ln}}}}}{{Bf{{Gb{Ll}}G`}}}}{{{h{{Oj{A@n}}}}{h{Jl}}ADf{h{{M`{Ln}}}}}{{Bf{{Gb{Ll}}G`}}}}{{{h{{A@f{A@nc}}}}{h{Jl}}ADf{h{{M`{Ln}}}}}{{Bf{{Gb{Ll}}G`}}}A@j}{{{h{{Oj{A@n}}}}{h{{M`{c}}}}{h{L`}}{ADh{Bb}}}{{Bf{{Gb{{Cb{Bb{Oj{ACf}}}}}}AAb}}}ACh}{{{h{{Oj{c}}}}{h{dHh}}}{{Bf{AbHj}}}A@`}0{{{h{AC`}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ACb}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{A@f{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@`A@j}0{{{h{{Oj{c}}}}e}GhA@`{{N`{{h{c}}}{{Mn{Gh}}}}}}{{{h{{A@f{ce}}}}g}GhA@`A@j{{N`{{h{c}}}{{Mn{Gh}}}}}}{{{ADj{c}}}{{Oj{c}}}A@`}{{{ADl{c}}}{{Oj{c}}}A@`}{{{ADn{c}}}{{Oj{c}}}A@`}{{{AE`{c}}}{{Oj{c}}}A@`}{{{AEb{c}}}{{Oj{c}}}A@`}{{{AEd{c}}}{{Oj{c}}}A@`}{cc{}}000{{{A@h{ce}}}{{Bf{{A@f{ce}}On}}}A@`A@j}{{{A@h{ce}}AEfAEh}{{A@f{ce}}}A@`A@j}{{{h{Nd}}}{{Bf{{Oj{c}}On}}}ACn}{{{h{Nd}}}{{Bf{{A@f{ce}}On}}}ACnA@j}{{{h{Nd}}{h{AD`}}}{{Bf{{A@f{ce}}On}}}ACnA@j}1{{{h{AEj}}}{{Bf{{Oj{c}}On}}}ACn}{{{h{AEj}}}{{Bf{{A@f{ce}}On}}}ACnA@j}{{{h{{A@f{ce}}}}AEl}{{Gb{{h{{A@f{ce}}}}}}}A@`A@j}{{{h{{A@f{ce}}}}AEl}{{Gb{c}}}A@`A@j}{{{h{{Oj{c}}}}e}{{Bf{{Cb{{Ml{{Ml{Ch}}}}Af}}On}}}{A@`A@b}{{AEn{c}}}}0{{{h{{A@f{ce}}}}}GhA@`A@j}0{{{h{{Oj{A@n}}}}}Gh}{{{h{{Oj{c}}}}{h{de}}}Ab{AF`A@`}Kb}{{{h{AC`}}{h{dc}}}AbKb}{{{h{ACb}}{h{dc}}}AbKb}{{{h{{A@f{ce}}}}{h{dg}}}AbA@`A@jKb}{ce{}{}}000{{{A@f{ce}}}{{A@h{ce}}}A@`A@j}{{{Oj{A@n}}}{{Bf{{Ml{{Oj{A@n}}}}On}}}}{{Fj{h{{M`{Ln}}}}Eb}{{Bf{{Cb{LbLd}}G`}}}}{{Lb{h{{M`{Ln}}}}Eb}{{Bf{{Cb{LbLd}}G`}}}}99:{{{h{{A@f{ce}}}}}{{AFb{ce}}}A@`A@j}{{{h{{A@f{ce}}}}}{{AFd{ce}}}A@`A@j}{{{h{{Oj{c}}}}}{{Bf{{AFf{c}}On}}}A@`}{{{h{{A@f{ce}}}}}{{Bf{{AFf{c}}On}}}A@`A@j}{{{h{{A@f{ce}}}}}{{Bf{AbAFh}}}A@`A@j}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Gb{AEl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{A@f{cAC`}}}}}{{Gb{AEl}}}A@`}{{{h{{A@f{cACb}}}}}{{Gb{AEl}}}A@`}{{{h{{A@f{ce}}}}}{{Bf{AElOn}}}A@`A@j}{{{h{{Oj{c}}}}}{{Bf{AElOn}}}A@`}1{{{h{{Oj{c}}}}}{{Bf{AFjOn}}}A@`}{{}{{h{Nd}}}}00{{{A@f{cAFl}}}{{Bf{{Oj{c}}On}}}A@`}{c{{Oj{c}}}A@`}{c{{Bf{{Oj{c}}On}}}A@`}{{{A@f{cAC`}}}{{Bf{{Oj{c}}On}}}A@`}{{AEl{Ml{c}}}{{Bf{{Oj{c}}On}}}A@`}{{{AE`{c}}}{{Oj{c}}}A@`}{{{ADl{c}}}{{Oj{c}}}A@`}4{{{A@f{cACb}}}{{Bf{{Oj{c}}On}}}A@`}3{{c{Gb{{AFn{c}}}}}{{Bf{{Oj{c}}On}}}A@`}614`{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{L`}}}{{Bf{{A@f{c}}On}}}A@j}{{{h{{M`{c}}}}{h{Nd}}}{{Bf{{Cb{{Oj{A@n}}{An{A@nAG`}}}}On}}}AGb}1{{{h{L`}}{h{AD`}}}{{Bf{{A@f{c}}On}}}A@j}{{{h{{Oj{c}}}}{h{{Oj{c}}}}}{{Gb{F`}}}{AGdA@`}}{{{h{AC`}}{h{AC`}}}{{Gb{F`}}}}{{{h{ACb}}{h{ACb}}}{{Gb{F`}}}}{{{h{{A@f{ce}}}}{h{{A@f{ce}}}}}{{Gb{F`}}}A@`A@j}{{{h{c}}}AElA@`}00{{{Oj{AA`}}{h{c}}}{{Bf{AGf{Oj{AA`}}}}}{{AAh{AA`}}}}0`{{{h{{A@f{ce}}}}}GhA@`A@j}{{{h{{Oj{c}}}}}{{Bf{AbOn}}}A@`}{{{h{{A@f{ce}}}}}{{Bf{AbADb}}}A@`A@j}{{{h{{Oj{c}}}}{h{dAGh}}e}{{Bf{AbOn}}}{A@`A@b}{{AEn{c}}}}{{{h{{A@f{ce}}}}g}{{Bf{{Ml{{Ml{Ch}}}}On}}}{A@bA@`}A@j{{AEn{c}}}}0{{{h{{Oj{c}}}}}{{Bf{AfOn}}}{A@`A@b}}{{{h{{Oj{c}}}}}Af{A@`A@b}}{{{h{{A@f{ce}}}}}AElA@`A@j}{{{h{{Oj{c}}}}e}BfA@`Md}{{{h{{A@f{ce}}}}g}BfA@`A@jMd}{{}AGj}00{{{h{{A@f{ce}}}}{h{{An{ABlc}}}}}{{A@f{ce}}}A@`A@j}`{{{h{c}}}e{}{}}000{{{h{c}}}Gd{}}0{{{h{{Oj{A@n}}}}{h{{An{A@nAG`}}}}}Gd}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}0{{{h{{Oj{c}}}}{h{di}}}{{Bf{{AGl{g}}}}}A@`A@`{}{{AGn{ceg}}}}{{{h{{A@f{ce}}}}{h{dk}}}{{Bf{{AGl{i}}}}}A@`A@jA@`{}{{AGn{cgi}}}}{c{{Bf{e}}}{}{}}0000000`{{{h{c}}}Nb{}}000={ce{}{}}000{{{h{{A@f{ce}}}}}GhA@`A@j}{{{h{Nd}}}{{Bf{GdG`}}}}``````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{G`}}{h{G`}}}Gh}{{{h{G`}}{h{dHh}}}Hl}0{AH`G`}{AHbG`}{AHdG`}{AHfG`}{OnG`}{AHhG`}{AHjG`}{cc{}}>{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0{{{h{c}}}Nb{}}{ce{}{}}```````````````````````````````````???????>>>>>>>{{{h{AHl}}}AHl}{{{h{AHn}}}AHn}{{{h{AI`}}}AI`}{{{h{Ll}}}Ll}{{{h{AIb}}}AIb}{{{h{ADf}}}ADf}{{{h{c}}{h{de}}}Ab{}{}}00000``{{}AIb}{{{h{AHl}}{h{AHl}}}Gh}{{{h{AHn}}{h{AHn}}}Gh}{{{h{AI`}}{h{AI`}}}Gh}{{{h{Ll}}{h{Ll}}}Gh}{{{h{AIb}}{h{AIb}}}Gh}{{{h{AHd}}{h{AHd}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000{{{h{AHl}}{h{dHh}}}Hl}{{{h{AHn}}{h{dHh}}}Hl}{{{h{AI`}}{h{dHh}}}Hl}{{{h{Ll}}{h{dHh}}}Hl}{{{h{AIb}}{h{dHh}}}Hl}{{{h{AHd}}{h{dHh}}}Hl}0{{{h{ADf}}{h{dHh}}}Hl}{cc{}}00{GhAI`}1{AHnLl}222{{{h{Ll}}{h{{An{Gd{Ml{AEl}}}}}}}{{Bf{AIbAHd}}}}{{{h{AHl}}{h{dc}}}AbKb}{{{h{AIb}}{h{dc}}}AbKb}{{{h{AHn}}}Gd}`{ce{}{}}000000{{{h{AHn}}}Gh}{{{h{AI`}}}Gh}{{{h{AIb}}}Gh}`{{{h{AIb}}{h{AIb}}}{{Gb{F`}}}}{{{h{Ll}}}Gh}`{{{h{AHl}}c}BfMd}{{{h{AHn}}c}BfMd}{{{h{AI`}}c}BfMd}{{{h{Ll}}c}BfMd}{{{h{AIb}}c}BfMd}`{{{h{c}}}e{}{}}00000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nb{}}000000>>>>>>>``````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000{{AIdEb}{{Bf{AIfG`}}}}{{{AIh{c}}Eb}{{Bf{AIfG`}}}{{AIj{AC`}}}}{{{AIl{c}}Eb}{{Bf{AIfG`}}}{{AIj{ACb}}}}{{{AIn{c}}Eb}{{Bf{AIfG`}}}{{AIj{ACb}}}}{{{AJ`{c}}Eb}{{Bf{AIfG`}}}{{AIj{AJb}}}}{{{AJd{c}}Eb}{{Bf{AIfG`}}}{{AJf{AC`}}}}{{{AJh{c}}Eb}{{Bf{AIfG`}}}{{AJf{AC`}}}}{{{AJj{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AJl{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AJn{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AK`{c}}Eb}{{Bf{AIfG`}}}{{AJf{ACb}}}}{{{AKb{c}}Eb}{{Bf{AIfG`}}}{{AJf{AJb}}}}{{{AKd{c}}Eb}{{Bf{AIfG`}}}{{AJf{AJb}}}}{{{h{{AIh{c}}}}}{{AIh{c}}}{Al{AIj{AC`}}}}{{{h{{AIl{c}}}}}{{AIl{c}}}{Al{AIj{ACb}}}}{{{h{{AIn{c}}}}}{{AIn{c}}}{Al{AIj{ACb}}}}{{{h{{AJ`{c}}}}}{{AJ`{c}}}{Al{AIj{AJb}}}}{{{h{{AJd{c}}}}}{{AJd{c}}}{Al{AJf{AC`}}}}{{{h{{AJh{c}}}}}{{AJh{c}}}{Al{AJf{AC`}}}}{{{h{{AJj{c}}}}}{{AJj{c}}}{Al{AJf{ACb}}}}{{{h{{AJl{c}}}}}{{AJl{c}}}{Al{AJf{ACb}}}}{{{h{{AJn{c}}}}}{{AJn{c}}}{Al{AJf{ACb}}}}{{{h{{AK`{c}}}}}{{AK`{c}}}{Al{AJf{ACb}}}}{{{h{{AKb{c}}}}}{{AKb{c}}}{Al{AJf{AJb}}}}{{{h{{AKd{c}}}}}{{AKd{c}}}{Al{AJf{AJb}}}}{{{h{c}}{h{de}}}Ab{}{}}00000000000{{{h{{AIh{c}}}}{h{dHh}}}Hl{Hn{AIj{AC`}}}}{{{h{{AIl{c}}}}{h{dHh}}}Hl{Hn{AIj{ACb}}}}{{{h{{AIn{c}}}}{h{dHh}}}Hl{Hn{AIj{ACb}}}}{{{h{{AJ`{c}}}}{h{dHh}}}Hl{Hn{AIj{AJb}}}}{{{h{{AJd{c}}}}{h{dHh}}}Hl{Hn{AJf{AC`}}}}{{{h{{AJh{c}}}}{h{dHh}}}Hl{Hn{AJf{AC`}}}}{{{h{{AJj{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AJl{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AJn{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AK`{c}}}}{h{dHh}}}Hl{Hn{AJf{ACb}}}}{{{h{{AKb{c}}}}{h{dHh}}}Hl{Hn{AJf{AJb}}}}{{{h{{AKd{c}}}}{h{dHh}}}Hl{Hn{AJf{AJb}}}}{cc{}}00000000000{ce{}{}}00000000000{{AIf{h{{M`{Ln}}}}Eb}{{Bf{{Cb{LbLd}}G`}}}}{{c{h{{M`{Ln}}}}Eb}{{Bf{{Cb{{Oj{A@n}}{An{A@nAG`}}}}G`}}}{}}00000000000{{{h{c}}}e{}{}}00000000000{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nb{}}00000000000555555555555`````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{dc}}}{{h{de}}}{}{}}00{{{h{AKf}}}AKf}{{{h{c}}{h{de}}}Ab{}{}}{{{h{AKf}}{h{dHh}}}Hl}0{{{h{Jj}}{h{dHh}}}Hl}0{{{h{Df}}{h{dHh}}}Hl}0=={AKfJj}{AHdJj}{AKhJj}{G`Jj}{NfJj}{cc{}}{ce{}{}}00{{{h{c}}}e{}{}}{{{h{c}}}Gd{}}00{c{{Bf{e}}}{}{}}00000{{{h{c}}}Nb{}}00444``````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{AKj}}}{{Gb{Gd}}}}{{{h{AKj}}}Gd}{c{{Bf{AKj}}}Gf}{{{h{f}}{h{Nd}}Gh}{{Bf{AKj{h{Nd}}}}}}{{{h{AKj}}{h{dHh}}}Hl}0<{{{h{Nd}}}{{Bf{AKjc}}}{}}<``{{{h{AKj}}c}BfMd};::9=```````````````````````````````````````````{{}AKl}{{}A@d}{{A@nBb}{{Bf{AA`AAb}}}};;;;;;;;;;;;::::::::::::{{{h{{AKn{ce}}}}{h{g}}}{{AAf{{AAd{c}}}}}{A@bA@`}A@j{{AAh{c}}}}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}00000{{{h{c}}}{{Bf{AbAAl}}}A@`}{{{h{{A@h{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbAAl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{h{{Cj{{Ml{Ch}}}}}}}{{Bf{AbAAl}}}}{{{h{{AL`{ce}}}}}{{AL`{ce}}}AlA@j}{{{h{A@d}}}A@d}{{{h{ALb}}}ALb}{{{h{{AKn{ce}}}}}{{AKn{ce}}}{AlA@`}{AlA@j}}{{{h{A@n}}}A@n}{{{h{AG`}}}AG`}{{{h{ALd}}}ALd}{{{h{ALf}}}ALf}{{{h{ALh}}}ALh}{{{h{c}}{h{de}}}Ab{}{}}00000000{{{h{{AKn{ce}}}}{h{{AKn{ce}}}}}F`{ACdA@`}{ACdA@j}}{{{h{A@n}}{h{A@n}}}F`}{{{h{ALd}}{h{ALd}}}F`}{{{h{ALh}}{h{ALh}}}F`}`{{}ALb}{{{h{{AL`{ce}}}}}{{h{g}}}{}A@j{}}{{A@nBb}{{Bf{AA`AAb}}}}{c{{Bf{A@n}}}Gf}{{{h{{AKn{ce}}}}}Af{A@bA@`}A@j}{{{h{A@d}}{h{A@d}}}Gh}{{{h{AHh}}{h{AHh}}}Gh}{{{h{{AKn{ce}}}}{h{{AKn{ce}}}}}Gh{GlA@`}{GlA@j}}{{{h{A@n}}{h{A@n}}}Gh}{{{h{AG`}}{h{AG`}}}Gh}{{{h{ALd}}{h{ALd}}}Gh}{{{h{ALf}}{h{ALf}}}Gh}{{{h{ALh}}{h{ALh}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000000000{{{h{{ALj{c}}}}{h{dHh}}}Hl{HnA@j}}{{{h{A@d}}{h{dHh}}}Hl}{{{h{ALb}}{h{dHh}}}Hl}{{{h{AHh}}{h{dHh}}}Hl}0{{{h{{AKn{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@`A@j}0{{{h{A@n}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{AG`}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{ALd}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALf}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALh}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{AKn{ce}}}}g}GhA@`A@j{{N`{{h{c}}}{{Mn{Gh}}}}}}{ALl{{ALn{c}}}A@j}{AM`{{ALn{c}}}A@j}{cc{}}0000{AHbAHh}1{OnAHh}22{AA`A@n}3333{{A@nAKl}{{ALj{c}}}A@j}{{AG`AKl}{{ALj{c}}}A@j}{{{h{Nd}}}{{Bf{A@n}}}}{{{h{Nd}}}{{Bf{AG`}}}}{{{h{AEj}}}{{Bf{{AKn{ce}}On}}}{AMbA@`}A@j}{{{h{A@n}}}{{Gb{AMd}}}}{{{h{A@n}}}{{Ml{AMd}}}}{c{{Bf{{AL`{{AMj{}{{AMf{e}}{AMh{c}}{Kd{g}}}}i}}g}}}{}{{AMl{{Cj{Ch}}}}Oh}HnA@j}{{}{{Bf{{AL`{AMnc}}e}}}A@j{}}{{{h{dc}}}{{Bf{{AL`{AMne}}g}}}{AN`Od}A@j{}}{{c{h{de}}}{{Bf{{AL`{{AMj{}{{AMf{g}}{AMh{c}}{Kd{i}}}}k}}i}}}{}{AN`Od}{{AMl{{Cj{Ch}}}}Oh}HnA@j}{{ce}{{Bf{{AL`{{AMj{}{{AMf{e}}{AMh{c}}{Kd{g}}}}i}}g}}}{}{{AMl{{Cj{Ch}}}}Oh}HnA@j}{c{{Bf{{AL`{AMne}}g}}}{}A@j{}}{{{h{{ALn{c}}}}}GhA@j}{{{h{A@n}}}Gh}{{{h{{AKn{ce}}}}{h{dg}}}Ab{AF`A@`}{AF`A@j}Kb}{{{h{A@n}}{h{dc}}}AbKb}{{{h{ALd}}{h{dc}}}AbKb}{{{h{ALh}}{h{dc}}}AbKb}{ce{}{}}00000000000{A@nANb}{AIj{{Bf{{ALj{c}}AHh}}}A@j}{{AJf{Gb{ANd}}AMd}{{Bf{{ALj{c}}AHh}}}A@j}{{{AL`{ec}}}{{Bf{{ALj{c}}AHh}}}A@j{{AIj{c}}}}{{{AL`{ec}}{Gb{ANd}}AMd}{{Bf{{ALj{c}}AHh}}}A@j{{AJf{c}}}}{{{ALj{c}}}{{Bf{{ALj{c}}AHh}}}A@j}{A@n{{Bf{{ALj{c}}AHh}}}A@j}{AG`{{Bf{{ALj{c}}AHh}}}A@j}{AJf{{Bf{{ALn{c}}AHh}}}A@j}{{{ALn{c}}}{{Bf{{ALn{c}}AHh}}}A@j}{{{AL`{ec}}}{{Bf{{ALn{c}}AHh}}}A@j{{AJf{c}}}}{{{AL`{ce}}}c{}A@j}{A@n{{Ml{A@n}}}}{AG`{{Ml{AG`}}}}{{{ALn{c}}Eb}{{Gb{ALl}}}A@j}{{{ALn{c}}Eb{h{{M`{e}}}}}AM`A@jAGb}{{{h{A@n}}}Gh}{{}Gh}{{{h{A@d}}}Gh}2{{{h{AG`}}}Gh}212133{{{h{{AKn{ce}}}}}AElA@`A@j}``{{{h{{AKn{ce}}}}}{{Bf{{AFf{c}}On}}}A@`A@j}{{}AKl}{{{h{A@n}}}ANf}{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Gb{AEl}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}44{{{h{AKl}}{h{AKl}}}AKl}5{{}{{h{Nd}}}}{{AEl{Ml{c}}}{{Bf{{AKn{ce}}On}}}A@`A@j}{{{h{A@n}}}AEl}``{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}{{{ALj{c}}AKl}{{ALj{c}}}A@j}{{{h{{AKn{ce}}}}{h{{AKn{ce}}}}}{{Gb{F`}}}{AGdA@`}{AGdA@j}}{{{h{A@n}}{h{A@n}}}{{Gb{F`}}}}{{{h{ALd}}{h{ALd}}}{{Gb{F`}}}}{{{h{ALh}}{h{ALh}}}{{Gb{F`}}}}{{{h{c}}}AElA@`}{{{h{{AKn{ce}}}}}{{h{{Cj{c}}}}}A@`A@j}{{{h{{AKn{ce}}}}}{{Bf{AbOn}}}A@`A@j}{{{h{{AKn{ce}}}}g}{{Bf{{Ml{{Ml{Ch}}}}On}}}{A@bA@`}A@j{{AEn{c}}}}{{{h{{AKn{ce}}}}}AElA@`A@j}{{{h{A@n}}c}BfMd}{{}AGj}{{{h{{AKn{ce}}}}}{{A@h{ce}}}{A@bA@`}A@j}{{}AKl}{{{h{c}}}e{}{}}00000000{{{h{AG`}}{h{{M`{c}}}}}{{Bf{A@nANh}}}AGb}{{{h{c}}}Gd{}}000{{{h{{A@f{c{A@j{}{{AAj{e}}}}}}}}}{{Bf{AbOn}}}A@`{{ABn{}{{AAn{AB`}}{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}}}A@`A@`A@`A@`}}0{{{h{{AKn{ce}}}}{h{dk}}}{{Bf{{AKn{ge}}{AGl{i}}}}}A@`A@jA@`{}{{AGn{cgi}}}}{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nb{}}00000000000{ce{}{}}00000000000`{{{h{ANj}}}{{Gb{Dh}}}}{{{h{ANj}}}{{Gb{Dl}}}}{{{h{ANj}}AEl}{{Gb{Kl}}}}`{{{h{Jb}}{h{Nd}}{h{{Cj{{h{{Cj{{h{Nd}}}}}}}}}}}{{Bf{AbANl}}}}````````````````````````````````````{{{h{dJl}}ANnl{A`{n}}}{{Gb{{A`{n}}}}}}``{{{h{Jl}}{h{{M`{Ln}}}}}Ld}`{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{dc}}}{{h{de}}}{}{}}0000000{{Ld{h{{Oj{A@n}}}}{h{{M`{Ln}}}}}Jl}{{{h{ANn}}}ANn}{{{h{AO`}}}AO`}{{{h{{AOb{c}}}}}{{AOb{c}}}{AlAOdHnAl}}{{{h{l}}}l}{{{h{Jl}}}Jl}{{{h{Hd}}}Hd}{{{h{AOf}}}AOf}{{{h{c}}{h{de}}}Ab{}{}}000000{{{h{ANn}}{h{ANn}}}F`}{{{h{l}}{h{l}}}F`}{{}l}{{}Jl}{{}Hd}{{}AOf}{{{h{{AOb{c}}}}}{{h{e}}}{AOdHnAl}{}}{{{h{AOh}}}{{Gb{AG`}}}}0{{{h{{AOb{AOj}}}}}{{Gb{AG`}}}}{{{h{{AOb{{AOl{ALl}}}}}}}{{Gb{AG`}}}}{{{h{{AOb{{AOn{ALl}}}}}}}{{Gb{AG`}}}}{{{h{ANn}}{h{ANn}}}Gh}{{{h{AO`}}{h{AO`}}}Gh}{{{h{l}}{h{l}}}Gh}{{{h{AOf}}{h{AOf}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000{{{h{Jl}}ANn}{{Gb{{h{{A`{n}}}}}}}}{{{h{ANn}}{h{dHh}}}Hl}{{{h{Hf}}{h{dHh}}}Hl}0{{{h{AO`}}{h{dHh}}}Hl}{{{h{{AOb{c}}}}{h{dHh}}}Hl{HnAOdHnAl}}{{{h{l}}{h{dHh}}}Hl}{{{h{Jl}}{h{dHh}}}Hl}{{{h{Hd}}{h{dHh}}}Hl}{{{h{AOf}}{h{dHh}}}Hl}{ABlANn}{cc{}}{ANfANn}1111111{{{h{ANn}}{h{dc}}}AbKb}{{{h{AOh}}{h{{M`{Ln}}}}}ANn}{{{h{{AOb{{AOn{ALl}}}}}}{h{{M`{Ln}}}}}ANn}{{{h{{AOb{AOj}}}}{h{{M`{Ln}}}}}ANn}{{{h{{AOb{{AOl{ALl}}}}}}{h{{M`{Ln}}}}}ANn}{{{h{Jl}}}{{Ml{{h{ANn}}}}}}{ce{}{}}0000000{{cAO`}{{AOb{c}}}{AOdHnAl}}{{}Jl}{{{h{ANn}}{h{ANn}}}{{Gb{F`}}}}{{{h{l}}{h{l}}}{{Gb{F`}}}}{{{h{dJl}}ANnl}{{Gb{{A`{n}}}}}}{{{h{B@`}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{{AOb{AOj}}}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{{AOb{{AOl{ALl}}}}}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{{AOb{{AOn{ALl}}}}}}{h{dHb}}AEl{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{n}}{h{dHb}}{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}}{{{h{c}}{h{dHb}}{h{Hd}}{h{{M`{Ln}}}}}{{Bf{AbHf}}}{}}`{{{h{Jl}}}{{Ml{{h{{A`{n}}}}}}}}`{{{h{c}}}e{}{}}000000{{{h{c}}}Gd{}}``{c{{Bf{e}}}{}{}}000000000000000{{{h{c}}}Nb{}}0000000{ce{}{}}0000000````````````````{{{h{d{Dd{c}}}}{h{e}}}{{h{d{Dd{c}}}}}{}{{B@d{B@b}}}}{{{h{d{Dd{c}}}}K`JhAFj}{{Bf{{h{d{Dd{c}}}}B@f}}}{}}{{{h{d{Dd{c}}}}K`JhAFjMb}{{Bf{{h{d{Dd{c}}}}B@f}}}{}}{{{h{d{Dd{c}}}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}AfDh}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}K`}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}K`}{{Bf{{h{d{Dd{c}}}}B@h}}}{}}{{{h{d{Dd{c}}}}{h{{Cj{K`}}}}}{{Bf{{h{d{Dd{c}}}}B@h}}}{}}{{{h{d{Dd{c}}}}Gh}{{h{d{Dd{c}}}}}{}}{{{h{c}}}{{h{e}}}{}{}}0000{{{h{dc}}}{{h{de}}}{}{}}0000{{{h{d{Dd{c}}}}B@j}{{h{d{Dd{c}}}}}{}}{{{h{{Dd{c}}}}}{{Dd{c}}}Al}{{{h{B@l}}}B@l}{{{h{B@j}}}B@j}{{{h{c}}{h{de}}}Ab{}{}}00{{{h{B@j}}{h{B@j}}}F`}{{{Dd{c}}e}{{Dd{e}}}{}O`}{{{h{d{Dd{c}}}}Bb}{{h{d{Dd{c}}}}}{}}{{}B@l}{{}B@j}{{{h{d{Dd{c}}}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Af}{{h{d{Dd{c}}}}}{}}1{{{h{B@j}}{h{B@j}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0{{{h{d{Dd{c}}}}Dh}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Dl}{{h{d{Dd{c}}}}}{}}{{{Dd{c}}}{{Bf{HbJj}}}O`}{{{Dd{c}}{h{de}}}{{Bf{HbJj}}}O`Od}{{{h{{Dd{c}}}}{h{dHh}}}HlHn}{{{h{B@h}}{h{dHh}}}Hl}0{{{h{B@f}}{h{dHh}}}Hl}0{{{h{B@l}}{h{dHh}}}Hl}{{{h{B@j}}{h{dHh}}}Hl}{cc{}}0000{{{h{B@j}}{h{dc}}}AbKb}>{ce{}{}}0000?{{{h{d{Dd{c}}}}B@n}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}}{{h{d{Dd{c}}}}}{}}0{{{h{d{Dd{c}}}}B@l}{{h{d{Dd{c}}}}}{}}{{{h{B@j}}{h{B@j}}}{{Gb{F`}}}}{{{h{d{Dd{c}}}}{An{Gd{Ml{AEl}}}}j}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Mb}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}{Ml{{Cb{AfDh}}}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}Jf}{{h{d{Dd{c}}}}}{}}{{{h{B@l}}{h{dBl}}}Ab}{{{h{B@l}}{h{dBl}}{h{dc}}}AbOd}{{{h{c}}}e{}{}}00{{{h{c}}}Gd{}}0{c{{Bf{e}}}{}{}}000000000{{{h{c}}}Nb{}}0000{{{h{d{Dd{c}}}}{Ml{K`}}}{{h{d{Dd{c}}}}}{}}{{{h{d{Dd{c}}}}BA`}{{h{d{Dd{c}}}}}{}}{ce{}{}}0000````","D":"GCf","p":[[5,"Balance",0,1990],[0,"mut"],[5,"Wallet",0,1991],[1,"reference"],[6,"KeychainKind",0,1992],[5,"SignerOrdering",1685,1993],[10,"TransactionSigner",1685,1993],[5,"Arc",1994],[1,"unit"],[17,"Item"],[5,"ScriptBuf",1995],[8,"Indexed",1996],[10,"Iterator",1997],[10,"Clone",1998],[5,"BTreeMap",1999],[5,"Block",2000],[1,"u32"],[5,"CannotConnectError",2001],[6,"Result",2002],[5,"BlockId",2003],[6,"ApplyHeaderError",2001],[5,"Transaction",2004],[10,"Into",2005],[1,"u64"],[1,"tuple"],[10,"IntoIterator",2006],[5,"Update",0,1991],[1,"u8"],[1,"slice"],[5,"ConfirmationBlockTime",2003],[5,"TxGraph",2007],[5,"Txid",2004],[8,"DefaultCoinSelectionAlgorithm",486,2008],[5,"TxBuilder",1872,2009],[6,"BuildFeeBumpError",1264,2010],[5,"Amount",2011],[6,"CalculateFeeError",2007],[5,"FeeRate",2012],[5,"LoadParams",0,2013],[5,"BlockHash",2000],[6,"Network",2014],[5,"CheckPointIter",2015],[5,"LocalOutput",0,1992],[5,"WeightedUtxo",0,1992],[6,"Utxo",0,1992],[5,"ChangeSet",0,2016],[5,"AddressInfo",0,1991],[6,"Ordering",2017],[5,"CreateParams",0,2013],[5,"PersistedWallet",0,2018],[6,"CreateWithPersistError",0,2018],[10,"WalletPersister",0,2018],[10,"IntoWalletDescriptor",603],[10,"Send",2019],[10,"AsyncWalletPersister",0,2018],[6,"Error",864],[6,"Option",2020],[5,"String",2021],[10,"Deserializer",2022],[1,"bool"],[6,"LoadWithPersistError",0,2018],[10,"PartialEq",2017],[6,"LoadError",0,1991],[6,"LoadMismatch",0,1991],[5,"Psbt",2023],[5,"SignOptions",1685,1993],[6,"SignerError",1685,1993],[5,"Formatter",2024],[5,"Error",2024],[8,"Result",2024],[10,"Debug",2024],[6,"FileStoreError",0,2018],[10,"Display",2024],[6,"ApplyBlockError",0,1991],[5,"ChangeSet",2025],[5,"ChangeSet",2026],[5,"ChangeSet",2001],[5,"ChangeSet",2007],[5,"SyncResponse",2027],[5,"FullScanResponse",2027],[5,"Transaction",2028],[8,"Result",2029],[5,"PsbtSighashType",2030],[5,"Input",2030],[6,"CreateTxError",1264,2010],[5,"SignersContainer",1685,1993],[8,"WalletTx",0,1991],[5,"OutPoint",2004],[10,"Hasher",2031],[17,"Error"],[10,"Future",2032],[5,"Box",2033],[5,"Pin",2034],[5,"TxOut",2004],[10,"IsDust",0,2035],[5,"Script",2036],[8,"ExtendedDescriptor",603],[8,"KeyMap",1363,2037],[5,"CheckPoint",2015],[10,"DoubleEndedIterator",2038],[5,"LocalChain",2001],[5,"Policy",897],[6,"All",2039],[5,"Secp256k1",2040],[5,"Sequence",2004],[10,"Serializer",2041],[5,"KeychainTxOutIndex",2025],[5,"FullScanRequestBuilder",2027],[5,"SyncRequestBuilder",2027],[5,"Vec",2042],[17,"Output"],[10,"FnMut",2043],[5,"TypeId",2044],[1,"str"],[5,"InsufficientFunds",486,2008],[5,"LargestFirstCoinSelection",486,2008],[5,"OldestFirstCoinSelection",486,2008],[5,"BranchAndBoundCoinSelection",486,2008],[5,"SingleRandomDraw",486,2008],[10,"CoinSelectionAlgorithm",486,2008],[5,"CoinSelectionResult",486,2008],[10,"RngCore",2045],[6,"Excess",486,2008],[10,"Default",2046],[6,"Descriptor",603,2037],[5,"Address",2047],[6,"Error",2048],[10,"MiniscriptKey",2048],[10,"ToPublicKey",2048],[6,"ScriptContextEnum",1363],[5,"Miniscript",603,2049],[6,"Terminal",2050],[10,"ScriptContext",1363,2051],[6,"Tree",2052],[6,"DescriptorPublicKey",1363,2053],[5,"DefiniteDescriptorKey",2053],[6,"ConversionError",2053],[6,"Placeholder",2054],[5,"Satisfaction",2054],[10,"AssetProvider",2055],[17,"Key"],[6,"ScriptContextError",2051],[17,"Sha256"],[5,"Hash",2056],[17,"Hash256"],[5,"Hash",2057],[17,"Ripemd160"],[5,"Hash",2058],[17,"Hash160"],[5,"Hash",2059],[10,"ParseableKey",2050],[6,"Legacy",603,2051],[6,"Segwitv0",603,2051],[10,"Ord",2017],[5,"PublicKey",2060],[10,"Verification",2061],[6,"DescriptorType",2037],[5,"DescriptorId",2062],[10,"FromStrKey",2063],[5,"ExtParams",2064],[6,"AnalysisError",2064],[10,"ExtractPolicy",603],[6,"BuildSatisfaction",897],[5,"Range",2065],[5,"Sh",2066],[5,"Wsh",2067],[5,"Pkh",2068],[5,"Wpkh",2067],[5,"Bare",2068],[5,"Tr",2069],[5,"Type",2070],[5,"ExtData",2071],[5,"Tree",2072],[1,"usize"],[10,"Satisfier",2054],[10,"Hash",2031],[5,"Iter",2073],[5,"PkIter",2073],[6,"Policy",2074],[6,"LiftError",2075],[5,"Weight",2076],[6,"BareCtx",2051],[6,"TapTree",2069],[6,"DescriptorSecretKey",1363,2053],[10,"Signing",2061],[10,"PartialOrd",2017],[5,"Plan",2055],[5,"TxIn",2004],[6,"SigType",2051],[6,"TranslateErr",2048],[10,"Translator",2048],[6,"ParsePublicKeyError",2060],[6,"Error",2077],[6,"PolicyError",897],[6,"Error",2078],[6,"KeyError",1363],[6,"HexToBytesError",2079],[6,"PkOrF",897],[6,"SatisfiableItem",897],[6,"Satisfaction",897],[5,"Condition",897],[10,"DescriptorTemplate",1080],[8,"DescriptorTemplateOut",1080],[5,"P2Pkh",1080],[10,"IntoDescriptorKey",1363],[5,"P2Wpkh_P2Sh",1080],[5,"P2Wpkh",1080],[5,"P2TR",1080],[6,"Tap",2051],[5,"Bip44",1080],[10,"DerivableKey",1363],[5,"Bip44Public",1080],[5,"Bip49",1080],[5,"Bip49Public",1080],[5,"Bip84",1080],[5,"Bip84Public",1080],[5,"Bip86",1080],[5,"Bip86Public",1080],[6,"MiniscriptPsbtError",1264,2010],[6,"Error",2080],[5,"FullyNodedExport",1340,2081],[8,"ValidNetworks",1363],[5,"SortedMultiVec",1363,2082],[5,"GeneratedKey",1363],[5,"PrivateKeyGenerateOptions",1363],[5,"SinglePub",1363,2053],[5,"SinglePriv",1363,2053],[6,"SinglePubKey",1363,2053],[6,"DescriptorKey",1363],[5,"Xpriv",2077],[6,"ExtendedKey",1363],[5,"Xpub",2077],[10,"FromStr",2083],[5,"DerivationPath",2077],[17,"Entropy"],[17,"Options"],[10,"GeneratableKey",1363],[10,"AsMut",2005],[10,"GeneratableDefaultOptions",1363],[10,"CryptoRng",2045],[5,"Assets",2055],[8,"KeySource",2077],[5,"Fingerprint",2077],[5,"DescriptorKeyParseError",2053],[10,"PsbtUtils",1679],[6,"Error",2084],[6,"SignerId",1685,1993],[6,"SignerContext",1685,1993],[5,"SignerWrapper",1685,1993],[10,"Sized",2019],[6,"TapLeavesOptions",1685,1993],[10,"SignerCommon",1685,1993],[5,"PrivateKey",2060],[5,"DescriptorMultiXKey",2053],[5,"DescriptorXKey",2053],[10,"InputSigner",1685,1993],[5,"PushBytes",2085],[10,"AsRef",2005],[6,"AddForeignUtxoError",1872,2009],[6,"AddUtxoError",1872,2009],[6,"ChangeSpendPolicy",1872,2009],[6,"TxOrdering",1872,2009],[6,"LockTime",2086],[1,"i32"],[15,"InvalidTxid",1986],[15,"UnexpectedConnectedToHash",472],[15,"Network",474],[15,"Genesis",474],[15,"Descriptor",474],[15,"Custom",1988],[15,"Foreign",483],[15,"Change",598],[15,"NoChange",598],[8,"DerivedDescriptor",603],[15,"PsbtTimelocks",1056],[15,"Complete",1059],[15,"Partial",1059],[15,"PartialComplete",1059],[15,"Sha256Preimage",1070],[15,"Hash256Preimage",1070],[15,"Ripemd160Preimage",1070],[15,"Hash160Preimage",1070],[15,"Thresh",1070],[15,"Multisig",1070],[15,"AbsoluteTimelock",1070],[15,"RelativeTimelock",1070],[15,"RbfSequenceCsv",1334],[15,"LockTime",1334],[15,"FeeTooLow",1334],[15,"FeeRateTooLow",1334],[8,"WalletExport",1340],[10,"ExtScriptContext",1363],[15,"Tap",1871]],"r":[[0,2009],[1,2009],[2,1991],[3,1991],[4,2018],[5,1990],[9,2016],[10,2009],[11,2013],[12,2018],[21,2018],[24,603],[29,2035],[30,1992],[32,1991],[33,1991],[34,2013],[35,2018],[37,1992],[47,2018],[49,1993],[50,2009],[51,2009],[55,1991],[56,1992],[59,1991],[60,2018],[61,1991],[62,1992],[147,1991],[198,1991],[199,1991],[338,2087],[353,1991],[354,1991],[362,603],[421,1991],[469,1991],[486,2008],[488,2008],[489,2008],[490,2008],[491,2008],[492,2008],[493,2008],[495,2008],[496,2008],[527,2008],[607,2037],[609,2053],[616,2051],[617,2049],[622,897],[623,2051],[624,2051],[658,863],[1264,2010],[1267,2010],[1275,2010],[1340,2081],[1341,2081],[1366,2053],[1367,2053],[1382,2037],[1392,2051],[1397,2053],[1398,2053],[1399,2053],[1400,2082],[1683,2088],[1684,2088],[1692,1993],[1709,1993],[1710,1993],[1711,1993],[1712,1993],[1713,1993],[1714,1993],[1715,1993],[1716,1993],[1718,1993],[1719,1993],[1872,2009],[1873,2009],[1876,2009],[1883,2009],[1884,2009]],"b":[[203,"impl-Display-for-Balance"],[204,"impl-Debug-for-Balance"],[211,"impl-Debug-for-FileStoreError"],[212,"impl-Display-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-Debug-for-LoadError"],[222,"impl-Display-for-LoadError"],[224,"impl-Debug-for-ApplyBlockError"],[225,"impl-Display-for-ApplyBlockError"],[234,"impl-From%3CChangeSet%3CConfirmationBlockTime,+ChangeSet%3E%3E-for-ChangeSet"],[235,"impl-From%3CChangeSet%3E-for-ChangeSet"],[236,"impl-From%3CChangeSet%3E-for-ChangeSet"],[237,"impl-From%3CChangeSet%3CConfirmationBlockTime%3E%3E-for-ChangeSet"],[245,"impl-From%3CSyncResponse%3E-for-Update"],[246,"impl-From%3CFullScanResponse%3CKeychainKind%3E%3E-for-Update"],[537,"impl-Debug-for-InsufficientFunds"],[538,"impl-Display-for-InsufficientFunds"],[696,"impl-Descriptor%3CDefiniteDescriptorKey%3E"],[697,"impl-Descriptor%3CDescriptorPublicKey%3E"],[724,"impl-Display-for-Descriptor%3CPk%3E"],[725,"impl-Debug-for-Descriptor%3CPk%3E"],[728,"impl-Display-for-Miniscript%3CPk,+Ctx%3E"],[729,"impl-Debug-for-Miniscript%3CPk,+Ctx%3E"],[732,"impl-From%3CSh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[733,"impl-From%3CWsh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[734,"impl-From%3CPkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[735,"impl-From%3CWpkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[736,"impl-From%3CBare%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[737,"impl-From%3CTr%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[881,"impl-Display-for-Error"],[882,"impl-Debug-for-Error"],[883,"impl-From%3CParsePublicKeyError%3E-for-Error"],[884,"impl-From%3CError%3E-for-Error"],[885,"impl-From%3CPolicyError%3E-for-Error"],[886,"impl-From%3CError%3E-for-Error"],[887,"impl-From%3CError%3E-for-Error"],[888,"impl-From%3CKeyError%3E-for-Error"],[889,"impl-From%3CHexToBytesError%3E-for-Error"],[984,"impl-Debug-for-PolicyError"],[985,"impl-Display-for-PolicyError"],[1301,"impl-Debug-for-MiniscriptPsbtError"],[1302,"impl-Display-for-MiniscriptPsbtError"],[1303,"impl-Debug-for-CreateTxError"],[1304,"impl-Display-for-CreateTxError"],[1305,"impl-Debug-for-BuildFeeBumpError"],[1306,"impl-Display-for-BuildFeeBumpError"],[1309,"impl-From%3CMiniscriptPsbtError%3E-for-CreateTxError"],[1310,"impl-From%3CPolicyError%3E-for-CreateTxError"],[1311,"impl-From%3CError%3E-for-CreateTxError"],[1312,"impl-From%3CError%3E-for-CreateTxError"],[1313,"impl-From%3CInsufficientFunds%3E-for-CreateTxError"],[1350,"impl-Display-for-FullyNodedExport"],[1351,"impl-Debug-for-FullyNodedExport"],[1496,"impl-Debug-for-KeyError"],[1497,"impl-Display-for-KeyError"],[1498,"impl-Debug-for-SortedMultiVec%3CPk,+Ctx%3E"],[1499,"impl-Display-for-SortedMultiVec%3CPk,+Ctx%3E"],[1500,"impl-Display-for-DescriptorPublicKey"],[1501,"impl-Debug-for-DescriptorPublicKey"],[1502,"impl-Debug-for-DescriptorSecretKey"],[1503,"impl-Display-for-DescriptorSecretKey"],[1508,"impl-From%3CXpriv%3E-for-ExtendedKey%3CCtx%3E"],[1509,"impl-From%3CXpub%3E-for-ExtendedKey%3CCtx%3E"],[1515,"impl-From%3CError%3E-for-KeyError"],[1517,"impl-From%3CError%3E-for-KeyError"],[1559,"impl-IntoDescriptorKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1560,"impl-DerivableKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1766,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1767,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1768,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1783,"impl-Debug-for-SignerError"],[1784,"impl-Display-for-SignerError"],[1791,"impl-From%3CHash%3E-for-SignerId"],[1793,"impl-From%3CFingerprint%3E-for-SignerId"],[1803,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1804,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1805,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1821,"impl-InputSigner-for-SignerWrapper%3CPrivateKey%3E"],[1822,"impl-InputSigner-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1823,"impl-InputSigner-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1929,"impl-Debug-for-AddUtxoError"],[1930,"impl-Display-for-AddUtxoError"],[1931,"impl-Debug-for-AddForeignUtxoError"],[1932,"impl-Display-for-AddForeignUtxoError"]],"c":"OjAAAAEAAAAAAAUAEAAAALgCAgMOAz4FvQUlBg==","e":"OzAAAAEAACsEfQAZAAAAQQAAAE0AAQBRACQAewAAAIMAEACeAAYArQAZAMoAAADMABYA6wADAPIAAAD2AAEA+gAAAAQBAQAgAQAAOwEAAEYBAABSAQAAWAEFAGMBAABrAQ8AggEjAK0BEQDEAREA8wEXAAwCAwARAgYAGgIHADUCIQBhAgAAbwIAAIMCAQCGAgAAiAIHAJMCAACVAgEAmAIAAJsCAQCeAgEAogIBAKUCAQCoAgEAqwILALwCAwDBAgsA0gIBANUCDQDpAgAA9gIDAAEDAAAHAwEACwMBABIDAQAoAwMALQMBADsDAQA+AwEAQgMFAE0DBwBWAwMAWwMDAG8DCwB9AwQApQMZAMEDGgDfAwAA4QMAAOYDAQD1AwAA+AMEAP4DIgBHBBcAYAQvAKgESAAOBQ0AHgUEACcFDwBBBQEARQUAAEcFAQBKBQAATgUFAIIFFwCkBRUAuwUBAL4FAADABSYA7AUAAO4FAADxBQAA+AUBAAUGAwAVBgAAGAYEAB4GAQAuBgEAMwYAAD0GAABCBgMASwYAAE8GCABZBgMAYAYvAL8GDwDQBhQA5wYOAPcGCQACBwAACgcAAAwHAgAaBwEAHgcCACIHAAAmBwcAMAcfAGkHCQB0BwYAfQcBAIIHAgCJBwYAlQcAAKEHAACoBxMAvgcEAA=="}],\ ["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-Debug-for-CoinSelectionAlgo"],[107,"impl-Display-for-CoinSelectionAlgo"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAK8AGgAAAAAAAgABAAUAAgAJAAIAEQABABQAAAAZAAAAGwABAB4AAAAgAAAAIgABACUAHQBFABQAWwABAF4ADwB4AAoAhAAFAIsAAACNAAAAmQAAAJsAAACeACAAwAAdAN8AAADkAAEA6AAAAA=="}],\ +["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=="}],\ ["example_esplora",{"t":"SSFGPFPNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNHONNNNNNNNNNNNNNNNNNNNNOOOOOOOOO","n":["DB_MAGIC","DB_PATH","EsploraArgs","EsploraCommands","Scan","ScanOptions","Sync","augment_args","augment_args","augment_args_for_update","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","client","clone","clone","clone","clone_into","clone_into","clone_into","command","command_for_update","eq","esplora_args","esplora_url","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","parallel_requests","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","esplora_args","esplora_args","scan_options","scan_options","stop_gap","unconfirmed","unused_spks","utxos"],"q":[[0,"example_esplora"],[72,"example_esplora::EsploraCommands"],[81,"clap_builder::builder::command"],[82,"bitcoin::network"],[83,"esplora_client::blocking"],[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,8,4,9,8,4,9,4,8,4,9,8,4,9,9,9,9,8,4,8,4,9,8,4,9,8,4,9,8,4,9,4,9,8,8,4,9,0,9,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{Ab}}{d{Ab}}}Af}{{{d{A`}}}h}`{{{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,"EsploraArgs",0],[6,"Network",82],[5,"BlockingClient",83],[8,"Result",84],[6,"EsploraCommands",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":"OzAAAAEAAEIACAAAAAQABgAAAAgAFgAgAAIAJgAIADIAAAA0ABQASgADAA=="}],\ ["example_wallet_electrum",{"t":"SSSSSSSSH","n":["BATCH_SIZE","DB_MAGIC","ELECTRUM_URL","EXTERNAL_DESC","INTERNAL_DESC","NETWORK","SEND_AMOUNT","STOP_GAP","main"],"q":[[0,"example_wallet_electrum"],[9,"anyhow"],[10,"core::result"]],"i":[0,0,0,0,0,0,0,0,0],"f":"````````{{}{{f{bd}}}}","D":"`","p":[[1,"unit"],[5,"Error",9],[6,"Result",10]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAkAAQAAAAkA"}],\ 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 0336346359..d5f70acbb2 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.\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.\nSupport for persisting bdk_chain structures to SQLite …\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 BinaryHeap<T> into a Vec<T>.\nTurn a VecDeque<T> into a Vec<T>.\nAllocate a Vec<T> and fill it by cloning s’s items.\nAllocate a Vec<T> and move s’s items into it.\nConverts the given String to a vector Vec that holds …\nReturns the argument unchanged.\nAllocate a Vec<T> and fill it by cloning s’s items.\nConvert a boxed slice into a vector by transferring …\nConverts a CString into a Vec<u8>.\nAllocate a Vec<T> and fill it by cloning s’s items.\nAllocate a Vec<u8> and fill it with a UTF-8 string.\nConvert a clone-on-write slice into a vector.\nAllocate a Vec<T> and fill it by cloning s’s items.\nReturns the argument unchanged.\nConverts a &str into a String.\nConverts a clone-on-write string to an owned instance of …\nAllocates an owned String from a single character.\nConverts a &String into a String.\nConverts the given boxed str slice to a String. It is …\nConverts a &mut str into a String.\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.\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.\nSupport for persisting bdk_chain structures to SQLite …\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.\nTurn a VecDeque<T> into a Vec<T>.\nAllocate a Vec<T> and fill it by cloning s’s items.\nConverts the given String to a vector Vec that holds …\nConvert a clone-on-write slice into a vector.\nConvert a boxed slice into a vector by transferring …\nConverts a CString into a Vec<u8>.\nReturns the argument unchanged.\nAllocate a Vec<T> and fill it by cloning s’s items.\nAllocate a Vec<u8> and fill it with a UTF-8 string.\nAllocate a Vec<T> and move s’s items into it.\nAllocate a Vec<T> and fill it by cloning s’s items.\nConverts a BinaryHeap<T> into a Vec<T>.\nAllocate a Vec<T> and fill it by cloning s’s items.\nAllocates an owned String from a single character.\nReturns the argument unchanged.\nConverts a &mut str into a String.\nConverts the given boxed str slice to a String. It is …\nConverts a clone-on-write string to an owned instance of …\nConverts a &String into a String.\nConverts a &str into a String.\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 20b8cd516c..ad89ff59a7 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.\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.\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 +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 …\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.\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.\nReturns true if the inner type is the same as T.\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.\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.\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/type.impl/alloc/boxed/struct.Box.js b/docs-rs/bdk/nightly/latest/type.impl/alloc/boxed/struct.Box.js index 1e9c5af471..0628be35a7 100644 --- a/docs-rs/bdk/nightly/latest/type.impl/alloc/boxed/struct.Box.js +++ b/docs-rs/bdk/nightly/latest/type.impl/alloc/boxed/struct.Box.js @@ -1,3 +1,3 @@ (function() {var type_impls = { -"bdk_esplora":[["
    §

    impl<T> AnyProvider for Box<T>
    where\n T: AnyProvider + ?Sized,

    §

    fn load_any(\n &self,\n key: DataKey,\n req: DataRequest<'_>\n) -> Result<AnyResponse, DataError>

    Loads an [AnyPayload] according to the key and request.
    ","AnyProvider","bdk_esplora::blocking_ext::Error"],["
    1.64.0 · source§

    impl<T> AsFd for Box<T>
    where\n T: AsFd + ?Sized,

    source§

    fn as_fd(&self) -> BorrowedFd<'_>

    Borrows the file descriptor. Read more
    ","AsFd","bdk_esplora::blocking_ext::Error"],["
    1.5.0 · source§

    impl<T, A> AsMut<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Converts this type into a mutable reference of the (usually inferred) input type.
    ","AsMut","bdk_esplora::blocking_ext::Error"],["
    1.63.0 · source§

    impl<T> AsRawFd for Box<T>
    where\n T: AsRawFd,

    source§

    fn as_raw_fd(&self) -> i32

    Extracts the raw file descriptor. Read more
    ","AsRawFd","bdk_esplora::blocking_ext::Error"],["
    1.5.0 · source§

    impl<T, A> AsRef<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

    fn as_ref(&self) -> &T

    Converts this type into a shared reference of the (usually inferred) input type.
    ","AsRef","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncBufRead for Box<T>
    where\n T: AsyncBufRead + Unpin + ?Sized,

    §

    fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<&[u8], Error>>

    Attempt to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
    §

    fn consume(self: Pin<&mut Box<T>>, amt: usize)

    Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
    ","AsyncBufRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncBufRead for Box<T>
    where\n T: AsyncBufRead + Unpin + ?Sized,

    §

    fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<&[u8], Error>>

    Attempts to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
    §

    fn consume(self: Pin<&mut Box<T>>, amt: usize)

    Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
    ","AsyncBufRead","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<Args, F, A> AsyncFn<Args> for Box<F, A>
    where\n Args: Tuple,\n F: AsyncFn<Args> + ?Sized,\n A: Allocator,

    source§

    extern "rust-call" fn async_call(\n &self,\n args: Args\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Call the AsyncFn, returning a future which may borrow from the called closure.
    ","AsyncFn","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<Args, F, A> AsyncFnMut<Args> for Box<F, A>
    where\n Args: Tuple,\n F: AsyncFnMut<Args> + ?Sized,\n A: Allocator,

    §

    type CallRefFuture<'a> = <F as AsyncFnMut<Args>>::CallRefFuture<'a>\nwhere\n Box<F, A>: 'a

    🔬This is a nightly-only experimental API. (async_fn_traits)
    source§

    extern "rust-call" fn async_call_mut(\n &mut self,\n args: Args\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Call the AsyncFnMut, returning a future which may borrow from the called closure.
    ","AsyncFnMut","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<Args, F, A> AsyncFnOnce<Args> for Box<F, A>
    where\n Args: Tuple,\n F: AsyncFnOnce<Args> + ?Sized,\n A: Allocator,

    §

    type Output = <F as AsyncFnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Output type of the called closure’s future.
    §

    type CallOnceFuture = <F as AsyncFnOnce<Args>>::CallOnceFuture

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Future returned by AsyncFnOnce::async_call_once.
    source§

    extern "rust-call" fn async_call_once(\n self,\n args: Args\n) -> <Box<F, A> as AsyncFnOnce<Args>>::CallOnceFuture

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Call the AsyncFnOnce, returning a future which may move out of the called closure.
    ","AsyncFnOnce","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<S> AsyncIterator for Box<S>
    where\n S: AsyncIterator + Unpin + ?Sized,

    §

    type Item = <S as AsyncIterator>::Item

    🔬This is a nightly-only experimental API. (async_iterator)
    The type of items yielded by the async iterator.
    source§

    fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Option<<Box<S> as AsyncIterator>::Item>>

    🔬This is a nightly-only experimental API. (async_iterator)
    Attempt to pull out the next value of this async iterator, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the async iterator is exhausted. Read more
    source§

    fn size_hint(&self) -> (usize, Option<usize>)

    🔬This is a nightly-only experimental API. (async_iterator)
    Returns the bounds on the remaining length of the async iterator. Read more
    ","AsyncIterator","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncRead for Box<T>
    where\n T: AsyncRead + Unpin + ?Sized,

    §

    fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut ReadBuf<'_>\n) -> Poll<Result<(), Error>>

    Attempts to read from the AsyncRead into buf. Read more
    ","AsyncRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncRead for Box<T>
    where\n T: AsyncRead + Unpin + ?Sized,

    §

    fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut [u8]\n) -> Poll<Result<usize, Error>>

    Attempt to read from the AsyncRead into buf. Read more
    §

    fn poll_read_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &mut [IoSliceMut<'_>]\n) -> Poll<Result<usize, Error>>

    Attempt to read from the AsyncRead into bufs using vectored\nIO operations. Read more
    ","AsyncRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncSeek for Box<T>
    where\n T: AsyncSeek + Unpin + ?Sized,

    §

    fn poll_seek(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n pos: SeekFrom\n) -> Poll<Result<u64, Error>>

    Attempt to seek to an offset, in bytes, in a stream. Read more
    ","AsyncSeek","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncSeek for Box<T>
    where\n T: AsyncSeek + Unpin + ?Sized,

    §

    fn start_seek(self: Pin<&mut Box<T>>, pos: SeekFrom) -> Result<(), Error>

    Attempts to seek to an offset, in bytes, in a stream. Read more
    §

    fn poll_complete(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<u64, Error>>

    Waits for a seek operation to complete. Read more
    ","AsyncSeek","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncWrite for Box<T>
    where\n T: AsyncWrite + Unpin + ?Sized,

    §

    fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8]\n) -> Poll<Result<usize, Error>>

    Attempt to write bytes from buf into the object. Read more
    §

    fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>]\n) -> Poll<Result<usize, Error>>

    Attempt to write bytes from bufs into the object using vectored\nIO operations. Read more
    §

    fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Attempt to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
    §

    fn poll_close(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Attempt to close the object. Read more
    ","AsyncWrite","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncWrite for Box<T>
    where\n T: AsyncWrite + Unpin + ?Sized,

    §

    fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8]\n) -> Poll<Result<usize, Error>>

    Attempt to write bytes from buf into the object. Read more
    §

    fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>]\n) -> Poll<Result<usize, Error>>

    Like poll_write, except that it writes from a slice of buffers. Read more
    §

    fn is_write_vectored(&self) -> bool

    Determines if this writer has an efficient poll_write_vectored\nimplementation. Read more
    §

    fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Attempts to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
    §

    fn poll_shutdown(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Initiates or attempts to shut down this writer, returning success when\nthe I/O connection has completely shut down. Read more
    ","AsyncWrite","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Body for Box<T>
    where\n T: Body + Unpin + ?Sized,

    §

    type Data = <T as Body>::Data

    Values yielded by the Body.
    §

    type Error = <T as Body>::Error

    The error type this Body might generate.
    source§

    fn poll_data(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Option<Result<<Box<T> as Body>::Data, <Box<T> as Body>::Error>>>

    Attempt to pull out the next data buffer of this stream.
    source§

    fn poll_trailers(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<Option<HeaderMap>, <Box<T> as Body>::Error>>

    Poll for an optional single HeaderMap of trailers. Read more
    source§

    fn is_end_stream(&self) -> bool

    Returns true when the end of stream has been reached. Read more
    source§

    fn size_hint(&self) -> SizeHint

    Returns the bounds on the remaining length of the stream. Read more
    source§

    fn data(&mut self) -> Data<'_, Self>
    where\n Self: Sized + Unpin,

    Returns future that resolves to next data chunk, if any.
    source§

    fn trailers(&mut self) -> Trailers<'_, Self>
    where\n Self: Sized + Unpin,

    Returns future that resolves to trailers, if any.
    source§

    fn map_data<F, B>(self, f: F) -> MapData<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Data) -> B,\n B: Buf,

    Maps this body’s data value to a different value.
    source§

    fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Error) -> E,

    Maps this body’s error value to a different value.
    source§

    fn collect(self) -> Collect<Self>
    where\n Self: Sized,

    Turn this body into Collected body which will collect all the DATA frames\nand trailers.
    ","Body","bdk_esplora::blocking_ext::Error"],["
    1.1.0 · source§

    impl<T, A> Borrow<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    ","Borrow","bdk_esplora::blocking_ext::Error"],["
    1.1.0 · source§

    impl<T, A> BorrowMut<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Mutably borrows from an owned value. Read more
    ","BorrowMut","bdk_esplora::blocking_ext::Error"],["
    §

    impl<M, P> BoundDataProvider<M> for Box<P>
    where\n M: DataMarker,\n P: BoundDataProvider<M> + ?Sized,

    §

    fn load_bound(&self, req: DataRequest<'_>) -> Result<DataResponse<M>, DataError>

    Query the provider for data, returning the result. Read more
    §

    fn bound_key(&self) -> DataKey

    Returns the [DataKey] that this provider uses for loading data.
    ","BoundDataProvider","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Box<T>

    1.0.0 · source

    pub fn new(x: T) -> Box<T>

    Allocates memory on the heap and then places x into it.

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    let five = Box::new(5);
    \n
    source

    pub fn new_uninit() -> Box<MaybeUninit<T>>

    🔬This is a nightly-only experimental API. (new_uninit)

    Constructs a new box with uninitialized contents.

    \n
    §Examples
    \n
    #![feature(new_uninit)]\n\nlet mut five = Box::<u32>::new_uninit();\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
    \n
    source

    pub fn new_zeroed() -> Box<MaybeUninit<T>>

    🔬This is a nightly-only experimental API. (new_uninit)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes.

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(new_uninit)]\n\nlet zero = Box::<u32>::new_zeroed();\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
    \n
    1.33.0 · source

    pub fn pin(x: T) -> Pin<Box<T>>

    Constructs a new Pin<Box<T>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

    \n

    Constructing and pinning of the Box can also be done in two steps: Box::pin(x)\ndoes the same as Box::into_pin(Box::new(x)). Consider using\ninto_pin if you already have a Box<T>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new.

    \n
    source

    pub fn try_new(x: T) -> Result<Box<T>, AllocError>

    🔬This is a nightly-only experimental API. (allocator_api)

    Allocates memory on the heap then places x into it,\nreturning an error if the allocation fails

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    #![feature(allocator_api)]\n\nlet five = Box::try_new(5)?;
    \n
    source

    pub fn try_new_uninit() -> Result<Box<MaybeUninit<T>>, AllocError>

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new box with uninitialized contents on the heap,\nreturning an error if the allocation fails

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nlet mut five = Box::<u32>::try_new_uninit()?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
    \n
    source

    pub fn try_new_zeroed() -> Result<Box<MaybeUninit<T>>, AllocError>

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes on the heap

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nlet zero = Box::<u32>::try_new_zeroed()?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Box<T>
    where\n T: ?Sized,

    1.4.0 · source

    pub unsafe fn from_raw(raw: *mut T) -> Box<T>

    Constructs a box from a raw pointer.

    \n

    After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

    \n
    §Safety
    \n

    This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

    \n

    The safety conditions are described in the memory layout section.

    \n
    §Examples
    \n

    Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw:

    \n\n
    let x = Box::new(5);\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
    \n

    Manually create a Box from scratch by using the global allocator:

    \n\n
    use std::alloc::{alloc, Layout};\n\nunsafe {\n    let ptr = alloc(Layout::new::<i32>()) as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw(ptr);\n}
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, A> Box<T, A>
    where\n A: Allocator,

    source

    pub fn new_in(x: T, alloc: A) -> Box<T, A>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Allocates memory in the given allocator then places x into it.

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::new_in(5, System);
    \n
    source

    pub fn try_new_in(x: T, alloc: A) -> Result<Box<T, A>, AllocError>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Allocates memory in the given allocator then places x into it,\nreturning an error if the allocation fails

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::try_new_in(5, System)?;
    \n
    source

    pub fn new_uninit_in(alloc: A) -> Box<MaybeUninit<T>, A>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new box with uninitialized contents in the provided allocator.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::new_uninit_in(System);\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
    \n
    source

    pub fn try_new_uninit_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new box with uninitialized contents in the provided allocator,\nreturning an error if the allocation fails

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::try_new_uninit_in(System)?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
    \n
    source

    pub fn new_zeroed_in(alloc: A) -> Box<MaybeUninit<T>, A>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator.

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::new_zeroed_in(System);\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
    \n
    source

    pub fn try_new_zeroed_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator,\nreturning an error if the allocation fails,

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::try_new_zeroed_in(System)?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
    \n
    source

    pub fn pin_in(x: T, alloc: A) -> Pin<Box<T, A>>
    where\n A: 'static + Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Pin<Box<T, A>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

    \n

    Constructing and pinning of the Box can also be done in two steps: Box::pin_in(x, alloc)\ndoes the same as Box::into_pin(Box::new_in(x, alloc)). Consider using\ninto_pin if you already have a Box<T, A>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new_in.

    \n
    source

    pub fn into_boxed_slice(boxed: Box<T, A>) -> Box<[T], A>

    🔬This is a nightly-only experimental API. (box_into_boxed_slice)

    Converts a Box<T> into a Box<[T]>

    \n

    This conversion does not allocate on the heap and happens in place.

    \n
    source

    pub fn into_inner(boxed: Box<T, A>) -> T

    🔬This is a nightly-only experimental API. (box_into_inner)

    Consumes the Box, returning the wrapped value.

    \n
    §Examples
    \n
    #![feature(box_into_inner)]\n\nlet c = Box::new(5);\n\nassert_eq!(Box::into_inner(c), 5);
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, A> Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    const: unstable · source

    pub unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Box<T, A>

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a box from a raw pointer in the given allocator.

    \n

    After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

    \n
    §Safety
    \n

    This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

    \n
    §Examples
    \n

    Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw_with_allocator:

    \n\n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(5, System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
    \n

    Manually create a Box from scratch by using the system allocator:

    \n\n
    #![feature(allocator_api, slice_ptr_get)]\n\nuse std::alloc::{Allocator, Layout, System};\n\nunsafe {\n    let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw_in(ptr, System);\n}
    \n
    1.4.0 · source

    pub fn into_raw(b: Box<T, A>) -> *mut T

    Consumes the Box, returning a wrapped raw pointer.

    \n

    The pointer will be properly aligned and non-null.

    \n

    After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw function, allowing the Box destructor to perform\nthe cleanup.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::into_raw(b) instead of b.into_raw(). This\nis so that there is no conflict with a method on the inner type.

    \n
    §Examples
    \n

    Converting the raw pointer back into a Box with Box::from_raw\nfor automatic cleanup:

    \n\n
    let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
    \n

    Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

    \n\n
    use std::alloc::{dealloc, Layout};\nuse std::ptr;\n\nlet x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    dealloc(ptr as *mut u8, Layout::new::<String>());\n}
    \n

    Note: This is equivalent to the following:

    \n\n
    let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    drop(Box::from_raw(ptr));\n}
    \n
    source

    pub fn into_raw_with_allocator(b: Box<T, A>) -> (*mut T, A)

    🔬This is a nightly-only experimental API. (allocator_api)

    Consumes the Box, returning a wrapped raw pointer and the allocator.

    \n

    The pointer will be properly aligned and non-null.

    \n

    After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw_in function, allowing the Box destructor to perform\nthe cleanup.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::into_raw_with_allocator(b) instead of b.into_raw_with_allocator(). This\nis so that there is no conflict with a method on the inner type.

    \n
    §Examples
    \n

    Converting the raw pointer back into a Box with Box::from_raw_in\nfor automatic cleanup:

    \n\n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
    \n

    Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

    \n\n
    #![feature(allocator_api)]\n\nuse std::alloc::{Allocator, Layout, System};\nuse std::ptr::{self, NonNull};\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    let non_null = NonNull::new_unchecked(ptr);\n    alloc.deallocate(non_null.cast(), Layout::new::<String>());\n}
    \n
    const: unstable · source

    pub fn allocator(b: &Box<T, A>) -> &A

    🔬This is a nightly-only experimental API. (allocator_api)

    Returns a reference to the underlying allocator.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::allocator(&b) instead of b.allocator(). This\nis so that there is no conflict with a method on the inner type.

    \n
    1.26.0 · source

    pub fn leak<'a>(b: Box<T, A>) -> &'a mut T
    where\n A: 'a,

    Consumes and leaks the Box, returning a mutable reference,\n&'a mut T. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

    \n

    This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak. If this is not acceptable, the reference should first be wrapped\nwith the Box::from_raw function producing a Box. This Box can\nthen be dropped which will properly destroy T and release the\nallocated memory.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::leak(b) instead of b.leak(). This\nis so that there is no conflict with a method on the inner type.

    \n
    §Examples
    \n

    Simple usage:

    \n\n
    let x = Box::new(41);\nlet static_ref: &'static mut usize = Box::leak(x);\n*static_ref += 1;\nassert_eq!(*static_ref, 42);
    \n

    Unsized data:

    \n\n
    let x = vec![1, 2, 3].into_boxed_slice();\nlet static_ref = Box::leak(x);\nstatic_ref[0] = 4;\nassert_eq!(*static_ref, [4, 2, 3]);
    \n
    1.63.0 (const: unstable) · source

    pub fn into_pin(boxed: Box<T, A>) -> Pin<Box<T, A>>
    where\n A: 'static,

    Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then\n*boxed will be pinned in memory and unable to be moved.

    \n

    This conversion does not allocate on the heap and happens in place.

    \n

    This is also available via From.

    \n

    Constructing and pinning a Box with Box::into_pin(Box::new(x))\ncan also be written more concisely using Box::pin(x).\nThis into_pin method is useful if you already have a Box<T>, or you are\nconstructing a (pinned) Box in a different way than with Box::new.

    \n
    §Notes
    \n

    It’s not recommended that crates add an impl like From<Box<T>> for Pin<T>,\nas it’ll introduce an ambiguity when calling Pin::from.\nA demonstration of such a poor impl is shown below.

    \n\n
    struct Foo; // A type defined in this crate.\nimpl From<Box<()>> for Pin<Foo> {\n    fn from(_: Box<()>) -> Pin<Foo> {\n        Pin::new(Foo)\n    }\n}\n\nlet foo = Box::new(());\nlet bar = Pin::from(foo);
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> Buf for Box<T>
    where\n T: Buf + ?Sized,

    §

    fn remaining(&self) -> usize

    Returns the number of bytes between the current position and the end of\nthe buffer. Read more
    §

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

    Returns a slice starting at the current position and of length between 0\nand Buf::remaining(). Note that this can return shorter slice (this allows\nnon-continuous internal representation). Read more
    §

    fn chunks_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize

    Fills dst with potentially multiple slices starting at self’s\ncurrent position. Read more
    §

    fn advance(&mut self, cnt: usize)

    Advance the internal cursor of the Buf Read more
    §

    fn has_remaining(&self) -> bool

    Returns true if there are any more bytes to consume Read more
    §

    fn copy_to_slice(&mut self, dst: &mut [u8])

    Copies bytes from self into dst. Read more
    §

    fn get_u8(&mut self) -> u8

    Gets an unsigned 8 bit integer from self. Read more
    §

    fn get_i8(&mut self) -> i8

    Gets a signed 8 bit integer from self. Read more
    §

    fn get_u16(&mut self) -> u16

    Gets an unsigned 16 bit integer from self in big-endian byte order. Read more
    §

    fn get_u16_le(&mut self) -> u16

    Gets an unsigned 16 bit integer from self in little-endian byte order. Read more
    §

    fn get_u16_ne(&mut self) -> u16

    Gets an unsigned 16 bit integer from self in native-endian byte order. Read more
    §

    fn get_i16(&mut self) -> i16

    Gets a signed 16 bit integer from self in big-endian byte order. Read more
    §

    fn get_i16_le(&mut self) -> i16

    Gets a signed 16 bit integer from self in little-endian byte order. Read more
    §

    fn get_i16_ne(&mut self) -> i16

    Gets a signed 16 bit integer from self in native-endian byte order. Read more
    §

    fn get_u32(&mut self) -> u32

    Gets an unsigned 32 bit integer from self in the big-endian byte order. Read more
    §

    fn get_u32_le(&mut self) -> u32

    Gets an unsigned 32 bit integer from self in the little-endian byte order. Read more
    §

    fn get_u32_ne(&mut self) -> u32

    Gets an unsigned 32 bit integer from self in native-endian byte order. Read more
    §

    fn get_i32(&mut self) -> i32

    Gets a signed 32 bit integer from self in big-endian byte order. Read more
    §

    fn get_i32_le(&mut self) -> i32

    Gets a signed 32 bit integer from self in little-endian byte order. Read more
    §

    fn get_i32_ne(&mut self) -> i32

    Gets a signed 32 bit integer from self in native-endian byte order. Read more
    §

    fn get_u64(&mut self) -> u64

    Gets an unsigned 64 bit integer from self in big-endian byte order. Read more
    §

    fn get_u64_le(&mut self) -> u64

    Gets an unsigned 64 bit integer from self in little-endian byte order. Read more
    §

    fn get_u64_ne(&mut self) -> u64

    Gets an unsigned 64 bit integer from self in native-endian byte order. Read more
    §

    fn get_i64(&mut self) -> i64

    Gets a signed 64 bit integer from self in big-endian byte order. Read more
    §

    fn get_i64_le(&mut self) -> i64

    Gets a signed 64 bit integer from self in little-endian byte order. Read more
    §

    fn get_i64_ne(&mut self) -> i64

    Gets a signed 64 bit integer from self in native-endian byte order. Read more
    §

    fn get_uint(&mut self, nbytes: usize) -> u64

    Gets an unsigned n-byte integer from self in big-endian byte order. Read more
    §

    fn get_uint_le(&mut self, nbytes: usize) -> u64

    Gets an unsigned n-byte integer from self in little-endian byte order. Read more
    §

    fn get_uint_ne(&mut self, nbytes: usize) -> u64

    Gets an unsigned n-byte integer from self in native-endian byte order. Read more
    §

    fn get_int(&mut self, nbytes: usize) -> i64

    Gets a signed n-byte integer from self in big-endian byte order. Read more
    §

    fn get_int_le(&mut self, nbytes: usize) -> i64

    Gets a signed n-byte integer from self in little-endian byte order. Read more
    §

    fn get_int_ne(&mut self, nbytes: usize) -> i64

    Gets a signed n-byte integer from self in native-endian byte order. Read more
    §

    fn copy_to_bytes(&mut self, len: usize) -> Bytes

    Consumes len bytes inside self and returns new instance of Bytes\nwith this data. Read more
    §

    fn get_u128(&mut self) -> u128

    Gets an unsigned 128 bit integer from self in big-endian byte order. Read more
    §

    fn get_u128_le(&mut self) -> u128

    Gets an unsigned 128 bit integer from self in little-endian byte order. Read more
    §

    fn get_u128_ne(&mut self) -> u128

    Gets an unsigned 128 bit integer from self in native-endian byte order. Read more
    §

    fn get_i128(&mut self) -> i128

    Gets a signed 128 bit integer from self in big-endian byte order. Read more
    §

    fn get_i128_le(&mut self) -> i128

    Gets a signed 128 bit integer from self in little-endian byte order. Read more
    §

    fn get_i128_ne(&mut self) -> i128

    Gets a signed 128 bit integer from self in native-endian byte order. Read more
    §

    fn get_f32(&mut self) -> f32

    Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in big-endian byte order. Read more
    §

    fn get_f32_le(&mut self) -> f32

    Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in little-endian byte order. Read more
    §

    fn get_f32_ne(&mut self) -> f32

    Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in native-endian byte order. Read more
    §

    fn get_f64(&mut self) -> f64

    Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in big-endian byte order. Read more
    §

    fn get_f64_le(&mut self) -> f64

    Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in little-endian byte order. Read more
    §

    fn get_f64_ne(&mut self) -> f64

    Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in native-endian byte order. Read more
    §

    fn take(self, limit: usize) -> Take<Self>
    where\n Self: Sized,

    Creates an adaptor which will read at most limit bytes from self. Read more
    §

    fn chain<U>(self, next: U) -> Chain<Self, U>
    where\n U: Buf,\n Self: Sized,

    Creates an adaptor which will chain this buffer with another. Read more
    §

    fn reader(self) -> Reader<Self>
    where\n Self: Sized,

    Creates an adaptor which implements the Read trait for self. Read more
    ","Buf","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> BufMut for Box<T>
    where\n T: BufMut + ?Sized,

    §

    fn remaining_mut(&self) -> usize

    Returns the number of bytes that can be written from the current\nposition until the end of the buffer is reached. Read more
    §

    fn chunk_mut(&mut self) -> &mut UninitSlice

    Returns a mutable slice starting at the current BufMut position and of\nlength between 0 and BufMut::remaining_mut(). Note that this can be shorter than the\nwhole remainder of the buffer (this allows non-continuous implementation). Read more
    §

    unsafe fn advance_mut(&mut self, cnt: usize)

    Advance the internal cursor of the BufMut Read more
    §

    fn put_slice(&mut self, src: &[u8])

    Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
    §

    fn put_u8(&mut self, n: u8)

    Writes an unsigned 8 bit integer to self. Read more
    §

    fn put_i8(&mut self, n: i8)

    Writes a signed 8 bit integer to self. Read more
    §

    fn put_u16(&mut self, n: u16)

    Writes an unsigned 16 bit integer to self in big-endian byte order. Read more
    §

    fn put_u16_le(&mut self, n: u16)

    Writes an unsigned 16 bit integer to self in little-endian byte order. Read more
    §

    fn put_u16_ne(&mut self, n: u16)

    Writes an unsigned 16 bit integer to self in native-endian byte order. Read more
    §

    fn put_i16(&mut self, n: i16)

    Writes a signed 16 bit integer to self in big-endian byte order. Read more
    §

    fn put_i16_le(&mut self, n: i16)

    Writes a signed 16 bit integer to self in little-endian byte order. Read more
    §

    fn put_i16_ne(&mut self, n: i16)

    Writes a signed 16 bit integer to self in native-endian byte order. Read more
    §

    fn put_u32(&mut self, n: u32)

    Writes an unsigned 32 bit integer to self in big-endian byte order. Read more
    §

    fn put_u32_le(&mut self, n: u32)

    Writes an unsigned 32 bit integer to self in little-endian byte order. Read more
    §

    fn put_u32_ne(&mut self, n: u32)

    Writes an unsigned 32 bit integer to self in native-endian byte order. Read more
    §

    fn put_i32(&mut self, n: i32)

    Writes a signed 32 bit integer to self in big-endian byte order. Read more
    §

    fn put_i32_le(&mut self, n: i32)

    Writes a signed 32 bit integer to self in little-endian byte order. Read more
    §

    fn put_i32_ne(&mut self, n: i32)

    Writes a signed 32 bit integer to self in native-endian byte order. Read more
    §

    fn put_u64(&mut self, n: u64)

    Writes an unsigned 64 bit integer to self in the big-endian byte order. Read more
    §

    fn put_u64_le(&mut self, n: u64)

    Writes an unsigned 64 bit integer to self in little-endian byte order. Read more
    §

    fn put_u64_ne(&mut self, n: u64)

    Writes an unsigned 64 bit integer to self in native-endian byte order. Read more
    §

    fn put_i64(&mut self, n: i64)

    Writes a signed 64 bit integer to self in the big-endian byte order. Read more
    §

    fn put_i64_le(&mut self, n: i64)

    Writes a signed 64 bit integer to self in little-endian byte order. Read more
    §

    fn put_i64_ne(&mut self, n: i64)

    Writes a signed 64 bit integer to self in native-endian byte order. Read more
    §

    fn has_remaining_mut(&self) -> bool

    Returns true if there is space in self for more bytes. Read more
    §

    fn put<T>(&mut self, src: T)
    where\n T: Buf,\n Self: Sized,

    Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
    §

    fn put_bytes(&mut self, val: u8, cnt: usize)

    Put cnt bytes val into self. Read more
    §

    fn put_u128(&mut self, n: u128)

    Writes an unsigned 128 bit integer to self in the big-endian byte order. Read more
    §

    fn put_u128_le(&mut self, n: u128)

    Writes an unsigned 128 bit integer to self in little-endian byte order. Read more
    §

    fn put_u128_ne(&mut self, n: u128)

    Writes an unsigned 128 bit integer to self in native-endian byte order. Read more
    §

    fn put_i128(&mut self, n: i128)

    Writes a signed 128 bit integer to self in the big-endian byte order. Read more
    §

    fn put_i128_le(&mut self, n: i128)

    Writes a signed 128 bit integer to self in little-endian byte order. Read more
    §

    fn put_i128_ne(&mut self, n: i128)

    Writes a signed 128 bit integer to self in native-endian byte order. Read more
    §

    fn put_uint(&mut self, n: u64, nbytes: usize)

    Writes an unsigned n-byte integer to self in big-endian byte order. Read more
    §

    fn put_uint_le(&mut self, n: u64, nbytes: usize)

    Writes an unsigned n-byte integer to self in the little-endian byte order. Read more
    §

    fn put_uint_ne(&mut self, n: u64, nbytes: usize)

    Writes an unsigned n-byte integer to self in the native-endian byte order. Read more
    §

    fn put_int(&mut self, n: i64, nbytes: usize)

    Writes low nbytes of a signed integer to self in big-endian byte order. Read more
    §

    fn put_int_le(&mut self, n: i64, nbytes: usize)

    Writes low nbytes of a signed integer to self in little-endian byte order. Read more
    §

    fn put_int_ne(&mut self, n: i64, nbytes: usize)

    Writes low nbytes of a signed integer to self in native-endian byte order. Read more
    §

    fn put_f32(&mut self, n: f32)

    Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in big-endian byte order. Read more
    §

    fn put_f32_le(&mut self, n: f32)

    Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in little-endian byte order. Read more
    §

    fn put_f32_ne(&mut self, n: f32)

    Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in native-endian byte order. Read more
    §

    fn put_f64(&mut self, n: f64)

    Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in big-endian byte order. Read more
    §

    fn put_f64_le(&mut self, n: f64)

    Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in little-endian byte order. Read more
    §

    fn put_f64_ne(&mut self, n: f64)

    Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in native-endian byte order. Read more
    §

    fn limit(self, limit: usize) -> Limit<Self>
    where\n Self: Sized,

    Creates an adaptor which can write at most limit bytes to self. Read more
    §

    fn writer(self) -> Writer<Self>
    where\n Self: Sized,

    Creates an adaptor which implements the Write trait for self. Read more
    §

    fn chain_mut<U>(self, next: U) -> Chain<Self, U>
    where\n U: BufMut,\n Self: Sized,

    Creates an adapter which will chain this buffer with another. Read more
    ","BufMut","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<B> BufRead for Box<B>
    where\n B: BufRead + ?Sized,

    source§

    fn fill_buf(&mut self) -> Result<&[u8], Error>

    Returns the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
    source§

    fn consume(&mut self, amt: usize)

    Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to read. Read more
    source§

    fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize, Error>

    Read all bytes into buf until the delimiter byte or EOF is reached. Read more
    source§

    fn read_line(&mut self, buf: &mut String) -> Result<usize, Error>

    Read all bytes until a newline (the 0xA byte) is reached, and append\nthem to the provided String buffer. Read more
    source§

    fn has_data_left(&mut self) -> Result<bool, Error>

    🔬This is a nightly-only experimental API. (buf_read_has_data_left)
    Check if the underlying Read has any data left to be read. Read more
    source§

    fn skip_until(&mut self, byte: u8) -> Result<usize, Error>

    🔬This is a nightly-only experimental API. (bufread_skip_until)
    Skip all bytes until the delimiter byte or EOF is reached. Read more
    1.0.0 · source§

    fn split(self, byte: u8) -> Split<Self>
    where\n Self: Sized,

    Returns an iterator over the contents of this reader split on the byte\nbyte. Read more
    1.0.0 · source§

    fn lines(self) -> Lines<Self>
    where\n Self: Sized,

    Returns an iterator over the lines of this reader. Read more
    ","BufRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> BufferProvider for Box<T>
    where\n T: BufferProvider + ?Sized,

    §

    fn load_buffer(\n &self,\n key: DataKey,\n req: DataRequest<'_>\n) -> Result<DataResponse<BufferMarker>, DataError>

    Loads a [DataPayload]<[BufferMarker]> according to the key and request.
    ","BufferProvider","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Clone for Box<T, A>
    where\n T: Clone,\n A: Allocator + Clone,

    source§

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

    Returns a new box with a clone() of this box’s contents.

    \n
    §Examples
    \n
    let x = Box::new(5);\nlet y = x.clone();\n\n// The value is the same\nassert_eq!(x, y);\n\n// But they are unique objects\nassert_ne!(&*x as *const i32, &*y as *const i32);
    \n
    source§

    fn clone_from(&mut self, source: &Box<T, A>)

    Copies source’s contents into self without creating a new allocation.

    \n
    §Examples
    \n
    let x = Box::new(5);\nlet mut y = Box::new(10);\nlet yp: *const i32 = &*y;\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no allocation occurred\nassert_eq!(yp, &*y);
    \n
    ","Clone","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<G, R, A> Coroutine<R> for Box<G, A>
    where\n G: Coroutine<R> + Unpin + ?Sized,\n A: Allocator,

    §

    type Yield = <G as Coroutine<R>>::Yield

    🔬This is a nightly-only experimental API. (coroutine_trait)
    The type of value this coroutine yields. Read more
    §

    type Return = <G as Coroutine<R>>::Return

    🔬This is a nightly-only experimental API. (coroutine_trait)
    The type of value this coroutine returns. Read more
    source§

    fn resume(\n self: Pin<&mut Box<G, A>>,\n arg: R\n) -> CoroutineState<<Box<G, A> as Coroutine<R>>::Yield, <Box<G, A> as Coroutine<R>>::Return>

    🔬This is a nightly-only experimental API. (coroutine_trait)
    Resumes the execution of this coroutine. Read more
    ","Coroutine","bdk_esplora::blocking_ext::Error"],["
    §

    impl<M, P> DataProvider<M> for Box<P>
    where\n M: KeyedDataMarker,\n P: DataProvider<M> + ?Sized,

    §

    fn load(&self, req: DataRequest<'_>) -> Result<DataResponse<M>, DataError>

    Query the provider for data, returning the result. Read more
    ","DataProvider","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Debug for Box<T, A>
    where\n T: Debug + ?Sized,\n A: Allocator,

    source§

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

    Formats the value using the given formatter. Read more
    ","Debug","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T> Default for Box<T>
    where\n T: Default,

    source§

    fn default() -> Box<T>

    Creates a Box<T>, with the Default value for T.

    \n
    ","Default","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Deref for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    §

    type Target = T

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &T

    Dereferences the value.
    ","Deref","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> DerefMut for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Mutably dereferences the value.
    ","DerefMut","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<'de, T> Deserialize<'de> for Box<T>
    where\n T: Deserialize<'de>,

    source§

    fn deserialize<D>(\n deserializer: D\n) -> Result<Box<T>, <D as Deserializer<'de>>::Error>
    where\n D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    ","Deserialize<'de>","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Display for Box<T, A>
    where\n T: Display + ?Sized,\n A: Allocator,

    source§

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

    Formats the value using the given formatter. Read more
    ","Display","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<I, A> DoubleEndedIterator for Box<I, A>
    where\n I: DoubleEndedIterator + ?Sized,\n A: Allocator,

    source§

    fn next_back(&mut self) -> Option<<I as Iterator>::Item>

    Removes and returns an element from the end of the iterator. Read more
    source§

    fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item>

    Returns the nth element from the end of the iterator. Read more
    source§

    fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator from the back by n elements. Read more
    1.27.0 · source§

    fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

    This is the reverse version of Iterator::try_fold(): it takes\nelements starting from the back of the iterator. Read more
    1.27.0 · source§

    fn rfold<B, F>(self, init: B, f: F) -> B
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

    An iterator method that reduces the iterator’s elements to a single,\nfinal value, starting from the back. Read more
    1.27.0 · source§

    fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Searches for an element of an iterator from the back that satisfies a predicate. Read more
    ","DoubleEndedIterator","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Drop for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

    fn drop(&mut self)

    Executes the destructor for this type. Read more
    ","Drop","bdk_esplora::blocking_ext::Error"],["
    §

    impl<M, P> DynamicDataProvider<M> for Box<P>
    where\n M: DataMarker,\n P: DynamicDataProvider<M> + ?Sized,

    §

    fn load_data(\n &self,\n key: DataKey,\n req: DataRequest<'_>\n) -> Result<DataResponse<M>, DataError>

    Query the provider for data, returning the result. Read more
    ","DynamicDataProvider","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> EncodeAsVarULE<T> for Box<T>
    where\n T: VarULE + ?Sized,

    §

    fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R

    Calls cb with a piecewise list of byte slices that when concatenated\nproduce the memory pattern of the corresponding instance of T. Read more
    §

    fn encode_var_ule_len(&self) -> usize

    Return the length, in bytes, of the corresponding [VarULE] type
    §

    fn encode_var_ule_write(&self, dst: &mut [u8])

    Write the corresponding [VarULE] type to the dst buffer. dst should\nbe the size of [Self::encode_var_ule_len()]
    ","EncodeAsVarULE","bdk_esplora::blocking_ext::Error"],["
    1.8.0 · source§

    impl<T> Error for Box<T>
    where\n T: Error,

    source§

    fn description(&self) -> &str

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

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

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

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

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

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

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    ","Error","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<I, A> ExactSizeIterator for Box<I, A>
    where\n I: ExactSizeIterator + ?Sized,\n A: Allocator,

    source§

    fn len(&self) -> usize

    Returns the exact remaining length of the iterator. Read more
    source§

    fn is_empty(&self) -> bool

    🔬This is a nightly-only experimental API. (exact_size_is_empty)
    Returns true if the iterator is empty. Read more
    ","ExactSizeIterator","bdk_esplora::blocking_ext::Error"],["
    1.35.0 · source§

    impl<Args, F, A> Fn<Args> for Box<F, A>
    where\n Args: Tuple,\n F: Fn<Args> + ?Sized,\n A: Allocator,

    source§

    extern "rust-call" fn call(\n &self,\n args: Args\n) -> <Box<F, A> as FnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (fn_traits)
    Performs the call operation.
    ","Fn","bdk_esplora::blocking_ext::Error"],["
    1.35.0 · source§

    impl<Args, F, A> FnMut<Args> for Box<F, A>
    where\n Args: Tuple,\n F: FnMut<Args> + ?Sized,\n A: Allocator,

    source§

    extern "rust-call" fn call_mut(\n &mut self,\n args: Args\n) -> <Box<F, A> as FnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (fn_traits)
    Performs the call operation.
    ","FnMut","bdk_esplora::blocking_ext::Error"],["
    1.35.0 · source§

    impl<Args, F, A> FnOnce<Args> for Box<F, A>
    where\n Args: Tuple,\n F: FnOnce<Args> + ?Sized,\n A: Allocator,

    §

    type Output = <F as FnOnce<Args>>::Output

    The returned type after the call operator is used.
    source§

    extern "rust-call" fn call_once(\n self,\n args: Args\n) -> <Box<F, A> as FnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (fn_traits)
    Performs the call operation.
    ","FnOnce","bdk_esplora::blocking_ext::Error"],["
    1.6.0 · source§

    impl<T> From<T> for Box<T>

    source§

    fn from(t: T) -> Box<T>

    Converts a T into a Box<T>

    \n

    The conversion allocates on the heap and moves t\nfrom the stack into it.

    \n
    §Examples
    \n
    let x = 5;\nlet boxed = Box::new(5);\n\nassert_eq!(Box::from(x), boxed);
    \n
    ","From","bdk_esplora::blocking_ext::Error"],["
    §

    impl<F> FusedFuture for Box<F>
    where\n F: FusedFuture + Unpin + ?Sized,

    §

    fn is_terminated(&self) -> bool

    Returns true if the underlying future should no longer be polled.
    ","FusedFuture","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S> FusedStream for Box<S>
    where\n S: FusedStream + Unpin + ?Sized,

    §

    fn is_terminated(&self) -> bool

    Returns true if the stream should no longer be polled.
    ","FusedStream","bdk_esplora::blocking_ext::Error"],["
    1.36.0 · source§

    impl<F, A> Future for Box<F, A>
    where\n F: Future + Unpin + ?Sized,\n A: Allocator,

    §

    type Output = <F as Future>::Output

    The type of value produced on completion.
    source§

    fn poll(\n self: Pin<&mut Box<F, A>>,\n cx: &mut Context<'_>\n) -> Poll<<Box<F, A> as Future>::Output>

    Attempt to resolve the future to a final value, registering\nthe current task for wakeup if the value is not yet available. Read more
    ","Future","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Hash for Box<T, A>
    where\n T: Hash + ?Sized,\n A: Allocator,

    source§

    fn hash<H>(&self, state: &mut H)
    where\n 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\n H: Hasher,\n Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    ","Hash","bdk_esplora::blocking_ext::Error"],["
    1.22.0 · source§

    impl<T, A> Hasher for Box<T, A>
    where\n T: Hasher + ?Sized,\n A: Allocator,

    source§

    fn finish(&self) -> u64

    Returns the hash value for the values written so far. Read more
    source§

    fn write(&mut self, bytes: &[u8])

    Writes some data into this Hasher. Read more
    source§

    fn write_u8(&mut self, i: u8)

    Writes a single u8 into this hasher.
    source§

    fn write_u16(&mut self, i: u16)

    Writes a single u16 into this hasher.
    source§

    fn write_u32(&mut self, i: u32)

    Writes a single u32 into this hasher.
    source§

    fn write_u64(&mut self, i: u64)

    Writes a single u64 into this hasher.
    source§

    fn write_u128(&mut self, i: u128)

    Writes a single u128 into this hasher.
    source§

    fn write_usize(&mut self, i: usize)

    Writes a single usize into this hasher.
    source§

    fn write_i8(&mut self, i: i8)

    Writes a single i8 into this hasher.
    source§

    fn write_i16(&mut self, i: i16)

    Writes a single i16 into this hasher.
    source§

    fn write_i32(&mut self, i: i32)

    Writes a single i32 into this hasher.
    source§

    fn write_i64(&mut self, i: i64)

    Writes a single i64 into this hasher.
    source§

    fn write_i128(&mut self, i: i128)

    Writes a single i128 into this hasher.
    source§

    fn write_isize(&mut self, i: isize)

    Writes a single isize into this hasher.
    source§

    fn write_length_prefix(&mut self, len: usize)

    🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
    Writes a length prefix into this hasher, as part of being prefix-free. Read more
    source§

    fn write_str(&mut self, s: &str)

    🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
    Writes a single str into this hasher. Read more
    ","Hasher","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<I, A> Iterator for Box<I, A>
    where\n I: Iterator + ?Sized,\n A: Allocator,

    §

    type Item = <I as Iterator>::Item

    The type of the elements being iterated over.
    source§

    fn next(&mut self) -> Option<<I as Iterator>::Item>

    Advances the iterator and returns the next value. Read more
    source§

    fn size_hint(&self) -> (usize, Option<usize>)

    Returns the bounds on the remaining length of the iterator. Read more
    source§

    fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item>

    Returns the nth element of the iterator. Read more
    source§

    fn last(self) -> Option<<I as Iterator>::Item>

    Consumes the iterator, returning the last element. Read more
    source§

    fn next_chunk<const N: usize>(\n &mut self\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
    where\n Self: Sized,

    🔬This is a nightly-only experimental API. (iter_next_chunk)
    Advances the iterator and returns an array containing the next N values. Read more
    1.0.0 · source§

    fn count(self) -> usize
    where\n Self: Sized,

    Consumes the iterator, counting the number of iterations and returning it. Read more
    source§

    fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator by n elements. Read more
    1.28.0 · source§

    fn step_by(self, step: usize) -> StepBy<Self>
    where\n Self: Sized,

    Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
    1.0.0 · source§

    fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
    where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

    Takes two iterators and creates a new iterator over both in sequence. Read more
    1.0.0 · source§

    fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
    where\n Self: Sized,\n U: IntoIterator,

    ‘Zips up’ two iterators into a single iterator of pairs. Read more
    source§

    fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
    where\n Self: Sized,\n G: FnMut() -> Self::Item,

    🔬This is a nightly-only experimental API. (iter_intersperse)
    Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
    1.0.0 · source§

    fn map<B, F>(self, f: F) -> Map<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

    Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
    1.21.0 · source§

    fn for_each<F>(self, f: F)
    where\n Self: Sized,\n F: FnMut(Self::Item),

    Calls a closure on each element of an iterator. Read more
    1.0.0 · source§

    fn filter<P>(self, predicate: P) -> Filter<Self, P>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
    1.0.0 · source§

    fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

    Creates an iterator that both filters and maps. Read more
    1.0.0 · source§

    fn enumerate(self) -> Enumerate<Self>
    where\n Self: Sized,

    Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
    1.0.0 · source§

    fn peekable(self) -> Peekable<Self>
    where\n Self: Sized,

    Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
    1.0.0 · source§

    fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Creates an iterator that skips elements based on a predicate. Read more
    1.0.0 · source§

    fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Creates an iterator that yields elements based on a predicate. Read more
    1.57.0 · source§

    fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
    where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

    Creates an iterator that both yields elements based on a predicate and maps. Read more
    1.0.0 · source§

    fn skip(self, n: usize) -> Skip<Self>
    where\n Self: Sized,

    Creates an iterator that skips the first n elements. Read more
    1.0.0 · source§

    fn take(self, n: usize) -> Take<Self>
    where\n Self: Sized,

    Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
    1.0.0 · source§

    fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
    where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

    An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
    1.0.0 · source§

    fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
    where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

    Creates an iterator that works like map, but flattens nested structure. Read more
    source§

    fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
    where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

    🔬This is a nightly-only experimental API. (iter_map_windows)
    Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
    1.0.0 · source§

    fn fuse(self) -> Fuse<Self>
    where\n Self: Sized,

    Creates an iterator which ends after the first None. Read more
    1.0.0 · source§

    fn inspect<F>(self, f: F) -> Inspect<Self, F>
    where\n Self: Sized,\n F: FnMut(&Self::Item),

    Does something with each element of an iterator, passing the value on. Read more
    1.0.0 · source§

    fn by_ref(&mut self) -> &mut Self
    where\n Self: Sized,

    Borrows an iterator, rather than consuming it. Read more
    1.0.0 · source§

    fn collect<B>(self) -> B
    where\n B: FromIterator<Self::Item>,\n Self: Sized,

    Transforms an iterator into a collection. Read more
    source§

    fn collect_into<E>(self, collection: &mut E) -> &mut E
    where\n E: Extend<Self::Item>,\n Self: Sized,

    🔬This is a nightly-only experimental API. (iter_collect_into)
    Collects all the items from an iterator into a collection. Read more
    1.0.0 · source§

    fn partition<B, F>(self, f: F) -> (B, B)
    where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

    Consumes an iterator, creating two collections from it. Read more
    source§

    fn is_partitioned<P>(self, predicate: P) -> bool
    where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

    🔬This is a nightly-only experimental API. (iter_is_partitioned)
    Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
    1.27.0 · source§

    fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

    An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
    1.27.0 · source§

    fn try_for_each<F, R>(&mut self, f: F) -> R
    where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

    An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
    1.0.0 · source§

    fn fold<B, F>(self, init: B, f: F) -> B
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

    Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
    1.51.0 · source§

    fn reduce<F>(self, f: F) -> Option<Self::Item>
    where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

    Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
    source§

    fn try_reduce<F, R>(\n &mut self,\n f: F\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
    where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> R,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

    🔬This is a nightly-only experimental API. (iterator_try_reduce)
    Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
    1.0.0 · source§

    fn all<F>(&mut self, f: F) -> bool
    where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

    Tests if every element of the iterator matches a predicate. Read more
    1.0.0 · source§

    fn any<F>(&mut self, f: F) -> bool
    where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

    Tests if any element of the iterator matches a predicate. Read more
    1.0.0 · source§

    fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Searches for an element of an iterator that satisfies a predicate. Read more
    1.30.0 · source§

    fn find_map<B, F>(&mut self, f: F) -> Option<B>
    where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

    Applies function to the elements of iterator and returns\nthe first non-none result. Read more
    source§

    fn try_find<F, R>(\n &mut self,\n f: F\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
    where\n Self: Sized,\n F: FnMut(&Self::Item) -> R,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

    🔬This is a nightly-only experimental API. (try_find)
    Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
    1.0.0 · source§

    fn position<P>(&mut self, predicate: P) -> Option<usize>
    where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

    Searches for an element in an iterator, returning its index. Read more
    1.6.0 · source§

    fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
    where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

    Returns the element that gives the maximum value from the\nspecified function. Read more
    1.15.0 · source§

    fn max_by<F>(self, compare: F) -> Option<Self::Item>
    where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

    Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
    1.6.0 · source§

    fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
    where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

    Returns the element that gives the minimum value from the\nspecified function. Read more
    1.15.0 · source§

    fn min_by<F>(self, compare: F) -> Option<Self::Item>
    where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

    Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
    1.0.0 · source§

    fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
    where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

    Converts an iterator of pairs into a pair of containers. Read more
    1.36.0 · source§

    fn copied<'a, T>(self) -> Copied<Self>
    where\n T: 'a + Copy,\n Self: Sized + Iterator<Item = &'a T>,

    Creates an iterator which copies all of its elements. Read more
    1.0.0 · source§

    fn cloned<'a, T>(self) -> Cloned<Self>
    where\n T: 'a + Clone,\n Self: Sized + Iterator<Item = &'a T>,

    Creates an iterator which clones all of its elements. Read more
    source§

    fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
    where\n Self: Sized,

    🔬This is a nightly-only experimental API. (iter_array_chunks)
    Returns an iterator over N elements of the iterator at a time. Read more
    1.11.0 · source§

    fn sum<S>(self) -> S
    where\n Self: Sized,\n S: Sum<Self::Item>,

    Sums the elements of an iterator. Read more
    1.11.0 · source§

    fn product<P>(self) -> P
    where\n Self: Sized,\n P: Product<Self::Item>,

    Iterates over the entire iterator, multiplying all the elements Read more
    source§

    fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
    where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

    🔬This is a nightly-only experimental API. (iter_order_by)
    Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
    1.5.0 · source§

    fn partial_cmp<I>(self, other: I) -> Option<Ordering>
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
    source§

    fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
    where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

    🔬This is a nightly-only experimental API. (iter_order_by)
    Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
    1.5.0 · source§

    fn eq<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are equal to those of\nanother. Read more
    source§

    fn eq_by<I, F>(self, other: I, eq: F) -> bool
    where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

    🔬This is a nightly-only experimental API. (iter_order_by)
    Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
    1.5.0 · source§

    fn ne<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are not equal to those of\nanother. Read more
    1.5.0 · source§

    fn lt<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
    1.5.0 · source§

    fn le<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
    1.5.0 · source§

    fn gt<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
    1.5.0 · source§

    fn ge<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
    source§

    fn is_sorted_by<F>(self, compare: F) -> bool
    where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

    🔬This is a nightly-only experimental API. (is_sorted)
    Checks if the elements of this iterator are sorted using the given comparator function. Read more
    source§

    fn is_sorted_by_key<F, K>(self, f: F) -> bool
    where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

    🔬This is a nightly-only experimental API. (is_sorted)
    Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
    ","Iterator","bdk_esplora::blocking_ext::Error"],["
    §

    impl<Sp> LocalSpawn for Box<Sp>
    where\n Sp: LocalSpawn + ?Sized,

    §

    fn spawn_local_obj(\n &self,\n future: LocalFutureObj<'static, ()>\n) -> Result<(), SpawnError>

    Spawns a future that will be run to completion. Read more
    §

    fn status_local(&self) -> Result<(), SpawnError>

    Determines whether the executor is able to spawn new tasks. Read more
    ","LocalSpawn","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Ord for Box<T, A>
    where\n T: Ord + ?Sized,\n A: Allocator,

    source§

    fn cmp(&self, other: &Box<T, A>) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where\n Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where\n 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\n Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    ","Ord","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> PartialEq for Box<T, A>
    where\n T: PartialEq + ?Sized,\n A: Allocator,

    source§

    fn eq(&self, other: &Box<T, A>) -> bool

    This method tests for self and other values to be equal, and is used\nby ==.
    source§

    fn ne(&self, other: &Box<T, A>) -> bool

    This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
    ","PartialEq","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> PartialOrd for Box<T, A>
    where\n T: PartialOrd + ?Sized,\n A: Allocator,

    source§

    fn partial_cmp(&self, other: &Box<T, A>) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    source§

    fn lt(&self, other: &Box<T, A>) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    source§

    fn le(&self, other: &Box<T, A>) -> bool

    This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
    source§

    fn ge(&self, other: &Box<T, A>) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
    source§

    fn gt(&self, other: &Box<T, A>) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    ","PartialOrd","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Pointer for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Formats the value using the given formatter. Read more
    ","Pointer","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<R> Read for Box<R>
    where\n R: Read + ?Sized,

    source§

    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>

    Pull some bytes from this source into the specified buffer, returning\nhow many bytes were read. Read more
    source§

    fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (read_buf)
    Pull some bytes from this source into the specified buffer. Read more
    source§

    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

    Like read, except that it reads into a slice of buffers. Read more
    source§

    fn is_read_vectored(&self) -> bool

    🔬This is a nightly-only experimental API. (can_vector)
    Determines if this Reader has an efficient read_vectored\nimplementation. Read more
    source§

    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

    Read all bytes until EOF in this source, placing them into buf. Read more
    source§

    fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

    Read all bytes until EOF in this source, appending them to buf. Read more
    source§

    fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

    Read the exact number of bytes required to fill buf. Read more
    source§

    fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (read_buf)
    Read the exact number of bytes required to fill cursor. Read more
    1.0.0 · source§

    fn by_ref(&mut self) -> &mut Self
    where\n Self: Sized,

    Creates a “by reference” adaptor for this instance of Read. Read more
    1.0.0 · source§

    fn bytes(self) -> Bytes<Self>
    where\n Self: Sized,

    Transforms this Read instance to an Iterator over its bytes. Read more
    1.0.0 · source§

    fn chain<R>(self, next: R) -> Chain<Self, R>
    where\n R: Read,\n Self: Sized,

    Creates an adapter which will chain this stream with another. Read more
    1.0.0 · source§

    fn take(self, limit: u64) -> Take<Self>
    where\n Self: Sized,

    Creates an adapter which will read at most limit bytes from it. Read more
    ","Read","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<R> RngCore for Box<R>
    where\n R: RngCore + ?Sized,

    source§

    fn next_u32(&mut self) -> u32

    Return the next random u32. Read more
    source§

    fn next_u64(&mut self) -> u64

    Return the next random u64. Read more
    source§

    fn fill_bytes(&mut self, dest: &mut [u8])

    Fill dest with random data. Read more
    source§

    fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>

    Fill dest entirely with random data. Read more
    ","RngCore","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<S> Seek for Box<S>
    where\n S: Seek + ?Sized,

    source§

    fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>

    Seek to an offset, in bytes, in a stream. Read more
    source§

    fn stream_position(&mut self) -> Result<u64, Error>

    Returns the current seek position from the start of the stream. Read more
    1.55.0 · source§

    fn rewind(&mut self) -> Result<(), Error>

    Rewind to the beginning of a stream. Read more
    source§

    fn stream_len(&mut self) -> Result<u64, Error>

    🔬This is a nightly-only experimental API. (seek_stream_len)
    Returns the length of this stream (in bytes). Read more
    source§

    fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (seek_seek_relative)
    Seeks relative to the current position. Read more
    ","Seek","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Serialize for Box<T>
    where\n T: Serialize + ?Sized,

    source§

    fn serialize<S>(\n &self,\n serializer: S\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where\n S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    ","Serialize","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S, Request> Service<Request> for Box<S>
    where\n S: Service<Request> + ?Sized,

    §

    type Response = <S as Service<Request>>::Response

    Responses given by the service.
    §

    type Error = <S as Service<Request>>::Error

    Errors produced by the service.
    §

    type Future = <S as Service<Request>>::Future

    The future response value.
    §

    fn poll_ready(\n &mut self,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <S as Service<Request>>::Error>>

    Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
    §

    fn call(&mut self, request: Request) -> <S as Service<Request>>::Future

    Process the request and return the response asynchronously. Read more
    ","Service","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S, Item> Sink<Item> for Box<S>
    where\n S: Sink<Item> + Unpin + ?Sized,

    §

    type Error = <S as Sink<Item>>::Error

    The type of value produced by the sink when an error occurs.
    §

    fn poll_ready(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

    Attempts to prepare the Sink to receive a value. Read more
    §

    fn start_send(\n self: Pin<&mut Box<S>>,\n item: Item\n) -> Result<(), <Box<S> as Sink<Item>>::Error>

    Begin the process of sending a value to the sink.\nEach call to this function must be preceded by a successful call to\npoll_ready which returned Poll::Ready(Ok(())). Read more
    §

    fn poll_flush(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

    Flush any remaining output from this sink. Read more
    §

    fn poll_close(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

    Flush any remaining output and close this sink, if necessary. Read more
    ","Sink","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> Source for Box<T>
    where\n T: Source + ?Sized,

    §

    fn register(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest\n) -> Result<(), Error>

    Register self with the given Registry instance. Read more
    §

    fn reregister(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest\n) -> Result<(), Error>

    Re-register self with the given Registry instance. Read more
    §

    fn deregister(&mut self, registry: &Registry) -> Result<(), Error>

    Deregister self from the given Registry instance. Read more
    ","Source","bdk_esplora::blocking_ext::Error"],["
    §

    impl<Sp> Spawn for Box<Sp>
    where\n Sp: Spawn + ?Sized,

    §

    fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError>

    Spawns a future that will be run to completion. Read more
    §

    fn status(&self) -> Result<(), SpawnError>

    Determines whether the executor is able to spawn new tasks. Read more
    ","Spawn","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S> Stream for Box<S>
    where\n S: Stream + Unpin + ?Sized,

    §

    type Item = <S as Stream>::Item

    Values yielded by the stream.
    §

    fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Option<<Box<S> as Stream>::Item>>

    Attempt to pull out the next value of this stream, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the stream is exhausted. Read more
    §

    fn size_hint(&self) -> (usize, Option<usize>)

    Returns the bounds on the remaining length of the stream. Read more
    ","Stream","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S> Subscriber for Box<S>
    where\n S: Subscriber + ?Sized,

    §

    fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest

    Registers a new callsite with this subscriber, returning whether or not\nthe subscriber is interested in being notified about the callsite. Read more
    §

    fn enabled(&self, metadata: &Metadata<'_>) -> bool

    Returns true if a span or event with the specified metadata would be\nrecorded. Read more
    §

    fn max_level_hint(&self) -> Option<LevelFilter>

    Returns the highest verbosity level that this Subscriber will\nenable, or None, if the subscriber does not implement level-based\nfiltering or chooses not to implement this method. Read more
    §

    fn new_span(&self, span: &Attributes<'_>) -> Id

    Visit the construction of a new span, returning a new span ID for the\nspan being constructed. Read more
    §

    fn record(&self, span: &Id, values: &Record<'_>)

    Record a set of values on a span. Read more
    §

    fn record_follows_from(&self, span: &Id, follows: &Id)

    Adds an indication that span follows from the span with the id\nfollows. Read more
    §

    fn event_enabled(&self, event: &Event<'_>) -> bool

    Determine if an [Event] should be recorded. Read more
    §

    fn event(&self, event: &Event<'_>)

    Records that an Event has occurred. Read more
    §

    fn enter(&self, span: &Id)

    Records that a span has been entered. Read more
    §

    fn exit(&self, span: &Id)

    Records that a span has been exited. Read more
    §

    fn clone_span(&self, id: &Id) -> Id

    Notifies the subscriber that a span ID has been cloned. Read more
    §

    fn try_close(&self, id: Id) -> bool

    Notifies the subscriber that a span ID has been dropped, and returns\ntrue if there are now 0 IDs that refer to that span. Read more
    §

    fn drop_span(&self, id: Id)

    👎Deprecated since 0.1.2: use Subscriber::try_close instead
    This method is deprecated. Read more
    §

    fn current_span(&self) -> Current

    Returns a type representing this subscriber’s view of the current span. Read more
    §

    unsafe fn downcast_raw(&self, id: TypeId) -> Option<*const ()>

    If self is the same type as the provided TypeId, returns an untyped\n*const pointer to that type. Otherwise, returns None. Read more
    §

    fn on_register_dispatch(&self, subscriber: &Dispatch)

    Invoked when this subscriber becomes a [Dispatch]. Read more
    ","Subscriber","bdk_esplora::blocking_ext::Error"],["
    §

    impl<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
    where\n F: Future<Output = T> + 'a,

    §

    fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

    Convert an owned instance into a (conceptually owned) fat pointer. Read more
    §

    unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

    Drops the future represented by the given fat pointer. Read more
    ","UnsafeFutureObj<'a, T>","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> Value for Box<T>
    where\n T: Value + ?Sized,

    §

    fn record(&self, key: &Field, visitor: &mut dyn Visit)

    Visits this value with the given Visitor.
    ","Value","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<W> Write for Box<W>
    where\n W: Write + ?Sized,

    source§

    fn write(&mut self, buf: &[u8]) -> Result<usize, Error>

    Write a buffer into this writer, returning how many bytes were written. Read more
    source§

    fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

    Like write, except that it writes from a slice of buffers. Read more
    source§

    fn is_write_vectored(&self) -> bool

    🔬This is a nightly-only experimental API. (can_vector)
    Determines if this Writer has an efficient write_vectored\nimplementation. Read more
    source§

    fn flush(&mut self) -> Result<(), Error>

    Flush this output stream, ensuring that all intermediately buffered\ncontents reach their destination. Read more
    source§

    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

    Attempts to write an entire buffer into this writer. Read more
    source§

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

    Writes a formatted string into this writer, returning any error\nencountered. Read more
    source§

    fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (write_all_vectored)
    Attempts to write multiple buffers into this writer. Read more
    1.0.0 · source§

    fn by_ref(&mut self) -> &mut Self
    where\n Self: Sized,

    Creates a “by reference” adapter for this instance of Write. Read more
    ","Write","bdk_esplora::blocking_ext::Error"],["
    §

    impl<'a, T> Writeable for Box<T>
    where\n T: Writeable + ?Sized,

    §

    fn write_to<W>(&self, sink: &mut W) -> Result<(), Error>
    where\n W: Write + ?Sized,

    Writes a string to the given sink. Errors from the sink are bubbled up.\nThe default implementation delegates to write_to_parts, and discards any\nPart annotations.
    §

    fn write_to_parts<W>(&self, sink: &mut W) -> Result<(), Error>
    where\n W: PartsWrite + ?Sized,

    Write bytes and Part annotations to the given sink. Errors from the\nsink are bubbled up. The default implementation delegates to write_to,\nand doesn’t produce any Part annotations.
    §

    fn writeable_length_hint(&self) -> LengthHint

    Returns a hint for the number of UTF-8 bytes that will be written to the sink. Read more
    §

    fn write_to_string(&self) -> Cow<'_, str>

    Creates a new String with the data from this Writeable. Like ToString,\nbut smaller and faster. Read more
    §

    fn writeable_cmp_bytes(&self, other: &[u8]) -> Ordering

    Compares the contents of this Writeable to the given bytes\nwithout allocating a String to hold the Writeable contents. Read more
    ","Writeable","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> CartablePointerLike for Box<T>

    ","CartablePointerLike","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, U, A> CoerceUnsized<Box<U, A>> for Box<T, A>
    where\n T: Unsize<U> + ?Sized,\n A: Allocator,\n U: ?Sized,

    ","CoerceUnsized>","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<R> CryptoRng for Box<R>
    where\n R: CryptoRng + ?Sized,

    ","CryptoRng","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, A> DerefPure for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    ","DerefPure","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, U> DispatchFromDyn<Box<U>> for Box<T>
    where\n T: Unsize<U> + ?Sized,\n U: ?Sized,

    ","DispatchFromDyn>","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Eq for Box<T, A>
    where\n T: Eq + ?Sized,\n A: Allocator,

    ","Eq","bdk_esplora::blocking_ext::Error"],["
    1.26.0 · source§

    impl<I, A> FusedIterator for Box<I, A>
    where\n I: FusedIterator + ?Sized,\n A: Allocator,

    ","FusedIterator","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> IoSafe for Box<T>
    where\n T: IoSafe + ?Sized,

    ","IoSafe","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> StableDeref for Box<T>
    where\n T: ?Sized,

    ","StableDeref","bdk_esplora::blocking_ext::Error"],["
    1.33.0 · source§

    impl<T, A> Unpin for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    ","Unpin","bdk_esplora::blocking_ext::Error"]] +"bdk_esplora":[["
    §

    impl<T> AnyProvider for Box<T>
    where\n T: AnyProvider + ?Sized,

    §

    fn load_any(\n &self,\n key: DataKey,\n req: DataRequest<'_>\n) -> Result<AnyResponse, DataError>

    Loads an [AnyPayload] according to the key and request.
    ","AnyProvider","bdk_esplora::blocking_ext::Error"],["
    1.64.0 · source§

    impl<T> AsFd for Box<T>
    where\n T: AsFd + ?Sized,

    source§

    fn as_fd(&self) -> BorrowedFd<'_>

    Borrows the file descriptor. Read more
    ","AsFd","bdk_esplora::blocking_ext::Error"],["
    1.5.0 · source§

    impl<T, A> AsMut<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Converts this type into a mutable reference of the (usually inferred) input type.
    ","AsMut","bdk_esplora::blocking_ext::Error"],["
    1.63.0 · source§

    impl<T> AsRawFd for Box<T>
    where\n T: AsRawFd,

    source§

    fn as_raw_fd(&self) -> i32

    Extracts the raw file descriptor. Read more
    ","AsRawFd","bdk_esplora::blocking_ext::Error"],["
    1.5.0 · source§

    impl<T, A> AsRef<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

    fn as_ref(&self) -> &T

    Converts this type into a shared reference of the (usually inferred) input type.
    ","AsRef","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncBufRead for Box<T>
    where\n T: AsyncBufRead + Unpin + ?Sized,

    §

    fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<&[u8], Error>>

    Attempt to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
    §

    fn consume(self: Pin<&mut Box<T>>, amt: usize)

    Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
    ","AsyncBufRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncBufRead for Box<T>
    where\n T: AsyncBufRead + Unpin + ?Sized,

    §

    fn poll_fill_buf(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<&[u8], Error>>

    Attempts to return the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
    §

    fn consume(self: Pin<&mut Box<T>>, amt: usize)

    Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to poll_read. Read more
    ","AsyncBufRead","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<Args, F, A> AsyncFn<Args> for Box<F, A>
    where\n Args: Tuple,\n F: AsyncFn<Args> + ?Sized,\n A: Allocator,

    source§

    extern "rust-call" fn async_call(\n &self,\n args: Args\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Call the AsyncFn, returning a future which may borrow from the called closure.
    ","AsyncFn","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<Args, F, A> AsyncFnMut<Args> for Box<F, A>
    where\n Args: Tuple,\n F: AsyncFnMut<Args> + ?Sized,\n A: Allocator,

    §

    type CallRefFuture<'a> = <F as AsyncFnMut<Args>>::CallRefFuture<'a>\nwhere\n Box<F, A>: 'a

    🔬This is a nightly-only experimental API. (async_fn_traits)
    source§

    extern "rust-call" fn async_call_mut(\n &mut self,\n args: Args\n) -> <Box<F, A> as AsyncFnMut<Args>>::CallRefFuture<'_>

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Call the AsyncFnMut, returning a future which may borrow from the called closure.
    ","AsyncFnMut","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<Args, F, A> AsyncFnOnce<Args> for Box<F, A>
    where\n Args: Tuple,\n F: AsyncFnOnce<Args> + ?Sized,\n A: Allocator,

    §

    type Output = <F as AsyncFnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Output type of the called closure’s future.
    §

    type CallOnceFuture = <F as AsyncFnOnce<Args>>::CallOnceFuture

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Future returned by AsyncFnOnce::async_call_once.
    source§

    extern "rust-call" fn async_call_once(\n self,\n args: Args\n) -> <Box<F, A> as AsyncFnOnce<Args>>::CallOnceFuture

    🔬This is a nightly-only experimental API. (async_fn_traits)
    Call the AsyncFnOnce, returning a future which may move out of the called closure.
    ","AsyncFnOnce","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<S> AsyncIterator for Box<S>
    where\n S: AsyncIterator + Unpin + ?Sized,

    §

    type Item = <S as AsyncIterator>::Item

    🔬This is a nightly-only experimental API. (async_iterator)
    The type of items yielded by the async iterator.
    source§

    fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Option<<Box<S> as AsyncIterator>::Item>>

    🔬This is a nightly-only experimental API. (async_iterator)
    Attempt to pull out the next value of this async iterator, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the async iterator is exhausted. Read more
    source§

    fn size_hint(&self) -> (usize, Option<usize>)

    🔬This is a nightly-only experimental API. (async_iterator)
    Returns the bounds on the remaining length of the async iterator. Read more
    ","AsyncIterator","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncRead for Box<T>
    where\n T: AsyncRead + Unpin + ?Sized,

    §

    fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut ReadBuf<'_>\n) -> Poll<Result<(), Error>>

    Attempts to read from the AsyncRead into buf. Read more
    ","AsyncRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncRead for Box<T>
    where\n T: AsyncRead + Unpin + ?Sized,

    §

    fn poll_read(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &mut [u8]\n) -> Poll<Result<usize, Error>>

    Attempt to read from the AsyncRead into buf. Read more
    §

    fn poll_read_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &mut [IoSliceMut<'_>]\n) -> Poll<Result<usize, Error>>

    Attempt to read from the AsyncRead into bufs using vectored\nIO operations. Read more
    ","AsyncRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncSeek for Box<T>
    where\n T: AsyncSeek + Unpin + ?Sized,

    §

    fn poll_seek(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n pos: SeekFrom\n) -> Poll<Result<u64, Error>>

    Attempt to seek to an offset, in bytes, in a stream. Read more
    ","AsyncSeek","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncSeek for Box<T>
    where\n T: AsyncSeek + Unpin + ?Sized,

    §

    fn start_seek(self: Pin<&mut Box<T>>, pos: SeekFrom) -> Result<(), Error>

    Attempts to seek to an offset, in bytes, in a stream. Read more
    §

    fn poll_complete(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<u64, Error>>

    Waits for a seek operation to complete. Read more
    ","AsyncSeek","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncWrite for Box<T>
    where\n T: AsyncWrite + Unpin + ?Sized,

    §

    fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8]\n) -> Poll<Result<usize, Error>>

    Attempt to write bytes from buf into the object. Read more
    §

    fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>]\n) -> Poll<Result<usize, Error>>

    Attempt to write bytes from bufs into the object using vectored\nIO operations. Read more
    §

    fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Attempt to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
    §

    fn poll_close(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Attempt to close the object. Read more
    ","AsyncWrite","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> AsyncWrite for Box<T>
    where\n T: AsyncWrite + Unpin + ?Sized,

    §

    fn poll_write(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n buf: &[u8]\n) -> Poll<Result<usize, Error>>

    Attempt to write bytes from buf into the object. Read more
    §

    fn poll_write_vectored(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>,\n bufs: &[IoSlice<'_>]\n) -> Poll<Result<usize, Error>>

    Like poll_write, except that it writes from a slice of buffers. Read more
    §

    fn is_write_vectored(&self) -> bool

    Determines if this writer has an efficient poll_write_vectored\nimplementation. Read more
    §

    fn poll_flush(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Attempts to flush the object, ensuring that any buffered data reach\ntheir destination. Read more
    §

    fn poll_shutdown(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), Error>>

    Initiates or attempts to shut down this writer, returning success when\nthe I/O connection has completely shut down. Read more
    ","AsyncWrite","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Body for Box<T>
    where\n T: Body + Unpin + ?Sized,

    §

    type Data = <T as Body>::Data

    Values yielded by the Body.
    §

    type Error = <T as Body>::Error

    The error type this Body might generate.
    source§

    fn poll_data(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Option<Result<<Box<T> as Body>::Data, <Box<T> as Body>::Error>>>

    Attempt to pull out the next data buffer of this stream.
    source§

    fn poll_trailers(\n self: Pin<&mut Box<T>>,\n cx: &mut Context<'_>\n) -> Poll<Result<Option<HeaderMap>, <Box<T> as Body>::Error>>

    Poll for an optional single HeaderMap of trailers. Read more
    source§

    fn is_end_stream(&self) -> bool

    Returns true when the end of stream has been reached. Read more
    source§

    fn size_hint(&self) -> SizeHint

    Returns the bounds on the remaining length of the stream. Read more
    source§

    fn data(&mut self) -> Data<'_, Self>
    where\n Self: Sized + Unpin,

    Returns future that resolves to next data chunk, if any.
    source§

    fn trailers(&mut self) -> Trailers<'_, Self>
    where\n Self: Sized + Unpin,

    Returns future that resolves to trailers, if any.
    source§

    fn map_data<F, B>(self, f: F) -> MapData<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Data) -> B,\n B: Buf,

    Maps this body’s data value to a different value.
    source§

    fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Error) -> E,

    Maps this body’s error value to a different value.
    source§

    fn collect(self) -> Collect<Self>
    where\n Self: Sized,

    Turn this body into Collected body which will collect all the DATA frames\nand trailers.
    ","Body","bdk_esplora::blocking_ext::Error"],["
    1.1.0 · source§

    impl<T, A> Borrow<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    ","Borrow","bdk_esplora::blocking_ext::Error"],["
    1.1.0 · source§

    impl<T, A> BorrowMut<T> for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Mutably borrows from an owned value. Read more
    ","BorrowMut","bdk_esplora::blocking_ext::Error"],["
    §

    impl<M, P> BoundDataProvider<M> for Box<P>
    where\n M: DataMarker,\n P: BoundDataProvider<M> + ?Sized,

    §

    fn load_bound(&self, req: DataRequest<'_>) -> Result<DataResponse<M>, DataError>

    Query the provider for data, returning the result. Read more
    §

    fn bound_key(&self) -> DataKey

    Returns the [DataKey] that this provider uses for loading data.
    ","BoundDataProvider","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Box<T>

    1.0.0 · source

    pub fn new(x: T) -> Box<T>

    Allocates memory on the heap and then places x into it.

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    let five = Box::new(5);
    \n
    source

    pub fn new_uninit() -> Box<MaybeUninit<T>>

    🔬This is a nightly-only experimental API. (new_uninit)

    Constructs a new box with uninitialized contents.

    \n
    §Examples
    \n
    #![feature(new_uninit)]\n\nlet mut five = Box::<u32>::new_uninit();\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
    \n
    source

    pub fn new_zeroed() -> Box<MaybeUninit<T>>

    🔬This is a nightly-only experimental API. (new_uninit)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes.

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(new_uninit)]\n\nlet zero = Box::<u32>::new_zeroed();\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
    \n
    1.33.0 · source

    pub fn pin(x: T) -> Pin<Box<T>>

    Constructs a new Pin<Box<T>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

    \n

    Constructing and pinning of the Box can also be done in two steps: Box::pin(x)\ndoes the same as Box::into_pin(Box::new(x)). Consider using\ninto_pin if you already have a Box<T>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new.

    \n
    source

    pub fn try_new(x: T) -> Result<Box<T>, AllocError>

    🔬This is a nightly-only experimental API. (allocator_api)

    Allocates memory on the heap then places x into it,\nreturning an error if the allocation fails

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    #![feature(allocator_api)]\n\nlet five = Box::try_new(5)?;
    \n
    source

    pub fn try_new_uninit() -> Result<Box<MaybeUninit<T>>, AllocError>

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new box with uninitialized contents on the heap,\nreturning an error if the allocation fails

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nlet mut five = Box::<u32>::try_new_uninit()?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
    \n
    source

    pub fn try_new_zeroed() -> Result<Box<MaybeUninit<T>>, AllocError>

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes on the heap

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nlet zero = Box::<u32>::try_new_zeroed()?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Box<T>
    where\n T: ?Sized,

    1.4.0 · source

    pub unsafe fn from_raw(raw: *mut T) -> Box<T>

    Constructs a box from a raw pointer.

    \n

    After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

    \n
    §Safety
    \n

    This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

    \n

    The safety conditions are described in the memory layout section.

    \n
    §Examples
    \n

    Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw:

    \n\n
    let x = Box::new(5);\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
    \n

    Manually create a Box from scratch by using the global allocator:

    \n\n
    use std::alloc::{alloc, Layout};\n\nunsafe {\n    let ptr = alloc(Layout::new::<i32>()) as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw(ptr);\n}
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, A> Box<T, A>
    where\n A: Allocator,

    source

    pub fn new_in(x: T, alloc: A) -> Box<T, A>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Allocates memory in the given allocator then places x into it.

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::new_in(5, System);
    \n
    source

    pub fn try_new_in(x: T, alloc: A) -> Result<Box<T, A>, AllocError>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Allocates memory in the given allocator then places x into it,\nreturning an error if the allocation fails

    \n

    This doesn’t actually allocate if T is zero-sized.

    \n
    §Examples
    \n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet five = Box::try_new_in(5, System)?;
    \n
    source

    pub fn new_uninit_in(alloc: A) -> Box<MaybeUninit<T>, A>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new box with uninitialized contents in the provided allocator.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::new_uninit_in(System);\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5)
    \n
    source

    pub fn try_new_uninit_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new box with uninitialized contents in the provided allocator,\nreturning an error if the allocation fails

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet mut five = Box::<u32, _>::try_new_uninit_in(System)?;\n\nlet five = unsafe {\n    // Deferred initialization:\n    five.as_mut_ptr().write(5);\n\n    five.assume_init()\n};\n\nassert_eq!(*five, 5);
    \n
    source

    pub fn new_zeroed_in(alloc: A) -> Box<MaybeUninit<T>, A>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator.

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::new_zeroed_in(System);\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0)
    \n
    source

    pub fn try_new_zeroed_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>
    where\n A: Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Box with uninitialized contents, with the memory\nbeing filled with 0 bytes in the provided allocator,\nreturning an error if the allocation fails,

    \n

    See MaybeUninit::zeroed for examples of correct and incorrect usage\nof this method.

    \n
    §Examples
    \n
    #![feature(allocator_api, new_uninit)]\n\nuse std::alloc::System;\n\nlet zero = Box::<u32, _>::try_new_zeroed_in(System)?;\nlet zero = unsafe { zero.assume_init() };\n\nassert_eq!(*zero, 0);
    \n
    source

    pub fn pin_in(x: T, alloc: A) -> Pin<Box<T, A>>
    where\n A: 'static + Allocator,

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a new Pin<Box<T, A>>. If T does not implement Unpin, then\nx will be pinned in memory and unable to be moved.

    \n

    Constructing and pinning of the Box can also be done in two steps: Box::pin_in(x, alloc)\ndoes the same as Box::into_pin(Box::new_in(x, alloc)). Consider using\ninto_pin if you already have a Box<T, A>, or if you want to\nconstruct a (pinned) Box in a different way than with Box::new_in.

    \n
    source

    pub fn into_boxed_slice(boxed: Box<T, A>) -> Box<[T], A>

    🔬This is a nightly-only experimental API. (box_into_boxed_slice)

    Converts a Box<T> into a Box<[T]>

    \n

    This conversion does not allocate on the heap and happens in place.

    \n
    source

    pub fn into_inner(boxed: Box<T, A>) -> T

    🔬This is a nightly-only experimental API. (box_into_inner)

    Consumes the Box, returning the wrapped value.

    \n
    §Examples
    \n
    #![feature(box_into_inner)]\n\nlet c = Box::new(5);\n\nassert_eq!(Box::into_inner(c), 5);
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, A> Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    const: unstable · source

    pub unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Box<T, A>

    🔬This is a nightly-only experimental API. (allocator_api)

    Constructs a box from a raw pointer in the given allocator.

    \n

    After calling this function, the raw pointer is owned by the\nresulting Box. Specifically, the Box destructor will call\nthe destructor of T and free the allocated memory. For this\nto be safe, the memory must have been allocated in accordance\nwith the memory layout used by Box .

    \n
    §Safety
    \n

    This function is unsafe because improper use may lead to\nmemory problems. For example, a double-free may occur if the\nfunction is called twice on the same raw pointer.

    \n
    §Examples
    \n

    Recreate a Box which was previously converted to a raw pointer\nusing Box::into_raw_with_allocator:

    \n\n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(5, System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
    \n

    Manually create a Box from scratch by using the system allocator:

    \n\n
    #![feature(allocator_api, slice_ptr_get)]\n\nuse std::alloc::{Allocator, Layout, System};\n\nunsafe {\n    let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;\n    // In general .write is required to avoid attempting to destruct\n    // the (uninitialized) previous contents of `ptr`, though for this\n    // simple example `*ptr = 5` would have worked as well.\n    ptr.write(5);\n    let x = Box::from_raw_in(ptr, System);\n}
    \n
    1.4.0 · source

    pub fn into_raw(b: Box<T, A>) -> *mut T

    Consumes the Box, returning a wrapped raw pointer.

    \n

    The pointer will be properly aligned and non-null.

    \n

    After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw function, allowing the Box destructor to perform\nthe cleanup.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::into_raw(b) instead of b.into_raw(). This\nis so that there is no conflict with a method on the inner type.

    \n
    §Examples
    \n

    Converting the raw pointer back into a Box with Box::from_raw\nfor automatic cleanup:

    \n\n
    let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nlet x = unsafe { Box::from_raw(ptr) };
    \n

    Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

    \n\n
    use std::alloc::{dealloc, Layout};\nuse std::ptr;\n\nlet x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    dealloc(ptr as *mut u8, Layout::new::<String>());\n}
    \n

    Note: This is equivalent to the following:

    \n\n
    let x = Box::new(String::from(\"Hello\"));\nlet ptr = Box::into_raw(x);\nunsafe {\n    drop(Box::from_raw(ptr));\n}
    \n
    source

    pub fn into_raw_with_allocator(b: Box<T, A>) -> (*mut T, A)

    🔬This is a nightly-only experimental API. (allocator_api)

    Consumes the Box, returning a wrapped raw pointer and the allocator.

    \n

    The pointer will be properly aligned and non-null.

    \n

    After calling this function, the caller is responsible for the\nmemory previously managed by the Box. In particular, the\ncaller should properly destroy T and release the memory, taking\ninto account the memory layout used by Box. The easiest way to\ndo this is to convert the raw pointer back into a Box with the\nBox::from_raw_in function, allowing the Box destructor to perform\nthe cleanup.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::into_raw_with_allocator(b) instead of b.into_raw_with_allocator(). This\nis so that there is no conflict with a method on the inner type.

    \n
    §Examples
    \n

    Converting the raw pointer back into a Box with Box::from_raw_in\nfor automatic cleanup:

    \n\n
    #![feature(allocator_api)]\n\nuse std::alloc::System;\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nlet x = unsafe { Box::from_raw_in(ptr, alloc) };
    \n

    Manual cleanup by explicitly running the destructor and deallocating\nthe memory:

    \n\n
    #![feature(allocator_api)]\n\nuse std::alloc::{Allocator, Layout, System};\nuse std::ptr::{self, NonNull};\n\nlet x = Box::new_in(String::from(\"Hello\"), System);\nlet (ptr, alloc) = Box::into_raw_with_allocator(x);\nunsafe {\n    ptr::drop_in_place(ptr);\n    let non_null = NonNull::new_unchecked(ptr);\n    alloc.deallocate(non_null.cast(), Layout::new::<String>());\n}
    \n
    const: unstable · source

    pub fn allocator(b: &Box<T, A>) -> &A

    🔬This is a nightly-only experimental API. (allocator_api)

    Returns a reference to the underlying allocator.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::allocator(&b) instead of b.allocator(). This\nis so that there is no conflict with a method on the inner type.

    \n
    1.26.0 · source

    pub fn leak<'a>(b: Box<T, A>) -> &'a mut T
    where\n A: 'a,

    Consumes and leaks the Box, returning a mutable reference,\n&'a mut T. Note that the type T must outlive the chosen lifetime\n'a. If the type has only static references, or none at all, then this\nmay be chosen to be 'static.

    \n

    This function is mainly useful for data that lives for the remainder of\nthe program’s life. Dropping the returned reference will cause a memory\nleak. If this is not acceptable, the reference should first be wrapped\nwith the Box::from_raw function producing a Box. This Box can\nthen be dropped which will properly destroy T and release the\nallocated memory.

    \n

    Note: this is an associated function, which means that you have\nto call it as Box::leak(b) instead of b.leak(). This\nis so that there is no conflict with a method on the inner type.

    \n
    §Examples
    \n

    Simple usage:

    \n\n
    let x = Box::new(41);\nlet static_ref: &'static mut usize = Box::leak(x);\n*static_ref += 1;\nassert_eq!(*static_ref, 42);
    \n

    Unsized data:

    \n\n
    let x = vec![1, 2, 3].into_boxed_slice();\nlet static_ref = Box::leak(x);\nstatic_ref[0] = 4;\nassert_eq!(*static_ref, [4, 2, 3]);
    \n
    1.63.0 (const: unstable) · source

    pub fn into_pin(boxed: Box<T, A>) -> Pin<Box<T, A>>
    where\n A: 'static,

    Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then\n*boxed will be pinned in memory and unable to be moved.

    \n

    This conversion does not allocate on the heap and happens in place.

    \n

    This is also available via From.

    \n

    Constructing and pinning a Box with Box::into_pin(Box::new(x))\ncan also be written more concisely using Box::pin(x).\nThis into_pin method is useful if you already have a Box<T>, or you are\nconstructing a (pinned) Box in a different way than with Box::new.

    \n
    §Notes
    \n

    It’s not recommended that crates add an impl like From<Box<T>> for Pin<T>,\nas it’ll introduce an ambiguity when calling Pin::from.\nA demonstration of such a poor impl is shown below.

    \n\n
    struct Foo; // A type defined in this crate.\nimpl From<Box<()>> for Pin<Foo> {\n    fn from(_: Box<()>) -> Pin<Foo> {\n        Pin::new(Foo)\n    }\n}\n\nlet foo = Box::new(());\nlet bar = Pin::from(foo);
    \n
    ",0,"bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> Buf for Box<T>
    where\n T: Buf + ?Sized,

    §

    fn remaining(&self) -> usize

    Returns the number of bytes between the current position and the end of\nthe buffer. Read more
    §

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

    Returns a slice starting at the current position and of length between 0\nand Buf::remaining(). Note that this can return a shorter slice (this\nallows non-continuous internal representation). Read more
    §

    fn chunks_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize

    Fills dst with potentially multiple slices starting at self’s\ncurrent position. Read more
    §

    fn advance(&mut self, cnt: usize)

    Advance the internal cursor of the Buf Read more
    §

    fn has_remaining(&self) -> bool

    Returns true if there are any more bytes to consume Read more
    §

    fn copy_to_slice(&mut self, dst: &mut [u8])

    Copies bytes from self into dst. Read more
    §

    fn get_u8(&mut self) -> u8

    Gets an unsigned 8 bit integer from self. Read more
    §

    fn get_i8(&mut self) -> i8

    Gets a signed 8 bit integer from self. Read more
    §

    fn get_u16(&mut self) -> u16

    Gets an unsigned 16 bit integer from self in big-endian byte order. Read more
    §

    fn get_u16_le(&mut self) -> u16

    Gets an unsigned 16 bit integer from self in little-endian byte order. Read more
    §

    fn get_u16_ne(&mut self) -> u16

    Gets an unsigned 16 bit integer from self in native-endian byte order. Read more
    §

    fn get_i16(&mut self) -> i16

    Gets a signed 16 bit integer from self in big-endian byte order. Read more
    §

    fn get_i16_le(&mut self) -> i16

    Gets a signed 16 bit integer from self in little-endian byte order. Read more
    §

    fn get_i16_ne(&mut self) -> i16

    Gets a signed 16 bit integer from self in native-endian byte order. Read more
    §

    fn get_u32(&mut self) -> u32

    Gets an unsigned 32 bit integer from self in the big-endian byte order. Read more
    §

    fn get_u32_le(&mut self) -> u32

    Gets an unsigned 32 bit integer from self in the little-endian byte order. Read more
    §

    fn get_u32_ne(&mut self) -> u32

    Gets an unsigned 32 bit integer from self in native-endian byte order. Read more
    §

    fn get_i32(&mut self) -> i32

    Gets a signed 32 bit integer from self in big-endian byte order. Read more
    §

    fn get_i32_le(&mut self) -> i32

    Gets a signed 32 bit integer from self in little-endian byte order. Read more
    §

    fn get_i32_ne(&mut self) -> i32

    Gets a signed 32 bit integer from self in native-endian byte order. Read more
    §

    fn get_u64(&mut self) -> u64

    Gets an unsigned 64 bit integer from self in big-endian byte order. Read more
    §

    fn get_u64_le(&mut self) -> u64

    Gets an unsigned 64 bit integer from self in little-endian byte order. Read more
    §

    fn get_u64_ne(&mut self) -> u64

    Gets an unsigned 64 bit integer from self in native-endian byte order. Read more
    §

    fn get_i64(&mut self) -> i64

    Gets a signed 64 bit integer from self in big-endian byte order. Read more
    §

    fn get_i64_le(&mut self) -> i64

    Gets a signed 64 bit integer from self in little-endian byte order. Read more
    §

    fn get_i64_ne(&mut self) -> i64

    Gets a signed 64 bit integer from self in native-endian byte order. Read more
    §

    fn get_uint(&mut self, nbytes: usize) -> u64

    Gets an unsigned n-byte integer from self in big-endian byte order. Read more
    §

    fn get_uint_le(&mut self, nbytes: usize) -> u64

    Gets an unsigned n-byte integer from self in little-endian byte order. Read more
    §

    fn get_uint_ne(&mut self, nbytes: usize) -> u64

    Gets an unsigned n-byte integer from self in native-endian byte order. Read more
    §

    fn get_int(&mut self, nbytes: usize) -> i64

    Gets a signed n-byte integer from self in big-endian byte order. Read more
    §

    fn get_int_le(&mut self, nbytes: usize) -> i64

    Gets a signed n-byte integer from self in little-endian byte order. Read more
    §

    fn get_int_ne(&mut self, nbytes: usize) -> i64

    Gets a signed n-byte integer from self in native-endian byte order. Read more
    §

    fn copy_to_bytes(&mut self, len: usize) -> Bytes

    Consumes len bytes inside self and returns new instance of Bytes\nwith this data. Read more
    §

    fn get_u128(&mut self) -> u128

    Gets an unsigned 128 bit integer from self in big-endian byte order. Read more
    §

    fn get_u128_le(&mut self) -> u128

    Gets an unsigned 128 bit integer from self in little-endian byte order. Read more
    §

    fn get_u128_ne(&mut self) -> u128

    Gets an unsigned 128 bit integer from self in native-endian byte order. Read more
    §

    fn get_i128(&mut self) -> i128

    Gets a signed 128 bit integer from self in big-endian byte order. Read more
    §

    fn get_i128_le(&mut self) -> i128

    Gets a signed 128 bit integer from self in little-endian byte order. Read more
    §

    fn get_i128_ne(&mut self) -> i128

    Gets a signed 128 bit integer from self in native-endian byte order. Read more
    §

    fn get_f32(&mut self) -> f32

    Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in big-endian byte order. Read more
    §

    fn get_f32_le(&mut self) -> f32

    Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in little-endian byte order. Read more
    §

    fn get_f32_ne(&mut self) -> f32

    Gets an IEEE754 single-precision (4 bytes) floating point number from\nself in native-endian byte order. Read more
    §

    fn get_f64(&mut self) -> f64

    Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in big-endian byte order. Read more
    §

    fn get_f64_le(&mut self) -> f64

    Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in little-endian byte order. Read more
    §

    fn get_f64_ne(&mut self) -> f64

    Gets an IEEE754 double-precision (8 bytes) floating point number from\nself in native-endian byte order. Read more
    §

    fn take(self, limit: usize) -> Take<Self>
    where\n Self: Sized,

    Creates an adaptor which will read at most limit bytes from self. Read more
    §

    fn chain<U>(self, next: U) -> Chain<Self, U>
    where\n U: Buf,\n Self: Sized,

    Creates an adaptor which will chain this buffer with another. Read more
    §

    fn reader(self) -> Reader<Self>
    where\n Self: Sized,

    Creates an adaptor which implements the Read trait for self. Read more
    ","Buf","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> BufMut for Box<T>
    where\n T: BufMut + ?Sized,

    §

    fn remaining_mut(&self) -> usize

    Returns the number of bytes that can be written from the current\nposition until the end of the buffer is reached. Read more
    §

    fn chunk_mut(&mut self) -> &mut UninitSlice

    Returns a mutable slice starting at the current BufMut position and of\nlength between 0 and BufMut::remaining_mut(). Note that this can be shorter than the\nwhole remainder of the buffer (this allows non-continuous implementation). Read more
    §

    unsafe fn advance_mut(&mut self, cnt: usize)

    Advance the internal cursor of the BufMut Read more
    §

    fn put_slice(&mut self, src: &[u8])

    Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
    §

    fn put_u8(&mut self, n: u8)

    Writes an unsigned 8 bit integer to self. Read more
    §

    fn put_i8(&mut self, n: i8)

    Writes a signed 8 bit integer to self. Read more
    §

    fn put_u16(&mut self, n: u16)

    Writes an unsigned 16 bit integer to self in big-endian byte order. Read more
    §

    fn put_u16_le(&mut self, n: u16)

    Writes an unsigned 16 bit integer to self in little-endian byte order. Read more
    §

    fn put_u16_ne(&mut self, n: u16)

    Writes an unsigned 16 bit integer to self in native-endian byte order. Read more
    §

    fn put_i16(&mut self, n: i16)

    Writes a signed 16 bit integer to self in big-endian byte order. Read more
    §

    fn put_i16_le(&mut self, n: i16)

    Writes a signed 16 bit integer to self in little-endian byte order. Read more
    §

    fn put_i16_ne(&mut self, n: i16)

    Writes a signed 16 bit integer to self in native-endian byte order. Read more
    §

    fn put_u32(&mut self, n: u32)

    Writes an unsigned 32 bit integer to self in big-endian byte order. Read more
    §

    fn put_u32_le(&mut self, n: u32)

    Writes an unsigned 32 bit integer to self in little-endian byte order. Read more
    §

    fn put_u32_ne(&mut self, n: u32)

    Writes an unsigned 32 bit integer to self in native-endian byte order. Read more
    §

    fn put_i32(&mut self, n: i32)

    Writes a signed 32 bit integer to self in big-endian byte order. Read more
    §

    fn put_i32_le(&mut self, n: i32)

    Writes a signed 32 bit integer to self in little-endian byte order. Read more
    §

    fn put_i32_ne(&mut self, n: i32)

    Writes a signed 32 bit integer to self in native-endian byte order. Read more
    §

    fn put_u64(&mut self, n: u64)

    Writes an unsigned 64 bit integer to self in the big-endian byte order. Read more
    §

    fn put_u64_le(&mut self, n: u64)

    Writes an unsigned 64 bit integer to self in little-endian byte order. Read more
    §

    fn put_u64_ne(&mut self, n: u64)

    Writes an unsigned 64 bit integer to self in native-endian byte order. Read more
    §

    fn put_i64(&mut self, n: i64)

    Writes a signed 64 bit integer to self in the big-endian byte order. Read more
    §

    fn put_i64_le(&mut self, n: i64)

    Writes a signed 64 bit integer to self in little-endian byte order. Read more
    §

    fn put_i64_ne(&mut self, n: i64)

    Writes a signed 64 bit integer to self in native-endian byte order. Read more
    §

    fn has_remaining_mut(&self) -> bool

    Returns true if there is space in self for more bytes. Read more
    §

    fn put<T>(&mut self, src: T)
    where\n T: Buf,\n Self: Sized,

    Transfer bytes into self from src and advance the cursor by the\nnumber of bytes written. Read more
    §

    fn put_bytes(&mut self, val: u8, cnt: usize)

    Put cnt bytes val into self. Read more
    §

    fn put_u128(&mut self, n: u128)

    Writes an unsigned 128 bit integer to self in the big-endian byte order. Read more
    §

    fn put_u128_le(&mut self, n: u128)

    Writes an unsigned 128 bit integer to self in little-endian byte order. Read more
    §

    fn put_u128_ne(&mut self, n: u128)

    Writes an unsigned 128 bit integer to self in native-endian byte order. Read more
    §

    fn put_i128(&mut self, n: i128)

    Writes a signed 128 bit integer to self in the big-endian byte order. Read more
    §

    fn put_i128_le(&mut self, n: i128)

    Writes a signed 128 bit integer to self in little-endian byte order. Read more
    §

    fn put_i128_ne(&mut self, n: i128)

    Writes a signed 128 bit integer to self in native-endian byte order. Read more
    §

    fn put_uint(&mut self, n: u64, nbytes: usize)

    Writes an unsigned n-byte integer to self in big-endian byte order. Read more
    §

    fn put_uint_le(&mut self, n: u64, nbytes: usize)

    Writes an unsigned n-byte integer to self in the little-endian byte order. Read more
    §

    fn put_uint_ne(&mut self, n: u64, nbytes: usize)

    Writes an unsigned n-byte integer to self in the native-endian byte order. Read more
    §

    fn put_int(&mut self, n: i64, nbytes: usize)

    Writes low nbytes of a signed integer to self in big-endian byte order. Read more
    §

    fn put_int_le(&mut self, n: i64, nbytes: usize)

    Writes low nbytes of a signed integer to self in little-endian byte order. Read more
    §

    fn put_int_ne(&mut self, n: i64, nbytes: usize)

    Writes low nbytes of a signed integer to self in native-endian byte order. Read more
    §

    fn put_f32(&mut self, n: f32)

    Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in big-endian byte order. Read more
    §

    fn put_f32_le(&mut self, n: f32)

    Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in little-endian byte order. Read more
    §

    fn put_f32_ne(&mut self, n: f32)

    Writes an IEEE754 single-precision (4 bytes) floating point number to\nself in native-endian byte order. Read more
    §

    fn put_f64(&mut self, n: f64)

    Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in big-endian byte order. Read more
    §

    fn put_f64_le(&mut self, n: f64)

    Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in little-endian byte order. Read more
    §

    fn put_f64_ne(&mut self, n: f64)

    Writes an IEEE754 double-precision (8 bytes) floating point number to\nself in native-endian byte order. Read more
    §

    fn limit(self, limit: usize) -> Limit<Self>
    where\n Self: Sized,

    Creates an adaptor which can write at most limit bytes to self. Read more
    §

    fn writer(self) -> Writer<Self>
    where\n Self: Sized,

    Creates an adaptor which implements the Write trait for self. Read more
    §

    fn chain_mut<U>(self, next: U) -> Chain<Self, U>
    where\n U: BufMut,\n Self: Sized,

    Creates an adapter which will chain this buffer with another. Read more
    ","BufMut","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<B> BufRead for Box<B>
    where\n B: BufRead + ?Sized,

    source§

    fn fill_buf(&mut self) -> Result<&[u8], Error>

    Returns the contents of the internal buffer, filling it with more data\nfrom the inner reader if it is empty. Read more
    source§

    fn consume(&mut self, amt: usize)

    Tells this buffer that amt bytes have been consumed from the buffer,\nso they should no longer be returned in calls to read. Read more
    source§

    fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize, Error>

    Read all bytes into buf until the delimiter byte or EOF is reached. Read more
    source§

    fn read_line(&mut self, buf: &mut String) -> Result<usize, Error>

    Read all bytes until a newline (the 0xA byte) is reached, and append\nthem to the provided String buffer. Read more
    source§

    fn has_data_left(&mut self) -> Result<bool, Error>

    🔬This is a nightly-only experimental API. (buf_read_has_data_left)
    Check if the underlying Read has any data left to be read. Read more
    source§

    fn skip_until(&mut self, byte: u8) -> Result<usize, Error>

    🔬This is a nightly-only experimental API. (bufread_skip_until)
    Skip all bytes until the delimiter byte or EOF is reached. Read more
    1.0.0 · source§

    fn split(self, byte: u8) -> Split<Self>
    where\n Self: Sized,

    Returns an iterator over the contents of this reader split on the byte\nbyte. Read more
    1.0.0 · source§

    fn lines(self) -> Lines<Self>
    where\n Self: Sized,

    Returns an iterator over the lines of this reader. Read more
    ","BufRead","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> BufferProvider for Box<T>
    where\n T: BufferProvider + ?Sized,

    §

    fn load_buffer(\n &self,\n key: DataKey,\n req: DataRequest<'_>\n) -> Result<DataResponse<BufferMarker>, DataError>

    Loads a [DataPayload]<[BufferMarker]> according to the key and request.
    ","BufferProvider","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Clone for Box<T, A>
    where\n T: Clone,\n A: Allocator + Clone,

    source§

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

    Returns a new box with a clone() of this box’s contents.

    \n
    §Examples
    \n
    let x = Box::new(5);\nlet y = x.clone();\n\n// The value is the same\nassert_eq!(x, y);\n\n// But they are unique objects\nassert_ne!(&*x as *const i32, &*y as *const i32);
    \n
    source§

    fn clone_from(&mut self, source: &Box<T, A>)

    Copies source’s contents into self without creating a new allocation.

    \n
    §Examples
    \n
    let x = Box::new(5);\nlet mut y = Box::new(10);\nlet yp: *const i32 = &*y;\n\ny.clone_from(&x);\n\n// The value is the same\nassert_eq!(x, y);\n\n// And no allocation occurred\nassert_eq!(yp, &*y);
    \n
    ","Clone","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<G, R, A> Coroutine<R> for Box<G, A>
    where\n G: Coroutine<R> + Unpin + ?Sized,\n A: Allocator,

    §

    type Yield = <G as Coroutine<R>>::Yield

    🔬This is a nightly-only experimental API. (coroutine_trait)
    The type of value this coroutine yields. Read more
    §

    type Return = <G as Coroutine<R>>::Return

    🔬This is a nightly-only experimental API. (coroutine_trait)
    The type of value this coroutine returns. Read more
    source§

    fn resume(\n self: Pin<&mut Box<G, A>>,\n arg: R\n) -> CoroutineState<<Box<G, A> as Coroutine<R>>::Yield, <Box<G, A> as Coroutine<R>>::Return>

    🔬This is a nightly-only experimental API. (coroutine_trait)
    Resumes the execution of this coroutine. Read more
    ","Coroutine","bdk_esplora::blocking_ext::Error"],["
    §

    impl<M, P> DataProvider<M> for Box<P>
    where\n M: KeyedDataMarker,\n P: DataProvider<M> + ?Sized,

    §

    fn load(&self, req: DataRequest<'_>) -> Result<DataResponse<M>, DataError>

    Query the provider for data, returning the result. Read more
    ","DataProvider","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Debug for Box<T, A>
    where\n T: Debug + ?Sized,\n A: Allocator,

    source§

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

    Formats the value using the given formatter. Read more
    ","Debug","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T> Default for Box<T>
    where\n T: Default,

    source§

    fn default() -> Box<T>

    Creates a Box<T>, with the Default value for T.

    \n
    ","Default","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Deref for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    §

    type Target = T

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &T

    Dereferences the value.
    ","Deref","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> DerefMut for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Mutably dereferences the value.
    ","DerefMut","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<'de, T> Deserialize<'de> for Box<T>
    where\n T: Deserialize<'de>,

    source§

    fn deserialize<D>(\n deserializer: D\n) -> Result<Box<T>, <D as Deserializer<'de>>::Error>
    where\n D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    ","Deserialize<'de>","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Display for Box<T, A>
    where\n T: Display + ?Sized,\n A: Allocator,

    source§

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

    Formats the value using the given formatter. Read more
    ","Display","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<I, A> DoubleEndedIterator for Box<I, A>
    where\n I: DoubleEndedIterator + ?Sized,\n A: Allocator,

    source§

    fn next_back(&mut self) -> Option<<I as Iterator>::Item>

    Removes and returns an element from the end of the iterator. Read more
    source§

    fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item>

    Returns the nth element from the end of the iterator. Read more
    source§

    fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator from the back by n elements. Read more
    1.27.0 · source§

    fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

    This is the reverse version of Iterator::try_fold(): it takes\nelements starting from the back of the iterator. Read more
    1.27.0 · source§

    fn rfold<B, F>(self, init: B, f: F) -> B
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

    An iterator method that reduces the iterator’s elements to a single,\nfinal value, starting from the back. Read more
    1.27.0 · source§

    fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Searches for an element of an iterator from the back that satisfies a predicate. Read more
    ","DoubleEndedIterator","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Drop for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

    fn drop(&mut self)

    Executes the destructor for this type. Read more
    ","Drop","bdk_esplora::blocking_ext::Error"],["
    §

    impl<M, P> DynamicDataProvider<M> for Box<P>
    where\n M: DataMarker,\n P: DynamicDataProvider<M> + ?Sized,

    §

    fn load_data(\n &self,\n key: DataKey,\n req: DataRequest<'_>\n) -> Result<DataResponse<M>, DataError>

    Query the provider for data, returning the result. Read more
    ","DynamicDataProvider","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> EncodeAsVarULE<T> for Box<T>
    where\n T: VarULE + ?Sized,

    §

    fn encode_var_ule_as_slices<R>(&self, cb: impl FnOnce(&[&[u8]]) -> R) -> R

    Calls cb with a piecewise list of byte slices that when concatenated\nproduce the memory pattern of the corresponding instance of T. Read more
    §

    fn encode_var_ule_len(&self) -> usize

    Return the length, in bytes, of the corresponding [VarULE] type
    §

    fn encode_var_ule_write(&self, dst: &mut [u8])

    Write the corresponding [VarULE] type to the dst buffer. dst should\nbe the size of [Self::encode_var_ule_len()]
    ","EncodeAsVarULE","bdk_esplora::blocking_ext::Error"],["
    1.8.0 · source§

    impl<T> Error for Box<T>
    where\n T: Error,

    source§

    fn description(&self) -> &str

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

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

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

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

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

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

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    ","Error","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<I, A> ExactSizeIterator for Box<I, A>
    where\n I: ExactSizeIterator + ?Sized,\n A: Allocator,

    source§

    fn len(&self) -> usize

    Returns the exact remaining length of the iterator. Read more
    source§

    fn is_empty(&self) -> bool

    🔬This is a nightly-only experimental API. (exact_size_is_empty)
    Returns true if the iterator is empty. Read more
    ","ExactSizeIterator","bdk_esplora::blocking_ext::Error"],["
    1.35.0 · source§

    impl<Args, F, A> Fn<Args> for Box<F, A>
    where\n Args: Tuple,\n F: Fn<Args> + ?Sized,\n A: Allocator,

    source§

    extern "rust-call" fn call(\n &self,\n args: Args\n) -> <Box<F, A> as FnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (fn_traits)
    Performs the call operation.
    ","Fn","bdk_esplora::blocking_ext::Error"],["
    1.35.0 · source§

    impl<Args, F, A> FnMut<Args> for Box<F, A>
    where\n Args: Tuple,\n F: FnMut<Args> + ?Sized,\n A: Allocator,

    source§

    extern "rust-call" fn call_mut(\n &mut self,\n args: Args\n) -> <Box<F, A> as FnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (fn_traits)
    Performs the call operation.
    ","FnMut","bdk_esplora::blocking_ext::Error"],["
    1.35.0 · source§

    impl<Args, F, A> FnOnce<Args> for Box<F, A>
    where\n Args: Tuple,\n F: FnOnce<Args> + ?Sized,\n A: Allocator,

    §

    type Output = <F as FnOnce<Args>>::Output

    The returned type after the call operator is used.
    source§

    extern "rust-call" fn call_once(\n self,\n args: Args\n) -> <Box<F, A> as FnOnce<Args>>::Output

    🔬This is a nightly-only experimental API. (fn_traits)
    Performs the call operation.
    ","FnOnce","bdk_esplora::blocking_ext::Error"],["
    1.6.0 · source§

    impl<T> From<T> for Box<T>

    source§

    fn from(t: T) -> Box<T>

    Converts a T into a Box<T>

    \n

    The conversion allocates on the heap and moves t\nfrom the stack into it.

    \n
    §Examples
    \n
    let x = 5;\nlet boxed = Box::new(5);\n\nassert_eq!(Box::from(x), boxed);
    \n
    ","From","bdk_esplora::blocking_ext::Error"],["
    §

    impl<F> FusedFuture for Box<F>
    where\n F: FusedFuture + Unpin + ?Sized,

    §

    fn is_terminated(&self) -> bool

    Returns true if the underlying future should no longer be polled.
    ","FusedFuture","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S> FusedStream for Box<S>
    where\n S: FusedStream + Unpin + ?Sized,

    §

    fn is_terminated(&self) -> bool

    Returns true if the stream should no longer be polled.
    ","FusedStream","bdk_esplora::blocking_ext::Error"],["
    1.36.0 · source§

    impl<F, A> Future for Box<F, A>
    where\n F: Future + Unpin + ?Sized,\n A: Allocator,

    §

    type Output = <F as Future>::Output

    The type of value produced on completion.
    source§

    fn poll(\n self: Pin<&mut Box<F, A>>,\n cx: &mut Context<'_>\n) -> Poll<<Box<F, A> as Future>::Output>

    Attempt to resolve the future to a final value, registering\nthe current task for wakeup if the value is not yet available. Read more
    ","Future","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Hash for Box<T, A>
    where\n T: Hash + ?Sized,\n A: Allocator,

    source§

    fn hash<H>(&self, state: &mut H)
    where\n 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\n H: Hasher,\n Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    ","Hash","bdk_esplora::blocking_ext::Error"],["
    1.22.0 · source§

    impl<T, A> Hasher for Box<T, A>
    where\n T: Hasher + ?Sized,\n A: Allocator,

    source§

    fn finish(&self) -> u64

    Returns the hash value for the values written so far. Read more
    source§

    fn write(&mut self, bytes: &[u8])

    Writes some data into this Hasher. Read more
    source§

    fn write_u8(&mut self, i: u8)

    Writes a single u8 into this hasher.
    source§

    fn write_u16(&mut self, i: u16)

    Writes a single u16 into this hasher.
    source§

    fn write_u32(&mut self, i: u32)

    Writes a single u32 into this hasher.
    source§

    fn write_u64(&mut self, i: u64)

    Writes a single u64 into this hasher.
    source§

    fn write_u128(&mut self, i: u128)

    Writes a single u128 into this hasher.
    source§

    fn write_usize(&mut self, i: usize)

    Writes a single usize into this hasher.
    source§

    fn write_i8(&mut self, i: i8)

    Writes a single i8 into this hasher.
    source§

    fn write_i16(&mut self, i: i16)

    Writes a single i16 into this hasher.
    source§

    fn write_i32(&mut self, i: i32)

    Writes a single i32 into this hasher.
    source§

    fn write_i64(&mut self, i: i64)

    Writes a single i64 into this hasher.
    source§

    fn write_i128(&mut self, i: i128)

    Writes a single i128 into this hasher.
    source§

    fn write_isize(&mut self, i: isize)

    Writes a single isize into this hasher.
    source§

    fn write_length_prefix(&mut self, len: usize)

    🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
    Writes a length prefix into this hasher, as part of being prefix-free. Read more
    source§

    fn write_str(&mut self, s: &str)

    🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
    Writes a single str into this hasher. Read more
    ","Hasher","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<I, A> Iterator for Box<I, A>
    where\n I: Iterator + ?Sized,\n A: Allocator,

    §

    type Item = <I as Iterator>::Item

    The type of the elements being iterated over.
    source§

    fn next(&mut self) -> Option<<I as Iterator>::Item>

    Advances the iterator and returns the next value. Read more
    source§

    fn size_hint(&self) -> (usize, Option<usize>)

    Returns the bounds on the remaining length of the iterator. Read more
    source§

    fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item>

    Returns the nth element of the iterator. Read more
    source§

    fn last(self) -> Option<<I as Iterator>::Item>

    Consumes the iterator, returning the last element. Read more
    source§

    fn next_chunk<const N: usize>(\n &mut self\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
    where\n Self: Sized,

    🔬This is a nightly-only experimental API. (iter_next_chunk)
    Advances the iterator and returns an array containing the next N values. Read more
    1.0.0 · source§

    fn count(self) -> usize
    where\n Self: Sized,

    Consumes the iterator, counting the number of iterations and returning it. Read more
    source§

    fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator by n elements. Read more
    1.28.0 · source§

    fn step_by(self, step: usize) -> StepBy<Self>
    where\n Self: Sized,

    Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
    1.0.0 · source§

    fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
    where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

    Takes two iterators and creates a new iterator over both in sequence. Read more
    1.0.0 · source§

    fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
    where\n Self: Sized,\n U: IntoIterator,

    ‘Zips up’ two iterators into a single iterator of pairs. Read more
    source§

    fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
    where\n Self: Sized,\n G: FnMut() -> Self::Item,

    🔬This is a nightly-only experimental API. (iter_intersperse)
    Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
    1.0.0 · source§

    fn map<B, F>(self, f: F) -> Map<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

    Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
    1.21.0 · source§

    fn for_each<F>(self, f: F)
    where\n Self: Sized,\n F: FnMut(Self::Item),

    Calls a closure on each element of an iterator. Read more
    1.0.0 · source§

    fn filter<P>(self, predicate: P) -> Filter<Self, P>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
    1.0.0 · source§

    fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
    where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

    Creates an iterator that both filters and maps. Read more
    1.0.0 · source§

    fn enumerate(self) -> Enumerate<Self>
    where\n Self: Sized,

    Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
    1.0.0 · source§

    fn peekable(self) -> Peekable<Self>
    where\n Self: Sized,

    Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
    1.0.0 · source§

    fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Creates an iterator that skips elements based on a predicate. Read more
    1.0.0 · source§

    fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Creates an iterator that yields elements based on a predicate. Read more
    1.57.0 · source§

    fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
    where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

    Creates an iterator that both yields elements based on a predicate and maps. Read more
    1.0.0 · source§

    fn skip(self, n: usize) -> Skip<Self>
    where\n Self: Sized,

    Creates an iterator that skips the first n elements. Read more
    1.0.0 · source§

    fn take(self, n: usize) -> Take<Self>
    where\n Self: Sized,

    Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
    1.0.0 · source§

    fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
    where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

    An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
    1.0.0 · source§

    fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
    where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

    Creates an iterator that works like map, but flattens nested structure. Read more
    source§

    fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
    where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

    🔬This is a nightly-only experimental API. (iter_map_windows)
    Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
    1.0.0 · source§

    fn fuse(self) -> Fuse<Self>
    where\n Self: Sized,

    Creates an iterator which ends after the first None. Read more
    1.0.0 · source§

    fn inspect<F>(self, f: F) -> Inspect<Self, F>
    where\n Self: Sized,\n F: FnMut(&Self::Item),

    Does something with each element of an iterator, passing the value on. Read more
    1.0.0 · source§

    fn by_ref(&mut self) -> &mut Self
    where\n Self: Sized,

    Borrows an iterator, rather than consuming it. Read more
    1.0.0 · source§

    fn collect<B>(self) -> B
    where\n B: FromIterator<Self::Item>,\n Self: Sized,

    Transforms an iterator into a collection. Read more
    source§

    fn collect_into<E>(self, collection: &mut E) -> &mut E
    where\n E: Extend<Self::Item>,\n Self: Sized,

    🔬This is a nightly-only experimental API. (iter_collect_into)
    Collects all the items from an iterator into a collection. Read more
    1.0.0 · source§

    fn partition<B, F>(self, f: F) -> (B, B)
    where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

    Consumes an iterator, creating two collections from it. Read more
    source§

    fn is_partitioned<P>(self, predicate: P) -> bool
    where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

    🔬This is a nightly-only experimental API. (iter_is_partitioned)
    Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
    1.27.0 · source§

    fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

    An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
    1.27.0 · source§

    fn try_for_each<F, R>(&mut self, f: F) -> R
    where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

    An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
    1.0.0 · source§

    fn fold<B, F>(self, init: B, f: F) -> B
    where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

    Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
    1.51.0 · source§

    fn reduce<F>(self, f: F) -> Option<Self::Item>
    where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

    Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
    source§

    fn try_reduce<F, R>(\n &mut self,\n f: F\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
    where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> R,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

    🔬This is a nightly-only experimental API. (iterator_try_reduce)
    Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
    1.0.0 · source§

    fn all<F>(&mut self, f: F) -> bool
    where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

    Tests if every element of the iterator matches a predicate. Read more
    1.0.0 · source§

    fn any<F>(&mut self, f: F) -> bool
    where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

    Tests if any element of the iterator matches a predicate. Read more
    1.0.0 · source§

    fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
    where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

    Searches for an element of an iterator that satisfies a predicate. Read more
    1.30.0 · source§

    fn find_map<B, F>(&mut self, f: F) -> Option<B>
    where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

    Applies function to the elements of iterator and returns\nthe first non-none result. Read more
    source§

    fn try_find<F, R>(\n &mut self,\n f: F\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
    where\n Self: Sized,\n F: FnMut(&Self::Item) -> R,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

    🔬This is a nightly-only experimental API. (try_find)
    Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
    1.0.0 · source§

    fn position<P>(&mut self, predicate: P) -> Option<usize>
    where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

    Searches for an element in an iterator, returning its index. Read more
    1.6.0 · source§

    fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
    where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

    Returns the element that gives the maximum value from the\nspecified function. Read more
    1.15.0 · source§

    fn max_by<F>(self, compare: F) -> Option<Self::Item>
    where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

    Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
    1.6.0 · source§

    fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
    where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

    Returns the element that gives the minimum value from the\nspecified function. Read more
    1.15.0 · source§

    fn min_by<F>(self, compare: F) -> Option<Self::Item>
    where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

    Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
    1.0.0 · source§

    fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
    where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

    Converts an iterator of pairs into a pair of containers. Read more
    1.36.0 · source§

    fn copied<'a, T>(self) -> Copied<Self>
    where\n T: 'a + Copy,\n Self: Sized + Iterator<Item = &'a T>,

    Creates an iterator which copies all of its elements. Read more
    1.0.0 · source§

    fn cloned<'a, T>(self) -> Cloned<Self>
    where\n T: 'a + Clone,\n Self: Sized + Iterator<Item = &'a T>,

    Creates an iterator which clones all of its elements. Read more
    source§

    fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
    where\n Self: Sized,

    🔬This is a nightly-only experimental API. (iter_array_chunks)
    Returns an iterator over N elements of the iterator at a time. Read more
    1.11.0 · source§

    fn sum<S>(self) -> S
    where\n Self: Sized,\n S: Sum<Self::Item>,

    Sums the elements of an iterator. Read more
    1.11.0 · source§

    fn product<P>(self) -> P
    where\n Self: Sized,\n P: Product<Self::Item>,

    Iterates over the entire iterator, multiplying all the elements Read more
    source§

    fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
    where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

    🔬This is a nightly-only experimental API. (iter_order_by)
    Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
    1.5.0 · source§

    fn partial_cmp<I>(self, other: I) -> Option<Ordering>
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
    source§

    fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
    where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

    🔬This is a nightly-only experimental API. (iter_order_by)
    Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
    1.5.0 · source§

    fn eq<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are equal to those of\nanother. Read more
    source§

    fn eq_by<I, F>(self, other: I, eq: F) -> bool
    where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

    🔬This is a nightly-only experimental API. (iter_order_by)
    Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
    1.5.0 · source§

    fn ne<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are not equal to those of\nanother. Read more
    1.5.0 · source§

    fn lt<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
    1.5.0 · source§

    fn le<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
    1.5.0 · source§

    fn gt<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
    1.5.0 · source§

    fn ge<I>(self, other: I) -> bool
    where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

    Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
    source§

    fn is_sorted_by<F>(self, compare: F) -> bool
    where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

    🔬This is a nightly-only experimental API. (is_sorted)
    Checks if the elements of this iterator are sorted using the given comparator function. Read more
    source§

    fn is_sorted_by_key<F, K>(self, f: F) -> bool
    where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

    🔬This is a nightly-only experimental API. (is_sorted)
    Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
    ","Iterator","bdk_esplora::blocking_ext::Error"],["
    §

    impl<Sp> LocalSpawn for Box<Sp>
    where\n Sp: LocalSpawn + ?Sized,

    §

    fn spawn_local_obj(\n &self,\n future: LocalFutureObj<'static, ()>\n) -> Result<(), SpawnError>

    Spawns a future that will be run to completion. Read more
    §

    fn status_local(&self) -> Result<(), SpawnError>

    Determines whether the executor is able to spawn new tasks. Read more
    ","LocalSpawn","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Ord for Box<T, A>
    where\n T: Ord + ?Sized,\n A: Allocator,

    source§

    fn cmp(&self, other: &Box<T, A>) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where\n Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where\n 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\n Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    ","Ord","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> PartialEq for Box<T, A>
    where\n T: PartialEq + ?Sized,\n A: Allocator,

    source§

    fn eq(&self, other: &Box<T, A>) -> bool

    This method tests for self and other values to be equal, and is used\nby ==.
    source§

    fn ne(&self, other: &Box<T, A>) -> bool

    This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
    ","PartialEq","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> PartialOrd for Box<T, A>
    where\n T: PartialOrd + ?Sized,\n A: Allocator,

    source§

    fn partial_cmp(&self, other: &Box<T, A>) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    source§

    fn lt(&self, other: &Box<T, A>) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    source§

    fn le(&self, other: &Box<T, A>) -> bool

    This method tests less than or equal to (for self and other) and is used by the <=\noperator. Read more
    source§

    fn ge(&self, other: &Box<T, A>) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >=\noperator. Read more
    source§

    fn gt(&self, other: &Box<T, A>) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    ","PartialOrd","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Pointer for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    source§

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

    Formats the value using the given formatter. Read more
    ","Pointer","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<R> Read for Box<R>
    where\n R: Read + ?Sized,

    source§

    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>

    Pull some bytes from this source into the specified buffer, returning\nhow many bytes were read. Read more
    source§

    fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (read_buf)
    Pull some bytes from this source into the specified buffer. Read more
    source§

    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

    Like read, except that it reads into a slice of buffers. Read more
    source§

    fn is_read_vectored(&self) -> bool

    🔬This is a nightly-only experimental API. (can_vector)
    Determines if this Reader has an efficient read_vectored\nimplementation. Read more
    source§

    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

    Read all bytes until EOF in this source, placing them into buf. Read more
    source§

    fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

    Read all bytes until EOF in this source, appending them to buf. Read more
    source§

    fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

    Read the exact number of bytes required to fill buf. Read more
    source§

    fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (read_buf)
    Read the exact number of bytes required to fill cursor. Read more
    1.0.0 · source§

    fn by_ref(&mut self) -> &mut Self
    where\n Self: Sized,

    Creates a “by reference” adaptor for this instance of Read. Read more
    1.0.0 · source§

    fn bytes(self) -> Bytes<Self>
    where\n Self: Sized,

    Transforms this Read instance to an Iterator over its bytes. Read more
    1.0.0 · source§

    fn chain<R>(self, next: R) -> Chain<Self, R>
    where\n R: Read,\n Self: Sized,

    Creates an adapter which will chain this stream with another. Read more
    1.0.0 · source§

    fn take(self, limit: u64) -> Take<Self>
    where\n Self: Sized,

    Creates an adapter which will read at most limit bytes from it. Read more
    ","Read","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<R> RngCore for Box<R>
    where\n R: RngCore + ?Sized,

    source§

    fn next_u32(&mut self) -> u32

    Return the next random u32. Read more
    source§

    fn next_u64(&mut self) -> u64

    Return the next random u64. Read more
    source§

    fn fill_bytes(&mut self, dest: &mut [u8])

    Fill dest with random data. Read more
    source§

    fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>

    Fill dest entirely with random data. Read more
    ","RngCore","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<S> Seek for Box<S>
    where\n S: Seek + ?Sized,

    source§

    fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>

    Seek to an offset, in bytes, in a stream. Read more
    source§

    fn stream_position(&mut self) -> Result<u64, Error>

    Returns the current seek position from the start of the stream. Read more
    1.55.0 · source§

    fn rewind(&mut self) -> Result<(), Error>

    Rewind to the beginning of a stream. Read more
    source§

    fn stream_len(&mut self) -> Result<u64, Error>

    🔬This is a nightly-only experimental API. (seek_stream_len)
    Returns the length of this stream (in bytes). Read more
    source§

    fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (seek_seek_relative)
    Seeks relative to the current position. Read more
    ","Seek","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T> Serialize for Box<T>
    where\n T: Serialize + ?Sized,

    source§

    fn serialize<S>(\n &self,\n serializer: S\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where\n S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    ","Serialize","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S, Request> Service<Request> for Box<S>
    where\n S: Service<Request> + ?Sized,

    §

    type Response = <S as Service<Request>>::Response

    Responses given by the service.
    §

    type Error = <S as Service<Request>>::Error

    Errors produced by the service.
    §

    type Future = <S as Service<Request>>::Future

    The future response value.
    §

    fn poll_ready(\n &mut self,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <S as Service<Request>>::Error>>

    Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
    §

    fn call(&mut self, request: Request) -> <S as Service<Request>>::Future

    Process the request and return the response asynchronously. Read more
    ","Service","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S, Item> Sink<Item> for Box<S>
    where\n S: Sink<Item> + Unpin + ?Sized,

    §

    type Error = <S as Sink<Item>>::Error

    The type of value produced by the sink when an error occurs.
    §

    fn poll_ready(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

    Attempts to prepare the Sink to receive a value. Read more
    §

    fn start_send(\n self: Pin<&mut Box<S>>,\n item: Item\n) -> Result<(), <Box<S> as Sink<Item>>::Error>

    Begin the process of sending a value to the sink.\nEach call to this function must be preceded by a successful call to\npoll_ready which returned Poll::Ready(Ok(())). Read more
    §

    fn poll_flush(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

    Flush any remaining output from this sink. Read more
    §

    fn poll_close(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Result<(), <Box<S> as Sink<Item>>::Error>>

    Flush any remaining output and close this sink, if necessary. Read more
    ","Sink","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> Source for Box<T>
    where\n T: Source + ?Sized,

    §

    fn register(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest\n) -> Result<(), Error>

    Register self with the given Registry instance. Read more
    §

    fn reregister(\n &mut self,\n registry: &Registry,\n token: Token,\n interests: Interest\n) -> Result<(), Error>

    Re-register self with the given Registry instance. Read more
    §

    fn deregister(&mut self, registry: &Registry) -> Result<(), Error>

    Deregister self from the given Registry instance. Read more
    ","Source","bdk_esplora::blocking_ext::Error"],["
    §

    impl<Sp> Spawn for Box<Sp>
    where\n Sp: Spawn + ?Sized,

    §

    fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError>

    Spawns a future that will be run to completion. Read more
    §

    fn status(&self) -> Result<(), SpawnError>

    Determines whether the executor is able to spawn new tasks. Read more
    ","Spawn","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S> Stream for Box<S>
    where\n S: Stream + Unpin + ?Sized,

    §

    type Item = <S as Stream>::Item

    Values yielded by the stream.
    §

    fn poll_next(\n self: Pin<&mut Box<S>>,\n cx: &mut Context<'_>\n) -> Poll<Option<<Box<S> as Stream>::Item>>

    Attempt to pull out the next value of this stream, registering the\ncurrent task for wakeup if the value is not yet available, and returning\nNone if the stream is exhausted. Read more
    §

    fn size_hint(&self) -> (usize, Option<usize>)

    Returns the bounds on the remaining length of the stream. Read more
    ","Stream","bdk_esplora::blocking_ext::Error"],["
    §

    impl<S> Subscriber for Box<S>
    where\n S: Subscriber + ?Sized,

    §

    fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest

    Registers a new callsite with this subscriber, returning whether or not\nthe subscriber is interested in being notified about the callsite. Read more
    §

    fn enabled(&self, metadata: &Metadata<'_>) -> bool

    Returns true if a span or event with the specified metadata would be\nrecorded. Read more
    §

    fn max_level_hint(&self) -> Option<LevelFilter>

    Returns the highest verbosity level that this Subscriber will\nenable, or None, if the subscriber does not implement level-based\nfiltering or chooses not to implement this method. Read more
    §

    fn new_span(&self, span: &Attributes<'_>) -> Id

    Visit the construction of a new span, returning a new span ID for the\nspan being constructed. Read more
    §

    fn record(&self, span: &Id, values: &Record<'_>)

    Record a set of values on a span. Read more
    §

    fn record_follows_from(&self, span: &Id, follows: &Id)

    Adds an indication that span follows from the span with the id\nfollows. Read more
    §

    fn event_enabled(&self, event: &Event<'_>) -> bool

    Determine if an [Event] should be recorded. Read more
    §

    fn event(&self, event: &Event<'_>)

    Records that an Event has occurred. Read more
    §

    fn enter(&self, span: &Id)

    Records that a span has been entered. Read more
    §

    fn exit(&self, span: &Id)

    Records that a span has been exited. Read more
    §

    fn clone_span(&self, id: &Id) -> Id

    Notifies the subscriber that a span ID has been cloned. Read more
    §

    fn try_close(&self, id: Id) -> bool

    Notifies the subscriber that a span ID has been dropped, and returns\ntrue if there are now 0 IDs that refer to that span. Read more
    §

    fn drop_span(&self, id: Id)

    👎Deprecated since 0.1.2: use Subscriber::try_close instead
    This method is deprecated. Read more
    §

    fn current_span(&self) -> Current

    Returns a type representing this subscriber’s view of the current span. Read more
    §

    unsafe fn downcast_raw(&self, id: TypeId) -> Option<*const ()>

    If self is the same type as the provided TypeId, returns an untyped\n*const pointer to that type. Otherwise, returns None. Read more
    §

    fn on_register_dispatch(&self, subscriber: &Dispatch)

    Invoked when this subscriber becomes a [Dispatch]. Read more
    ","Subscriber","bdk_esplora::blocking_ext::Error"],["
    §

    impl<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
    where\n F: Future<Output = T> + 'a,

    §

    fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

    Convert an owned instance into a (conceptually owned) fat pointer. Read more
    §

    unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

    Drops the future represented by the given fat pointer. Read more
    ","UnsafeFutureObj<'a, T>","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> Value for Box<T>
    where\n T: Value + ?Sized,

    §

    fn record(&self, key: &Field, visitor: &mut dyn Visit)

    Visits this value with the given Visitor.
    ","Value","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<W> Write for Box<W>
    where\n W: Write + ?Sized,

    source§

    fn write(&mut self, buf: &[u8]) -> Result<usize, Error>

    Write a buffer into this writer, returning how many bytes were written. Read more
    source§

    fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

    Like write, except that it writes from a slice of buffers. Read more
    source§

    fn is_write_vectored(&self) -> bool

    🔬This is a nightly-only experimental API. (can_vector)
    Determines if this Writer has an efficient write_vectored\nimplementation. Read more
    source§

    fn flush(&mut self) -> Result<(), Error>

    Flush this output stream, ensuring that all intermediately buffered\ncontents reach their destination. Read more
    source§

    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

    Attempts to write an entire buffer into this writer. Read more
    source§

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

    Writes a formatted string into this writer, returning any error\nencountered. Read more
    source§

    fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

    🔬This is a nightly-only experimental API. (write_all_vectored)
    Attempts to write multiple buffers into this writer. Read more
    1.0.0 · source§

    fn by_ref(&mut self) -> &mut Self
    where\n Self: Sized,

    Creates a “by reference” adapter for this instance of Write. Read more
    ","Write","bdk_esplora::blocking_ext::Error"],["
    §

    impl<'a, T> Writeable for Box<T>
    where\n T: Writeable + ?Sized,

    §

    fn write_to<W>(&self, sink: &mut W) -> Result<(), Error>
    where\n W: Write + ?Sized,

    Writes a string to the given sink. Errors from the sink are bubbled up.\nThe default implementation delegates to write_to_parts, and discards any\nPart annotations.
    §

    fn write_to_parts<W>(&self, sink: &mut W) -> Result<(), Error>
    where\n W: PartsWrite + ?Sized,

    Write bytes and Part annotations to the given sink. Errors from the\nsink are bubbled up. The default implementation delegates to write_to,\nand doesn’t produce any Part annotations.
    §

    fn writeable_length_hint(&self) -> LengthHint

    Returns a hint for the number of UTF-8 bytes that will be written to the sink. Read more
    §

    fn write_to_string(&self) -> Cow<'_, str>

    Creates a new String with the data from this Writeable. Like ToString,\nbut smaller and faster. Read more
    §

    fn writeable_cmp_bytes(&self, other: &[u8]) -> Ordering

    Compares the contents of this Writeable to the given bytes\nwithout allocating a String to hold the Writeable contents. Read more
    ","Writeable","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> CartablePointerLike for Box<T>

    ","CartablePointerLike","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, U, A> CoerceUnsized<Box<U, A>> for Box<T, A>
    where\n T: Unsize<U> + ?Sized,\n A: Allocator,\n U: ?Sized,

    ","CoerceUnsized>","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<R> CryptoRng for Box<R>
    where\n R: CryptoRng + ?Sized,

    ","CryptoRng","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, A> DerefPure for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    ","DerefPure","bdk_esplora::blocking_ext::Error"],["
    source§

    impl<T, U> DispatchFromDyn<Box<U>> for Box<T>
    where\n T: Unsize<U> + ?Sized,\n U: ?Sized,

    ","DispatchFromDyn>","bdk_esplora::blocking_ext::Error"],["
    1.0.0 · source§

    impl<T, A> Eq for Box<T, A>
    where\n T: Eq + ?Sized,\n A: Allocator,

    ","Eq","bdk_esplora::blocking_ext::Error"],["
    1.26.0 · source§

    impl<I, A> FusedIterator for Box<I, A>
    where\n I: FusedIterator + ?Sized,\n A: Allocator,

    ","FusedIterator","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> IoSafe for Box<T>
    where\n T: IoSafe + ?Sized,

    ","IoSafe","bdk_esplora::blocking_ext::Error"],["
    §

    impl<T> StableDeref for Box<T>
    where\n T: ?Sized,

    ","StableDeref","bdk_esplora::blocking_ext::Error"],["
    1.33.0 · source§

    impl<T, A> Unpin for Box<T, A>
    where\n A: Allocator,\n T: ?Sized,

    ","Unpin","bdk_esplora::blocking_ext::Error"]] };if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/examples/index.html b/examples/index.html index 6f3aa1c3ce..67ed9f1dd5 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.

    Last Updated: 11/28/2024, 10:52:18 AM

    - + diff --git a/foundation/about/index.html b/foundation/about/index.html index d21d398b81..d39e4d337d 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 2f55477c3d..7809c2ff26 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 6673ff7e16..523d6f4ed4 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 03161c81bb..43da6ce1a3 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 3820a7ef39..d758b80c0d 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 f3c2f37feb..71909bfa94 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 f644fc1961..8c24d5971b 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 14601bd767..2ee86a7586 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 16c269602d..a9bd55e056 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 6dd079dbb5..37e212c86e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://bitcoindevkit.org/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/_2023-q4-update/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q1-update/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q3-rfp-rust-maintainer/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q2-update/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q3-update/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics-multisig-2of3/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bdk-core-pt1/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bdk-rn-making-of/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bdk-with-tor/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/bindings-scope/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/compact-filters-demo/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/descriptors-in-the-wild/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/descriptor-based-paper-wallet/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-flutter/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-rn/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/getting-started-with-rust-hwi/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/hello-world/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/hidden-power-of-bitcoin/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/improving-coin-selection-in-bdk/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/miniscript-vulnerability/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/release-v0.3.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/release-v0.2.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/02/release-v0.4.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/03/release-v0.5.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/04/release-v0.6.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/06/release-v0.8.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/07/release-v0.9.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/2021/05/release-v0.7.0/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/road-to-bdk-1/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/spending-policy-demo/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/using-bdk-with-hardware-wallets/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/all/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/custodial/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/desktop/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/exchange/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/hardware/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/infrastructure/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/blog/why-bindings/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/web/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/adoption/mobile/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/concept/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/compiler/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/installation/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/introduction/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/interface/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/playground/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/bdk-cli/regtest/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/descriptors/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/case-studies/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/examples/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/about/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/become-a-member/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/grants/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/members/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/grantees/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/foundation/supporters/2024-11-28T10:52:18.000Zdailyhttps://bitcoindevkit.org/getting-started/2024-11-28T10:52:18.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/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/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/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 +https://bitcoindevkit.org/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q1-update/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/_2023-q4-update/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q2-update/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q3-rfp-rust-maintainer/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q3-update/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics-multisig-2of3/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bdk-rn-making-of/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bdk-with-tor/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bdk-core-pt1/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/bindings-scope/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/compact-filters-demo/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/descriptor-based-paper-wallet/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/descriptors-in-the-wild/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-flutter/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-rn/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/hello-world/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/getting-started-with-rust-hwi/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/hidden-power-of-bitcoin/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/improving-coin-selection-in-bdk/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/miniscript-vulnerability/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/release-v0.3.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/02/release-v0.4.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/release-v0.2.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/04/release-v0.6.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/03/release-v0.5.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/05/release-v0.7.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/06/release-v0.8.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/road-to-bdk-1/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/2021/07/release-v0.9.0/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/spending-policy-demo/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/why-bindings/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/blog/using-bdk-with-hardware-wallets/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/custodial/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/all/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/desktop/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/exchange/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/hardware/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/infrastructure/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/mobile/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/adoption/web/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/compiler/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/installation/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/concept/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/interface/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/introduction/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/playground/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/bdk-cli/regtest/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/case-studies/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/descriptors/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/examples/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/about/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/become-a-member/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/grantees/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/grants/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/supporters/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/foundation/members/2024-11-29T13:53:50.000Zdailyhttps://bitcoindevkit.org/getting-started/2024-11-29T13:53:50.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/basics/dailyhttps://bitcoindevkit.org/blog/tags/novice/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-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/architecture/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/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/Bitcoin%20Zavior/dailyhttps://bitcoindevkit.org/blog/author/rorp/dailyhttps://bitcoindevkit.org/blog/author/Lloyd%20Fournier/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