From: github-actions Date: Wed, 29 Dec 2021 10:12:57 +0000 (+0000) Subject: Publish autogenerated nightly docs X-Git-Url: http://internal-gitweb-vhost/script/%22https:/struct.EncoderStringWriter.html?a=commitdiff_plain;h=c6edb7884255bd200e91b66fe36da58618f9bfb2;p=bitcoindevkit.org Publish autogenerated nightly docs --- diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic-LICENSE.txt b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic-LICENSE.txt new file mode 100644 index 0000000000..0bf46682b5 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic-LICENSE.txt @@ -0,0 +1,99 @@ +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic.ttf.woff b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic.ttf.woff new file mode 100644 index 0000000000..fb063e8fb7 Binary files /dev/null and b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic.ttf.woff differ diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic.ttf.woff2 b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic.ttf.woff2 new file mode 100644 index 0000000000..1866ad4bce Binary files /dev/null and b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/NanumBarunGothic.ttf.woff2 differ diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/ayu.css b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/ayu.css index af24cd6cca..53a919812c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/ayu.css +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/ayu.css @@ -1 +1 @@ - body{background-color:#0f1419;color:#c5c5c5;}h1,h2,h3,h4{color:white;}h1.fqn{border-bottom-color:#5c6773;}h1.fqn a{color:#fff;}h2,h3,h4{border-bottom-color:#5c6773;}h4{border:none;}.in-band{background-color:#0f1419;}.invisible{background:rgba(0,0,0,0);}.docblock code{color:#ffb454;}.code-header{color:#e6e1cf;}.docblock pre>code,pre>code{color:#e6e1cf;}span code{color:#e6e1cf;}.docblock a>code{color:#39AFD7 !important;}.docblock code,.docblock-short code{background-color:#191f26;}pre,.rustdoc.source .example-wrap{color:#e6e1cf;background-color:#191f26;}.sidebar{background-color:#14191f;}.logo-container.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);}*{scrollbar-color:#5c6773 transparent;}.sidebar{scrollbar-color:#5c6773 transparent;}::-webkit-scrollbar-track{background-color:transparent;}::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar::-webkit-scrollbar-track{background-color:transparent;}.sidebar::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar .current{background-color:transparent;color:#ffb44c;}.source .sidebar{background-color:#0f1419;}.sidebar .location{border-color:#000;background-color:#0f1419;color:#fff;}.sidebar-elems .location{color:#ff7733;}.sidebar-elems .location a{color:#fff;}.sidebar .version{border-bottom-color:#424c57;}.sidebar-title{border-top-color:#5c6773;border-bottom-color:#5c6773;}.block a:hover{background:transparent;color:#ffb44c;}.line-numbers span{color:#5c6773;}.line-numbers .line-highlighted{color:#708090;background-color:rgba(255,236,164,0.06);padding-right:4px;border-right:1px solid #ffb44c;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#5c6773;}.docblock table td,.docblock table th{border-color:#5c6773;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#c5c5c5;}.search-results a:hover{background-color:#777;}.search-results a:focus{color:#000 !important;background-color:#c6afb3;}.search-results a{color:#0096cf;}.search-results a div.desc{color:#c5c5c5;}.content .item-info::before{color:#ccc;}.content span.foreigntype,.content a.foreigntype{color:#ef57ff;}.content span.union,.content a.union{color:#98a01c;}.content span.constant,.content a.constant,.content span.static,.content a.static{color:#6380a0;}.content span.primitive,.content a.primitive{color:#32889b;}.content span.traitalias,.content a.traitalias{color:#57d399;}.content span.keyword,.content a.keyword{color:#de5249;}.content span.externcrate,.content span.mod,.content a.mod{color:#acccf9;}.content span.struct,.content a.struct{color:#ffa0a5;}.content span.enum,.content a.enum{color:#99e0c9;}.content span.trait,.content a.trait{color:#39AFD7;}.content span.type,.content a.type{color:#cfbcf5;}.content span.fn,.content a.fn,.content span.method,.content a.method,.content span.tymethod,.content a.tymethod,.content .fnname{color:#fdd687;}.content span.attr,.content a.attr,.content span.derive,.content a.derive,.content span.macro,.content a.macro{color:#a37acc;}pre.rust .comment{color:#788797;}pre.rust .doccomment{color:#a1ac88;}nav:not(.sidebar){border-bottom-color:#424c57;}nav.main .current{border-top-color:#5c6773;border-bottom-color:#5c6773;}nav.main .separator{border:1px solid #5c6773;}a{color:#c5c5c5;}body.source .example-wrap pre.rust a{background:#333;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#39AFD7;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}details.rustdoc-toggle>summary::before,details.undocumented>summary::before{filter:invert(100%);}#crate-search{color:#c5c5c5;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;border-color:#424c57;}.search-input{color:#ffffff;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;transition:box-shadow 150ms ease-in-out;}#crate-search+.search-input:focus{box-shadow:0 0 0 1px #148099,0 0 0 2px transparent;}.search-input:disabled{background-color:#3e3e3e;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable,.stab.deprecated,.stab.portability{color:#c5c5c5;background:#314559 !important;border-style:none !important;border-radius:4px;padding:3px 6px 3px 6px;}.stab.portability>code{color:#e6e1cf;background:none;}#help>div{background:#14191f;box-shadow:0px 6px 20px 0px black;border:none;border-radius:4px;}#help span.bottom,#help span.top{border-color:#5c6773;}.since{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:#788797;}.line-numbers :target{background-color:transparent;}pre.rust .number,pre.rust .string{color:#b8cc52;}pre.rust .kw,pre.rust .kw-2,pre.rust .prelude-ty,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .op,pre.rust .lifetime{color:#ff7733;}pre.rust .macro,pre.rust .macro-nonterminal{color:#a37acc;}pre.rust .question-mark{color:#ff9011;}pre.rust .self{color:#36a3d9;font-style:italic;}pre.rust .attribute{color:#e6e1cf;}pre.rust .attribute .ident,pre.rust .attribute .op{color:#e6e1cf;}.example-wrap>pre.line-number{color:#5c67736e;border:none;}a.test-arrow{font-size:100%;color:#788797;border-radius:4px;background-color:rgba(57,175,215,0.09);}a.test-arrow:hover{background-color:rgba(57,175,215,0.368);color:#c5c5c5;}.toggle-label,.code-attribute{color:#999;}:target,:target>*{background:rgba(255,236,164,0.06);}:target{border-right:3px solid rgba(255,180,76,0.85);}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.4);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#39AFD7;}.tooltip::after{background-color:#314559;color:#c5c5c5;border:1px solid #5c6773;}.tooltip::before{border-color:transparent #314559 transparent transparent;}.notable-traits-tooltiptext{background-color:#314559;border-color:#5c6773;}.notable-traits-tooltiptext .notable{border-bottom-color:#5c6773;}#titles>button.selected{background-color:#141920 !important;border-bottom:1px solid #ffb44c !important;border-top:none;}#titles>button:not(.selected){background-color:transparent !important;border:none;}#titles>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#titles>button>div.count{color:#888;}.search-input:focus{}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{}.content span.struct,.content a.struct,.block a.current.struct{}#titles>button:hover,#titles>button.selected{}.content span.type,.content a.type,.block a.current.type{}.content span.union,.content a.union,.block a.current.union{}pre.rust .lifetime{}.stab.unstable{}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){}.content span.enum,.content a.enum,.block a.current.enum{}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{}.content span.keyword,.content a.keyword,.block a.current.keyword{}pre.rust .comment{}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{}pre.rust .kw{}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{}pre.rust .doccomment{}.stab.deprecated{}.content a.attr,.content a.derive,.content a.macro{}.stab.portability{}.content span.primitive,.content a.primitive,.block a.current.primitive{}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{}pre.rust .kw-2,pre.rust .prelude-ty{}.content span.trait,.content a.trait,.block a.current.trait{}.search-results a:focus span{}a.result-trait:focus{}a.result-traitalias:focus{}a.result-mod:focus,a.result-externcrate:focus{}a.result-mod:focus{}a.result-externcrate:focus{}a.result-enum:focus{}a.result-struct:focus{}a.result-union:focus{}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{}a.result-type:focus{}a.result-foreigntype:focus{}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{}a.result-constant:focus,a.result-static:focus{}a.result-primitive:focus{}a.result-keyword:focus{}@media (max-width:700px){.sidebar-menu{background-color:#14191f;border-bottom-color:#5c6773;border-right-color:#5c6773;}.sidebar-elems{background-color:#14191f;border-right-color:#5c6773;}#sidebar-filler{background-color:#14191f;border-bottom-color:#5c6773;}}kbd{color:#c5c5c5;background-color:#314559;border-color:#5c6773;border-bottom-color:#5c6773;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#5c6773;background-color:#0f1419;color:#fff;}#theme-picker>img,#settings-menu>img{filter:invert(100);}#copy-path{color:#fff;}#copy-path>img{filter:invert(70%);}#copy-path:hover>img{filter:invert(100%);}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#e0e0e0;}#theme-choices{border-color:#5c6773;background-color:#0f1419;}#theme-choices>button:not(:first-child){border-top-color:#5c6773;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:rgba(110,110,110,0.33);}@media (max-width:700px){#theme-picker{background:#0f1419;}}#all-types{background-color:#14191f;}#all-types:hover{background-color:rgba(70,70,70,0.33);}.search-results .result-name span.alias{color:#c5c5c5;}.search-results .result-name span.grey{color:#999;}#sidebar-toggle{background-color:#14191f;}#sidebar-toggle:hover{background-color:rgba(70,70,70,0.33);}#source-sidebar{background-color:#14191f;}#source-sidebar>.title{color:#fff;border-bottom-color:#5c6773;}div.files>a:hover,div.name:hover{background-color:#14191f;color:#ffb44c;}div.files>.selected{background-color:#14191f;color:#ffb44c;}.setting-line>.title{border-bottom-color:#5c6773;}input:checked+.slider{background-color:#ffb454 !important;} \ No newline at end of file + body{background-color:#0f1419;color:#c5c5c5;}h1,h2,h3,h4{color:white;}h1.fqn{border-bottom-color:#5c6773;}h1.fqn a{color:#fff;}h2,h3,h4{border-bottom-color:#5c6773;}h4{border:none;}.in-band{background-color:#0f1419;}.invisible{background:rgba(0,0,0,0);}.docblock code{color:#ffb454;}.code-header{color:#e6e1cf;}.docblock pre>code,pre>code{color:#e6e1cf;}span code{color:#e6e1cf;}.docblock a>code{color:#39AFD7 !important;}.docblock code,.docblock-short code{background-color:#191f26;}pre,.rustdoc.source .example-wrap{color:#e6e1cf;background-color:#191f26;}.sidebar{background-color:#14191f;}.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);}*{scrollbar-color:#5c6773 #24292f;}.sidebar{scrollbar-color:#5c6773 #24292f;}::-webkit-scrollbar-track{background-color:transparent;}::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar::-webkit-scrollbar-track{background-color:transparent;}.sidebar::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar .current{background-color:transparent;color:#ffb44c;}.source .sidebar{background-color:#14191f;}.sidebar .location{border-color:#000;background-color:#0f1419;color:#fff;}.sidebar-elems .location{color:#ff7733;}.sidebar-elems .location a{color:#fff;}.sidebar .version{border-bottom-color:#424c57;}.sidebar-title{border-top-color:#5c6773;border-bottom-color:#5c6773;}.block a:hover{background:transparent;color:#ffb44c;}.line-numbers span{color:#5c6773;}.line-numbers .line-highlighted{color:#708090;background-color:rgba(255,236,164,0.06);padding-right:4px;border-right:1px solid #ffb44c;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5,.docblock h6{border-bottom-color:#5c6773;}.docblock table td,.docblock table th{border-color:#5c6773;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#c5c5c5;}.search-results a:hover{background-color:#777;}.search-results a:focus{color:#000 !important;background-color:#c6afb3;}.search-results a{color:#0096cf;}.search-results a div.desc{color:#c5c5c5;}.content .item-info::before{color:#ccc;}.content span.foreigntype,.content a.foreigntype{color:#ef57ff;}.content span.union,.content a.union{color:#98a01c;}.content span.constant,.content a.constant,.content span.static,.content a.static{color:#6380a0;}.content span.primitive,.content a.primitive{color:#32889b;}.content span.traitalias,.content a.traitalias{color:#57d399;}.content span.keyword,.content a.keyword{color:#de5249;}.content span.externcrate,.content span.mod,.content a.mod{color:#acccf9;}.content span.struct,.content a.struct{color:#ffa0a5;}.content span.enum,.content a.enum{color:#99e0c9;}.content span.trait,.content a.trait{color:#39AFD7;}.content span.type,.content a.type{color:#cfbcf5;}.content span.fn,.content a.fn,.content span.method,.content a.method,.content span.tymethod,.content a.tymethod,.content .fnname{color:#fdd687;}.content span.attr,.content a.attr,.content span.derive,.content a.derive,.content span.macro,.content a.macro{color:#a37acc;}pre.rust .comment{color:#788797;}pre.rust .doccomment{color:#a1ac88;}nav:not(.sidebar){border-bottom-color:#424c57;}nav.main .current{border-top-color:#5c6773;border-bottom-color:#5c6773;}nav.main .separator{border:1px solid #5c6773;}a{color:#39AFD7;}a.srclink,a#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,pre.rust a,.sidebar a,.in-band a{color:#c5c5c5;}.search-results a{color:#0096cf;}body.source .example-wrap pre.rust a{background:#333;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}details.rustdoc-toggle>summary::before,details.undocumented>summary::before{filter:invert(100%);}#crate-search{color:#c5c5c5;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;border-color:#424c57;}.search-input{color:#ffffff;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;transition:box-shadow 150ms ease-in-out;}#crate-search+.search-input:focus{box-shadow:0 0 0 1px #148099,0 0 0 2px transparent;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable,.stab.deprecated,.stab.portability{color:#c5c5c5;background:#314559 !important;border-style:none !important;border-radius:4px;padding:3px 6px 3px 6px;}.stab.portability>code{color:#e6e1cf;background:none;}#help>div{background:#14191f;box-shadow:0px 6px 20px 0px black;border:none;border-radius:4px;}#help span.bottom,#help span.top{border-color:#5c6773;}.since{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:#788797;}.line-numbers :target{background-color:transparent;}pre.rust .number,pre.rust .string{color:#b8cc52;}pre.rust .kw,pre.rust .kw-2,pre.rust .prelude-ty,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .op,pre.rust .lifetime{color:#ff7733;}pre.rust .macro,pre.rust .macro-nonterminal{color:#a37acc;}pre.rust .question-mark{color:#ff9011;}pre.rust .self{color:#36a3d9;font-style:italic;}pre.rust .attribute{color:#e6e1cf;}pre.rust .attribute .ident,pre.rust .attribute .op{color:#e6e1cf;}.example-wrap>pre.line-number{color:#5c67736e;border:none;}a.test-arrow{font-size:100%;color:#788797;border-radius:4px;background-color:rgba(57,175,215,0.09);}a.test-arrow:hover{background-color:rgba(57,175,215,0.368);color:#c5c5c5;}.toggle-label,.code-attribute{color:#999;}:target,:target>*{background:rgba(255,236,164,0.06);}:target{border-right:3px solid rgba(255,180,76,0.85);}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.4);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#39AFD7;}.tooltip::after{background-color:#314559;color:#c5c5c5;border:1px solid #5c6773;}.tooltip::before{border-color:transparent #314559 transparent transparent;}.notable-traits-tooltiptext{background-color:#314559;border-color:#5c6773;}.notable-traits-tooltiptext .notable{border-bottom-color:#5c6773;}#titles>button.selected{background-color:#141920 !important;border-bottom:1px solid #ffb44c !important;border-top:none;}#titles>button:not(.selected){background-color:transparent !important;border:none;}#titles>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#titles>button>div.count{color:#888;}.search-input:focus{}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{}.content span.struct,.content a.struct,.block a.current.struct{}#titles>button:hover,#titles>button.selected{}.content span.type,.content a.type,.block a.current.type{}.content span.union,.content a.union,.block a.current.union{}pre.rust .lifetime{}.stab.unstable{}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){}.content span.enum,.content a.enum,.block a.current.enum{}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{}.content span.keyword,.content a.keyword,.block a.current.keyword{}pre.rust .comment{}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{}pre.rust .kw{}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{}pre.rust .doccomment{}.stab.deprecated{}.content a.attr,.content a.derive,.content a.macro{}.stab.portability{}.content span.primitive,.content a.primitive,.block a.current.primitive{}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{}pre.rust .kw-2,pre.rust .prelude-ty{}.content span.trait,.content a.trait,.block a.current.trait{}.search-results a:focus span{}a.result-trait:focus{}a.result-traitalias:focus{}a.result-mod:focus,a.result-externcrate:focus{}a.result-mod:focus{}a.result-externcrate:focus{}a.result-enum:focus{}a.result-struct:focus{}a.result-union:focus{}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{}a.result-type:focus{}a.result-foreigntype:focus{}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{}a.result-constant:focus,a.result-static:focus{}a.result-primitive:focus{}a.result-keyword:focus{}@media (max-width:700px){.sidebar-menu{background-color:#14191f;border-bottom-color:#5c6773;border-right-color:#5c6773;}.sidebar-elems{background-color:#14191f;border-right-color:#5c6773;}#sidebar-filler{background-color:#14191f;border-bottom-color:#5c6773;}}kbd{color:#c5c5c5;background-color:#314559;border-color:#5c6773;border-bottom-color:#5c6773;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#5c6773;background-color:#0f1419;color:#fff;}#theme-picker>img,#settings-menu>img{filter:invert(100);}#copy-path{color:#fff;}#copy-path>img{filter:invert(70%);}#copy-path:hover>img{filter:invert(100%);}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#e0e0e0;}#theme-choices{border-color:#5c6773;background-color:#0f1419;}#theme-choices>button:not(:first-child){border-top-color:#5c6773;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:rgba(110,110,110,0.33);}@media (max-width:700px){#theme-picker{background:#0f1419;}}#all-types{background-color:#14191f;}#all-types:hover{background-color:rgba(70,70,70,0.33);}.search-results .result-name span.alias{color:#c5c5c5;}.search-results .result-name span.grey{color:#999;}#sidebar-toggle{background-color:#14191f;}#sidebar-toggle:hover{background-color:rgba(70,70,70,0.33);}#source-sidebar{background-color:#14191f;}#source-sidebar>.title{color:#fff;border-bottom-color:#5c6773;}div.files>a:hover,div.name:hover{background-color:#14191f;color:#ffb44c;}div.files>.selected{background-color:#14191f;color:#ffb44c;}.setting-line>.title{border-bottom-color:#5c6773;}input:checked+.slider{background-color:#ffb454 !important;}.scraped-example .example-wrap .rust span.highlight{background:rgb(91,59,1);}.scraped-example .example-wrap .rust span.highlight.focus{background:rgb(124,75,15);}.scraped-example:not(.expanded) .code-wrapper:before{background:linear-gradient(to bottom,rgba(15,20,25,1),rgba(15,20,25,0));}.scraped-example:not(.expanded) .code-wrapper:after{background:linear-gradient(to top,rgba(15,20,25,1),rgba(15,20,25,0));}.toggle-line-inner{background:#616161;}.toggle-line:hover .toggle-line-inner{background:##898989;} \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html index 473787d6bb..b5bde753ad 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html @@ -1,5 +1,6 @@ -List of all items in this crate

List of all items[] +List of all items in this crate +
logo

List of all items[] -

Structs

Enums

Traits

Macros

Functions

Typedefs

- +

Structs

Enums

Traits

Macros

Functions

Typedefs

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchain.html index 86b743a374..05d1c7b857 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchain.html @@ -1,14 +1,16 @@ -AnyBlockchain in bdk::blockchain::any - Rust

Enum bdk::blockchain::any::AnyBlockchain[][src]

pub enum AnyBlockchain {
+AnyBlockchain in bdk::blockchain::any - Rust
+    
logo

Enum bdk::blockchain::any::AnyBlockchain[][src]

pub enum AnyBlockchain {
     Electrum(ElectrumBlockchain),
     Esplora(EsploraBlockchain),
     CompactFilters(CompactFiltersBlockchain),
 }
Expand description

Type that can contain any of the Blockchain types defined by the library

It allows switching backend at runtime

See this module’s documentation for a usage example.

-

Variants

This is supported on crate feature electrum only.

Electrum client

-

Tuple Fields of Electrum

This is supported on crate feature esplora only.

Esplora client

-

Tuple Fields of Esplora

CompactFilters(CompactFiltersBlockchain)
This is supported on crate feature compact_filters only.

Compact filters client

-

Tuple Fields of CompactFilters

Trait Implementations

Return the set of Capability supported by this backend

+

Variants

Electrum(ElectrumBlockchain)

Tuple Fields

This is supported on crate feature electrum only.

Electrum client

+

Esplora(EsploraBlockchain)

Tuple Fields

This is supported on crate feature esplora only.

Esplora client

+

CompactFilters(CompactFiltersBlockchain)

Tuple Fields

This is supported on crate feature compact_filters only.

Compact filters client

+

Trait Implementations

Return the set of Capability supported by this backend

Setup the backend and populate the internal database for the first time Read more

Populate the internal database with transactions and UTXOs Read more

Fetch a transaction from the blockchain given its txid

@@ -21,21 +23,19 @@

Performs the conversion.

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchainConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchainConfig.html index bacd1a1623..5c70b784b6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchainConfig.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/enum.AnyBlockchainConfig.html @@ -1,4 +1,6 @@ -AnyBlockchainConfig in bdk::blockchain::any - Rust

Enum bdk::blockchain::any::AnyBlockchainConfig[][src]

pub enum AnyBlockchainConfig {
+AnyBlockchainConfig in bdk::blockchain::any - Rust
+    
logo

Enum bdk::blockchain::any::AnyBlockchainConfig[][src]

pub enum AnyBlockchainConfig {
     Electrum(ElectrumBlockchainConfig),
     Esplora(EsploraBlockchainConfig),
     CompactFilters(CompactFiltersBlockchainConfig),
@@ -28,40 +30,37 @@ will find this particularly useful.

stop_gap: 20, }) );
-

Variants

This is supported on crate feature electrum only.

Electrum client

-

Tuple Fields of Electrum

This is supported on crate feature esplora only.

Esplora client

-

Tuple Fields of Esplora

This is supported on crate feature compact_filters only.

Compact filters client

-

Tuple Fields of CompactFilters

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Variants

Electrum(ElectrumBlockchainConfig)

Tuple Fields

This is supported on crate feature electrum only.

Electrum client

+

Esplora(EsploraBlockchainConfig)

Tuple Fields

This is supported on crate feature esplora only.

Esplora client

+

CompactFilters(CompactFiltersBlockchainConfig)

This is supported on crate feature compact_filters only.

Compact filters client

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Performs the conversion.

Performs the conversion.

Performs the conversion.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/index.html index 538f2c8270..afc3797bee 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/any/index.html @@ -1,7 +1,9 @@ -bdk::blockchain::any - Rust

Module bdk::blockchain::any[][src]

Expand description

Runtime-checked blockchain types

+bdk::blockchain::any - Rust +
logo

Module bdk::blockchain::any[][src]

Expand description

Runtime-checked blockchain types

This module provides the implementation of AnyBlockchain which allows switching the inner Blockchain type at runtime.

-

Example

+

Example

In this example both wallet_electrum and wallet_esplora have the same type of Wallet<AnyBlockchain, MemoryDatabase>. This means that they could both, for instance, be assigned to a struct member.

@@ -36,9 +38,8 @@ blockchain type supported using a single line of code:

MemoryDatabase::default(), blockchain, )?;
-

Enums

-

Type that can contain any of the Blockchain types defined by the library

-

Type that can contain any of the blockchain configurations defined by the library

-
- +

Enums

+

Type that can contain any of the Blockchain types defined by the library

+

Type that can contain any of the blockchain configurations defined by the library

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/enum.CompactFiltersError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/enum.CompactFiltersError.html index d1bf965657..f50de038e0 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/enum.CompactFiltersError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/enum.CompactFiltersError.html @@ -1,4 +1,6 @@ -CompactFiltersError in bdk::blockchain::compact_filters - Rust

Enum bdk::blockchain::compact_filters::CompactFiltersError[][src]

pub enum CompactFiltersError {
+CompactFiltersError in bdk::blockchain::compact_filters - Rust
+    
logo

Enum bdk::blockchain::compact_filters::CompactFiltersError[][src]

pub enum CompactFiltersError {
 
Show 15 variants InvalidResponse, InvalidHeaders, InvalidFilterHeader, @@ -15,22 +17,22 @@ Time(SystemTimeError), Global(Box<Error>),
}
This is supported on crate feature compact_filters only.
Expand description

An error that can occur during sync with a CompactFiltersBlockchain

-

Variants

InvalidResponse

A peer sent an invalid or unexpected response

-
InvalidHeaders

The headers returned are invalid

-
InvalidFilterHeader

The compact filter headers returned are invalid

-
InvalidFilter

The compact filter returned is invalid

-
MissingBlock

The peer is missing a block in the valid chain

-
DataCorruption

The data stored in the block filters storage are corrupted

-
NotConnected

A peer is not connected

-
Timeout

A peer took too long to reply to one of our messages

-
PeerBloomDisabled

The peer doesn’t advertise the BLOOM service flag

-
NoPeers

No peers have been specified

-
Db(Error)

Internal database error

-

Tuple Fields of Db

0: Error
Io(Error)

Internal I/O error

-

Tuple Fields of Io

0: Error
Bip158(Error)

Invalid BIP158 filter

-

Tuple Fields of Bip158

0: Error

Internal system time error

-

Tuple Fields of Time

Global(Box<Error>)

Wrapper for crate::error::Error

-

Tuple Fields of Global

0: Box<Error>

Trait Implementations

Formats the value using the given formatter. Read more

+

Variants

InvalidResponse

A peer sent an invalid or unexpected response

+

InvalidHeaders

The headers returned are invalid

+

InvalidFilterHeader

The compact filter headers returned are invalid

+

InvalidFilter

The compact filter returned is invalid

+

MissingBlock

The peer is missing a block in the valid chain

+

DataCorruption

The data stored in the block filters storage are corrupted

+

NotConnected

A peer is not connected

+

Timeout

A peer took too long to reply to one of our messages

+

PeerBloomDisabled

The peer doesn’t advertise the BLOOM service flag

+

NoPeers

No peers have been specified

+

Db(Error)

Tuple Fields

0: Error

Internal database error

+

Io(Error)

Tuple Fields

0: Error

Internal I/O error

+

Bip158(Error)

Tuple Fields

0: Error

Invalid BIP158 filter

+

Time(SystemTimeError)

Tuple Fields

Internal system time error

+

Global(Box<Error>)

Tuple Fields

0: Box<Error>

Wrapper for crate::error::Error

+

Trait Implementations

Formats the value using the given formatter. Read more

Formats the value using the given formatter. Read more

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

🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

@@ -43,31 +45,20 @@

Performs the conversion.

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Converts a reference to Self into a dynamic trait object of Fail.

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the “name” of the error. Read more

-

Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

-

Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

-

Provides context for this failure. Read more

-

Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

Converts the given value to a String. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/index.html index 14bed612f4..95c22c6deb 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/index.html @@ -1,4 +1,6 @@ -bdk::blockchain::compact_filters - Rust

Module bdk::blockchain::compact_filters[][src]

This is supported on crate feature compact_filters only.
Expand description

Compact Filters

+bdk::blockchain::compact_filters - Rust +
logo

Module bdk::blockchain::compact_filters[][src]

This is supported on crate feature compact_filters only.
Expand description

Compact Filters

This module contains a multithreaded implementation of an Blockchain backend that uses BIP157 (aka “Neutrino”) to populate the wallet’s database by downloading compact filters from the P2P network.

@@ -10,7 +12,7 @@ messages received by different peers. Thus, it’s recommended to use this modul connecting to a single peer at a time, optionally by opening multiple connections if it’s desirable to use multiple threads at once to sync in parallel.

This is an EXPERIMENTAL feature, API and other major changes are expected.

-

Example

+

Example

let num_threads = 4;
 
 let mempool = Arc::new(Mempool::default());
@@ -24,14 +26,13 @@ desirable to use multiple threads at once to sync in parallel.

}) .collect::<Result<_, _>>()?; let blockchain = CompactFiltersBlockchain::new(peers, "./wallet-filters", Some(500_000))?;
-

Structs

-

Data to connect to a Bitcoin P2P peer

-

Structure implementing the required blockchain traits

-

Configuration for a CompactFiltersBlockchain

-

Container for unconfirmed, but valid Bitcoin transactions

-

A Bitcoin peer

-

Enums

-

An error that can occur during sync with a CompactFiltersBlockchain

-
- +

Structs

+

Data to connect to a Bitcoin P2P peer

+

Structure implementing the required blockchain traits

+

Container for unconfirmed, but valid Bitcoin transactions

+

A Bitcoin peer

+

Enums

+

An error that can occur during sync with a CompactFiltersBlockchain

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.BitcoinPeerConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.BitcoinPeerConfig.html index 529f5ba605..8324e26bbd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.BitcoinPeerConfig.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.BitcoinPeerConfig.html @@ -1,4 +1,6 @@ -BitcoinPeerConfig in bdk::blockchain::compact_filters - Rust

Struct bdk::blockchain::compact_filters::BitcoinPeerConfig[][src]

pub struct BitcoinPeerConfig {
+BitcoinPeerConfig in bdk::blockchain::compact_filters - Rust
+    
logo

Struct bdk::blockchain::compact_filters::BitcoinPeerConfig[][src]

pub struct BitcoinPeerConfig {
     pub address: String,
     pub socks5: Option<String>,
     pub socks5_credentials: Option<(String, String)>,
@@ -7,33 +9,30 @@
 
socks5: Option<String>

Optional socks5 proxy

socks5_credentials: Option<(String, String)>

Optional socks5 proxy credentials

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Deserialize this value from the given Serde deserializer. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchain.html index ebd9e1bb42..b522810bdc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchain.html @@ -1,5 +1,7 @@ -CompactFiltersBlockchain in bdk::blockchain::compact_filters - Rust

Struct bdk::blockchain::compact_filters::CompactFiltersBlockchain[][src]

pub struct CompactFiltersBlockchain { /* fields omitted */ }
This is supported on crate feature compact_filters only.
Expand description

Structure implementing the required blockchain traits

-

Example

+CompactFiltersBlockchain in bdk::blockchain::compact_filters - Rust +
logo

Struct bdk::blockchain::compact_filters::CompactFiltersBlockchain[][src]

pub struct CompactFiltersBlockchain { /* fields omitted */ }
This is supported on crate feature compact_filters only.
Expand description

Structure implementing the required blockchain traits

+

Example

See the blockchain::compact_filters module for a usage example.

Implementations

Construct a new instance given a list of peers, a path to store headers and block filters downloaded during the sync and optionally a number of blocks to ignore starting @@ -14,27 +16,25 @@ speed-up the sync process.

Broadcast a transaction

Return the current height

Estimate the fee rate required to confirm a transaction in a given target of blocks

-

Populate the internal database with transactions and UTXOs Read more

+

Populate the internal database with transactions and UTXOs Read more

Type that contains the configuration

Create a new instance given a configuration

Formats the value using the given formatter. Read more

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchainConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchainConfig.html index b9abcf5a31..4806421448 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchainConfig.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.CompactFiltersBlockchainConfig.html @@ -1,4 +1,6 @@ -CompactFiltersBlockchainConfig in bdk::blockchain::compact_filters - Rust

Struct bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig[][src]

pub struct CompactFiltersBlockchainConfig {
+CompactFiltersBlockchainConfig in bdk::blockchain::compact_filters - Rust
+    
logo

Struct bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig[][src]

pub struct CompactFiltersBlockchainConfig {
     pub peers: Vec<BitcoinPeerConfig>,
     pub network: Network,
     pub storage_dir: String,
@@ -6,37 +8,34 @@
 }
This is supported on crate feature compact_filters only.
Expand description

Configuration for a CompactFiltersBlockchain

Fields

peers: Vec<BitcoinPeerConfig>

List of peers to try to connect to for asking headers and filters

network: Network

Network used

-
storage_dir: String

Storage dir to save partially downloaded headers and full blocks

+
storage_dir: String

Storage dir to save partially downloaded headers and full blocks. Should be a separate directory per descriptor. Consider using crate::wallet::wallet_name_from_descriptor for this.

skip_blocks: Option<usize>

Optionally skip initial skip_blocks blocks (default: 0)

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Performs the conversion.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Mempool.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Mempool.html index cfa16dc28d..f180b9d621 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Mempool.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Mempool.html @@ -1,4 +1,6 @@ -Mempool in bdk::blockchain::compact_filters - Rust

Struct bdk::blockchain::compact_filters::Mempool[][src]

pub struct Mempool(_);
This is supported on crate feature compact_filters only.
Expand description

Container for unconfirmed, but valid Bitcoin transactions

+Mempool in bdk::blockchain::compact_filters - Rust +
logo

Struct bdk::blockchain::compact_filters::Mempool[][src]

pub struct Mempool(_);
This is supported on crate feature compact_filters only.
Expand description

Container for unconfirmed, but valid Bitcoin transactions

It is normally shared between Peers with the use of Arc, so that transactions are not duplicated in memory.

Implementations

Create a new empty mempool

@@ -11,21 +13,19 @@ peers. To do that, b

Trait Implementations

Formats the value using the given formatter. Read more

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

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Peer.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Peer.html index c19b1edd4d..c05fa28fbe 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Peer.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/compact_filters/struct.Peer.html @@ -1,4 +1,6 @@ -Peer in bdk::blockchain::compact_filters - Rust

Struct bdk::blockchain::compact_filters::Peer[][src]

pub struct Peer { /* fields omitted */ }
This is supported on crate feature compact_filters only.
Expand description

A Bitcoin peer

+Peer in bdk::blockchain::compact_filters - Rust +
logo

Struct bdk::blockchain::compact_filters::Peer[][src]

pub struct Peer { /* fields omitted */ }
This is supported on crate feature compact_filters only.
Expand description

A Bitcoin peer

Implementations

Connect to a peer over a plaintext TCP connection

This function internally spawns a new thread that will monitor incoming messages from the peer, and optionally reply to some of them transparently, like pings

@@ -14,21 +16,19 @@ peer, and optionally reply to some of them transparently, like

Waits for a specific incoming Bitcoin message, optionally with a timeout

Trait Implementations

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/index.html index fdf321f533..3a748f0efe 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/index.html @@ -1,13 +1,14 @@ -bdk::blockchain::electrum - Rust

Module bdk::blockchain::electrum[][src]

This is supported on crate feature electrum only.
Expand description

Electrum

+bdk::blockchain::electrum - Rust +
logo

Module bdk::blockchain::electrum[][src]

This is supported on crate feature electrum only.
Expand description

Electrum

This module defines a Blockchain struct that wraps an [electrum_client::Client] and implements the logic required to populate the wallet’s database by querying the inner client.

-

Example

+

Example

let client = electrum_client::Client::new("ssl://electrum.blockstream.info:50002")?;
 let blockchain = ElectrumBlockchain::from(client);
-

Structs

-

Wrapper over an Electrum Client that implements the required blockchain traits

-

Configuration for an ElectrumBlockchain

-
- +

Structs

+

Wrapper over an Electrum Client that implements the required blockchain traits

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchain.html index 50327ac0ae..132b426cbf 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchain.html @@ -1,33 +1,33 @@ -ElectrumBlockchain in bdk::blockchain::electrum - Rust

Struct bdk::blockchain::electrum::ElectrumBlockchain[][src]

pub struct ElectrumBlockchain { /* fields omitted */ }
This is supported on crate feature electrum only.
Expand description

Wrapper over an Electrum Client that implements the required blockchain traits

-

Example

+ElectrumBlockchain in bdk::blockchain::electrum - Rust +
logo

Struct bdk::blockchain::electrum::ElectrumBlockchain[][src]

pub struct ElectrumBlockchain { /* fields omitted */ }
This is supported on crate feature electrum only.
Expand description

Wrapper over an Electrum Client that implements the required blockchain traits

+

Example

See the blockchain::electrum module for a usage example.

-

Trait Implementations

Return the set of Capability supported by this backend

-

Setup the backend and populate the internal database for the first time Read more

-

Fetch a transaction from the blockchain given its txid

-

Broadcast a transaction

-

Return the current height

-

Estimate the fee rate required to confirm a transaction in a given target of blocks

-

Populate the internal database with transactions and UTXOs Read more

-

Type that contains the configuration

-

Create a new instance given a configuration

+

Trait Implementations

Return the set of Capability supported by this backend

+

Setup the backend and populate the internal database for the first time Read more

+

Fetch a transaction from the blockchain given its txid

+

Broadcast a transaction

+

Return the current height

+

Estimate the fee rate required to confirm a transaction in a given target of blocks

+

Populate the internal database with transactions and UTXOs Read more

+

Type that contains the configuration

+

Create a new instance given a configuration

Performs the conversion.

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchainConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchainConfig.html index 214df70de2..c6c78f2444 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchainConfig.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/electrum/struct.ElectrumBlockchainConfig.html @@ -1,4 +1,6 @@ -ElectrumBlockchainConfig in bdk::blockchain::electrum - Rust

Struct bdk::blockchain::electrum::ElectrumBlockchainConfig[][src]

pub struct ElectrumBlockchainConfig {
+ElectrumBlockchainConfig in bdk::blockchain::electrum - Rust
+    
logo

Struct bdk::blockchain::electrum::ElectrumBlockchainConfig[][src]

pub struct ElectrumBlockchainConfig {
     pub url: String,
     pub socks5: Option<String>,
     pub retry: u8,
@@ -11,35 +13,32 @@
 
retry: u8

Request retry count

timeout: Option<u8>

Request timeout (seconds)

stop_gap: usize

Stop searching addresses for transactions after finding an unused gap of this length

-

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Performs the conversion.

-

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

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/enum.Capability.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/enum.Capability.html index 3f003cef14..a4345108c4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/enum.Capability.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/enum.Capability.html @@ -1,39 +1,38 @@ -Capability in bdk::blockchain - Rust

Enum bdk::blockchain::Capability[][src]

pub enum Capability {
+Capability in bdk::blockchain - Rust
+    
logo

Enum bdk::blockchain::Capability[][src]

pub enum Capability {
     FullHistory,
     GetAnyTx,
     AccurateFees,
 }
Expand description

Capabilities that can be supported by a Blockchain backend

-

Variants

FullHistory

Can recover the full history of a wallet and not only the set of currently spendable UTXOs

-
GetAnyTx

Can fetch any historical transaction given its txid

-
AccurateFees

Can compute accurate fees for the transactions found during sync

-

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Feeds this value into the given Hasher. Read more

-

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

-

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

Variants

FullHistory

Can recover the full history of a wallet and not only the set of currently spendable UTXOs

+

GetAnyTx

Can fetch any historical transaction given its txid

+

AccurateFees

Can compute accurate fees for the transactions found during sync

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Feeds this value into the given Hasher. Read more

+

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

+

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

This method tests for !=.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/enum.EsploraError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/enum.EsploraError.html index 6b4fabb600..439765b356 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/enum.EsploraError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/enum.EsploraError.html @@ -1,4 +1,6 @@ -EsploraError in bdk::blockchain::esplora - Rust

Enum bdk::blockchain::esplora::EsploraError[][src]

pub enum EsploraError {
+EsploraError in bdk::blockchain::esplora - Rust
+    
logo

Enum bdk::blockchain::esplora::EsploraError[][src]

pub enum EsploraError {
     Ureq(Error),
     UreqTransport(Transport),
     HttpResponse(u16),
@@ -11,56 +13,45 @@
     HeaderHeightNotFound(u32),
     HeaderHashNotFound(BlockHash),
 }
This is supported on crate feature esplora only.
Expand description

Errors that can happen during a sync with EsploraBlockchain

-

Variants

Ureq(Error)

Error during ureq HTTP request

-

Tuple Fields of Ureq

0: Error
UreqTransport(Transport)

Transport error during the ureq HTTP call

-

Tuple Fields of UreqTransport

0: Transport
HttpResponse(u16)

HTTP response error

-

Tuple Fields of HttpResponse

0: u16
Io(Error)

IO error during ureq response read

-

Tuple Fields of Io

0: Error
NoHeader

No header found in ureq response

-
Parsing(ParseIntError)

Invalid number returned

-

Tuple Fields of Parsing

BitcoinEncoding(Error)

Invalid Bitcoin data returned

-

Tuple Fields of BitcoinEncoding

0: Error
Hex(Error)

Invalid Hex data returned

-

Tuple Fields of Hex

0: Error
TransactionNotFound(Txid)

Transaction not found

-

Tuple Fields of TransactionNotFound

0: Txid
HeaderHeightNotFound(u32)

Header height not found

-

Tuple Fields of HeaderHeightNotFound

0: u32
HeaderHashNotFound(BlockHash)

Header hash not found

-

Tuple Fields of HeaderHashNotFound

0: BlockHash

Trait Implementations

Formats the value using the given formatter. Read more

-

Formats the value using the given formatter. Read more

-

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

+

Variants

Ureq(Error)

Tuple Fields

0: Error

Error during ureq HTTP request

+

UreqTransport(Transport)

Tuple Fields

0: Transport

Transport error during the ureq HTTP call

+

HttpResponse(u16)

Tuple Fields

0: u16

HTTP response error

+

Io(Error)

Tuple Fields

0: Error

IO error during ureq response read

+

NoHeader

No header found in ureq response

+

Parsing(ParseIntError)

Tuple Fields

Invalid number returned

+

BitcoinEncoding(Error)

Tuple Fields

0: Error

Invalid Bitcoin data returned

+

Hex(Error)

Tuple Fields

0: Error

Invalid Hex data returned

+

TransactionNotFound(Txid)

Tuple Fields

0: Txid

Transaction not found

+

HeaderHeightNotFound(u32)

Tuple Fields

0: u32

Header height not found

+

HeaderHashNotFound(BlockHash)

Tuple Fields

0: BlockHash

Header hash not found

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

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

🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

👎 Deprecated since 1.42.0:

use the Display impl or to_string()

👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

-

Performs the conversion.

-

Performs the conversion.

-

Performs the conversion.

-

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

Performs the conversion.

-

Performs the conversion.

-

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Converts a reference to Self into a dynamic trait object of Fail.

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the “name” of the error. Read more

-

Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

-

Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

-

Provides context for this failure. Read more

-

Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

Converts the given value to a String. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/index.html index 0bbf5f0304..706d8a5983 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/index.html @@ -1,19 +1,19 @@ -bdk::blockchain::esplora - Rust

Module bdk::blockchain::esplora[][src]

This is supported on crate feature esplora only.
Expand description

Esplora

+bdk::blockchain::esplora - Rust +
logo

Module bdk::blockchain::esplora[][src]

This is supported on crate feature esplora only.
Expand description

Esplora

This module defines a EsploraBlockchain struct that can query an Esplora backend populate the wallet’s database by:

-

Example

+

Example

let blockchain = EsploraBlockchain::new("https://blockstream.info/testnet/api", 20);

Esplora blockchain can use either ureq or reqwest for the HTTP client depending on your needs (blocking or async respectively).

Please note, to configure the Esplora HTTP client correctly use one of: Blocking: –features=‘esplora,ureq’ Async: –features=‘async-interface,esplora,reqwest’ –no-default-features

-

Structs

-

Structure that implements the logic to sync with Esplora

-

Configuration for an EsploraBlockchain

-

Data type used when fetching transaction history from Esplora.

-

Enums

-

Errors that can happen during a sync with EsploraBlockchain

-
- +

Structs

+

Structure that implements the logic to sync with Esplora

+

Enums

+

Errors that can happen during a sync with EsploraBlockchain

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/sidebar-items.js index bf88a1a159..d4d17db97b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["EsploraError","Errors that can happen during a sync with [`EsploraBlockchain`]"]],"struct":[["EsploraBlockchain","Structure that implements the logic to sync with Esplora"],["EsploraBlockchainConfig","Configuration for an [`EsploraBlockchain`]"],["EsploraGetHistory","Data type used when fetching transaction history from Esplora."]]}); \ No newline at end of file +initSidebarItems({"enum":[["EsploraError","Errors that can happen during a sync with [`EsploraBlockchain`]"]],"struct":[["EsploraBlockchain","Structure that implements the logic to sync with Esplora"],["EsploraBlockchainConfig","Configuration for an [`EsploraBlockchain`]"]]}); \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchain.html index d275ec2a49..406a7022d3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchain.html @@ -1,35 +1,36 @@ -EsploraBlockchain in bdk::blockchain::esplora - Rust

Struct bdk::blockchain::esplora::EsploraBlockchain[][src]

pub struct EsploraBlockchain { /* fields omitted */ }
This is supported on crate feature esplora only.
Expand description

Structure that implements the logic to sync with Esplora

-

Example

+EsploraBlockchain in bdk::blockchain::esplora - Rust +
logo

Struct bdk::blockchain::esplora::EsploraBlockchain[][src]

pub struct EsploraBlockchain { /* fields omitted */ }
This is supported on crate feature esplora only.
Expand description

Structure that implements the logic to sync with Esplora

+

Example

See the blockchain::esplora module for a usage example.

-

Implementations

Create a new instance of the client from a base URL and the stop_gap.

-

Set the inner ureq agent.

-

Trait Implementations

Return the set of Capability supported by this backend

-

Setup the backend and populate the internal database for the first time Read more

-

Fetch a transaction from the blockchain given its txid

-

Broadcast a transaction

-

Return the current height

-

Estimate the fee rate required to confirm a transaction in a given target of blocks

-

Populate the internal database with transactions and UTXOs Read more

-

Type that contains the configuration

-

Create a new instance given a configuration

+

Implementations

Create a new instance of the client from a base URL and the stop_gap.

+

Set the inner ureq agent.

+

Set the number of parallel requests the client can make.

+

Trait Implementations

Return the set of Capability supported by this backend

+

Setup the backend and populate the internal database for the first time Read more

+

Fetch a transaction from the blockchain given its txid

+

Broadcast a transaction

+

Return the current height

+

Estimate the fee rate required to confirm a transaction in a given target of blocks

+

Populate the internal database with transactions and UTXOs Read more

+

Type that contains the configuration

+

Create a new instance given a configuration

Formats the value using the given formatter. Read more

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchainConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchainConfig.html index d8dc87b5e7..c45ee26f3f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchainConfig.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraBlockchainConfig.html @@ -1,11 +1,14 @@ -EsploraBlockchainConfig in bdk::blockchain::esplora - Rust

Struct bdk::blockchain::esplora::EsploraBlockchainConfig[][src]

pub struct EsploraBlockchainConfig {
+EsploraBlockchainConfig in bdk::blockchain::esplora - Rust
+    
logo

Struct bdk::blockchain::esplora::EsploraBlockchainConfig[][src]

pub struct EsploraBlockchainConfig {
     pub base_url: String,
     pub proxy: Option<String>,
-    pub timeout_read: u64,
-    pub timeout_write: u64,
+    pub concurrency: Option<u8>,
     pub stop_gap: usize,
+    pub timeout: Option<u64>,
 }
This is supported on crate feature esplora only.
Expand description

Configuration for an EsploraBlockchain

-

Fields

base_url: String

Base URL of the esplora service eg. https://blockstream.info/api/

+

Fields

base_url: String

Base URL of the esplora service

+

eg. https://blockstream.info/api/

proxy: Option<String>

Optional URL of the proxy to use to make requests to the Esplora server

The string should be formatted as: <protocol>://<user>:<password>@host:<port>.

Note that the format of this value and the supported protocols change slightly between the @@ -13,38 +16,36 @@ sync version of esplora (using ureq) and the async version (using < details check with the documentation of the two crates. Both of them are compiled with the socks feature enabled.

The proxy is ignored when targeting wasm32.

-
timeout_read: u64

Socket read timeout.

-
timeout_write: u64

Socket write timeout.

+
concurrency: Option<u8>

Number of parallel requests sent to the esplora service (default: 4)

stop_gap: usize

Stop searching addresses for transactions after finding an unused gap of this length.

-

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+
timeout: Option<u64>

Socket timeout.

+

Implementations

create a config with default values given the base url and stop gap

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Performs the conversion.

-

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

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraGetHistory.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraGetHistory.html deleted file mode 100644 index 02fa3f15f5..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/struct.EsploraGetHistory.html +++ /dev/null @@ -1,21 +0,0 @@ -EsploraGetHistory in bdk::blockchain::esplora - Rust

Struct bdk::blockchain::esplora::EsploraGetHistory[][src]

pub struct EsploraGetHistory { /* fields omitted */ }
This is supported on crate feature esplora only.
Expand description

Data type used when fetching transaction history from Esplora.

-

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

-

The alignment of pointer.

-

The type for initializers.

-

Initializes a with the given initializer. Read more

-

Dereferences the given pointer. Read more

-

Mutably dereferences the given pointer. Read more

-

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/ureq/struct.EsploraBlockchainConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/ureq/struct.EsploraBlockchainConfig.html deleted file mode 100644 index 40575d9a80..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/esplora/ureq/struct.EsploraBlockchainConfig.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

Redirecting to ../../../../bdk/blockchain/esplora/struct.EsploraBlockchainConfig.html...

- - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.log_progress.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.log_progress.html index 582d5ced7b..f324cb1557 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.log_progress.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.log_progress.html @@ -1,4 +1,5 @@ -log_progress in bdk::blockchain - Rust

Function bdk::blockchain::log_progress[][src]

pub fn log_progress() -> LogProgress
Expand description

Create a new instance of LogProgress

-
- +log_progress in bdk::blockchain - Rust +
logo

Function bdk::blockchain::log_progress[][src]

pub fn log_progress() -> LogProgress
Expand description

Create a new instance of LogProgress

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.noop_progress.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.noop_progress.html index e182f4305a..c850414e14 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.noop_progress.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.noop_progress.html @@ -1,4 +1,5 @@ -noop_progress in bdk::blockchain - Rust

Function bdk::blockchain::noop_progress[][src]

pub fn noop_progress() -> NoopProgress
Expand description

Create a new instance of NoopProgress

-
- +noop_progress in bdk::blockchain - Rust +
logo

Function bdk::blockchain::noop_progress[][src]

pub fn noop_progress() -> NoopProgress
Expand description

Create a new instance of NoopProgress

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.progress.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.progress.html index 17ce1479b7..e69010cbf3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.progress.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/fn.progress.html @@ -1,4 +1,5 @@ -progress in bdk::blockchain - Rust

Function bdk::blockchain::progress[][src]

pub fn progress() -> (Sender<ProgressData>, Receiver<ProgressData>)
Expand description

Shortcut to create a channel (pair of Sender and Receiver) that can transport ProgressData

-
- +progress in bdk::blockchain - Rust +
logo

Function bdk::blockchain::progress[][src]

pub fn progress() -> (Sender<ProgressData>, Receiver<ProgressData>)
Expand description

Shortcut to create a channel (pair of Sender and Receiver) that can transport ProgressData

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/index.html index c7deb7cdde..d6be5da6d6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/index.html @@ -1,31 +1,32 @@ -bdk::blockchain - Rust

Module bdk::blockchain[][src]

Expand description

Blockchain backends

+bdk::blockchain - Rust +
logo

Module bdk::blockchain[][src]

Expand description

Blockchain backends

This module provides the implementation of a few commonly-used backends like Electrum, Esplora and Compact Filters/Neutrino, along with a generalized trait Blockchain that can be implemented to build customized backends.

-

Re-exports

-
pub use any::AnyBlockchain;
pub use any::AnyBlockchainConfig;
pub use self::electrum::ElectrumBlockchain;
pub use self::electrum::ElectrumBlockchainConfig;
pub use self::compact_filters::CompactFiltersBlockchain;

Modules

-

Runtime-checked blockchain types

-
compact_filterscompact_filters

Compact Filters

-
electrumelectrum

Electrum

-
esploraesplora

Esplora

-

Structs

-

Structure that implements the logic to sync with Esplora

-

Type that implements Progress and logs at level INFO every update received

-

Type that implements Progress and drops every update received

-

Enums

-

Capabilities that can be supported by a Blockchain backend

-

Traits

-

Trait that defines the actions that must be supported by a blockchain backend

-

Trait for Blockchain types that can be created given a configuration

-

Trait for types that can receive and process progress updates during Blockchain::sync and +

Re-exports

+
pub use any::AnyBlockchain;
pub use any::AnyBlockchainConfig;
pub use self::electrum::ElectrumBlockchain;
pub use self::electrum::ElectrumBlockchainConfig;
pub use self::compact_filters::CompactFiltersBlockchain;

Modules

+

Runtime-checked blockchain types

+
compact_filterscompact_filters

Compact Filters

+
electrumelectrum

Electrum

+
esploraesplora

Esplora

+

Structs

+

Structure that implements the logic to sync with Esplora

+

Type that implements Progress and logs at level INFO every update received

+

Type that implements Progress and drops every update received

+

Enums

+

Capabilities that can be supported by a Blockchain backend

+

Traits

+

Trait that defines the actions that must be supported by a blockchain backend

+

Trait for Blockchain types that can be created given a configuration

+

Trait for types that can receive and process progress updates during Blockchain::sync and Blockchain::setup

-

Functions

-

Create a new instance of LogProgress

-

Create a new instance of NoopProgress

-

Shortcut to create a channel (pair of Sender and Receiver) that can transport ProgressData

-

Type Definitions

-

Data sent with a progress update over a channel

-
- +

Functions

+

Create a new instance of LogProgress

+

Create a new instance of NoopProgress

+

Shortcut to create a channel (pair of Sender and Receiver) that can transport ProgressData

+

Type Definitions

+

Data sent with a progress update over a channel

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.EsploraBlockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.EsploraBlockchain.html index c7a19a2bed..a5b5e8c235 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.EsploraBlockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.EsploraBlockchain.html @@ -1,35 +1,36 @@ -EsploraBlockchain in bdk::blockchain - Rust

Struct bdk::blockchain::EsploraBlockchain[][src]

pub struct EsploraBlockchain { /* fields omitted */ }
Expand description

Structure that implements the logic to sync with Esplora

-

Example

+EsploraBlockchain in bdk::blockchain - Rust +
logo

Struct bdk::blockchain::EsploraBlockchain[][src]

pub struct EsploraBlockchain { /* fields omitted */ }
Expand description

Structure that implements the logic to sync with Esplora

+

Example

See the blockchain::esplora module for a usage example.

-

Implementations

This is supported on crate feature esplora only.

Create a new instance of the client from a base URL and the stop_gap.

-
This is supported on crate feature esplora only.

Set the inner ureq agent.

-

Trait Implementations

Return the set of Capability supported by this backend

-

Setup the backend and populate the internal database for the first time Read more

-

Fetch a transaction from the blockchain given its txid

-

Broadcast a transaction

-

Return the current height

-

Estimate the fee rate required to confirm a transaction in a given target of blocks

-

Populate the internal database with transactions and UTXOs Read more

-

Type that contains the configuration

-

Create a new instance given a configuration

+

Implementations

This is supported on crate feature esplora only.

Create a new instance of the client from a base URL and the stop_gap.

+
This is supported on crate feature esplora only.

Set the inner ureq agent.

+
This is supported on crate feature esplora only.

Set the number of parallel requests the client can make.

+

Trait Implementations

Return the set of Capability supported by this backend

+

Setup the backend and populate the internal database for the first time Read more

+

Fetch a transaction from the blockchain given its txid

+

Broadcast a transaction

+

Return the current height

+

Estimate the fee rate required to confirm a transaction in a given target of blocks

+

Populate the internal database with transactions and UTXOs Read more

+

Type that contains the configuration

+

Create a new instance given a configuration

Formats the value using the given formatter. Read more

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.LogProgress.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.LogProgress.html index d09f52c3c4..e29089efd6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.LogProgress.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.LogProgress.html @@ -1,27 +1,26 @@ -LogProgress in bdk::blockchain - Rust

Struct bdk::blockchain::LogProgress[][src]

pub struct LogProgress;
Expand description

Type that implements Progress and logs at level INFO every update received

-

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Send a new progress update Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+LogProgress in bdk::blockchain - Rust +
logo

Struct bdk::blockchain::LogProgress[][src]

pub struct LogProgress;
Expand description

Type that implements Progress and logs at level INFO every update received

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Send a new progress update Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.NoopProgress.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.NoopProgress.html index 6b2ecaf8d1..5ac828a287 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.NoopProgress.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/struct.NoopProgress.html @@ -1,27 +1,26 @@ -NoopProgress in bdk::blockchain - Rust

Struct bdk::blockchain::NoopProgress[][src]

pub struct NoopProgress;
Expand description

Type that implements Progress and drops every update received

-

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Send a new progress update Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+NoopProgress in bdk::blockchain - Rust +
logo

Struct bdk::blockchain::NoopProgress[][src]

pub struct NoopProgress;
Expand description

Type that implements Progress and drops every update received

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Send a new progress update Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Blockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Blockchain.html index ac0001fa21..677d61a9d8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Blockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Blockchain.html @@ -1,4 +1,6 @@ -Blockchain in bdk::blockchain - Rust

Trait bdk::blockchain::Blockchain[][src]

pub trait Blockchain {
+Blockchain in bdk::blockchain - Rust
+    
logo

Trait bdk::blockchain::Blockchain[][src]

pub trait Blockchain {
     fn get_capabilities(&self) -> HashSet<Capability>;
 
fn setup<D: BatchDatabase, P: 'static + Progress>(
        &self,
        database: &mut D,
        progress_update: P
    ) -> Result<(), Error>;
fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error>; @@ -8,19 +10,19 @@ fn sync<D: BatchDatabase, P: 'static + Progress>(
        &self,
        database: &mut D,
        progress_update: P
    ) -> Result<(), Error> { ... } }
Expand description

Trait that defines the actions that must be supported by a blockchain backend

-

Required methods

Return the set of Capability supported by this backend

-

Setup the backend and populate the internal database for the first time

+

Required methods

Return the set of Capability supported by this backend

+

Setup the backend and populate the internal database for the first time

This method is the equivalent of Blockchain::sync, but it’s guaranteed to only be called once, at the first Wallet::sync.

The rationale behind the distinction between sync and setup is that some custom backends might need to perform specific actions only the first time they are synced.

For types that do not have that distinction, only this method can be implemented, since Blockchain::sync defaults to calling this internally if not overridden.

-

Fetch a transaction from the blockchain given its txid

-

Broadcast a transaction

-

Return the current height

-

Estimate the fee rate required to confirm a transaction in a given target of blocks

-

Provided methods

Populate the internal database with transactions and UTXOs

+

Fetch a transaction from the blockchain given its txid

+

Broadcast a transaction

+

Return the current height

+

Estimate the fee rate required to confirm a transaction in a given target of blocks

+

Provided methods

Populate the internal database with transactions and UTXOs

If not overridden, it defaults to calling Blockchain::setup internally.

This method should implement the logic required to iterate over the list of the wallet’s script_pubkeys using Database::iter_script_pubkeys and look for relevant transactions @@ -30,6 +32,5 @@ in the blockchain to populate the database with BatchOperations::del_utxo.

The progress_update object can be used to give the caller updates about the progress by using Progress::update.

-

Implementations on Foreign Types

Implementors

- +

Implementations on Foreign Types

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.ConfigurableBlockchain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.ConfigurableBlockchain.html index a3e8655ff0..6949ca672a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.ConfigurableBlockchain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.ConfigurableBlockchain.html @@ -1,9 +1,10 @@ -ConfigurableBlockchain in bdk::blockchain - Rust

Trait bdk::blockchain::ConfigurableBlockchain[][src]

pub trait ConfigurableBlockchain: Blockchain + Sized {
+ConfigurableBlockchain in bdk::blockchain - Rust
+    
logo

Trait bdk::blockchain::ConfigurableBlockchain[][src]

pub trait ConfigurableBlockchain: Blockchain + Sized {
     type Config: Debug;
     fn from_config(config: &Self::Config) -> Result<Self, Error>;
 }
Expand description

Trait for Blockchain types that can be created given a configuration

-

Associated Types

Type that contains the configuration

-

Required methods

Create a new instance given a configuration

-

Implementors

- +

Associated Types

Type that contains the configuration

+

Required methods

Create a new instance given a configuration

+

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Progress.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Progress.html index 7e670cad1a..50a4fa1053 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Progress.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/trait.Progress.html @@ -1,10 +1,11 @@ -Progress in bdk::blockchain - Rust

Trait bdk::blockchain::Progress[][src]

pub trait Progress: Send {
+Progress in bdk::blockchain - Rust
+    
logo

Trait bdk::blockchain::Progress[][src]

pub trait Progress: Send {
     fn update(
        &self,
        progress: f32,
        message: Option<String>
    ) -> Result<(), Error>; }
Expand description

Trait for types that can receive and process progress updates during Blockchain::sync and Blockchain::setup

-

Required methods

Send a new progress update

+

Required methods

Send a new progress update

The progress value should be in the range 0.0 - 100.0, and the message value is an optional text message that can be displayed to the user.

-

Implementations on Foreign Types

Implementors

- +

Implementations on Foreign Types

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/type.ProgressData.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/type.ProgressData.html index b00b9f8183..8f66005aa1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/type.ProgressData.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/blockchain/type.ProgressData.html @@ -1,4 +1,5 @@ -ProgressData in bdk::blockchain - Rust

Type Definition bdk::blockchain::ProgressData[][src]

pub type ProgressData = (f32, Option<String>);
Expand description

Data sent with a progress update over a channel

-
- +ProgressData in bdk::blockchain - Rust +
logo

Type Definition bdk::blockchain::ProgressData[][src]

pub type ProgressData = (f32, Option<String>);
Expand description

Data sent with a progress update over a channel

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyBatch.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyBatch.html index b55b849074..3247168e58 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyBatch.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyBatch.html @@ -1,42 +1,44 @@ -AnyBatch in bdk::database::any - Rust

Enum bdk::database::any::AnyBatch[][src]

pub enum AnyBatch {
+AnyBatch in bdk::database::any - Rust
+    
logo

Enum bdk::database::any::AnyBatch[][src]

pub enum AnyBatch {
     Memory(<MemoryDatabase as BatchDatabase>::Batch),
     Sled(<Tree as BatchDatabase>::Batch),
     Sqlite(<SqliteDatabase as BatchDatabase>::Batch),
 }
Expand description

Type that contains any of the BatchDatabase::Batch types defined by the library

-

Variants

In-memory ephemeral database

-

Tuple Fields of Memory

Sled(<Tree as BatchDatabase>::Batch)
This is supported on crate feature key-value-db only.

Simple key-value embedded database based on [sled]

-

Tuple Fields of Sled

0: <Tree as BatchDatabase>::Batch
This is supported on crate feature sqlite only.

Sqlite embedded database using [rusqlite]

-

Tuple Fields of Sqlite

Trait Implementations

Store a script_pubkey along with its keychain and child number.

-

Store a LocalUtxo

-

Store a raw transaction

-

Store the metadata of a transaction

-

Store the last derivation index for a given keychain.

-

Delete a script_pubkey given the keychain and its child number.

-

Delete the data related to a specific script_pubkey, meaning the keychain and the child +

Variants

Memory(<MemoryDatabase as BatchDatabase>::Batch)

Tuple Fields

In-memory ephemeral database

+

Sled(<Tree as BatchDatabase>::Batch)

Tuple Fields

0: <Tree as BatchDatabase>::Batch
This is supported on crate feature key-value-db only.

Simple key-value embedded database based on [sled]

+

Sqlite(<SqliteDatabase as BatchDatabase>::Batch)

Tuple Fields

This is supported on crate feature sqlite only.

Sqlite embedded database using [rusqlite]

+

Trait Implementations

Store a script_pubkey along with its keychain and child number.

+

Store a LocalUtxo

+

Store a raw transaction

+

Store the metadata of a transaction

+

Store the last derivation index for a given keychain.

+

Store the sync time

+

Delete a script_pubkey given the keychain and its child number.

+

Delete the data related to a specific script_pubkey, meaning the keychain and the child number. Read more

-

Delete a LocalUtxo given its [OutPoint]

-

Delete a raw transaction given its [Txid]

-

Delete the metadata of a transaction and optionally the raw transaction itself

-

Delete the last derivation index for a keychain.

+

Delete a LocalUtxo given its [OutPoint]

+

Delete a raw transaction given its [Txid]

+

Delete the metadata of a transaction and optionally the raw transaction itself

+

Delete the last derivation index for a keychain.

+

Reset the sync time to None Read more

Performs the conversion.

Performs the conversion.

Performs the conversion.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabase.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabase.html index d868ceb875..32c9b59ffd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabase.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabase.html @@ -1,63 +1,66 @@ -AnyDatabase in bdk::database::any - Rust

Enum bdk::database::any::AnyDatabase[][src]

pub enum AnyDatabase {
+AnyDatabase in bdk::database::any - Rust
+    
logo

Enum bdk::database::any::AnyDatabase[][src]

pub enum AnyDatabase {
     Memory(MemoryDatabase),
     Sled(Tree),
     Sqlite(SqliteDatabase),
 }
Expand description

Type that can contain any of the Database types defined by the library

It allows switching database type at runtime.

See this module’s documentation for a usage example.

-

Variants

In-memory ephemeral database

-

Tuple Fields of Memory

Sled(Tree)
This is supported on crate feature key-value-db only.

Simple key-value embedded database based on [sled]

-

Tuple Fields of Sled

0: Tree
This is supported on crate feature sqlite only.

Sqlite embedded database using [rusqlite]

-

Tuple Fields of Sqlite

Trait Implementations

Container for the operations

-

Create a new batch container

-

Consume and apply a batch of operations

-

Store a script_pubkey along with its keychain and child number.

+

Variants

Memory(MemoryDatabase)

Tuple Fields

In-memory ephemeral database

+

Sled(Tree)

Tuple Fields

0: Tree
This is supported on crate feature key-value-db only.

Simple key-value embedded database based on [sled]

+

Sqlite(SqliteDatabase)

Tuple Fields

This is supported on crate feature sqlite only.

Sqlite embedded database using [rusqlite]

+

Trait Implementations

Container for the operations

+

Create a new batch container

+

Consume and apply a batch of operations

+

Store a script_pubkey along with its keychain and child number.

Store a LocalUtxo

Store a raw transaction

Store the metadata of a transaction

Store the last derivation index for a given keychain.

-

Delete a script_pubkey given the keychain and its child number.

-

Delete the data related to a specific script_pubkey, meaning the keychain and the child +

Store the sync time

+

Delete a script_pubkey given the keychain and its child number.

+

Delete the data related to a specific script_pubkey, meaning the keychain and the child number. Read more

-

Delete a LocalUtxo given its [OutPoint]

-

Delete a raw transaction given its [Txid]

-

Delete the metadata of a transaction and optionally the raw transaction itself

-

Delete the last derivation index for a keychain.

-

Type that contains the configuration

-

Create a new instance given a configuration

-

Read and checks the descriptor checksum for a given keychain. Read more

-

Return the list of script_pubkeys

-

Return the list of LocalUtxos

-

Return the list of raw transactions

-

Return the list of transactions metadata

-

Fetch a script_pubkey given the child number of a keychain.

-

Fetch the keychain and child number of a given script_pubkey

-

Fetch a LocalUtxo given its [OutPoint]

-

Fetch a raw transaction given its [Txid]

-

Fetch the transaction metadata and optionally also the raw transaction

-

Return the last defivation index for a keychain.

-

Increment the last derivation index for a keychain and return it Read more

-

Force changes to be written to disk

+

Delete a LocalUtxo given its [OutPoint]

+

Delete a raw transaction given its [Txid]

+

Delete the metadata of a transaction and optionally the raw transaction itself

+

Delete the last derivation index for a keychain.

+

Reset the sync time to None Read more

+

Type that contains the configuration

+

Create a new instance given a configuration

+

Read and checks the descriptor checksum for a given keychain. Read more

+

Return the list of script_pubkeys

+

Return the list of LocalUtxos

+

Return the list of raw transactions

+

Return the list of transactions metadata

+

Fetch a script_pubkey given the child number of a keychain.

+

Fetch the keychain and child number of a given script_pubkey

+

Fetch a LocalUtxo given its [OutPoint]

+

Fetch a raw transaction given its [Txid]

+

Fetch the transaction metadata and optionally also the raw transaction

+

Return the last derivation index for a keychain.

+

Return the sync time, if present

+

Increment the last derivation index for a keychain and return it Read more

+

Force changes to be written to disk

Formats the value using the given formatter. Read more

Performs the conversion.

Performs the conversion.

Performs the conversion.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabaseConfig.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabaseConfig.html index d00058c87f..880c502de4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabaseConfig.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/enum.AnyDatabaseConfig.html @@ -1,4 +1,6 @@ -AnyDatabaseConfig in bdk::database::any - Rust

Enum bdk::database::any::AnyDatabaseConfig[][src]

pub enum AnyDatabaseConfig {
+AnyDatabaseConfig in bdk::database::any - Rust
+    
logo

Enum bdk::database::any::AnyDatabaseConfig[][src]

pub enum AnyDatabaseConfig {
     Memory(()),
     Sled(SledDbConfiguration),
     Sqlite(SqliteDbConfiguration),
@@ -6,31 +8,29 @@
 

This allows storing a single configuration that can be loaded into an AnyDatabase instance. Wallets that plan to offer users the ability to switch blockchain backend at runtime will find this particularly useful.

-

Variants

Memory(())

Memory database has no config

-

Tuple Fields of Memory

0: ()
This is supported on crate feature key-value-db only.

Simple key-value embedded database based on [sled]

-

Tuple Fields of Sled

This is supported on crate feature sqlite only.

Sqlite embedded database using [rusqlite]

-

Tuple Fields of Sqlite

Trait Implementations

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Performs the conversion.

-

Performs the conversion.

-

Performs the conversion.

-

Serialize this value into the given Serde serializer. Read more

+

Variants

Memory(())

Tuple Fields

0: ()

Memory database has no config

+

Sled(SledDbConfiguration)

Tuple Fields

This is supported on crate feature key-value-db only.

Simple key-value embedded database based on [sled]

+

Sqlite(SqliteDbConfiguration)

Tuple Fields

This is supported on crate feature sqlite only.

Sqlite embedded database using [rusqlite]

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/index.html index 32a137b083..53cc099585 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/index.html @@ -1,7 +1,9 @@ -bdk::database::any - Rust

Module bdk::database::any[][src]

Expand description

Runtime-checked database types

+bdk::database::any - Rust +
logo

Module bdk::database::any[][src]

Expand description

Runtime-checked database types

This module provides the implementation of AnyDatabase which allows switching the inner Database type at runtime.

-

Example

+

Example

In this example, wallet_memory and wallet_sled have the same type of Wallet<(), AnyDatabase>.

let memory = MemoryDatabase::default();
@@ -15,13 +17,12 @@ database supported using a single line of code:

let config = serde_json::from_str("...")?;
 let database = AnyDatabase::from_config(&config)?;
 let wallet = Wallet::new_offline("...", None, Network::Testnet, database)?;
-

Structs

-

Configuration type for a [sled::Tree] database

-

Configuration type for a sqlite::SqliteDatabase database

-

Enums

-

Type that contains any of the BatchDatabase::Batch types defined by the library

-

Type that can contain any of the Database types defined by the library

-

Type that can contain any of the database configurations defined by the library

-
- +

Structs

+

Configuration type for a [sled::Tree] database

+

Configuration type for a sqlite::SqliteDatabase database

+

Enums

+

Type that contains any of the BatchDatabase::Batch types defined by the library

+

Type that can contain any of the Database types defined by the library

+

Type that can contain any of the database configurations defined by the library

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SledDbConfiguration.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SledDbConfiguration.html index b6e90414ab..0e7da32dbd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SledDbConfiguration.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SledDbConfiguration.html @@ -1,29 +1,29 @@ -SledDbConfiguration in bdk::database::any - Rust

Struct bdk::database::any::SledDbConfiguration[][src]

pub struct SledDbConfiguration {
+SledDbConfiguration in bdk::database::any - Rust
+    
logo

Struct bdk::database::any::SledDbConfiguration[][src]

pub struct SledDbConfiguration {
     pub path: String,
     pub tree_name: String,
 }
Expand description

Configuration type for a [sled::Tree] database

Fields

path: String

Main directory of the db

tree_name: String

Name of the database tree, a separated namespace for the data

-

Trait Implementations

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Performs the conversion.

-

Serialize this value into the given Serde serializer. Read more

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Performs the conversion.

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SqliteDbConfiguration.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SqliteDbConfiguration.html index 9afc907488..6d43c96f9d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SqliteDbConfiguration.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/any/struct.SqliteDbConfiguration.html @@ -1,27 +1,27 @@ -SqliteDbConfiguration in bdk::database::any - Rust

Struct bdk::database::any::SqliteDbConfiguration[][src]

pub struct SqliteDbConfiguration {
+SqliteDbConfiguration in bdk::database::any - Rust
+    
logo

Struct bdk::database::any::SqliteDbConfiguration[][src]

pub struct SqliteDbConfiguration {
     pub path: String,
 }
Expand description

Configuration type for a sqlite::SqliteDatabase database

Fields

path: String

Main directory of the db

-

Trait Implementations

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Performs the conversion.

-

Serialize this value into the given Serde serializer. Read more

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Performs the conversion.

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/index.html index a09050fc73..1648404dd9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/index.html @@ -1,4 +1,6 @@ -bdk::database - Rust

Module bdk::database[][src]

Expand description

Database types

+bdk::database - Rust +
logo

Module bdk::database[][src]

Expand description

Database types

This module provides the implementation of some defaults database types, along with traits that can be implemented externally to let Wallets use customized databases.

It’s important to note that the databases defined here only contains “blockchain-related” data. @@ -7,17 +9,17 @@ keys.

The currently recommended database is [sled], which is a pretty simple key-value embedded database written in Rust. If the key-value-db feature is enabled (which by default is), this library automatically implements all the required traits for [sled::Tree].

-

Re-exports

-
pub use any::AnyDatabase;
pub use any::AnyDatabaseConfig;
pub use memory::MemoryDatabase;

Modules

-

Runtime-checked database types

-

In-memory ephemeral database

-

Structs

-

Sqlite database stored on filesystem

-

Traits

-

Trait for a database that supports batch operations

-

Trait for operations that can be batched

-

Trait for Database types that can be created given a configuration

-

Trait for reading data from a database

-
- +

Re-exports

+
pub use any::AnyDatabase;
pub use any::AnyDatabaseConfig;
pub use memory::MemoryDatabase;

Modules

+

Runtime-checked database types

+

In-memory ephemeral database

+

Structs

+

Sqlite database stored on filesystem

+

Blockchain state at the time of syncing

+

Traits

+

Trait for a database that supports batch operations

+

Trait for operations that can be batched

+

Trait for Database types that can be created given a configuration

+

Trait for reading data from a database

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/index.html index 9a202f2ef4..68e86fae1c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/index.html @@ -1,8 +1,9 @@ -bdk::database::memory - Rust

Module bdk::database::memory[][src]

Expand description

In-memory ephemeral database

+bdk::database::memory - Rust +
logo

Module bdk::database::memory[][src]

Expand description

In-memory ephemeral database

This module defines an in-memory database type called MemoryDatabase that is based on a BTreeMap.

-

Structs

-

In-memory ephemeral database

-
- +

Structs

+

In-memory ephemeral database

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/struct.MemoryDatabase.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/struct.MemoryDatabase.html index afb930e59e..e6afccab41 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/struct.MemoryDatabase.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/memory/struct.MemoryDatabase.html @@ -1,60 +1,63 @@ -MemoryDatabase in bdk::database::memory - Rust

Struct bdk::database::memory::MemoryDatabase[][src]

pub struct MemoryDatabase { /* fields omitted */ }
Expand description

In-memory ephemeral database

+MemoryDatabase in bdk::database::memory - Rust +
logo

Struct bdk::database::memory::MemoryDatabase[][src]

pub struct MemoryDatabase { /* fields omitted */ }
Expand description

In-memory ephemeral database

This database can be used as a temporary storage for wallets that are not kept permanently on a device, or on platforms that don’t provide a filesystem, like wasm32.

Once it’s dropped its content will be lost.

If you are looking for a permanent storage solution, you can try with the default key-value -database called [sled]. See the database module documentation for more defailts.

-

Implementations

Create a new empty database

-

Trait Implementations

Container for the operations

-

Create a new batch container

-

Consume and apply a batch of operations

-

Store a script_pubkey along with its keychain and child number.

-

Store a LocalUtxo

-

Store a raw transaction

-

Store the metadata of a transaction

-

Store the last derivation index for a given keychain.

-

Delete a script_pubkey given the keychain and its child number.

-

Delete the data related to a specific script_pubkey, meaning the keychain and the child +database called [sled]. See the database module documentation for more details.

+

Implementations

Create a new empty database

+

Trait Implementations

Container for the operations

+

Create a new batch container

+

Consume and apply a batch of operations

+

Store a script_pubkey along with its keychain and child number.

+

Store a LocalUtxo

+

Store a raw transaction

+

Store the metadata of a transaction

+

Store the last derivation index for a given keychain.

+

Store the sync time

+

Delete a script_pubkey given the keychain and its child number.

+

Delete the data related to a specific script_pubkey, meaning the keychain and the child number. Read more

-

Delete a LocalUtxo given its [OutPoint]

-

Delete a raw transaction given its [Txid]

-

Delete the metadata of a transaction and optionally the raw transaction itself

-

Delete the last derivation index for a keychain.

-

Type that contains the configuration

-

Create a new instance given a configuration

-

Read and checks the descriptor checksum for a given keychain. Read more

-

Return the list of script_pubkeys

-

Return the list of LocalUtxos

-

Return the list of raw transactions

-

Return the list of transactions metadata

-

Fetch a script_pubkey given the child number of a keychain.

-

Fetch the keychain and child number of a given script_pubkey

-

Fetch a LocalUtxo given its [OutPoint]

-

Fetch a raw transaction given its [Txid]

-

Fetch the transaction metadata and optionally also the raw transaction

-

Return the last defivation index for a keychain.

-

Increment the last derivation index for a keychain and return it Read more

-

Force changes to be written to disk

-

Formats the value using the given formatter. Read more

-

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

+

Delete a LocalUtxo given its [OutPoint]

+

Delete a raw transaction given its [Txid]

+

Delete the metadata of a transaction and optionally the raw transaction itself

+

Delete the last derivation index for a keychain.

+

Reset the sync time to None Read more

+

Type that contains the configuration

+

Create a new instance given a configuration

+

Read and checks the descriptor checksum for a given keychain. Read more

+

Return the list of script_pubkeys

+

Return the list of LocalUtxos

+

Return the list of raw transactions

+

Return the list of transactions metadata

+

Fetch a script_pubkey given the child number of a keychain.

+

Fetch the keychain and child number of a given script_pubkey

+

Fetch a LocalUtxo given its [OutPoint]

+

Fetch a raw transaction given its [Txid]

+

Fetch the transaction metadata and optionally also the raw transaction

+

Return the last derivation index for a keychain.

+

Return the sync time, if present

+

Increment the last derivation index for a keychain and return it Read more

+

Force changes to be written to disk

+

Formats the value using the given formatter. Read more

+

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

Performs the conversion.

Performs the conversion.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/sidebar-items.js index 3856fe121b..22babbc454 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"mod":[["any","Runtime-checked database types"],["memory","In-memory ephemeral database"]],"struct":[["SqliteDatabase","Sqlite database stored on filesystem"]],"trait":[["BatchDatabase","Trait for a database that supports batch operations"],["BatchOperations","Trait for operations that can be batched"],["ConfigurableDatabase","Trait for [`Database`] types that can be created given a configuration"],["Database","Trait for reading data from a database"]]}); \ No newline at end of file +initSidebarItems({"mod":[["any","Runtime-checked database types"],["memory","In-memory ephemeral database"]],"struct":[["SqliteDatabase","Sqlite database stored on filesystem"],["SyncTime","Blockchain state at the time of syncing"]],"trait":[["BatchDatabase","Trait for a database that supports batch operations"],["BatchOperations","Trait for operations that can be batched"],["ConfigurableDatabase","Trait for [`Database`] types that can be created given a configuration"],["Database","Trait for reading data from a database"]]}); \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SqliteDatabase.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SqliteDatabase.html index fc14591c39..d82302136c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SqliteDatabase.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SqliteDatabase.html @@ -1,4 +1,6 @@ -SqliteDatabase in bdk::database - Rust

Struct bdk::database::SqliteDatabase[][src]

pub struct SqliteDatabase {
+SqliteDatabase in bdk::database - Rust
+    
logo

Struct bdk::database::SqliteDatabase[][src]

pub struct SqliteDatabase {
     pub path: String,
     pub connection: Connection,
 }
Expand description

Sqlite database stored on filesystem

@@ -6,57 +8,58 @@ crate::database

Fields

path: String

Path on the local filesystem to store the sqlite file

connection: Connection

A rusqlite connection object to the sqlite database

-

Implementations

Instantiate a new SqliteDatabase instance by creating a connection +

Implementations

Instantiate a new SqliteDatabase instance by creating a connection to the database stored at path

-

Trait Implementations

Container for the operations

-

Create a new batch container

-

Consume and apply a batch of operations

-

Store a script_pubkey along with its keychain and child number.

-

Store a LocalUtxo

-

Store a raw transaction

-

Store the metadata of a transaction

-

Store the last derivation index for a given keychain.

-

Delete a script_pubkey given the keychain and its child number.

-

Delete the data related to a specific script_pubkey, meaning the keychain and the child +

Trait Implementations

Container for the operations

+

Create a new batch container

+

Consume and apply a batch of operations

+

Store a script_pubkey along with its keychain and child number.

+

Store a LocalUtxo

+

Store a raw transaction

+

Store the metadata of a transaction

+

Store the last derivation index for a given keychain.

+

Store the sync time

+

Delete a script_pubkey given the keychain and its child number.

+

Delete the data related to a specific script_pubkey, meaning the keychain and the child number. Read more

-

Delete a LocalUtxo given its [OutPoint]

-

Delete a raw transaction given its [Txid]

-

Delete the metadata of a transaction and optionally the raw transaction itself

-

Delete the last derivation index for a keychain.

-

Type that contains the configuration

-

Create a new instance given a configuration

-

Read and checks the descriptor checksum for a given keychain. Read more

-

Return the list of script_pubkeys

-

Return the list of LocalUtxos

-

Return the list of raw transactions

-

Return the list of transactions metadata

-

Fetch a script_pubkey given the child number of a keychain.

-

Fetch the keychain and child number of a given script_pubkey

-

Fetch a LocalUtxo given its [OutPoint]

-

Fetch a raw transaction given its [Txid]

-

Fetch the transaction metadata and optionally also the raw transaction

-

Return the last defivation index for a keychain.

-

Increment the last derivation index for a keychain and return it Read more

-

Force changes to be written to disk

-

Formats the value using the given formatter. Read more

+

Delete a LocalUtxo given its [OutPoint]

+

Delete a raw transaction given its [Txid]

+

Delete the metadata of a transaction and optionally the raw transaction itself

+

Delete the last derivation index for a keychain.

+

Reset the sync time to None Read more

+

Type that contains the configuration

+

Create a new instance given a configuration

+

Read and checks the descriptor checksum for a given keychain. Read more

+

Return the list of script_pubkeys

+

Return the list of LocalUtxos

+

Return the list of raw transactions

+

Return the list of transactions metadata

+

Fetch a script_pubkey given the child number of a keychain.

+

Fetch the keychain and child number of a given script_pubkey

+

Fetch a LocalUtxo given its [OutPoint]

+

Fetch a raw transaction given its [Txid]

+

Fetch the transaction metadata and optionally also the raw transaction

+

Return the last derivation index for a keychain.

+

Return the sync time, if present

+

Increment the last derivation index for a keychain and return it Read more

+

Force changes to be written to disk

+

Formats the value using the given formatter. Read more

Performs the conversion.

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SyncTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SyncTime.html new file mode 100644 index 0000000000..82578863bd --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/struct.SyncTime.html @@ -0,0 +1,32 @@ +SyncTime in bdk::database - Rust +
logo

Struct bdk::database::SyncTime[][src]

pub struct SyncTime {
+    pub block_time: BlockTime,
+}
Expand description

Blockchain state at the time of syncing

+

Contains only the block time and height at the moment

+

Fields

block_time: BlockTime

Block timestamp and height at the time of sync

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

+

The alignment of pointer.

+

The type for initializers.

+

Initializes a with the given initializer. Read more

+

Dereferences the given pointer. Read more

+

Mutably dereferences the given pointer. Read more

+

Drops the object pointed to by the given pointer. Read more

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
+ \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchDatabase.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchDatabase.html index acbea968b7..fb0edd2dad 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchDatabase.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchDatabase.html @@ -1,12 +1,13 @@ -BatchDatabase in bdk::database - Rust

Trait bdk::database::BatchDatabase[][src]

pub trait BatchDatabase: Database {
+BatchDatabase in bdk::database - Rust
+    
logo

Trait bdk::database::BatchDatabase[][src]

pub trait BatchDatabase: Database {
     type Batch: BatchOperations;
     fn begin_batch(&self) -> Self::Batch;
 
fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error>; }
Expand description

Trait for a database that supports batch operations

This trait defines the methods to start and apply a batch of operations.

-

Associated Types

Container for the operations

-

Required methods

Create a new batch container

-

Consume and apply a batch of operations

-

Implementations on Foreign Types

Implementors

- +

Associated Types

Container for the operations

+

Required methods

Create a new batch container

+

Consume and apply a batch of operations

+

Implementations on Foreign Types

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchOperations.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchOperations.html index cc5faecac2..dfaf3d4469 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchOperations.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.BatchOperations.html @@ -1,30 +1,36 @@ -BatchOperations in bdk::database - Rust

Trait bdk::database::BatchOperations[][src]

pub trait BatchOperations {
-    fn set_script_pubkey(
        &mut self,
        script: &Script,
        keychain: KeychainKind,
        child: u32
    ) -> Result<(), Error>; +BatchOperations in bdk::database - Rust +
logo

Trait bdk::database::BatchOperations[][src]

pub trait BatchOperations {
+
Show 13 methods fn set_script_pubkey(
        &mut self,
        script: &Script,
        keychain: KeychainKind,
        child: u32
    ) -> Result<(), Error>;
fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error>;
fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error>;
fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error>;
fn set_last_index(
        &mut self,
        keychain: KeychainKind,
        value: u32
    ) -> Result<(), Error>; +
fn set_sync_time(&mut self, sync_time: SyncTime) -> Result<(), Error>;
fn del_script_pubkey_from_path(
        &mut self,
        keychain: KeychainKind,
        child: u32
    ) -> Result<Option<Script>, Error>;
fn del_path_from_script_pubkey(
        &mut self,
        script: &Script
    ) -> Result<Option<(KeychainKind, u32)>, Error>;
fn del_utxo(
        &mut self,
        outpoint: &OutPoint
    ) -> Result<Option<LocalUtxo>, Error>;
fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error>;
fn del_tx(
        &mut self,
        txid: &Txid,
        include_raw: bool
    ) -> Result<Option<TransactionDetails>, Error>;
fn del_last_index(
        &mut self,
        keychain: KeychainKind
    ) -> Result<Option<u32>, Error>; -}
Expand description

Trait for operations that can be batched

+
fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error>; +
}
Expand description

Trait for operations that can be batched

This trait defines the list of operations that must be implemented on the Database type and the BatchDatabase::Batch type.

-

Required methods

Store a script_pubkey along with its keychain and child number.

-

Store a LocalUtxo

-

Store a raw transaction

-

Store the metadata of a transaction

-

Store the last derivation index for a given keychain.

-

Delete a script_pubkey given the keychain and its child number.

-

Delete the data related to a specific script_pubkey, meaning the keychain and the child +

Required methods

Store a script_pubkey along with its keychain and child number.

+

Store a LocalUtxo

+

Store a raw transaction

+

Store the metadata of a transaction

+

Store the last derivation index for a given keychain.

+

Store the sync time

+

Delete a script_pubkey given the keychain and its child number.

+

Delete the data related to a specific script_pubkey, meaning the keychain and the child number.

-

Delete a LocalUtxo given its [OutPoint]

-

Delete a raw transaction given its [Txid]

-

Delete the metadata of a transaction and optionally the raw transaction itself

-

Delete the last derivation index for a keychain.

-

Implementations on Foreign Types

Implementors

- +

Delete a LocalUtxo given its [OutPoint]

+

Delete a raw transaction given its [Txid]

+

Delete the metadata of a transaction and optionally the raw transaction itself

+

Delete the last derivation index for a keychain.

+

Reset the sync time to None

+

Returns the removed value

+

Implementations on Foreign Types

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.ConfigurableDatabase.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.ConfigurableDatabase.html index 230a6c5ae1..9cd3723111 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.ConfigurableDatabase.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.ConfigurableDatabase.html @@ -1,9 +1,10 @@ -ConfigurableDatabase in bdk::database - Rust

Trait bdk::database::ConfigurableDatabase[][src]

pub trait ConfigurableDatabase: Database + Sized {
+ConfigurableDatabase in bdk::database - Rust
+    
logo

Trait bdk::database::ConfigurableDatabase[][src]

pub trait ConfigurableDatabase: Database + Sized {
     type Config: Debug;
     fn from_config(config: &Self::Config) -> Result<Self, Error>;
 }
Expand description

Trait for Database types that can be created given a configuration

-

Associated Types

Type that contains the configuration

-

Required methods

Create a new instance given a configuration

-

Implementations on Foreign Types

Implementors

- +

Associated Types

Type that contains the configuration

+

Required methods

Create a new instance given a configuration

+

Implementations on Foreign Types

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.Database.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.Database.html index e58fa2d43c..0643e50bc4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.Database.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/database/trait.Database.html @@ -1,5 +1,7 @@ -Database in bdk::database - Rust

Trait bdk::database::Database[][src]

pub trait Database: BatchOperations {
-
Show 13 methods fn check_descriptor_checksum<B: AsRef<[u8]>>(
        &mut self,
        keychain: KeychainKind,
        bytes: B
    ) -> Result<(), Error>; +Database in bdk::database - Rust +
logo

Trait bdk::database::Database[][src]

pub trait Database: BatchOperations {
+
Show 14 methods fn check_descriptor_checksum<B: AsRef<[u8]>>(
        &mut self,
        keychain: KeychainKind,
        bytes: B
    ) -> Result<(), Error>;
fn iter_script_pubkeys(
        &self,
        keychain: Option<KeychainKind>
    ) -> Result<Vec<Script>, Error>;
fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error>;
fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error>; @@ -10,27 +12,28 @@
fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error>;
fn get_tx(
        &self,
        txid: &Txid,
        include_raw: bool
    ) -> Result<Option<TransactionDetails>, Error>;
fn get_last_index(
        &self,
        keychain: KeychainKind
    ) -> Result<Option<u32>, Error>; +
fn get_sync_time(&self) -> Result<Option<SyncTime>, Error>;
fn increment_last_index(
        &mut self,
        keychain: KeychainKind
    ) -> Result<u32, Error>;
fn flush(&mut self) -> Result<(), Error>;
}
Expand description

Trait for reading data from a database

This traits defines the operations that can be used to read data out of a database

-

Required methods

Read and checks the descriptor checksum for a given keychain.

+

Required methods

Read and checks the descriptor checksum for a given keychain.

Should return Error::ChecksumMismatch if the checksum doesn’t match. If there’s no checksum in the database, simply store it for the next time.

-

Return the list of script_pubkeys

-

Return the list of LocalUtxos

-

Return the list of raw transactions

-

Return the list of transactions metadata

-

Fetch a script_pubkey given the child number of a keychain.

-

Fetch the keychain and child number of a given script_pubkey

-

Fetch a LocalUtxo given its [OutPoint]

-

Fetch a raw transaction given its [Txid]

-

Fetch the transaction metadata and optionally also the raw transaction

-

Return the last defivation index for a keychain.

-

Increment the last derivation index for a keychain and return it

+

Return the list of script_pubkeys

+

Return the list of LocalUtxos

+

Return the list of raw transactions

+

Return the list of transactions metadata

+

Fetch a script_pubkey given the child number of a keychain.

+

Fetch the keychain and child number of a given script_pubkey

+

Fetch a LocalUtxo given its [OutPoint]

+

Fetch a raw transaction given its [Txid]

+

Fetch the transaction metadata and optionally also the raw transaction

+

Return the last derivation index for a keychain.

+

Return the sync time, if present

+

Increment the last derivation index for a keychain and return it

It should insert and return 0 if not present in the database

-

Force changes to be written to disk

-

Implementations on Foreign Types

Implementors

- +

Force changes to be written to disk

+

Implementations on Foreign Types

Implementors

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/fn.get_checksum.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/fn.get_checksum.html index 55ce0b83b6..53ce870102 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/fn.get_checksum.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/fn.get_checksum.html @@ -1,4 +1,5 @@ -get_checksum in bdk::descriptor::checksum - Rust

Function bdk::descriptor::checksum::get_checksum[][src]

pub fn get_checksum(desc: &str) -> Result<String, DescriptorError>
Expand description

Compute the checksum of a descriptor

-
- +get_checksum in bdk::descriptor::checksum - Rust +
logo

Function bdk::descriptor::checksum::get_checksum[][src]

pub fn get_checksum(desc: &str) -> Result<String, DescriptorError>
Expand description

Compute the checksum of a descriptor

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/index.html index 019adf3d57..b6dcece558 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/checksum/index.html @@ -1,8 +1,9 @@ -bdk::descriptor::checksum - Rust

Module bdk::descriptor::checksum[][src]

Expand description

Descriptor checksum

+bdk::descriptor::checksum - Rust +
logo

Module bdk::descriptor::checksum[][src]

Expand description

Descriptor checksum

This module contains a re-implementation of the function used by Bitcoin Core to calculate the checksum of a descriptor

-

Functions

-

Compute the checksum of a descriptor

-
- +

Functions

+

Compute the checksum of a descriptor

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html index 7bdf70a2ad..106c5dbaab 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html @@ -1,16 +1,18 @@ -Descriptor in bdk::descriptor - Rust

Enum bdk::descriptor::Descriptor[]

pub enum Descriptor<Pk> where
    Pk: MiniscriptKey, 
{ +Descriptor in bdk::descriptor - Rust +
logo

Enum bdk::descriptor::Descriptor[]

pub enum Descriptor<Pk> where
    Pk: MiniscriptKey, 
{ Bare(Bare<Pk>), Pkh(Pkh<Pk>), Wpkh(Wpkh<Pk>), Sh(Sh<Pk>), Wsh(Wsh<Pk>), }
Expand description

Script descriptor

-

Variants

Bare(Bare<Pk>)

A raw scriptpubkey (including pay-to-pubkey) under Legacy context

-

Tuple Fields of Bare

0: Bare<Pk>
Pkh(Pkh<Pk>)

Pay-to-PubKey-Hash

-

Tuple Fields of Pkh

0: Pkh<Pk>
Wpkh(Wpkh<Pk>)

Pay-to-Witness-PubKey-Hash

-

Tuple Fields of Wpkh

0: Wpkh<Pk>
Sh(Sh<Pk>)

Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)

-

Tuple Fields of Sh

0: Sh<Pk>
Wsh(Wsh<Pk>)

Pay-to-Witness-ScriptHash with Segwitv0 context

-

Tuple Fields of Wsh

0: Wsh<Pk>

Implementations

Create a new pk descriptor

+

Variants

Bare(Bare<Pk>)

Tuple Fields

0: Bare<Pk>

A raw scriptpubkey (including pay-to-pubkey) under Legacy context

+

Pkh(Pkh<Pk>)

Tuple Fields

0: Pkh<Pk>

Pay-to-PubKey-Hash

+

Wpkh(Wpkh<Pk>)

Tuple Fields

0: Wpkh<Pk>

Pay-to-Witness-PubKey-Hash

+

Sh(Sh<Pk>)

Tuple Fields

0: Sh<Pk>

Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)

+

Wsh(Wsh<Pk>)

Tuple Fields

0: Wsh<Pk>

Pay-to-Witness-ScriptHash with Segwitv0 context

+

Implementations

Create a new pk descriptor

Create a new PkH descriptor

Create a new Wpkh descriptor Will return Err if uncompressed key is used

@@ -45,8 +47,8 @@ Errors when miniscript exceeds resource limits under p2sh context

a descriptor that only contains public keys and a map to lookup the secret key given a public key.

Serialize a descriptor to string with its secret keys

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

Whether the descriptor is safe Checks whether all the spend paths in the descriptor are possible on the bitcoin network under the current standardness and consensus rules @@ -81,8 +83,8 @@ sighash when evaluating a CHECKSIG & co. OP code.

Attempts to produce a satisfying witness and scriptSig to spend an output controlled by the given descriptor; add the data to a given TxIn output. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

Extract the spending policy

Run a predicate on every key in the descriptor, returning whether the predicate returned true for every key Read more

@@ -92,62 +94,59 @@ the predicate returned true for any key Read more<

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

Parse an expression tree into a descriptor

Feeds this value into the given Hasher. Read more

-

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

+

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

Convert the object into an abstract policy

This method returns an Ordering between self and other. Read more

-

Compares and returns the maximum of two values. Read more

-

Compares and returns the minimum of two values. Read more

-

Restrict a value to a certain interval. Read more

+

Compares and returns the maximum of two values. Read more

+

Compares and returns the minimum of two values. Read more

+

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

-

This method tests less than (for self and other) and is used by the < operator. Read more

-

This method tests less than or equal to (for self and other) and is used by the <= +

This method tests less than (for self and other) and is used by the < operator. Read more

+

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

-

This method tests greater than (for self and other) and is used by the > operator. Read more

-

This method tests greater than or equal to (for self and other) and is used by the >= +

This method tests greater than (for self and other) and is used by the > operator. Read more

+

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

-

Serialize this value into the given Serde serializer. Read more

-

Convert a descriptor using abstract keys to one using specific keys +

Serialize this value into the given Serde serializer. Read more

+

Convert a descriptor using abstract keys to one using specific keys This will panic if translatefpk returns an uncompressed key when converting to a Segwit descriptor. To prevent this panic, ensure translatefpk returns an error in this case instead.

The associated output type. This must be Self

Calls translate_pk with conversion functions that cannot fail

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

Converts the given value to a String. Read more

-

Translate a struct from one generic to another where the +

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

Converts the given value to a String. Read more

+

Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

-

Translate a struct from one generic to another where the +

Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

-

Translate a struct from one generic to another where the +

Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Legacy.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Legacy.html index 839a91fcf1..8ae265e0dc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Legacy.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Legacy.html @@ -1,27 +1,29 @@ -Legacy in bdk::descriptor - Rust

Enum bdk::descriptor::Legacy[]

pub enum Legacy {}
Expand description

Legacy ScriptContext +Legacy in bdk::descriptor - Rust +

logo

Enum bdk::descriptor::Legacy[]

pub enum Legacy {}
Expand description

Legacy ScriptContext To be used as P2SH scripts For creation of Bare scriptpubkeys, construct the Miniscript under Bare ScriptContext

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Feeds this value into the given Hasher. Read more

-

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

+

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

This method returns an Ordering between self and other. Read more

-

Compares and returns the maximum of two values. Read more

-

Compares and returns the minimum of two values. Read more

-

Restrict a value to a certain interval. Read more

+

Compares and returns the maximum of two values. Read more

+

Compares and returns the minimum of two values. Read more

+

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

+

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

-

This method tests less than (for self and other) and is used by the < operator. Read more

-

This method tests less than or equal to (for self and other) and is used by the <= +

This method tests less than (for self and other) and is used by the < operator. Read more

+

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

-

This method tests greater than (for self and other) and is used by the > operator. Read more

-

This method tests greater than or equal to (for self and other) and is used by the >= +

This method tests greater than (for self and other) and is used by the > operator. Read more

+

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

-

Depending on ScriptContext, fragments can be malleable. For Example, +

Depending on ScriptContext, fragments can be malleable. For Example, under Legacy context, PkH is malleable because it is possible to estimate the cost of satisfaction because of compressed keys This is currently only used in compiler code for removing malleable @@ -29,10 +31,10 @@ compilations. This does NOT recursively check if the children of the fragment are valid or not. Since the compilation proceeds in a leaf to root fashion, a recursive check is unnecessary. Read more

-

Check whether the given satisfaction is valid under the ScriptContext +

Check whether the given satisfaction is valid under the ScriptContext For example, segwit satisfactions may fail if the witness len is more 3600 or number of stack elements are more than 100. Read more

-

Depending on script Context, some of the Terminals might not +

Depending on script Context, some of the Terminals might not be valid under the current consensus rules. Or some of the script resource limits may have been exceeded. These miniscripts would never be accepted by the Bitcoin network and hence @@ -42,17 +44,17 @@ uncompressed public keys are non-standard and thus invalid. In LegacyP2SH context, scripts above 520 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments. Read more

-

Consensus rules at the Miniscript satisfaction time. +

Consensus rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path(Legacy/Segwitv0) may require more than 201 opcodes. Read more

-

Policy rules at the Miniscript satisfaction time. +

Policy rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path in Legacy context scriptSig more than 1650 bytes Read more

-

Depending on script context, the size of a satifaction witness may slightly differ.

-

Depending on script Context, some of the script resource limits +

Depending on script context, the size of a satifaction witness may slightly differ.

+

Depending on script Context, some of the script resource limits may have been exceeded under the current bitcoin core policy rules These miniscripts would never be accepted by the Bitcoin network and hence it is safe to discard them. (unless explicitly disabled by non-standard flag) @@ -60,36 +62,33 @@ For example, in Segwit Context with MiniscriptKey as bitcoin::PublicKey scripts over 3600 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments. Read more

-

Check the consensus + policy(if not disabled) rules that are not based +

Check the consensus + policy(if not disabled) rules that are not based satisfaction Read more

-

Check the consensus + policy(if not disabled) rules including the +

Check the consensus + policy(if not disabled) rules including the ones for satisfaction Read more

-

Check whether the top-level is type B

-

Other top level checks that are context specific

-

Check top level consensus rules.

+

Check whether the top-level is type B

+

Other top level checks that are context specific

+

Check top level consensus rules.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns whether the script context is Legacy

Returns whether the script context is Segwitv0

-

Performs the conversion.

-

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Segwitv0.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Segwitv0.html index 11e3d518c9..2123d28f6c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Segwitv0.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Segwitv0.html @@ -1,24 +1,26 @@ -Segwitv0 in bdk::descriptor - Rust

Enum bdk::descriptor::Segwitv0[]

pub enum Segwitv0 {}
Expand description

Segwitv0 ScriptContext

+Segwitv0 in bdk::descriptor - Rust +
logo

Enum bdk::descriptor::Segwitv0[]

pub enum Segwitv0 {}
Expand description

Segwitv0 ScriptContext

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Feeds this value into the given Hasher. Read more

-

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

+

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

This method returns an Ordering between self and other. Read more

-

Compares and returns the maximum of two values. Read more

-

Compares and returns the minimum of two values. Read more

-

Restrict a value to a certain interval. Read more

+

Compares and returns the maximum of two values. Read more

+

Compares and returns the minimum of two values. Read more

+

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

+

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

-

This method tests less than (for self and other) and is used by the < operator. Read more

-

This method tests less than or equal to (for self and other) and is used by the <= +

This method tests less than (for self and other) and is used by the < operator. Read more

+

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

-

This method tests greater than (for self and other) and is used by the > operator. Read more

-

This method tests greater than or equal to (for self and other) and is used by the >= +

This method tests greater than (for self and other) and is used by the > operator. Read more

+

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

-

Depending on ScriptContext, fragments can be malleable. For Example, +

Depending on ScriptContext, fragments can be malleable. For Example, under Legacy context, PkH is malleable because it is possible to estimate the cost of satisfaction because of compressed keys This is currently only used in compiler code for removing malleable @@ -26,10 +28,10 @@ compilations. This does NOT recursively check if the children of the fragment are valid or not. Since the compilation proceeds in a leaf to root fashion, a recursive check is unnecessary. Read more

-

Check whether the given satisfaction is valid under the ScriptContext +

Check whether the given satisfaction is valid under the ScriptContext For example, segwit satisfactions may fail if the witness len is more 3600 or number of stack elements are more than 100. Read more

-

Depending on script Context, some of the Terminals might not +

Depending on script Context, some of the Terminals might not be valid under the current consensus rules. Or some of the script resource limits may have been exceeded. These miniscripts would never be accepted by the Bitcoin network and hence @@ -39,11 +41,11 @@ uncompressed public keys are non-standard and thus invalid. In LegacyP2SH context, scripts above 520 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments. Read more

-

Consensus rules at the Miniscript satisfaction time. +

Consensus rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path(Legacy/Segwitv0) may require more than 201 opcodes. Read more

-

Depending on script Context, some of the script resource limits +

Depending on script Context, some of the script resource limits may have been exceeded under the current bitcoin core policy rules These miniscripts would never be accepted by the Bitcoin network and hence it is safe to discard them. (unless explicitly disabled by non-standard flag) @@ -51,42 +53,39 @@ For example, in Segwit Context with MiniscriptKey as bitcoin::PublicKey scripts over 3600 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments. Read more

-

Policy rules at the Miniscript satisfaction time. +

Policy rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path in Legacy context scriptSig more than 1650 bytes Read more

-

Depending on script context, the size of a satifaction witness may slightly differ.

-

Check the consensus + policy(if not disabled) rules that are not based +

Depending on script context, the size of a satifaction witness may slightly differ.

+

Check the consensus + policy(if not disabled) rules that are not based satisfaction Read more

-

Check the consensus + policy(if not disabled) rules including the +

Check the consensus + policy(if not disabled) rules including the ones for satisfaction Read more

-

Check whether the top-level is type B

-

Other top level checks that are context specific

-

Check top level consensus rules.

+

Check whether the top-level is type B

+

Other top level checks that are context specific

+

Check top level consensus rules.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns whether the script context is Legacy

Returns whether the script context is Segwitv0

-

Performs the conversion.

-

Performs the conversion.

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/enum.Error.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/enum.Error.html index ec4d949d3a..0e628f1d0f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/enum.Error.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/enum.Error.html @@ -1,4 +1,6 @@ -Error in bdk::descriptor::error - Rust

Enum bdk::descriptor::error::Error[][src]

pub enum Error {
+Error in bdk::descriptor::error - Rust
+    
logo

Enum bdk::descriptor::error::Error[][src]

pub enum Error {
     InvalidHdKeyPath,
     InvalidDescriptorChecksum,
     HardenedDerivationXpub,
@@ -12,19 +14,19 @@
     Miniscript(Error),
     Hex(Error),
 }
Expand description

Errors related to the parsing and usage of descriptors

-

Variants

InvalidHdKeyPath

Invalid HD Key path, such as having a wildcard but a length != 1

-
InvalidDescriptorChecksum

The provided descriptor doesn’t match its checksum

-
HardenedDerivationXpub

The descriptor contains hardened derivation steps on public extended keys

-
DuplicatedKeys

The descriptor contains multiple keys with the same BIP32 fingerprint

-

Error thrown while working with keys

-

Tuple Fields of Key

Policy(PolicyError)

Error while extracting and manipulating policies

-

Tuple Fields of Policy

InvalidDescriptorCharacter(char)

Invalid character found in the descriptor checksum

-

Tuple Fields of InvalidDescriptorCharacter

0: char
Bip32(Error)

BIP32 error

-

Tuple Fields of Bip32

0: Error
Base58(Error)

Error during base58 decoding

-

Tuple Fields of Base58

0: Error
Pk(Error)

Key-related error

-

Tuple Fields of Pk

0: Error
Miniscript(Error)

Miniscript error

-

Tuple Fields of Miniscript

0: Error
Hex(Error)

Hex decoding error

-

Tuple Fields of Hex

0: Error

Trait Implementations

Formats the value using the given formatter. Read more

+

Variants

InvalidHdKeyPath

Invalid HD Key path, such as having a wildcard but a length != 1

+

InvalidDescriptorChecksum

The provided descriptor doesn’t match its checksum

+

HardenedDerivationXpub

The descriptor contains hardened derivation steps on public extended keys

+

DuplicatedKeys

The descriptor contains multiple keys with the same BIP32 fingerprint

+

Key(KeyError)

Tuple Fields

Error thrown while working with keys

+

Policy(PolicyError)

Tuple Fields

Error while extracting and manipulating policies

+

InvalidDescriptorCharacter(char)

Tuple Fields

0: char

Invalid character found in the descriptor checksum

+

Bip32(Error)

Tuple Fields

0: Error

BIP32 error

+

Base58(Error)

Tuple Fields

0: Error

Error during base58 decoding

+

Pk(Error)

Tuple Fields

0: Error

Key-related error

+

Miniscript(Error)

Tuple Fields

0: Error

Miniscript error

+

Hex(Error)

Tuple Fields

0: Error

Hex decoding error

+

Trait Implementations

Formats the value using the given formatter. Read more

Formats the value using the given formatter. Read more

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

🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

@@ -39,31 +41,20 @@

Performs the conversion.

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Converts a reference to Self into a dynamic trait object of Fail.

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the “name” of the error. Read more

-

Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

-

Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

-

Provides context for this failure. Read more

-

Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

Converts the given value to a String. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/index.html index 932150123c..8b06a6198f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/error/index.html @@ -1,6 +1,7 @@ -bdk::descriptor::error - Rust

Module bdk::descriptor::error[][src]

Expand description

Descriptor errors

-

Enums

-

Errors related to the parsing and usage of descriptors

-
- +bdk::descriptor::error - Rust +
logo

Module bdk::descriptor::error[][src]

Expand description

Descriptor errors

+

Enums

+

Errors related to the parsing and usage of descriptors

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/index.html index 4c2d3b96f0..8de8347b46 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/index.html @@ -1,35 +1,36 @@ -bdk::descriptor - Rust

Module bdk::descriptor[][src]

Expand description

Descriptors

+bdk::descriptor - Rust +
logo

Module bdk::descriptor[][src]

Expand description

Descriptors

This module contains generic utilities to work with descriptors, plus some re-exported types from [miniscript].

-

Re-exports

-
pub use self::checksum::get_checksum;
pub use self::error::Error as DescriptorError;
pub use self::policy::Policy;

Modules

-

Descriptor checksum

-

Descriptor errors

-

Descriptor policy

-

Descriptor templates

-

Structs

-

Extended DescriptorPublicKey that has been derived

-

Top-level script AST type

-

Enums

-

Script descriptor

-

Legacy ScriptContext +

Re-exports

+
pub use self::checksum::get_checksum;
pub use self::error::Error as DescriptorError;
pub use self::policy::Policy;

Modules

+

Descriptor checksum

+

Descriptor errors

+

Descriptor policy

+

Descriptor templates

+

Structs

+

Extended DescriptorPublicKey that has been derived

+

Top-level script AST type

+

Enums

+

Script descriptor

+

Legacy ScriptContext To be used as P2SH scripts For creation of Bare scriptpubkeys, construct the Miniscript under Bare ScriptContext

-

Segwitv0 ScriptContext

-

Traits

-

Trait implemented on Descriptors to add a method to extract the spending policy

-

Trait for types which can be converted into an ExtendedDescriptor and a KeyMap usable by a wallet in a specific [Network]

-

The ScriptContext for Miniscript. Additional type information associated with +

Segwitv0 ScriptContext

+

Traits

+

Trait implemented on Descriptors to add a method to extract the spending policy

+

Trait for types which can be converted into an ExtendedDescriptor and a KeyMap usable by a wallet in a specific [Network]

+

The ScriptContext for Miniscript. Additional type information associated with miniscript that is used for carrying out checks that dependent on the context under which the script is used. For example, disallowing uncompressed keys in Segwit context

-

Type Definitions

-

Alias for a Descriptor that contains extended derived keys

-

Alias for a Descriptor that can contain extended keys using DescriptorPublicKey

-

Alias for the type of maps that represent derivation paths in a psbt::Input or +

Type Definitions

+

Alias for a Descriptor that contains extended derived keys

+

Alias for a Descriptor that can contain extended keys using DescriptorPublicKey

+

Alias for the type of maps that represent derivation paths in a psbt::Input or psbt::Output

-

Alias type for a map of public key to secret key

-
- +

Alias type for a map of public key to secret key

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.BuildSatisfaction.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.BuildSatisfaction.html index fd9eddbd4f..5e92d09071 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.BuildSatisfaction.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.BuildSatisfaction.html @@ -1,4 +1,6 @@ -BuildSatisfaction in bdk::descriptor::policy - Rust

Enum bdk::descriptor::policy::BuildSatisfaction[][src]

pub enum BuildSatisfaction<'a> {
+BuildSatisfaction in bdk::descriptor::policy - Rust
+    
logo

Enum bdk::descriptor::policy::BuildSatisfaction[][src]

pub enum BuildSatisfaction<'a> {
     None,
     Psbt(&'a Psbt),
     PsbtTimelocks {
@@ -7,36 +9,33 @@
         input_max_height: u32,
     },
 }
Expand description

Options to build the satisfaction field in the policy

-

Variants

None

Don’t generate satisfaction field

-
Psbt(&'a Psbt)

Analyze the given PSBT to check for existing signatures

-

Tuple Fields of Psbt

0: &'a Psbt
PsbtTimelocks

Like Psbt variant and also check for expired timelocks

-

Fields of PsbtTimelocks

psbt: &'a Psbt

Given PSBT

-
current_height: u32

Current blockchain height

-
input_max_height: u32

The highest confirmation height between the inputs +

Variants

None

Don’t generate satisfaction field

+

Psbt(&'a Psbt)

Tuple Fields

0: &'a Psbt

Analyze the given PSBT to check for existing signatures

+

PsbtTimelocks

Fields

psbt: &'a Psbt

Given PSBT

+
current_height: u32

Current blockchain height

+
input_max_height: u32

The highest confirmation height between the inputs CSV should consider different inputs, but we consider the worst condition for the tx as whole

-

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Like Psbt variant and also check for expired timelocks

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PolicyError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PolicyError.html index 0412f4a82f..5a2060943a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PolicyError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PolicyError.html @@ -1,4 +1,6 @@ -PolicyError in bdk::descriptor::policy - Rust

Enum bdk::descriptor::policy::PolicyError[][src]

pub enum PolicyError {
+PolicyError in bdk::descriptor::policy - Rust
+    
logo

Enum bdk::descriptor::policy::PolicyError[][src]

pub enum PolicyError {
     NotEnoughItemsSelected(String),
     IndexOutOfRange(usize),
     AddOnLeaf,
@@ -6,12 +8,12 @@
     MixedTimelockUnits,
     IncompatibleConditions,
 }
Expand description

Errors that can happen while extracting and manipulating policies

-

Variants

NotEnoughItemsSelected(String)

Not enough items are selected to satisfy a SatisfiableItem::Thresh or a SatisfiableItem::Multisig

-

Tuple Fields of NotEnoughItemsSelected

0: String
IndexOutOfRange(usize)

Index out of range for an item to satisfy a SatisfiableItem::Thresh or a SatisfiableItem::Multisig

-

Tuple Fields of IndexOutOfRange

0: usize
AddOnLeaf

Can not add to an item that is Satisfaction::None or Satisfaction::Complete

-
AddOnPartialComplete

Can not add to an item that is Satisfaction::PartialComplete

-
MixedTimelockUnits

Can not merge CSV or timelock values unless both are less than or both are equal or greater than 500_000_000

-
IncompatibleConditions

Incompatible conditions (not currently used)

+

Variants

NotEnoughItemsSelected(String)

Tuple Fields

0: String

Not enough items are selected to satisfy a SatisfiableItem::Thresh or a SatisfiableItem::Multisig

+

IndexOutOfRange(usize)

Tuple Fields

0: usize

Index out of range for an item to satisfy a SatisfiableItem::Thresh or a SatisfiableItem::Multisig

+

AddOnLeaf

Can not add to an item that is Satisfaction::None or Satisfaction::Complete

+

AddOnPartialComplete

Can not add to an item that is Satisfaction::PartialComplete

+

MixedTimelockUnits

Can not merge CSV or timelock values unless both are less than or both are equal or greater than 500_000_000

+

IncompatibleConditions

Incompatible conditions (not currently used)

Trait Implementations

Formats the value using the given formatter. Read more

Formats the value using the given formatter. Read more

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

@@ -24,31 +26,20 @@ by ==. Read more

This method tests for !=.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Converts a reference to Self into a dynamic trait object of Fail.

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the “name” of the error. Read more

-

Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

-

Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

-

Provides context for this failure. Read more

-

Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

-

Converts the given value to a String. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html index a58bf0bb83..7f080c5f59 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html @@ -1,4 +1,6 @@ -Satisfaction in bdk::descriptor::policy - Rust

Enum bdk::descriptor::policy::Satisfaction[][src]

pub enum Satisfaction {
+Satisfaction in bdk::descriptor::policy - Rust
+    
logo

Enum bdk::descriptor::policy::Satisfaction[][src]

pub enum Satisfaction {
     Partial {
         n: usize,
         m: usize,
@@ -18,47 +20,44 @@
     },
     None,
 }
Expand description

Represent if and how much a policy item is satisfied by the wallet’s descriptor

-

Variants

Partial

Only a partial satisfaction of some kind of threshold policy

-

Fields of Partial

n: usize

Total number of items

-
m: usize

Threshold

-
items: Vec<usize>

The items that can be satisfied by the descriptor or are satisfied in the PSBT

-
sorted: Option<bool>

Whether the items are sorted in lexicographic order (used by sortedmulti)

-
conditions: ConditionMap

Extra conditions that also need to be satisfied

-
PartialComplete

Can reach the threshold of some kind of threshold policy

-

Fields of PartialComplete

n: usize

Total number of items

-
m: usize

Threshold

-
items: Vec<usize>

The items that can be satisfied by the descriptor

-
sorted: Option<bool>

Whether the items are sorted in lexicographic order (used by sortedmulti)

-
conditions: FoldedConditionMap

Extra conditions that also need to be satisfied

-
Complete

Can satisfy the policy item

-

Fields of Complete

condition: Condition

Extra conditions that also need to be satisfied

-
None

Cannot satisfy or contribute to the policy item

+

Variants

Partial

Fields

n: usize

Total number of items

+
m: usize

Threshold

+
items: Vec<usize>

The items that can be satisfied by the descriptor or are satisfied in the PSBT

+
sorted: Option<bool>

Whether the items are sorted in lexicographic order (used by sortedmulti)

+
conditions: ConditionMap

Extra conditions that also need to be satisfied

+

Only a partial satisfaction of some kind of threshold policy

+

PartialComplete

Fields

n: usize

Total number of items

+
m: usize

Threshold

+
items: Vec<usize>

The items that can be satisfied by the descriptor

+
sorted: Option<bool>

Whether the items are sorted in lexicographic order (used by sortedmulti)

+
conditions: FoldedConditionMap

Extra conditions that also need to be satisfied

+

Can reach the threshold of some kind of threshold policy

+

Complete

Fields

condition: Condition

Extra conditions that also need to be satisfied

+

Can satisfy the policy item

+

None

Cannot satisfy or contribute to the policy item

Implementations

Returns whether the Satisfaction is a leaf item

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Performs the conversion.

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html index 10e4daecb0..ab09eaa096 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html @@ -1,4 +1,6 @@ -SatisfiableItem in bdk::descriptor::policy - Rust

Enum bdk::descriptor::policy::SatisfiableItem[][src]

pub enum SatisfiableItem {
+SatisfiableItem in bdk::descriptor::policy - Rust
+    
logo

Enum bdk::descriptor::policy::SatisfiableItem[][src]

pub enum SatisfiableItem {
     Signature(PkOrF),
     SignatureKey(PkOrF),
     Sha256Preimage {
@@ -28,53 +30,50 @@
         threshold: usize,
     },
 }
Expand description

An item that needs to be satisfied

-

Variants

Signature(PkOrF)

Signature for a raw public key

-

Tuple Fields of Signature

0: PkOrF
SignatureKey(PkOrF)

Signature for an extended key fingerprint

-

Tuple Fields of SignatureKey

0: PkOrF
Sha256Preimage

SHA256 preimage hash

-

Fields of Sha256Preimage

hash: Hash

The digest value

-
Hash256Preimage

Double SHA256 preimage hash

-

Fields of Hash256Preimage

hash: Hash

The digest value

-
Ripemd160Preimage

RIPEMD160 preimage hash

-

Fields of Ripemd160Preimage

hash: Hash

The digest value

-
Hash160Preimage

SHA256 then RIPEMD160 preimage hash

-

Fields of Hash160Preimage

hash: Hash

The digest value

-
AbsoluteTimelock

Absolute timeclock timestamp

-

Fields of AbsoluteTimelock

value: u32

The timestamp value

-
RelativeTimelock

Relative timelock locktime

-

Fields of RelativeTimelock

value: u32

The locktime value

-
Multisig

Multi-signature public keys with threshold count

-

Fields of Multisig

keys: Vec<PkOrF>

The raw public key or extended key fingerprint

-
threshold: usize

The required threshold count

-
Thresh

Threshold items with threshold count

-

Fields of Thresh

items: Vec<Policy>

The policy items

-
threshold: usize

The required threshold count

-

Implementations

Returns whether the SatisfiableItem is a leaf item

+

Variants

Signature(PkOrF)

Tuple Fields

0: PkOrF

Signature for a raw public key

+

SignatureKey(PkOrF)

Tuple Fields

0: PkOrF

Signature for an extended key fingerprint

+

Sha256Preimage

Fields

hash: Hash

The digest value

+

SHA256 preimage hash

+

Hash256Preimage

Fields

hash: Hash

The digest value

+

Double SHA256 preimage hash

+

Ripemd160Preimage

Fields

hash: Hash

The digest value

+

RIPEMD160 preimage hash

+

Hash160Preimage

Fields

hash: Hash

The digest value

+

SHA256 then RIPEMD160 preimage hash

+

AbsoluteTimelock

Fields

value: u32

The timestamp value

+

Absolute timeclock timestamp

+

RelativeTimelock

Fields

value: u32

The locktime value

+

Relative timelock locktime

+

Multisig

Fields

keys: Vec<PkOrF>

The raw public key or extended key fingerprint

+
threshold: usize

The required threshold count

+

Multi-signature public keys with threshold count

+

Thresh

Fields

items: Vec<Policy>

The policy items

+
threshold: usize

The required threshold count

+

Threshold items with threshold count

+

Implementations

Returns whether the SatisfiableItem is a leaf item

Returns a unique id for the SatisfiableItem

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Performs the conversion.

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/index.html index c9fc4315a8..c0151c7375 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/index.html @@ -1,8 +1,10 @@ -bdk::descriptor::policy - Rust

Module bdk::descriptor::policy[][src]

Expand description

Descriptor policy

+bdk::descriptor::policy - Rust +
logo

Module bdk::descriptor::policy[][src]

Expand description

Descriptor policy

This module implements the logic to extract and represent the spending policies of a descriptor in a more human-readable format.

This is an EXPERIMENTAL feature, API and other major changes are expected.

-

Example

+

Example

use bdk::descriptor::policy::BuildSatisfaction;
 let secp = Secp256k1::new();
 let desc = "wsh(and_v(v:pk(cV3oCth6zxZ1UVsHLnGothsWNsaoxRhC6aeNi5VbSdFpwUkgkEci),or_d(pk(cVMTy7uebJgvFaSBwcgvwk8qn8xSLc97dKow4MBetjrrahZoimm2),older(12960))))";
@@ -13,18 +15,17 @@ in a more human-readable format.

let signers = Arc::new(key_map.into()); let policy = extended_desc.extract_policy(&signers, BuildSatisfaction::None, &secp)?; println!("policy: {}", serde_json::to_string(&policy)?);
-

Structs

-

An extra condition that must be satisfied but that is out of control of the user

-

Raw public key or extended key fingerprint

-

Descriptor spending policy

-

Enums

-

Options to build the satisfaction field in the policy

-

Errors that can happen while extracting and manipulating policies

-

Represent if and how much a policy item is satisfied by the wallet’s descriptor

-

An item that needs to be satisfied

-

Type Definitions

-

Type for a map of sets of Condition items keyed by each set’s index

-

Type for a map of folded sets of Condition items keyed by a vector of the combined set’s indexes

-
- +

Structs

+

An extra condition that must be satisfied but that is out of control of the user

+

Raw public key or extended key fingerprint

+

Descriptor spending policy

+

Enums

+

Options to build the satisfaction field in the policy

+

Errors that can happen while extracting and manipulating policies

+

Represent if and how much a policy item is satisfied by the wallet’s descriptor

+

An item that needs to be satisfied

+

Type Definitions

+

Type for a map of sets of Condition items keyed by each set’s index

+

Type for a map of folded sets of Condition items keyed by a vector of the combined set’s indexes

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html index accab7d501..37bc581313 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html @@ -1,4 +1,6 @@ -Condition in bdk::descriptor::policy - Rust

Struct bdk::descriptor::policy::Condition[][src]

pub struct Condition {
+Condition in bdk::descriptor::policy - Rust
+    
logo

Struct bdk::descriptor::policy::Condition[][src]

pub struct Condition {
     pub csv: Option<u32>,
     pub timelock: Option<u32>,
 }
Expand description

An extra condition that must be satisfied but that is out of control of the user

@@ -6,46 +8,43 @@
timelock: Option<u32>

Optional timelock condition

Implementations

Returns true if there are no extra conditions to verify

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

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

Feeds this value into the given Hasher. Read more

-

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

+

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

This method returns an Ordering between self and other. Read more

-

Compares and returns the maximum of two values. Read more

-

Compares and returns the minimum of two values. Read more

-

Restrict a value to a certain interval. Read more

+

Compares and returns the maximum of two values. Read more

+

Compares and returns the minimum of two values. Read more

+

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

-

This method tests less than (for self and other) and is used by the < operator. Read more

-

This method tests less than or equal to (for self and other) and is used by the <= +

This method tests less than (for self and other) and is used by the < operator. Read more

+

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

-

This method tests greater than (for self and other) and is used by the > operator. Read more

-

This method tests greater than or equal to (for self and other) and is used by the >= +

This method tests greater than (for self and other) and is used by the > operator. Read more

+

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.PkOrF.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.PkOrF.html index aecf0a08a7..7ff6c34de5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.PkOrF.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.PkOrF.html @@ -1,29 +1,28 @@ -PkOrF in bdk::descriptor::policy - Rust

Struct bdk::descriptor::policy::PkOrF[][src]

pub struct PkOrF { /* fields omitted */ }
Expand description

Raw public key or extended key fingerprint

+PkOrF in bdk::descriptor::policy - Rust +
logo

Struct bdk::descriptor::policy::PkOrF[][src]

pub struct PkOrF { /* fields omitted */ }
Expand description

Raw public key or extended key fingerprint

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

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

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html index cf4cd6599e..daf449f72d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html @@ -1,4 +1,6 @@ -Policy in bdk::descriptor::policy - Rust

Struct bdk::descriptor::policy::Policy[][src]

pub struct Policy {
+Policy in bdk::descriptor::policy - Rust
+    
logo

Struct bdk::descriptor::policy::Policy[][src]

pub struct Policy {
     pub id: String,
     pub item: SatisfiableItem,
     pub satisfaction: Satisfaction,
@@ -16,30 +18,27 @@ on that.

Return the conditions that are set by the spending policy for a given path in the policy tree

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Performs the conversion.

-

Serialize this value into the given Serde serializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.ConditionMap.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.ConditionMap.html index c222634d0b..58deb2e994 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.ConditionMap.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.ConditionMap.html @@ -1,4 +1,5 @@ -ConditionMap in bdk::descriptor::policy - Rust

Type Definition bdk::descriptor::policy::ConditionMap[][src]

pub type ConditionMap = BTreeMap<usize, HashSet<Condition>>;
Expand description

Type for a map of sets of Condition items keyed by each set’s index

-
- +ConditionMap in bdk::descriptor::policy - Rust +
logo

Type Definition bdk::descriptor::policy::ConditionMap[][src]

pub type ConditionMap = BTreeMap<usize, HashSet<Condition>>;
Expand description

Type for a map of sets of Condition items keyed by each set’s index

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.FoldedConditionMap.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.FoldedConditionMap.html index a878b45589..dfb82a6147 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.FoldedConditionMap.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/type.FoldedConditionMap.html @@ -1,4 +1,5 @@ -FoldedConditionMap in bdk::descriptor::policy - Rust

Type Definition bdk::descriptor::policy::FoldedConditionMap[][src]

pub type FoldedConditionMap = BTreeMap<Vec<usize>, HashSet<Condition>>;
Expand description

Type for a map of folded sets of Condition items keyed by a vector of the combined set’s indexes

-
- +FoldedConditionMap in bdk::descriptor::policy - Rust +
logo

Type Definition bdk::descriptor::policy::FoldedConditionMap[][src]

pub type FoldedConditionMap = BTreeMap<Vec<usize>, HashSet<Condition>>;
Expand description

Type for a map of folded sets of Condition items keyed by a vector of the combined set’s indexes

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.DerivedDescriptorKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.DerivedDescriptorKey.html index 9cdf7671f9..6b47ffa75a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.DerivedDescriptorKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.DerivedDescriptorKey.html @@ -1,8 +1,10 @@ -DerivedDescriptorKey in bdk::descriptor - Rust

Struct bdk::descriptor::DerivedDescriptorKey[][src]

pub struct DerivedDescriptorKey<'s>(_, _);
Expand description

Extended DescriptorPublicKey that has been derived

+DerivedDescriptorKey in bdk::descriptor - Rust +
logo

Struct bdk::descriptor::DerivedDescriptorKey[][src]

pub struct DerivedDescriptorKey<'s>(_, _);
Expand description

Extended DescriptorPublicKey that has been derived

Derived keys are guaranteed to never contain wildcards of any kind

Implementations

Construct a new derived key

Panics if the key is wildcard

-

Methods from Deref<Target = DescriptorPublicKey>

The fingerprint of the master key associated with this key

+

Methods from Deref<Target = DescriptorPublicKey>

The fingerprint of the master key associated with this key

Full path, from the master key

For wildcard keys this will return the path up to the wildcard, so you can get full paths by appending one additional derivation step, according @@ -16,13 +18,13 @@ to avoid hardened derivation steps, start from a DescriptorSecretKeyas_public, or call TranslatePk2::translate_pk2 with some function which has access to secret key data.

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

+

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

The resulting type after dereferencing.

Dereferences the value.

Formats the value using the given formatter. Read more

Feeds this value into the given Hasher. Read more

-

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

+

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

The associated Hash type with the publicKey

Converts an object to PublicHash

Check if the publicKey is uncompressed. The default @@ -30,42 +32,39 @@ implementation returns false Read more

Computes the size of a public key when serialized in a script, including the length bytes Read more

This method returns an Ordering between self and other. Read more

-

Compares and returns the maximum of two values. Read more

-

Compares and returns the minimum of two values. Read more

-

Restrict a value to a certain interval. Read more

+

Compares and returns the maximum of two values. Read more

+

Compares and returns the minimum of two values. Read more

+

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

+

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

-

This method tests less than (for self and other) and is used by the < operator. Read more

-

This method tests less than or equal to (for self and other) and is used by the <= +

This method tests less than (for self and other) and is used by the < operator. Read more

+

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

-

This method tests greater than (for self and other) and is used by the > operator. Read more

-

This method tests greater than or equal to (for self and other) and is used by the >= +

This method tests greater than (for self and other) and is used by the > operator. Read more

+

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

Converts an object to a public key

Converts a hashed version of the public key to a hash160 hash. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Performs the conversion.

-

Performs the conversion.

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Performs the conversion.

+

Performs the conversion.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

-

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

-

Uses borrowed data to replace owned data, usually by cloning. Read more

-

Converts the given value to a String. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- +
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html index 3bf9c9b0ac..890f5ec82f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html @@ -1,4 +1,6 @@ -Miniscript in bdk::descriptor - Rust

Struct bdk::descriptor::Miniscript[]

pub struct Miniscript<Pk, Ctx> where
    Ctx: ScriptContext,
    Pk: MiniscriptKey, 
{ +Miniscript in bdk::descriptor - Rust +
logo

Struct bdk::descriptor::Miniscript[]

pub struct Miniscript<Pk, Ctx> where
    Pk: MiniscriptKey,
    Ctx: ScriptContext
{ pub node: Terminal<Pk, Ctx>, pub ty: Type, pub ext: ExtData, @@ -7,7 +9,7 @@

Fields

node: Terminal<Pk, Ctx>

A node in the Abstract Syntax Tree(

ty: Type

The correctness and malleability type information for the AST node

ext: ExtData

Additional information helpful for extra analysis.

-

Implementations

Whether all spend paths of miniscript require a signature

+

Implementations

Whether all spend paths of miniscript require a signature

Whether the miniscript is malleable

Whether the miniscript can exceed the resource limits(Opcodes, Stack limit etc)

Whether the miniscript contains a combination of timelocks

@@ -20,7 +22,7 @@ Signing logic may not find satisfaction even if one exists.

Use this function to check whether the guarantees of library hold. Most functions of the library like would still work, but results cannot be relied upon

-

Iterator-related extensions for Miniscript

+

Iterator-related extensions for Miniscript

Creates a new [Iter] iterator that will iterate over all Miniscript items within AST by traversing its branches. For the specific algorithm please see [Iter::next] function.

@@ -65,10 +67,10 @@ returns it cloned copy.

Returns Option::Some with hash of n’th public key or hash from the current miniscript item, if any. Otherwise returns Option::None.

NB: The function analyzes only single miniscript item and not any of its descendants in AST.

-

Add type information(Type and Extdata) to Miniscript based on +

Add type information(Type and Extdata) to Miniscript based on AstElem fragment. Dependent on display and clone because of Error Display code of type_check.

-

Extracts the AstElem representing the root of the miniscript

+

Extracts the AstElem representing the root of the miniscript

Get a reference to the inner AstElem representing the root of miniscript

Attempt to parse an insane(scripts don’t clear sanity checks) script into a Miniscript representation. @@ -81,14 +83,14 @@ accept sane scripts.

This function will fail parsing for scripts that do not clear the Miniscript::sanity_check checks. Use Miniscript::parse_insane to parse such scripts.

-

Encode as a Bitcoin script

+

Encode as a Bitcoin script

Size, in bytes of the script-pubkey. If this Miniscript is used outside of segwit (e.g. in a bare or P2SH descriptor), this quantity should be multiplied by 4 to compute the weight.

In general, it is not recommended to use this function directly, but to instead call the corresponding function on a Descriptor, which will handle the segwit/non-segwit technicalities for you.

-

Maximum number of witness elements used to satisfy the Miniscript +

Maximum number of witness elements used to satisfy the Miniscript fragment, including the witness script itself. Used to estimate the weight of the VarInt that specifies this number in a serialized transaction.

@@ -104,18 +106,18 @@ will handle the segwit/non-segwit technicalities for you.

All signatures are assumed to be 73 bytes in size, including the length prefix (segwit) or push opcode (pre-segwit) and sighash postfix.

-

Attempt to parse an insane(scripts don’t clear sanity checks) +

Attempt to parse an insane(scripts don’t clear sanity checks) from string into a Miniscript representation. Use this to parse scripts with repeated pubkeys, timelock mixing, malleable scripts without sig or scripts that can exceed resource limits. Some of the analysis guarantees of miniscript are lost when dealing with insane scripts. In general, in a multi-party setting users should only accept sane scripts.

-

Attempt to produce non-malleable satisfying witness for the +

Attempt to produce non-malleable satisfying witness for the witness script represented by the parse tree

-

Attempt to produce a malleable satisfying witness for the +

Attempt to produce a malleable satisfying witness for the witness script represented by the parse tree

-

Lifting corresponds conversion of miniscript into Policy +

Lifting corresponds conversion of miniscript into Policy [policy.semantic.Policy] for human readable or machine analysis. However, naively lifting miniscripts can result in incorrect interpretations that don’t correspond underlying semantics when @@ -125,91 +127,88 @@ This can occur if the miniscript contains a

  • Timelock combination
  • Contains a spend that exceeds resource limits
  • -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

    Deserialize this value from the given Serde deserializer. Read more

    -

    Formats the value using the given formatter. Read more

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

    Deserialize this value from the given Serde deserializer. Read more

    +

    Formats the value using the given formatter. Read more

    Extract the spending policy

    -

    Run a predicate on every key in the descriptor, returning whether +

    Run a predicate on every key in the descriptor, returning whether the predicate returned true for every key Read more

    Run a predicate on every key in the descriptor, returning whether the predicate returned true for any key Read more

    -

    Parse a Miniscript from string and perform sanity checks +

    Parse a Miniscript from string and perform sanity checks See Miniscript::from_str_insane to parse scripts from string that do not clear the Miniscript::sanity_check checks.

    The associated error which can be returned from parsing.

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

    -

    Parse an expression tree into a Miniscript. As a general rule, this +

    Parse an expression tree into a Miniscript. As a general rule, this should not be called directly; rather go through the descriptor API.

    -

    Feeds this value into the given Hasher. Read more

    -

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

    -

    Convert the object into an abstract policy

    -

    Ord of Miniscript must depend only on node and not the type information. +

    Feeds this value into the given Hasher. Read more

    +

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

    +

    Convert the object into an abstract policy

    +

    Ord of Miniscript must depend only on node and not the type information. The type information and extra_properties can be deterministically determined by the ast.

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    -

    PartialEq of Miniscript must depend only on node and not the type information. +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    +

    PartialEq of Miniscript must depend only on node and not the type information. The type information and extra_properties can be deterministically determined by the ast.

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    -

    PartialOrd of Miniscript must depend only on node and not the type information. +

    This method tests for !=.

    +

    PartialOrd of Miniscript must depend only on node and not the type information. The type information and extra_properties can be deterministically determined by the ast.

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    -

    Serialize this value into the given Serde serializer. Read more

    -

    This will panic if translatefpk returns an uncompressed key when +

    Serialize this value into the given Serde serializer. Read more

    +

    This will panic if translatefpk returns an uncompressed key when converting to a Segwit descriptor. To prevent this panic, ensure translatefpk returns an error in this case instead.

    The associated output type. This must be Self

    Calls translate_pk with conversion functions that cannot fail

    -

    Eq of Miniscript must depend only on node and not the type information. +

    Eq of Miniscript must depend only on node and not the type information. The type information and extra_properties can be deterministically determined by the ast.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    Translate a struct from one generic to another where the +

    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

    Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

    -

    Translate a struct from one generic to another where the +

    Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

    Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

    -

    Translate a struct from one generic to another where the +

    Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

    Translate a struct from one generic to another where the translation for Pk is provided by translatefpk Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/index.html index 2edd73980f..5857da9d84 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/index.html @@ -1,20 +1,21 @@ -bdk::descriptor::template - Rust

    Module bdk::descriptor::template[][src]

    Expand description

    Descriptor templates

    +bdk::descriptor::template - Rust +
    logo

    Module bdk::descriptor::template[][src]

    Expand description

    Descriptor templates

    This module contains the definition of various common script templates that are ready to be used. See the documentation of each template for an example.

    -

    Structs

    -

    BIP44 template. Expands to pkh(key/44'/0'/0'/{0,1}/*)

    -

    BIP44 public template. Expands to pkh(key/{0,1}/*)

    -

    BIP49 template. Expands to sh(wpkh(key/49'/0'/0'/{0,1}/*))

    -

    BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))

    -

    BIP84 template. Expands to wpkh(key/84'/0'/0'/{0,1}/*)

    -

    BIP84 public template. Expands to wpkh(key/{0,1}/*)

    -

    P2PKH template. Expands to a descriptor pkh(key)

    -

    P2WPKH template. Expands to a descriptor wpkh(key)

    -

    P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))

    -

    Traits

    -

    Trait for descriptor templates that can be built into a full descriptor

    -

    Type Definitions

    -

    Type alias for the return type of DescriptorTemplate, descriptor! and others

    -
    - +

    Structs

    +

    BIP44 template. Expands to pkh(key/44'/0'/0'/{0,1}/*)

    +

    BIP44 public template. Expands to pkh(key/{0,1}/*)

    +

    BIP49 template. Expands to sh(wpkh(key/49'/0'/0'/{0,1}/*))

    +

    BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))

    +

    BIP84 template. Expands to wpkh(key/84'/0'/0'/{0,1}/*)

    +

    BIP84 public template. Expands to wpkh(key/{0,1}/*)

    +

    P2PKH template. Expands to a descriptor pkh(key)

    +

    P2WPKH template. Expands to a descriptor wpkh(key)

    +

    P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))

    +

    Traits

    +

    Trait for descriptor templates that can be built into a full descriptor

    +

    Type Definitions

    +

    Type alias for the return type of DescriptorTemplate, descriptor! and others

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44.html index 5f7c8bbff0..357a0855b5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44.html @@ -1,7 +1,9 @@ -Bip44 in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::Bip44[][src]

    pub struct Bip44<K: DerivableKey<Legacy>>(pub K, pub KeychainKind);
    Expand description

    BIP44 template. Expands to pkh(key/44'/0'/0'/{0,1}/*)

    +Bip44 in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::Bip44[][src]

    pub struct Bip44<K: DerivableKey<Legacy>>(pub K, pub KeychainKind);
    Expand description

    BIP44 template. Expands to pkh(key/44'/0'/0'/{0,1}/*)

    Since there are hardened derivation steps, this template requires a private derivable key (generally a xprv/tprv).

    See Bip44Public for a template that can work with a xpub/tpub.

    -

    Example

    +

    Example

    use bdk::template::Bip44;
     
     let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m")?;
    @@ -16,10 +18,10 @@
     assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "pkh([c55b303f/44'/0'/0']tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)#xgaaevjx");

    Tuple Fields

    0: K1: KeychainKind

    Trait Implementations

    Build the complete descriptor

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -27,11 +29,9 @@

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44Public.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44Public.html index 28874d293e..164b4700b3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44Public.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip44Public.html @@ -1,9 +1,11 @@ -Bip44Public in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::Bip44Public[][src]

    pub struct Bip44Public<K: DerivableKey<Legacy>>(pub K, pub Fingerprint, pub KeychainKind);
    Expand description

    BIP44 public template. Expands to pkh(key/{0,1}/*)

    +Bip44Public in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::Bip44Public[][src]

    pub struct Bip44Public<K: DerivableKey<Legacy>>(pub K, pub Fingerprint, pub KeychainKind);
    Expand description

    BIP44 public template. Expands to pkh(key/{0,1}/*)

    This assumes that the key used has already been derived with m/44'/0'/0'.

    This template requires the parent fingerprint to populate correctly the metadata of PSBTs.

    See Bip44 for a template that does the full derivation, but requires private data for the key.

    -

    Example

    +

    Example

    use bdk::template::Bip44Public;
     
     let key = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU")?;
    @@ -19,10 +21,10 @@ for the key.

    assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "pkh([c55b303f/44'/0'/0']tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)#xgaaevjx");

    Tuple Fields

    0: K1: Fingerprint2: KeychainKind

    Trait Implementations

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -30,11 +32,9 @@ for the key.

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49.html index bdf6d79374..7d78956806 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49.html @@ -1,7 +1,9 @@ -Bip49 in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::Bip49[][src]

    pub struct Bip49<K: DerivableKey<Segwitv0>>(pub K, pub KeychainKind);
    Expand description

    BIP49 template. Expands to sh(wpkh(key/49'/0'/0'/{0,1}/*))

    +Bip49 in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::Bip49[][src]

    pub struct Bip49<K: DerivableKey<Segwitv0>>(pub K, pub KeychainKind);
    Expand description

    BIP49 template. Expands to sh(wpkh(key/49'/0'/0'/{0,1}/*))

    Since there are hardened derivation steps, this template requires a private derivable key (generally a xprv/tprv).

    See Bip49Public for a template that can work with a xpub/tpub.

    -

    Example

    +

    Example

    use bdk::template::Bip49;
     
     let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m")?;
    @@ -16,10 +18,10 @@
     assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "sh(wpkh([c55b303f/49\'/0\'/0\']tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))#gsmdv4xr");

    Tuple Fields

    0: K1: KeychainKind

    Trait Implementations

    Build the complete descriptor

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -27,11 +29,9 @@

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49Public.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49Public.html index 990701de24..66c1d86a73 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49Public.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip49Public.html @@ -1,9 +1,11 @@ -Bip49Public in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::Bip49Public[][src]

    pub struct Bip49Public<K: DerivableKey<Segwitv0>>(pub K, pub Fingerprint, pub KeychainKind);
    Expand description

    BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))

    +Bip49Public in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::Bip49Public[][src]

    pub struct Bip49Public<K: DerivableKey<Segwitv0>>(pub K, pub Fingerprint, pub KeychainKind);
    Expand description

    BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))

    This assumes that the key used has already been derived with m/49'/0'/0'.

    This template requires the parent fingerprint to populate correctly the metadata of PSBTs.

    See Bip49 for a template that does the full derivation, but requires private data for the key.

    -

    Example

    +

    Example

    use bdk::template::Bip49Public;
     
     let key = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L")?;
    @@ -19,10 +21,10 @@ for the key.

    assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "sh(wpkh([c55b303f/49\'/0\'/0\']tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))#gsmdv4xr");

    Tuple Fields

    0: K1: Fingerprint2: KeychainKind

    Trait Implementations

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -30,11 +32,9 @@ for the key.

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84.html index 340052e2f1..fad395c457 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84.html @@ -1,7 +1,9 @@ -Bip84 in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::Bip84[][src]

    pub struct Bip84<K: DerivableKey<Segwitv0>>(pub K, pub KeychainKind);
    Expand description

    BIP84 template. Expands to wpkh(key/84'/0'/0'/{0,1}/*)

    +Bip84 in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::Bip84[][src]

    pub struct Bip84<K: DerivableKey<Segwitv0>>(pub K, pub KeychainKind);
    Expand description

    BIP84 template. Expands to wpkh(key/84'/0'/0'/{0,1}/*)

    Since there are hardened derivation steps, this template requires a private derivable key (generally a xprv/tprv).

    See Bip84Public for a template that can work with a xpub/tpub.

    -

    Example

    +

    Example

    use bdk::template::Bip84;
     
     let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m")?;
    @@ -16,10 +18,10 @@
     assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "wpkh([c55b303f/84\'/0\'/0\']tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)#nkk5dtkg");

    Tuple Fields

    0: K1: KeychainKind

    Trait Implementations

    Build the complete descriptor

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -27,11 +29,9 @@

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84Public.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84Public.html index d946de1a23..279d572998 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84Public.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.Bip84Public.html @@ -1,9 +1,11 @@ -Bip84Public in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::Bip84Public[][src]

    pub struct Bip84Public<K: DerivableKey<Segwitv0>>(pub K, pub Fingerprint, pub KeychainKind);
    Expand description

    BIP84 public template. Expands to wpkh(key/{0,1}/*)

    +Bip84Public in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::Bip84Public[][src]

    pub struct Bip84Public<K: DerivableKey<Segwitv0>>(pub K, pub Fingerprint, pub KeychainKind);
    Expand description

    BIP84 public template. Expands to wpkh(key/{0,1}/*)

    This assumes that the key used has already been derived with m/84'/0'/0'.

    This template requires the parent fingerprint to populate correctly the metadata of PSBTs.

    See Bip84 for a template that does the full derivation, but requires private data for the key.

    -

    Example

    +

    Example

    use bdk::template::Bip84Public;
     
     let key = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q")?;
    @@ -19,10 +21,10 @@ for the key.

    assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "wpkh([c55b303f/84\'/0\'/0\']tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)#nkk5dtkg");

    Tuple Fields

    0: K1: Fingerprint2: KeychainKind

    Trait Implementations

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -30,11 +32,9 @@ for the key.

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Pkh.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Pkh.html index 9f00d81a24..f19dc8dee7 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Pkh.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Pkh.html @@ -1,5 +1,7 @@ -P2Pkh in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::P2Pkh[][src]

    pub struct P2Pkh<K: IntoDescriptorKey<Legacy>>(pub K);
    Expand description

    P2PKH template. Expands to a descriptor pkh(key)

    -

    Example

    +P2Pkh in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::P2Pkh[][src]

    pub struct P2Pkh<K: IntoDescriptorKey<Legacy>>(pub K);
    Expand description

    P2PKH template. Expands to a descriptor pkh(key)

    +

    Example

    use bdk::template::P2Pkh;
     
     let key =
    @@ -17,10 +19,10 @@
     );

    Tuple Fields

    0: K

    Trait Implementations

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -28,11 +30,9 @@

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh.html index cdb5cf12c8..c8a22d9bc1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh.html @@ -1,5 +1,7 @@ -P2Wpkh in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::P2Wpkh[][src]

    pub struct P2Wpkh<K: IntoDescriptorKey<Segwitv0>>(pub K);
    Expand description

    P2WPKH template. Expands to a descriptor wpkh(key)

    -

    Example

    +P2Wpkh in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::P2Wpkh[][src]

    pub struct P2Wpkh<K: IntoDescriptorKey<Segwitv0>>(pub K);
    Expand description

    P2WPKH template. Expands to a descriptor wpkh(key)

    +

    Example

    use bdk::template::P2Wpkh;
     
     let key =
    @@ -17,10 +19,10 @@
     );

    Tuple Fields

    0: K

    Trait Implementations

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -28,11 +30,9 @@

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh_P2Sh.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh_P2Sh.html index 3caa912c30..30d8e76650 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh_P2Sh.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/struct.P2Wpkh_P2Sh.html @@ -1,5 +1,7 @@ -P2Wpkh_P2Sh in bdk::descriptor::template - Rust

    Struct bdk::descriptor::template::P2Wpkh_P2Sh[][src]

    pub struct P2Wpkh_P2Sh<K: IntoDescriptorKey<Segwitv0>>(pub K);
    Expand description

    P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))

    -

    Example

    +P2Wpkh_P2Sh in bdk::descriptor::template - Rust +
    logo

    Struct bdk::descriptor::template::P2Wpkh_P2Sh[][src]

    pub struct P2Wpkh_P2Sh<K: IntoDescriptorKey<Segwitv0>>(pub K);
    Expand description

    P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))

    +

    Example

    use bdk::template::P2Wpkh_P2Sh;
     
     let key =
    @@ -17,10 +19,10 @@
     );

    Tuple Fields

    0: K

    Trait Implementations

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    Convert to wallet descriptor

    The alignment of pointer.

    The type for initializers.

    @@ -28,11 +30,9 @@

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/trait.DescriptorTemplate.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/trait.DescriptorTemplate.html index 4fcbe7b52c..33cf2111ff 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/trait.DescriptorTemplate.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/trait.DescriptorTemplate.html @@ -1,9 +1,11 @@ -DescriptorTemplate in bdk::descriptor::template - Rust

    Trait bdk::descriptor::template::DescriptorTemplate[][src]

    pub trait DescriptorTemplate {
    +DescriptorTemplate in bdk::descriptor::template - Rust
    +    
    logo

    Trait bdk::descriptor::template::DescriptorTemplate[][src]

    pub trait DescriptorTemplate {
         fn build(self) -> Result<DescriptorTemplateOut, DescriptorError>;
     }
    Expand description

    Trait for descriptor templates that can be built into a full descriptor

    Since IntoWalletDescriptor is implemented for any DescriptorTemplate, they can also be passed directly to the Wallet constructor.

    -

    Example

    +

    Example

    Required methods

    Build the complete descriptor

    -

    Implementors

    - +

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/type.DescriptorTemplateOut.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/type.DescriptorTemplateOut.html index d5a999d18b..b17926494f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/type.DescriptorTemplateOut.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/template/type.DescriptorTemplateOut.html @@ -1,5 +1,6 @@ -DescriptorTemplateOut in bdk::descriptor::template - Rust

    Type Definition bdk::descriptor::template::DescriptorTemplateOut[][src]

    pub type DescriptorTemplateOut = (ExtendedDescriptor, KeyMap, ValidNetworks);
    Expand description

    Type alias for the return type of DescriptorTemplate, descriptor! and others

    +DescriptorTemplateOut in bdk::descriptor::template - Rust +
    logo

    Type Definition bdk::descriptor::template::DescriptorTemplateOut[][src]

    pub type DescriptorTemplateOut = (ExtendedDescriptor, KeyMap, ValidNetworks);
    Expand description

    Type alias for the return type of DescriptorTemplate, descriptor! and others

    Trait Implementations

    Convert to wallet descriptor

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ExtractPolicy.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ExtractPolicy.html index 6e9c6f1081..c1e46a1d7c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ExtractPolicy.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ExtractPolicy.html @@ -1,7 +1,8 @@ -ExtractPolicy in bdk::descriptor - Rust

    Trait bdk::descriptor::ExtractPolicy[][src]

    pub trait ExtractPolicy {
    +ExtractPolicy in bdk::descriptor - Rust
    +    
    logo

    Trait bdk::descriptor::ExtractPolicy[][src]

    pub trait ExtractPolicy {
         fn extract_policy(
            &self,
            signers: &SignersContainer,
            psbt: BuildSatisfaction<'_>,
            secp: &Secp256k1<All>
        ) -> Result<Option<Policy>, DescriptorError>; }
    Expand description

    Trait implemented on Descriptors to add a method to extract the spending policy

    Required methods

    Extract the spending policy

    -

    Implementors

    - +

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.IntoWalletDescriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.IntoWalletDescriptor.html index 29b6762f60..9491509121 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.IntoWalletDescriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.IntoWalletDescriptor.html @@ -1,9 +1,10 @@ -IntoWalletDescriptor in bdk::descriptor - Rust

    Trait bdk::descriptor::IntoWalletDescriptor[][src]

    pub trait IntoWalletDescriptor {
    +IntoWalletDescriptor in bdk::descriptor - Rust
    +    
    logo

    Trait bdk::descriptor::IntoWalletDescriptor[][src]

    pub trait IntoWalletDescriptor {
         fn into_wallet_descriptor(
            self,
            secp: &Secp256k1<All>,
            network: Network
        ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError>; }
    Expand description

    Trait for types which can be converted into an ExtendedDescriptor and a KeyMap usable by a wallet in a specific [Network]

    Required methods

    Convert to wallet descriptor

    Implementations on Foreign Types

    Implementors

    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ScriptContext.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ScriptContext.html index 92abbd0176..1fb648d077 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ScriptContext.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/trait.ScriptContext.html @@ -1,32 +1,34 @@ -ScriptContext in bdk::descriptor - Rust

    Trait bdk::descriptor::ScriptContext[]

    pub trait ScriptContext: Debug + Clone + Ord + PartialOrd<Self> + Eq + PartialEq<Self> + Hash + Sealed {
    -    fn check_terminal_non_malleable<Pk, Ctx>(
            _frag: &Terminal<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    ; -
    fn max_satisfaction_size<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Option<usize>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    ; +ScriptContext in bdk::descriptor - Rust +
    logo

    Trait bdk::descriptor::ScriptContext[]

    pub trait ScriptContext: Debug + Clone + Ord + PartialOrd<Self> + Eq + PartialEq<Self> + Hash + Sealed {
    +    fn check_terminal_non_malleable<Pk, Ctx>(
            _frag: &Terminal<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    ; +
    fn max_satisfaction_size<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Option<usize>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    ; - fn check_witness<Pk, Ctx>(
            _witness: &[Vec<u8, Global>]
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , + fn check_witness<Pk, Ctx>(
            _witness: &[Vec<u8, Global>]
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_global_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_global_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_global_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_global_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_local_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_local_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_local_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_local_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_global_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_global_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_local_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_local_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn top_level_type_check<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn top_level_type_check<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn other_top_level_checks<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn other_top_level_checks<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn top_level_checks<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Result<(), Error>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn top_level_checks<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Result<(), Error>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } }
    Expand description

    The ScriptContext for Miniscript. Additional type information associated with miniscript that is used for carrying out checks that dependent on the context under which the script is used. For example, disallowing uncompressed keys in Segwit context

    -

    Required methods

    Depending on ScriptContext, fragments can be malleable. For Example, +

    Required methods

    Depending on ScriptContext, fragments can be malleable. For Example, under Legacy context, PkH is malleable because it is possible to estimate the cost of satisfaction because of compressed keys This is currently only used in compiler code for removing malleable @@ -34,11 +36,11 @@ compilations. This does NOT recursively check if the children of the fragment are valid or not. Since the compilation proceeds in a leaf to root fashion, a recursive check is unnecessary.

    -

    Depending on script context, the size of a satifaction witness may slightly differ.

    -

    Provided methods

    Check whether the given satisfaction is valid under the ScriptContext +

    Depending on script context, the size of a satifaction witness may slightly differ.

    +

    Provided methods

    Check whether the given satisfaction is valid under the ScriptContext For example, segwit satisfactions may fail if the witness len is more 3600 or number of stack elements are more than 100.

    -

    Depending on script Context, some of the Terminals might not +

    Depending on script Context, some of the Terminals might not be valid under the current consensus rules. Or some of the script resource limits may have been exceeded. These miniscripts would never be accepted by the Bitcoin network and hence @@ -48,7 +50,7 @@ uncompressed public keys are non-standard and thus invalid. In LegacyP2SH context, scripts above 520 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments.

    -

    Depending on script Context, some of the script resource limits +

    Depending on script Context, some of the script resource limits may have been exceeded under the current bitcoin core policy rules These miniscripts would never be accepted by the Bitcoin network and hence it is safe to discard them. (unless explicitly disabled by non-standard flag) @@ -56,22 +58,21 @@ For example, in Segwit Context with MiniscriptKey as bitcoin::PublicKey scripts over 3600 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments.

    -

    Consensus rules at the Miniscript satisfaction time. +

    Consensus rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path(Legacy/Segwitv0) may require more than 201 opcodes.

    -

    Policy rules at the Miniscript satisfaction time. +

    Policy rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path in Legacy context scriptSig more than 1650 bytes

    -

    Check the consensus + policy(if not disabled) rules that are not based +

    Check the consensus + policy(if not disabled) rules that are not based satisfaction

    -

    Check the consensus + policy(if not disabled) rules including the +

    Check the consensus + policy(if not disabled) rules including the ones for satisfaction

    -

    Check whether the top-level is type B

    -

    Other top level checks that are context specific

    -

    Check top level consensus rules.

    -

    Implementations on Foreign Types

    Implementors

    - +

    Check whether the top-level is type B

    +

    Other top level checks that are context specific

    +

    Check top level consensus rules.

    +

    Implementations on Foreign Types

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.DerivedDescriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.DerivedDescriptor.html index 97508febab..b4f2fd3a7a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.DerivedDescriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.DerivedDescriptor.html @@ -1,4 +1,5 @@ -DerivedDescriptor in bdk::descriptor - Rust

    Type Definition bdk::descriptor::DerivedDescriptor[][src]

    pub type DerivedDescriptor<'s> = Descriptor<DerivedDescriptorKey<'s>>;
    Expand description

    Alias for a Descriptor that contains extended derived keys

    -
    - +DerivedDescriptor in bdk::descriptor - Rust +
    logo

    Type Definition bdk::descriptor::DerivedDescriptor[][src]

    pub type DerivedDescriptor<'s> = Descriptor<DerivedDescriptorKey<'s>>;
    Expand description

    Alias for a Descriptor that contains extended derived keys

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.ExtendedDescriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.ExtendedDescriptor.html index 207f54a03e..e031402170 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.ExtendedDescriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.ExtendedDescriptor.html @@ -1,5 +1,6 @@ -ExtendedDescriptor in bdk::descriptor - Rust

    Type Definition bdk::descriptor::ExtendedDescriptor[][src]

    pub type ExtendedDescriptor = Descriptor<DescriptorPublicKey>;
    Expand description

    Alias for a Descriptor that can contain extended keys using DescriptorPublicKey

    +ExtendedDescriptor in bdk::descriptor - Rust +
    logo

    Type Definition bdk::descriptor::ExtendedDescriptor[][src]

    pub type ExtendedDescriptor = Descriptor<DescriptorPublicKey>;
    Expand description

    Alias for a Descriptor that can contain extended keys using DescriptorPublicKey

    Trait Implementations

    Convert to wallet descriptor

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.HdKeyPaths.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.HdKeyPaths.html index 0f31e1f774..05cf163420 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.HdKeyPaths.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.HdKeyPaths.html @@ -1,5 +1,6 @@ -HdKeyPaths in bdk::descriptor - Rust

    Type Definition bdk::descriptor::HdKeyPaths[][src]

    pub type HdKeyPaths = BTreeMap<PublicKey, KeySource>;
    Expand description

    Alias for the type of maps that represent derivation paths in a psbt::Input or +HdKeyPaths in bdk::descriptor - Rust +

    logo

    Type Definition bdk::descriptor::HdKeyPaths[][src]

    pub type HdKeyPaths = BTreeMap<PublicKey, KeySource>;
    Expand description

    Alias for the type of maps that represent derivation paths in a psbt::Input or psbt::Output

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.KeyMap.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.KeyMap.html index 417fe088cf..73e7b3facc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.KeyMap.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/type.KeyMap.html @@ -1,8 +1,9 @@ -KeyMap in bdk::descriptor - Rust

    Type Definition bdk::descriptor::KeyMap[]

    pub type KeyMap = HashMap<DescriptorPublicKey, DescriptorSecretKey, RandomState>;
    Expand description

    Alias type for a map of public key to secret key

    +KeyMap in bdk::descriptor - Rust +
    logo

    Type Definition bdk::descriptor::KeyMap[]

    Expand description

    Alias type for a map of public key to secret key

    This map is returned whenever a descriptor that contains secrets is parsed using Descriptor::parse_descriptor, since the descriptor will always only contain public keys. This map allows looking up the corresponding secret key given a public key from the descriptor.

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Error.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Error.html index a383630561..1ce7e50b97 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Error.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Error.html @@ -1,4 +1,6 @@ -Error in bdk - Rust

    Enum bdk::Error[][src]

    pub enum Error {
    +Error in bdk - Rust
    +    
    logo

    Enum bdk::Error[][src]

    pub enum Error {
     
    Show 41 variants InvalidU32Bytes(Vec<u8>), Generic(String), ScriptDoesntHaveAddressForm, @@ -41,7 +43,7 @@ Miniscript(Error), Bip32(Error), Secp256k1(Error), - Json(Error), + Json(Error), Hex(Error), Psbt(Error), PsbtParse(PsbtParseError), @@ -51,58 +53,58 @@ Sled(Error), Rusqlite(Error),
    }
    Expand description

    Errors that can be thrown by the Wallet

    -

    Variants

    InvalidU32Bytes(Vec<u8>)

    Wrong number of bytes found when trying to convert to u32

    -

    Tuple Fields of InvalidU32Bytes

    0: Vec<u8>
    Generic(String)

    Generic error

    -

    Tuple Fields of Generic

    0: String
    ScriptDoesntHaveAddressForm

    This error is thrown when trying to convert Bare and Public key script to address

    -
    NoRecipients

    Cannot build a tx without recipients

    -
    NoUtxosSelected

    manually_selected_only option is selected but no utxo has been passed

    -
    OutputBelowDustLimit(usize)

    Output created is under the dust limit, 546 satoshis

    -

    Tuple Fields of OutputBelowDustLimit

    0: usize
    InsufficientFunds

    Wallet’s UTXO set is not enough to cover recipient’s requested plus fee

    -

    Fields of InsufficientFunds

    needed: u64

    Sats needed for some transaction

    -
    available: u64

    Sats available for spending

    -
    BnBTotalTriesExceeded

    Branch and bound coin selection possible attempts with sufficiently big UTXO set could grow +

    Variants

    InvalidU32Bytes(Vec<u8>)

    Tuple Fields

    0: Vec<u8>

    Wrong number of bytes found when trying to convert to u32

    +

    Generic(String)

    Tuple Fields

    0: String

    Generic error

    +

    ScriptDoesntHaveAddressForm

    This error is thrown when trying to convert Bare and Public key script to address

    +

    NoRecipients

    Cannot build a tx without recipients

    +

    NoUtxosSelected

    manually_selected_only option is selected but no utxo has been passed

    +

    OutputBelowDustLimit(usize)

    Tuple Fields

    0: usize

    Output created is under the dust limit, 546 satoshis

    +

    InsufficientFunds

    Fields

    needed: u64

    Sats needed for some transaction

    +
    available: u64

    Sats available for spending

    +

    Wallet’s UTXO set is not enough to cover recipient’s requested plus fee

    +

    BnBTotalTriesExceeded

    Branch and bound coin selection possible attempts with sufficiently big UTXO set could grow exponentially, thus a limit is set, and when hit, this error is thrown

    -
    BnBNoExactMatch

    Branch and bound coin selection tries to avoid needing a change by finding the right inputs for +

    BnBNoExactMatch

    Branch and bound coin selection tries to avoid needing a change by finding the right inputs for the desired outputs plus fee, if there is not such combination this error is thrown

    -
    UnknownUtxo

    Happens when trying to spend an UTXO that is not in the internal database

    -
    TransactionNotFound

    Thrown when a tx is not found in the internal database

    -
    TransactionConfirmed

    Happens when trying to bump a transaction that is already confirmed

    -
    IrreplaceableTransaction

    Trying to replace a tx that has a sequence >= 0xFFFFFFFE

    -
    FeeRateTooLow

    When bumping a tx the fee rate requested is lower than required

    -

    Fields of FeeRateTooLow

    required: FeeRate

    Required fee rate (satoshi/vbyte)

    -
    FeeTooLow

    When bumping a tx the absolute fee requested is lower than replaced tx absolute fee

    -

    Fields of FeeTooLow

    required: u64

    Required fee absolute value (satoshi)

    -
    FeeRateUnavailable

    Node doesn’t have data to estimate a fee rate

    -
    MissingKeyOrigin(String)

    In order to use the TxBuilder::add_global_xpubs option every extended +

    UnknownUtxo

    Happens when trying to spend an UTXO that is not in the internal database

    +

    TransactionNotFound

    Thrown when a tx is not found in the internal database

    +

    TransactionConfirmed

    Happens when trying to bump a transaction that is already confirmed

    +

    IrreplaceableTransaction

    Trying to replace a tx that has a sequence >= 0xFFFFFFFE

    +

    FeeRateTooLow

    Fields

    required: FeeRate

    Required fee rate (satoshi/vbyte)

    +

    When bumping a tx the fee rate requested is lower than required

    +

    FeeTooLow

    Fields

    required: u64

    Required fee absolute value (satoshi)

    +

    When bumping a tx the absolute fee requested is lower than replaced tx absolute fee

    +

    FeeRateUnavailable

    Node doesn’t have data to estimate a fee rate

    +

    MissingKeyOrigin(String)

    Tuple Fields

    0: String

    In order to use the TxBuilder::add_global_xpubs option every extended key in the descriptor must either be a master key itself (having depth = 0) or have an explicit origin provided

    -

    Tuple Fields of MissingKeyOrigin

    0: String

    Error while working with keys

    -

    Tuple Fields of Key

    ChecksumMismatch

    Descriptor checksum mismatch

    -
    SpendingPolicyRequired(KeychainKind)

    Spending policy is not compatible with this KeychainKind

    -

    Tuple Fields of SpendingPolicyRequired

    InvalidPolicyPathError(PolicyError)

    Error while extracting and manipulating policies

    -

    Tuple Fields of InvalidPolicyPathError

    Signer(SignerError)

    Signing error

    -

    Tuple Fields of Signer

    InvalidNetwork

    Invalid network

    -

    Fields of InvalidNetwork

    requested: Network

    requested network, for example what is given as bdk-cli option

    -
    found: Network

    found network, for example the network of the bitcoin node

    -
    InvalidProgressValue(f32)

    Progress value must be between 0.0 (included) and 100.0 (included)

    -

    Tuple Fields of InvalidProgressValue

    0: f32
    ProgressUpdateError

    Progress update error (maybe the channel has been closed)

    -
    InvalidOutpoint(OutPoint)

    Requested outpoint doesn’t exist in the tx (vout greater than available outputs)

    -

    Tuple Fields of InvalidOutpoint

    0: OutPoint
    Descriptor(Error)

    Error related to the parsing and usage of descriptors

    -

    Tuple Fields of Descriptor

    0: Error
    AddressValidator(AddressValidatorError)

    Error that can be returned to fail the validation of an address

    -

    Tuple Fields of AddressValidator

    Encode(Error)

    Encoding error

    -

    Tuple Fields of Encode

    0: Error
    Miniscript(Error)

    Miniscript error

    -

    Tuple Fields of Miniscript

    0: Error
    Bip32(Error)

    BIP32 error

    -

    Tuple Fields of Bip32

    0: Error
    Secp256k1(Error)

    An ECDSA error

    -

    Tuple Fields of Secp256k1

    0: Error
    Json(Error)

    Error serializing or deserializing JSON data

    -

    Tuple Fields of Json

    0: Error
    Hex(Error)

    Hex decoding error

    -

    Tuple Fields of Hex

    0: Error
    Psbt(Error)

    Partially signed bitcoin transaction error

    -

    Tuple Fields of Psbt

    0: Error
    PsbtParse(PsbtParseError)

    Partially signed bitcoin transaction parseerror

    -

    Tuple Fields of PsbtParse

    0: PsbtParseError
    Electrum(Error)

    Electrum client error

    -

    Tuple Fields of Electrum

    0: Error
    Esplora(Box<EsploraError>)

    Esplora client error

    -

    Tuple Fields of Esplora

    CompactFilters(CompactFiltersError)

    Compact filters client error)

    -

    Tuple Fields of CompactFilters

    Sled(Error)

    Sled database error

    -

    Tuple Fields of Sled

    0: Error
    Rusqlite(Error)

    Rusqlite client error

    -

    Tuple Fields of Rusqlite

    0: Error

    Trait Implementations

    Formats the value using the given formatter. Read more

    +

    Key(KeyError)

    Tuple Fields

    Error while working with keys

    +

    ChecksumMismatch

    Descriptor checksum mismatch

    +

    SpendingPolicyRequired(KeychainKind)

    Tuple Fields

    Spending policy is not compatible with this KeychainKind

    +

    InvalidPolicyPathError(PolicyError)

    Tuple Fields

    Error while extracting and manipulating policies

    +

    Signer(SignerError)

    Tuple Fields

    Signing error

    +

    InvalidNetwork

    Fields

    requested: Network

    requested network, for example what is given as bdk-cli option

    +
    found: Network

    found network, for example the network of the bitcoin node

    +

    Invalid network

    +

    InvalidProgressValue(f32)

    Tuple Fields

    0: f32

    Progress value must be between 0.0 (included) and 100.0 (included)

    +

    ProgressUpdateError

    Progress update error (maybe the channel has been closed)

    +

    InvalidOutpoint(OutPoint)

    Tuple Fields

    0: OutPoint

    Requested outpoint doesn’t exist in the tx (vout greater than available outputs)

    +

    Descriptor(Error)

    Tuple Fields

    0: Error

    Error related to the parsing and usage of descriptors

    +

    AddressValidator(AddressValidatorError)

    Tuple Fields

    Error that can be returned to fail the validation of an address

    +

    Encode(Error)

    Tuple Fields

    0: Error

    Encoding error

    +

    Miniscript(Error)

    Tuple Fields

    0: Error

    Miniscript error

    +

    Bip32(Error)

    Tuple Fields

    0: Error

    BIP32 error

    +

    Secp256k1(Error)

    Tuple Fields

    0: Error

    An ECDSA error

    +

    Json(Error)

    Tuple Fields

    0: Error

    Error serializing or deserializing JSON data

    +

    Hex(Error)

    Tuple Fields

    0: Error

    Hex decoding error

    +

    Psbt(Error)

    Tuple Fields

    0: Error

    Partially signed bitcoin transaction error

    +

    PsbtParse(PsbtParseError)

    Tuple Fields

    0: PsbtParseError

    Partially signed bitcoin transaction parse error

    +

    Electrum(Error)

    Tuple Fields

    0: Error

    Electrum client error

    +

    Esplora(Box<EsploraError>)

    Tuple Fields

    Esplora client error

    +

    CompactFilters(CompactFiltersError)

    Tuple Fields

    Compact filters client error)

    +

    Sled(Error)

    Tuple Fields

    0: Error

    Sled database error

    +

    Rusqlite(Error)

    Tuple Fields

    0: Error

    Rusqlite client error

    +

    Trait Implementations

    Formats the value using the given formatter. Read more

    Formats the value using the given formatter. Read more

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

    🔬 This is a nightly-only experimental API. (backtrace)

    Returns a stack backtrace, if available, of where this error occurred. Read more

    @@ -117,7 +119,7 @@ explicit origin provided

    Performs the conversion.

    Performs the conversion.

    Performs the conversion.

    -

    Performs the conversion.

    +

    Performs the conversion.

    Performs the conversion.

    Performs the conversion.

    Performs the conversion.

    @@ -128,31 +130,20 @@ explicit origin provided

    Performs the conversion.

    Performs the conversion.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Converts a reference to Self into a dynamic trait object of Fail.

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Returns the “name” of the error. Read more

    -

    Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

    -

    Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

    -

    Provides context for this failure. Read more

    -

    Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html index b7202193d0..26df0cf2f9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html @@ -1,47 +1,46 @@ -KeychainKind in bdk - Rust

    Enum bdk::KeychainKind[][src]

    pub enum KeychainKind {
    +KeychainKind in bdk - Rust
    +    
    logo

    Enum bdk::KeychainKind[][src]

    pub enum KeychainKind {
         External,
         Internal,
     }
    Expand description

    Types of keychains

    -

    Variants

    External

    External

    -
    Internal

    Internal, usually used for change outputs

    +

    Variants

    External

    External

    +

    Internal

    Internal, usually used for change outputs

    Implementations

    Return KeychainKind as a byte

    -

    Trait Implementations

    Performs the conversion.

    +

    Trait Implementations

    Performs the conversion.

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    -

    Deserialize this value from the given Serde deserializer. Read more

    +

    Deserialize this value from the given Serde deserializer. Read more

    Feeds this value into the given Hasher. Read more

    -

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

    +

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

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    -

    Serialize this value into the given Serde serializer. Read more

    +

    This method tests for !=.

    +

    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    Calculate the base32 serialized length

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Error type if conversion fails

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Error type if conversion fails

    Check if all values are in range and return array-like struct of u5 values

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    Encode as base32 and write it to the supplied writer Implementations shouldn’t allocate. Read more

    Convert Self to base32 vector

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Utxo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Utxo.html index 02d5db3d00..62926be37e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Utxo.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.Utxo.html @@ -1,42 +1,41 @@ -Utxo in bdk - Rust

    Enum bdk::Utxo[][src]

    pub enum Utxo {
    +Utxo in bdk - Rust
    +    
    logo

    Enum bdk::Utxo[][src]

    pub enum Utxo {
         Local(LocalUtxo),
         Foreign {
             outpoint: OutPoint,
             psbt_input: Box<Input>,
         },
     }
    Expand description

    An unspent transaction output (UTXO).

    -

    Variants

    Local(LocalUtxo)

    A UTXO owned by the local wallet.

    -

    Tuple Fields of Local

    Foreign

    A UTXO owned by another wallet.

    -

    Fields of Foreign

    outpoint: OutPoint

    The location of the output.

    -
    psbt_input: Box<Input>

    The information about the input we require to add it to a PSBT.

    -

    Implementations

    Get the location of the UTXO

    +

    Variants

    Local(LocalUtxo)

    Tuple Fields

    A UTXO owned by the local wallet.

    +

    Foreign

    Fields

    outpoint: OutPoint

    The location of the output.

    +
    psbt_input: Box<Input>

    The information about the input we require to add it to a PSBT.

    +

    A UTXO owned by another wallet.

    +

    Implementations

    Get the location of the UTXO

    Get the TxOut of the UTXO

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html index 32eb32ae0c..07212d79e7 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html @@ -1,4 +1,5 @@ -version in bdk - Rust

    Function bdk::version[][src]

    pub fn version() -> &'static str
    Expand description

    Get the version of BDK at runtime

    -
    - +version in bdk - Rust +
    logo

    Function bdk::version[][src]

    pub fn version() -> &'static str
    Expand description

    Get the version of BDK at runtime

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html index f8225ea782..1f4be90dd3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html @@ -1,5 +1,7 @@ -bdk - Rust

    Crate bdk[][src]

    Expand description

    A modern, lightweight, descriptor-based wallet library written in Rust.

    -

    About

    +bdk - Rust +
    logo

    Crate bdk[][src]

    Expand description

    A modern, lightweight, descriptor-based wallet library written in Rust.

    +

    About

    The BDK library aims to be the core building block for Bitcoin wallets of any kind.

    • It uses Miniscript to support descriptors with generalized conditions. This exact same library can be used to build @@ -8,7 +10,7 @@ single-sig wallets, multisigs, timelocked contracts and more.
    • It is built to be cross-platform: the core logic works on desktop, mobile, and even WebAssembly.
    • It is very easy to extend: developers can implement customized logic for blockchain backends, databases, signers, coin selection, and more, without having to fork and modify this library.
    -

    A Tour of BDK

    +

    A Tour of BDK

    BDK consists of a number of modules that provide a range of functionality essential for implementing descriptor based Bitcoin wallet applications in Rust. In this section, we will take a brief tour of BDK, summarizing the major APIs and @@ -17,13 +19,13 @@ their uses.

    The default features include a simple key-value database (sled) to cache blockchain data and an electrum blockchain client to interact with the bitcoin P2P network.

    -
    bdk = "0.11.0"

    Sync the balance of a descriptor

    Example

    +
    bdk = "0.14.0"

    Sync the balance of a descriptor

    Example

    use bdk::Wallet;
     use bdk::database::MemoryDatabase;
     use bdk::blockchain::{noop_progress, ElectrumBlockchain};
     use bdk::electrum_client::Client;
     
    -fn main() -> Result<(), bdk::Error> {
    +fn main() -> Result<(), bdk::Error> {
         let client = Client::new("ssl://electrum.blockstream.info:60002")?;
         let wallet = Wallet::new(
             "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
    @@ -39,12 +41,12 @@ interact with the bitcoin P2P network.

    Ok(()) }
    -

    Generate a few addresses

    Example

    +

    Generate a few addresses

    Example

    use bdk::{Wallet};
     use bdk::database::MemoryDatabase;
     use bdk::wallet::AddressIndex::New;
     
    -fn main() -> Result<(), bdk::Error> {
    +fn main() -> Result<(), bdk::Error> {
     let wallet = Wallet::new_offline(
             "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
             Some("wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"),
    @@ -58,7 +60,7 @@ interact with the bitcoin P2P network.

    Ok(()) }
    -

    Create a transaction

    Example

    +

    Create a transaction

    Example

    use bdk::{FeeRate, Wallet};
     use bdk::database::MemoryDatabase;
     use bdk::blockchain::{noop_progress, ElectrumBlockchain};
    @@ -67,7 +69,7 @@ interact with the bitcoin P2P network.

    use bitcoin::consensus::serialize; use bdk::wallet::AddressIndex::New; -fn main() -> Result<(), bdk::Error> { +fn main() -> Result<(), bdk::Error> { let client = Client::new("ssl://electrum.blockstream.info:60002")?; let wallet = Wallet::new( "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", @@ -95,7 +97,7 @@ interact with the bitcoin P2P network.

    Ok(()) }
    -

    Sign a transaction

    Example

    +

    Sign a transaction

    Example

    use std::str::FromStr;
     
     use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;
    @@ -103,7 +105,7 @@ interact with the bitcoin P2P network.

    use bdk::{Wallet, SignOptions}; use bdk::database::MemoryDatabase; -fn main() -> Result<(), bdk::Error> { +fn main() -> Result<(), bdk::Error> { let wallet = Wallet::new_offline( "wpkh([c258d2e4/84h/1h/0h]tprv8griRPhA7342zfRyB6CqeKF8CJDXYu5pgnj1cjL1u2ngKcJha5jjTRimG82ABzJQ4MQe71CV54xfn25BbhCNfEGGJZnxvCDQCd6JkbvxW6h/0/*)", Some("wpkh([c258d2e4/84h/1h/0h]tprv8griRPhA7342zfRyB6CqeKF8CJDXYu5pgnj1cjL1u2ngKcJha5jjTRimG82ABzJQ4MQe71CV54xfn25BbhCNfEGGJZnxvCDQCd6JkbvxW6h/1/*)"), @@ -114,11 +116,11 @@ interact with the bitcoin P2P network.

    let psbt = "..."; let mut psbt = Psbt::from_str(psbt)?; - let finalized = wallet.sign(&mut psbt, SignOptions::default())?; + let finalized = wallet.sign(&mut psbt, SignOptions::default())?; Ok(()) }
    -

    Feature flags

    +

    Feature flags

    BDK uses a set of feature flags to reduce the amount of compiled code by allowing projects to only enable the features they need. By default, BDK enables two internal features, key-value-db and electrum.

    @@ -131,7 +133,7 @@ Below is a list of the available feature flags and the additional functionality
  • async-interface: async functions in bdk traits
  • keys-bip39: BIP-39 mnemonic codes for generating deterministic keys
  • -

    Internal features

    +

    Internal features

    These features do not expose any new API, but influence internal implementation aspects of BDK.

      @@ -140,30 +142,31 @@ BDK.

    • esplora: esplora client protocol for interacting with blockstream electrs servers
    • key-value-db: key value database based on sled for caching blockchain data
    -

    Re-exports

    -
    pub extern crate bitcoin;
    pub extern crate electrum_client;
    pub extern crate miniscript;
    pub extern crate rusqlite;
    pub extern crate sled;
    pub use descriptor::template;
    pub use descriptor::HdKeyPaths;
    pub use wallet::address_validator;
    pub use wallet::signer;
    pub use wallet::signer::SignOptions;
    pub use wallet::tx_builder::TxBuilder;
    pub use wallet::Wallet;

    Modules

    -

    Blockchain backends

    -

    Database types

    -

    Descriptors

    -

    Key formats

    -

    Wallet

    -

    Macros

    -

    Macro to write full descriptors with code

    -

    Macro to write descriptor fragments with code

    -

    Structs

    -

    Block height and timestamp of the block containing the confirmed transaction

    -

    Fee rate

    -

    An unspent output owned by a Wallet.

    -

    A wallet transaction

    -

    A Utxo with its satisfaction_weight.

    -

    Enums

    -

    Errors that can be thrown by the Wallet

    -

    Types of keychains

    -

    An unspent transaction output (UTXO).

    -

    Traits

    -

    Trait implemented by types that can be used to measure weight units.

    -

    Functions

    -

    Get the version of BDK at runtime

    -
    - +

    Re-exports

    +
    pub extern crate bitcoin;
    pub extern crate electrum_client;
    pub extern crate miniscript;
    pub extern crate rusqlite;
    pub extern crate sled;
    pub use descriptor::template;
    pub use descriptor::HdKeyPaths;
    pub use wallet::address_validator;
    pub use wallet::signer;
    pub use wallet::signer::SignOptions;
    pub use wallet::tx_builder::TxBuilder;
    pub use wallet::Wallet;

    Modules

    +

    Blockchain backends

    +

    Database types

    +

    Descriptors

    +

    Key formats

    +

    Wallet

    +

    Macros

    +

    Macro to write full descriptors with code

    +

    Macro to write descriptor fragments with code

    +

    Structs

    +

    Block height and timestamp of a block

    +

    Fee rate

    +

    An unspent output owned by a Wallet.

    +

    A wallet transaction

    +

    A Utxo with its satisfaction_weight.

    +

    Enums

    +

    Errors that can be thrown by the Wallet

    +

    Types of keychains

    +

    An unspent transaction output (UTXO).

    +

    Traits

    +

    Trait implemented by types that can be used to measure weight units.

    +

    Functions

    +

    Get the version of BDK at runtime

    +

    Type Definitions

    +

    DEPRECATED: Confirmation time of a transaction

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.Language.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.Language.html index 64cd628ef5..4b30304896 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.Language.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.Language.html @@ -1,49 +1,52 @@ -Language in bdk::keys::bip39 - Rust

    Enum bdk::keys::bip39::Language[]

    pub enum Language {
    +Language in bdk::keys::bip39 - Rust
    +    
    logo

    Enum bdk::keys::bip39::Language[]

    pub enum Language {
         English,
    -    ChineseSimplified,
    -    ChineseTraditional,
    -    French,
    -    Italian,
    -    Japanese,
    -    Korean,
    -    Spanish,
    -}
    This is supported on crate feature keys-bip39 only.
    Expand description

    The language determines which words will be used in a mnemonic phrase, but also indirectly -determines the binary value of each word when a Mnemonic is turned into a Seed.

    -

    These are not of much use right now, and may even be removed from the crate, as there is no -official language specified by the standard except English.

    -

    Variants

    English
    ChineseSimplified
    ChineseTraditional
    French
    Italian
    Japanese
    Korean
    Spanish

    Implementations

    Construct a word list from its language code. Returns None -if the language code is not valid or not supported.

    -

    Get the word list for this language

    -

    Get a [WordMap][WordMap] that allows word -> index lookups in the word list

    -

    The index of an individual word in the word list is used as the binary value of that word -when the phrase is turned into a [Seed][Seed].

    +}
    This is supported on crate feature keys-bip39 only.
    Expand description

    Language to be used for the mnemonic phrase.

    +

    The English language is always available, other languages are enabled using +the compilation features.

    +

    Variants

    English

    The English language.

    +

    Implementations

    The list of supported languages. +Language support is managed by compile features.

    +

    Get words from the word list that start with the given prefix.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    -

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

    +

    Formats the value using the given formatter. Read more

    +

    Feeds this value into the given Hasher. Read more

    +

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

    +

    This method returns an Ordering between self and other. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    This method tests for !=.

    +

    This method returns an ordering between self and other values if one exists. Read more

    +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more

    +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.MnemonicType.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.MnemonicType.html deleted file mode 100644 index f7c6746c0e..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.MnemonicType.html +++ /dev/null @@ -1,111 +0,0 @@ -MnemonicType in bdk::keys::bip39 - Rust

    Enum bdk::keys::bip39::MnemonicType[]

    pub enum MnemonicType {
    -    Words12,
    -    Words15,
    -    Words18,
    -    Words21,
    -    Words24,
    -}
    This is supported on crate feature keys-bip39 only.
    Expand description

    Determines the number of words that will be present in a Mnemonic phrase

    -

    Also directly affects the amount of entropy that will be used to create a Mnemonic, -and therefore the cryptographic strength of the HD wallet keys/addresses that can be derived from -it using the Seed.

    -

    For example, a 12 word mnemonic phrase is essentially a friendly representation of a 128-bit key, -while a 24 word mnemonic phrase is essentially a 256-bit key.

    -

    If you know you want a specific phrase length, you can use the enum variant directly, for example -MnemonicType::Words12.

    -

    You can also get a MnemonicType that corresponds to one of the standard BIP39 key sizes by -passing arbitrary usize values:

    - -
    use bip39::{MnemonicType};
    -
    -let mnemonic_type = MnemonicType::for_key_size(128).unwrap();
    -

    Variants

    Words12
    Words15
    Words18
    Words21
    Words24

    Implementations

    Get a MnemonicType for a mnemonic phrase with a specific number of words

    -

    Specifying a word count not provided for by the BIP39 standard will return an Error -of kind ErrorKind::InvalidWordLength.

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let mnemonic_type = MnemonicType::for_word_count(12).unwrap();
    -

    Get a MnemonicType for a mnemonic phrase representing the given key size as bits

    -

    Specifying a key size not provided for by the BIP39 standard will return an Error -of kind ErrorKind::InvalidKeysize.

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let mnemonic_type = MnemonicType::for_key_size(128).unwrap();
    -

    Get a MnemonicType for an existing mnemonic phrase

    -

    This can be used when you need information about a mnemonic phrase based on the number of -words, for example you can get the entropy value using MnemonicType::entropy_bits.

    -

    Specifying a phrase that does not match one of the standard BIP39 phrase lengths will return -an Error of kind ErrorKind::InvalidWordLength. The phrase will not be validated in any -other way.

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let test_mnemonic = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -
    -let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();
    -
    -let entropy_bits = mnemonic_type.entropy_bits();
    -

    Return the number of entropy+checksum bits

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let test_mnemonic = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -
    -let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();
    -
    -let total_bits = mnemonic_type.total_bits();
    -

    Return the number of entropy bits

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let test_mnemonic = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -
    -let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();
    -
    -let entropy_bits = mnemonic_type.entropy_bits();
    -

    Return the number of checksum bits

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let test_mnemonic = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -
    -let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();
    -
    -let checksum_bits = mnemonic_type.checksum_bits();
    -

    Return the number of words

    -

    Example

    -
    use bip39::{MnemonicType};
    -
    -let mnemonic_type = MnemonicType::Words12;
    -
    -let word_count = mnemonic_type.word_count();
    -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

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

    -

    Formats the value using the given formatter. Read more

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    -

    The alignment of pointer.

    -

    The type for initializers.

    -

    Initializes a with the given initializer. Read more

    -

    Dereferences the given pointer. Read more

    -

    Mutably dereferences the given pointer. Read more

    -

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The resulting type after obtaining ownership.

    -

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.WordCount.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.WordCount.html new file mode 100644 index 0000000000..b95b2c5b27 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/enum.WordCount.html @@ -0,0 +1,31 @@ +WordCount in bdk::keys::bip39 - Rust +
    logo

    Enum bdk::keys::bip39::WordCount[][src]

    pub enum WordCount {
    +    Words12,
    +    Words15,
    +    Words18,
    +    Words21,
    +    Words24,
    +}
    This is supported on crate feature keys-bip39 only.
    Expand description

    Type describing entropy length (aka word count) in the mnemonic

    +

    Variants

    Words12

    12 words mnemonic (128 bits entropy)

    +

    Words15

    15 words mnemonic (160 bits entropy)

    +

    Words18

    18 words mnemonic (192 bits entropy)

    +

    Words21

    21 words mnemonic (224 bits entropy)

    +

    Words24

    24 words mnemonic (256 bits entropy)

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    +

    The alignment of pointer.

    +

    The type for initializers.

    +

    Initializes a with the given initializer. Read more

    +

    Dereferences the given pointer. Read more

    +

    Mutably dereferences the given pointer. Read more

    +

    Drops the object pointed to by the given pointer. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/index.html index 01e929c430..4af34a95c6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/index.html @@ -1,13 +1,12 @@ -bdk::keys::bip39 - Rust

    Module bdk::keys::bip39[][src]

    This is supported on crate feature keys-bip39 only.
    Expand description

    BIP-0039

    -

    Structs

    -

    The primary type in this crate, most tasks require creating or using one.

    -

    The secret value used to derive HD wallet addresses from a Mnemonic phrase.

    -

    Enums

    -

    The language determines which words will be used in a mnemonic phrase, but also indirectly -determines the binary value of each word when a Mnemonic is turned into a Seed.

    -

    Determines the number of words that will be present in a Mnemonic phrase

    -

    Type Definitions

    -

    Type for a BIP39 mnemonic with an optional passphrase

    -
    - +bdk::keys::bip39 - Rust +
    logo

    Module bdk::keys::bip39[][src]

    This is supported on crate feature keys-bip39 only.
    Expand description

    BIP-0039

    +

    Structs

    +

    A mnemonic code.

    +

    Enums

    +

    Language to be used for the mnemonic phrase.

    +

    Type describing entropy length (aka word count) in the mnemonic

    +

    Type Definitions

    +

    Type for a BIP39 mnemonic with an optional passphrase

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/sidebar-items.js index 4c0779de63..10e71d1882 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["Language","The language determines which words will be used in a mnemonic phrase, but also indirectly determines the binary value of each word when a `Mnemonic` is turned into a `Seed`."],["MnemonicType","Determines the number of words that will be present in a `Mnemonic` phrase"]],"struct":[["Mnemonic","The primary type in this crate, most tasks require creating or using one."],["Seed","The secret value used to derive HD wallet addresses from a `Mnemonic` phrase."]],"type":[["MnemonicWithPassphrase","Type for a BIP39 mnemonic with an optional passphrase"]]}); \ No newline at end of file +initSidebarItems({"enum":[["Language","Language to be used for the mnemonic phrase."],["WordCount","Type describing entropy length (aka word count) in the mnemonic"]],"struct":[["Mnemonic","A mnemonic code."]],"type":[["MnemonicWithPassphrase","Type for a BIP39 mnemonic with an optional passphrase"]]}); \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Mnemonic.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Mnemonic.html index c7b3c9a84c..34285bb25d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Mnemonic.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Mnemonic.html @@ -1,104 +1,97 @@ -Mnemonic in bdk::keys::bip39 - Rust

    Struct bdk::keys::bip39::Mnemonic[]

    pub struct Mnemonic { /* fields omitted */ }
    This is supported on crate feature keys-bip39 only.
    Expand description

    The primary type in this crate, most tasks require creating or using one.

    -

    To create a new Mnemonic from a randomly generated key, call Mnemonic::new().

    -

    To get a Mnemonic instance for an existing mnemonic phrase, including -those generated by other software or hardware wallets, use Mnemonic::from_phrase().

    -

    You can get the HD wallet Seed from a Mnemonic by calling Seed::new(). -From there you can either get the raw byte value with Seed::as_bytes(), or the hex -representation using Rust formatting: format!("{:X}", seed).

    -

    You can also get the original entropy value back from a Mnemonic with Mnemonic::entropy(), -but beware that the entropy value is not the same thing as an HD wallet seed, and should -never be used that way.

    -

    Implementations

    Generates a new Mnemonic

    -

    Use Mnemonic::phrase() to get an str slice of the generated phrase.

    -

    Example

    -
    use bip39::{Mnemonic, MnemonicType, Language};
    +Mnemonic in bdk::keys::bip39 - Rust
    +    
    logo

    Struct bdk::keys::bip39::Mnemonic[]

    pub struct Mnemonic { /* fields omitted */ }
    This is supported on crate feature keys-bip39 only.
    Expand description

    A mnemonic code.

    +

    The core::str::FromStr implementation will try to determine the language of the +mnemonic from all the supported languages. (Languages have to be explicitly enabled using +the Cargo features.)

    +

    Supported number of words are 12, 18 and 24.

    +

    Implementations

    Create a new Mnemonic in the specified language from the given entropy. +Entropy must be a multiple of 32 bits (4 bytes) and 128-256 bits in length.

    +

    Create a new English Mnemonic from the given entropy. +Entropy must be a multiple of 32 bits (4 bytes) and 128-256 bits in length.

    +

    Generate a new Mnemonic in the given language +with the given randomness source. +For the different supported word counts, see documentation on Mnemonic.

    +

    Example:

    -let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); -let phrase = mnemonic.phrase(); +
    extern crate rand;
    +extern crate bip39;
     
    -println!("phrase: {}", phrase);
    +use bip39::{Mnemonic, Language};
     
    -assert_eq!(phrase.split(" ").count(), 12);
    -

    Create a Mnemonic from pre-generated entropy

    -

    Example

    -
    use bip39::{Mnemonic, MnemonicType, Language};
    -
    -let entropy = &[0x33, 0xE4, 0x6B, 0xB1, 0x3A, 0x74, 0x6E, 0xA4, 0x1C, 0xDD, 0xE4, 0x5C, 0x90, 0x84, 0x6A, 0x79];
    -let mnemonic = Mnemonic::from_entropy(entropy, Language::English).unwrap();
    -
    -assert_eq!("crop cash unable insane eight faith inflict route frame loud box vibrant", mnemonic.phrase());
    -assert_eq!("33E46BB13A746EA41CDDE45C90846A79", format!("{:X}", mnemonic));
    -

    Create a Mnemonic from an existing mnemonic phrase

    -

    The phrase supplied will be checked for word length and validated according to the checksum -specified in BIP0039

    -

    Example

    -
    use bip39::{Mnemonic, Language};
    -
    -let phrase = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();
    -
    -assert_eq!(phrase, mnemonic.phrase());
    -

    Validate a mnemonic phrase

    -

    The phrase supplied will be checked for word length and validated according to the checksum -specified in BIP0039.

    -

    Example

    -
    use bip39::{Mnemonic, Language};
    -
    -let test_mnemonic = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -
    -assert!(Mnemonic::validate(test_mnemonic, Language::English).is_ok());
    -

    Get the mnemonic phrase as a string reference.

    -

    Consume the Mnemonic and return the phrase as a String.

    -

    This operation doesn’t perform any allocations.

    -

    Get the original entropy value of the mnemonic phrase as a slice.

    -

    Example

    -
    use bip39::{Mnemonic, Language};
    -
    -let phrase = "park remain person kitchen mule spell knee armed position rail grid ankle";
    -
    -let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();
    -
    -let entropy: &[u8] = mnemonic.entropy();
    -

    Note: You shouldn’t use the generated entropy as secrets, for that generate a new -Seed from the Mnemonic.

    -

    Get the Language

    -

    Trait Implementations

    Performs the conversion.

    -

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +let mut rng = rand::thread_rng(); +let m = Mnemonic::generate_in_with(&mut rng, Language::English, 24).unwrap();
    +

    Get the language of the Mnemonic.

    +

    Get an iterator over the words.

    +

    Determine the language of the mnemonic.

    +

    NOTE: This method only guarantees that the returned language is the +correct language on the assumption that the mnemonic is valid. +It does not itself validate the mnemonic.

    +

    Some word lists don’t guarantee that their words don’t occur in other +word lists. In the extremely unlikely case that a word list can be +interpreted in multiple languages, an [Error::AmbiguousLanguages] is +returned, containing the possible languages.

    +

    Parse a mnemonic in normalized UTF8 in the given language.

    +

    Parse a mnemonic in normalized UTF8.

    +

    Parse a mnemonic in the given language.

    +

    Parse a mnemonic and detect the language from the enabled languages.

    +

    Get the number of words in the mnemonic.

    +

    Convert to seed bytes with a passphrase in normalized UTF8.

    +

    Convert to seed bytes.

    +

    Convert the mnemonic back to the entropy used to generate it. +The return value is a byte array and the size. +Use Mnemonic::to_entropy (needs std) to get a Vec.

    +

    Convert the mnemonic back to the entropy used to generate it.

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    -

    Consume self and turn it into an ExtendedKey Read more

    -

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as +

    Consume self and turn it into an ExtendedKey Read more

    +

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as key origin and derivation path Read more

    -

    Formats the value using the given formatter. Read more

    -

    Type specifying the amount of entropy required e.g. [u8;32]

    -

    Extra options required by the generate_with_entropy

    -

    Returned error in case of failure

    -

    Generate a key given the extra options and the entropy

    -

    Generate a key given the options with a random entropy

    -

    Formats the value using the given formatter.

    -

    Formats the value using the given formatter.

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Deserialize this value from the given Serde deserializer. Read more

    +

    Formats the value using the given formatter. Read more

    +

    The associated error which can be returned from parsing.

    +

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

    +

    Type specifying the amount of entropy required e.g. [u8;32]

    +

    Extra options required by the generate_with_entropy

    +

    Returned error in case of failure

    +

    Generate a key given the extra options and the entropy

    +

    Generate a key given the options with a random entropy

    +

    Feeds this value into the given Hasher. Read more

    +

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

    +

    This method returns an Ordering between self and other. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    +

    This method tests for self and other values to be equal, and is used +by ==. Read more

    +

    This method tests for !=.

    +

    This method returns an ordering between self and other values if one exists. Read more

    +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more

    +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more

    +

    Serialize this value into the given Serde serializer. Read more

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    Outputs the hash in hexadecimal form

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Seed.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Seed.html deleted file mode 100644 index 383c9685a5..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/struct.Seed.html +++ /dev/null @@ -1,48 +0,0 @@ -Seed in bdk::keys::bip39 - Rust

    Struct bdk::keys::bip39::Seed[]

    pub struct Seed { /* fields omitted */ }
    This is supported on crate feature keys-bip39 only.
    Expand description

    The secret value used to derive HD wallet addresses from a Mnemonic phrase.

    -

    Because it is not possible to create a Mnemonic instance that is invalid, it is -therefore impossible to have a Seed instance that is invalid. This guarantees that only -a valid, intact mnemonic phrase can be used to derive HD wallet addresses.

    -

    To get the raw byte value use Seed::as_bytes(). These can be used to derive -HD wallet addresses using another crate (deriving HD wallet addresses is outside the scope of this -crate and the BIP39 standard).

    -

    Implementations

    Generates the seed from the Mnemonic and the password.

    -

    Get the seed value as a byte slice

    -

    Trait Implementations

    Performs the conversion.

    -

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

    Consume self and turn it into an ExtendedKey Read more

    -

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as -key origin and derivation path Read more

    -

    Formats the value using the given formatter.

    -

    Formats the value using the given formatter.

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Calculate the base32 serialized length

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Error type if conversion fails

    -

    Check if all values are in range and return array-like struct of u5 values

    -

    Performs the conversion.

    -

    Performs the conversion.

    -

    The alignment of pointer.

    -

    The type for initializers.

    -

    Initializes a with the given initializer. Read more

    -

    Dereferences the given pointer. Read more

    -

    Mutably dereferences the given pointer. Read more

    -

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    Encode as base32 and write it to the supplied writer -Implementations shouldn’t allocate. Read more

    -

    Convert Self to base32 vector

    -

    Outputs the hash in hexadecimal form

    -

    The resulting type after obtaining ownership.

    -

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/type.MnemonicWithPassphrase.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/type.MnemonicWithPassphrase.html index 1b98adebbf..dae1b7bae2 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/type.MnemonicWithPassphrase.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/bip39/type.MnemonicWithPassphrase.html @@ -1,7 +1,8 @@ -MnemonicWithPassphrase in bdk::keys::bip39 - Rust

    Type Definition bdk::keys::bip39::MnemonicWithPassphrase[][src]

    pub type MnemonicWithPassphrase = (Mnemonic, Option<String>);
    This is supported on crate feature keys-bip39 only.
    Expand description

    Type for a BIP39 mnemonic with an optional passphrase

    -

    Trait Implementations

    Consume self and turn it into an ExtendedKey Read more

    -

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as +MnemonicWithPassphrase in bdk::keys::bip39 - Rust +

    logo

    Type Definition bdk::keys::bip39::MnemonicWithPassphrase[][src]

    pub type MnemonicWithPassphrase = (Mnemonic, Option<String>);
    This is supported on crate feature keys-bip39 only.
    Expand description

    Type for a BIP39 mnemonic with an optional passphrase

    +

    Trait Implementations

    Consume self and turn it into an ExtendedKey Read more

    +

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as key origin and derivation path Read more

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorKey.html index 8a5149114e..315ada672e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorKey.html @@ -1,28 +1,28 @@ -DescriptorKey in bdk::keys - Rust

    Enum bdk::keys::DescriptorKey[][src]

    pub enum DescriptorKey<Ctx: ScriptContext> {
    +DescriptorKey in bdk::keys - Rust
    +    
    logo

    Enum bdk::keys::DescriptorKey[][src]

    pub enum DescriptorKey<Ctx: ScriptContext> {
         // some variants omitted
     }
    Expand description

    Container for public or secret keys

    Implementations

    Create an instance given a public key and a set of valid networks

    Create an instance given a secret key and a set of valid networks

    Override the computed set of valid networks

    Trait Implementations

    Formats the value using the given formatter. Read more

    -

    The “identity” conversion is used internally by some bdk::fragments

    -

    Turn the key into a DescriptorKey within the requested ScriptContext

    +

    The “identity” conversion is used internally by some bdk::fragments

    +

    Turn the key into a DescriptorKey within the requested ScriptContext

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorPublicKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorPublicKey.html index 4253281299..8669d08639 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorPublicKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorPublicKey.html @@ -1,11 +1,13 @@ -DescriptorPublicKey in bdk::keys - Rust

    Enum bdk::keys::DescriptorPublicKey[]

    pub enum DescriptorPublicKey {
    +DescriptorPublicKey in bdk::keys - Rust
    +    
    logo

    Enum bdk::keys::DescriptorPublicKey[]

    pub enum DescriptorPublicKey {
         SinglePub(DescriptorSinglePub),
         XPub(DescriptorXKey<ExtendedPubKey>),
     }
    Expand description

    The MiniscriptKey corresponding to Descriptors. This can either be Single public key or a Xpub

    -

    Variants

    Single Public Key

    -

    Tuple Fields of SinglePub

    XPub(DescriptorXKey<ExtendedPubKey>)

    Xpub

    -

    Tuple Fields of XPub

    0: DescriptorXKey<ExtendedPubKey>

    Implementations

    The fingerprint of the master key associated with this key

    +

    Variants

    SinglePub(DescriptorSinglePub)

    Tuple Fields

    Single Public Key

    +

    XPub(DescriptorXKey<ExtendedPubKey>)

    Tuple Fields

    0: DescriptorXKey<ExtendedPubKey>

    Xpub

    +

    Implementations

    The fingerprint of the master key associated with this key

    Full path, from the master key

    For wildcard keys this will return the path up to the wildcard, so you can get full paths by appending one additional derivation step, according @@ -21,14 +23,14 @@ to avoid hardened derivation steps, start from a DescriptorSecretKeyas_public, or call TranslatePk2::translate_pk2 with some function which has access to secret key data.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

    Formats the value using the given formatter. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

    Formats the value using the given formatter. Read more

    The associated error which can be returned from parsing.

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

    Feeds this value into the given Hasher. Read more

    -

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

    -

    Turn the key into a DescriptorKey within the requested ScriptContext

    +

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

    +

    Turn the key into a DescriptorKey within the requested ScriptContext

    The associated Hash type with the publicKey

    Check if the publicKey is uncompressed. The default implementation returns false Read more

    @@ -36,40 +38,37 @@ implementation returns false Read more

    Computes the size of a public key when serialized in a script, including the length bytes Read more

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorSecretKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorSecretKey.html index 9359492fb1..2251b19115 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorSecretKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.DescriptorSecretKey.html @@ -1,37 +1,37 @@ -DescriptorSecretKey in bdk::keys - Rust

    Enum bdk::keys::DescriptorSecretKey[]

    pub enum DescriptorSecretKey {
    +DescriptorSecretKey in bdk::keys - Rust
    +    
    logo

    Enum bdk::keys::DescriptorSecretKey[]

    pub enum DescriptorSecretKey {
         SinglePriv(DescriptorSinglePriv),
         XPrv(DescriptorXKey<ExtendedPrivKey>),
     }
    Expand description

    A Secret Key that can be either a single key or an Xprv

    -

    Variants

    Single Secret Key

    -

    Tuple Fields of SinglePriv

    XPrv(DescriptorXKey<ExtendedPrivKey>)

    Xprv

    -

    Tuple Fields of XPrv

    0: DescriptorXKey<ExtendedPrivKey>

    Implementations

    Return the public version of this key, by applying either +

    Variants

    SinglePriv(DescriptorSinglePriv)

    Tuple Fields

    Single Secret Key

    +

    XPrv(DescriptorXKey<ExtendedPrivKey>)

    Tuple Fields

    0: DescriptorXKey<ExtendedPrivKey>

    Xprv

    +

    Implementations

    Return the public version of this key, by applying either DescriptorSinglePriv::as_public or [DescriptorXKey<bip32::ExtendedPrivKey>::as_public] depending on the type of key.

    If the key is an “XPrv”, the hardened derivation steps will be applied before converting it to a public key. See the documentation of [DescriptorXKey<bip32::ExtendedPrivKey>::as_public] for more details.

    -

    Trait Implementations

    Formats the value using the given formatter. Read more

    -

    Formats the value using the given formatter. Read more

    +

    Trait Implementations

    Formats the value using the given formatter. Read more

    +

    Formats the value using the given formatter. Read more

    The associated error which can be returned from parsing.

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

    -

    Turn the key into a DescriptorKey within the requested ScriptContext

    +

    Turn the key into a DescriptorKey within the requested ScriptContext

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ExtendedKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ExtendedKey.html index 495b49355f..d804a9858c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ExtendedKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ExtendedKey.html @@ -1,39 +1,39 @@ -ExtendedKey in bdk::keys - Rust

    Enum bdk::keys::ExtendedKey[][src]

    pub enum ExtendedKey<Ctx: ScriptContext = Legacy> {
    +ExtendedKey in bdk::keys - Rust
    +    
    logo

    Enum bdk::keys::ExtendedKey[][src]

    pub enum ExtendedKey<Ctx: ScriptContext = Legacy> {
         Private((ExtendedPrivKey, PhantomData<Ctx>)),
         Public((ExtendedPubKey, PhantomData<Ctx>)),
     }
    Expand description

    Enum for extended keys that can be either xprv or xpub

    An instance of ExtendedKey can be constructed from an ExtendedPrivKey or an ExtendedPubKey by using the From trait.

    Defaults to the Legacy context.

    -

    Variants

    Private((ExtendedPrivKey, PhantomData<Ctx>))

    A private extended key, aka an xprv

    -

    Tuple Fields of Private

    0: (ExtendedPrivKey, PhantomData<Ctx>)
    Public((ExtendedPubKey, PhantomData<Ctx>))

    A public extended key, aka an xpub

    -

    Tuple Fields of Public

    0: (ExtendedPubKey, PhantomData<Ctx>)

    Implementations

    Return whether or not the key contains the private data

    -

    Transform the ExtendedKey into an ExtendedPrivKey for the +

    Variants

    Private((ExtendedPrivKey, PhantomData<Ctx>))

    Tuple Fields

    0: (ExtendedPrivKey, PhantomData<Ctx>)

    A private extended key, aka an xprv

    +

    Public((ExtendedPubKey, PhantomData<Ctx>))

    Tuple Fields

    0: (ExtendedPubKey, PhantomData<Ctx>)

    A public extended key, aka an xpub

    +

    Implementations

    Return whether or not the key contains the private data

    +

    Transform the ExtendedKey into an ExtendedPrivKey for the given [Network], if the key contains the private data

    -

    Transform the ExtendedKey into an ExtendedPubKey for the +

    Transform the ExtendedKey into an ExtendedPubKey for the given [Network]

    -

    Trait Implementations

    Identity conversion

    -

    Consume self and turn it into an ExtendedKey Read more

    -

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as +

    Trait Implementations

    Identity conversion

    +

    Consume self and turn it into an ExtendedKey Read more

    +

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as key origin and derivation path Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Performs the conversion.

    +

    Performs the conversion.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.KeyError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.KeyError.html index e06474c06f..604f3d2719 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.KeyError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.KeyError.html @@ -1,4 +1,6 @@ -KeyError in bdk::keys - Rust

    Enum bdk::keys::KeyError[][src]

    pub enum KeyError {
    +KeyError in bdk::keys - Rust
    +    
    logo

    Enum bdk::keys::KeyError[][src]

    pub enum KeyError {
         InvalidScriptContext,
         InvalidNetwork,
         InvalidChecksum,
    @@ -6,48 +8,37 @@
         Bip32(Error),
         Miniscript(Error),
     }
    Expand description

    Errors thrown while working with keys

    -

    Variants

    InvalidScriptContext

    The key cannot exist in the given script context

    -
    InvalidNetwork

    The key is not valid for the given network

    -
    InvalidChecksum

    The key has an invalid checksum

    -
    Message(String)

    Custom error message

    -

    Tuple Fields of Message

    0: String
    Bip32(Error)

    BIP32 error

    -

    Tuple Fields of Bip32

    0: Error
    Miniscript(Error)

    Miniscript error

    -

    Tuple Fields of Miniscript

    0: Error

    Trait Implementations

    Formats the value using the given formatter. Read more

    -

    Formats the value using the given formatter. Read more

    -

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

    +

    Variants

    InvalidScriptContext

    The key cannot exist in the given script context

    +

    InvalidNetwork

    The key is not valid for the given network

    +

    InvalidChecksum

    The key has an invalid checksum

    +

    Message(String)

    Tuple Fields

    0: String

    Custom error message

    +

    Bip32(Error)

    Tuple Fields

    0: Error

    BIP32 error

    +

    Miniscript(Error)

    Tuple Fields

    0: Error

    Miniscript error

    +

    Trait Implementations

    Formats the value using the given formatter. Read more

    +

    Formats the value using the given formatter. Read more

    +

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

    🔬 This is a nightly-only experimental API. (backtrace)

    Returns a stack backtrace, if available, of where this error occurred. Read more

    👎 Deprecated since 1.42.0:

    use the Display impl or to_string()

    👎 Deprecated since 1.33.0:

    replaced by Error::source, which can support downcasting

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Performs the conversion.

    +

    Performs the conversion.

    Performs the conversion.

    Performs the conversion.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Converts a reference to Self into a dynamic trait object of Fail.

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Returns the “name” of the error. Read more

    -

    Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

    -

    Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

    -

    Provides context for this failure. Read more

    -

    Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ScriptContextEnum.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ScriptContextEnum.html index 1a209b5c87..62fcd7b83e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ScriptContextEnum.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/enum.ScriptContextEnum.html @@ -1,37 +1,36 @@ -ScriptContextEnum in bdk::keys - Rust

    Enum bdk::keys::ScriptContextEnum[][src]

    pub enum ScriptContextEnum {
    +ScriptContextEnum in bdk::keys - Rust
    +    
    logo

    Enum bdk::keys::ScriptContextEnum[][src]

    pub enum ScriptContextEnum {
         Legacy,
         Segwitv0,
     }
    Expand description

    Enum representation of the known valid ScriptContexts

    -

    Variants

    Legacy

    Legacy scripts

    -
    Segwitv0

    Segwitv0 scripts

    +

    Variants

    Legacy

    Legacy scripts

    +

    Segwitv0

    Segwitv0 scripts

    Implementations

    Returns whether the script context is ScriptContextEnum::Legacy

    Returns whether the script context is ScriptContextEnum::Segwitv0

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    +

    This method tests for !=.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.any_network.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.any_network.html index 3fdb567cb4..018497e614 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.any_network.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.any_network.html @@ -1,4 +1,5 @@ -any_network in bdk::keys - Rust

    Function bdk::keys::any_network[][src]

    pub fn any_network() -> ValidNetworks
    Expand description

    Create a set containing mainnet, testnet and regtest

    -
    - +any_network in bdk::keys - Rust +
    logo

    Function bdk::keys::any_network[][src]

    pub fn any_network() -> ValidNetworks
    Expand description

    Create a set containing mainnet, testnet and regtest

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.mainnet_network.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.mainnet_network.html index 5753bd5e40..11b412a984 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.mainnet_network.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.mainnet_network.html @@ -1,4 +1,5 @@ -mainnet_network in bdk::keys - Rust

    Function bdk::keys::mainnet_network[][src]

    pub fn mainnet_network() -> ValidNetworks
    Expand description

    Create a set only containing mainnet

    -
    - +mainnet_network in bdk::keys - Rust +
    logo

    Function bdk::keys::mainnet_network[][src]

    pub fn mainnet_network() -> ValidNetworks
    Expand description

    Create a set only containing mainnet

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.merge_networks.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.merge_networks.html index 9b15a7abda..bbec6619de 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.merge_networks.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.merge_networks.html @@ -1,4 +1,5 @@ -merge_networks in bdk::keys - Rust

    Function bdk::keys::merge_networks[][src]

    pub fn merge_networks(a: &ValidNetworks, b: &ValidNetworks) -> ValidNetworks
    Expand description

    Compute the intersection of two sets

    -
    - +merge_networks in bdk::keys - Rust +
    logo

    Function bdk::keys::merge_networks[][src]

    pub fn merge_networks(a: &ValidNetworks, b: &ValidNetworks) -> ValidNetworks
    Expand description

    Compute the intersection of two sets

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.test_networks.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.test_networks.html index efa8335377..f9004c163e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.test_networks.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/fn.test_networks.html @@ -1,4 +1,5 @@ -test_networks in bdk::keys - Rust

    Function bdk::keys::test_networks[][src]

    pub fn test_networks() -> ValidNetworks
    Expand description

    Create a set containing testnet and regtest

    -
    - +test_networks in bdk::keys - Rust +
    logo

    Function bdk::keys::test_networks[][src]

    pub fn test_networks() -> ValidNetworks
    Expand description

    Create a set containing testnet and regtest

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/index.html index 45a9223788..482753c1cf 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/index.html @@ -1,38 +1,39 @@ -bdk::keys - Rust

    Module bdk::keys[][src]

    Expand description

    Key formats

    -

    Modules

    -
    bip39keys-bip39

    BIP-0039

    -

    Structs

    -

    A Single Descriptor Secret Key with optional origin information

    -

    A Single Descriptor Key with optional origin information

    -

    Output of a GeneratableKey key generation

    -

    Options for generating a [PrivateKey]

    -

    Contents of a “sortedmulti” descriptor

    -

    Enums

    -

    Container for public or secret keys

    -

    The MiniscriptKey corresponding to Descriptors. This can +bdk::keys - Rust +

    logo

    Module bdk::keys[][src]

    Expand description

    Key formats

    +

    Modules

    +
    bip39keys-bip39

    BIP-0039

    +

    Structs

    +

    A Single Descriptor Secret Key with optional origin information

    +

    A Single Descriptor Key with optional origin information

    +

    Output of a GeneratableKey key generation

    +

    Options for generating a [PrivateKey]

    +

    Contents of a “sortedmulti” descriptor

    +

    Enums

    +

    Container for public or secret keys

    +

    The MiniscriptKey corresponding to Descriptors. This can either be Single public key or a Xpub

    -

    A Secret Key that can be either a single key or an Xprv

    -

    Enum for extended keys that can be either xprv or xpub

    -

    Errors thrown while working with keys

    -

    Enum representation of the known valid ScriptContexts

    -

    Traits

    -

    Trait for keys that can be derived.

    -

    Trait that adds extra useful methods to ScriptContexts

    -

    Trait that allows generating a key with the default options

    -

    Trait for keys that can be generated

    -

    Trait for objects that can be turned into a public or secret DescriptorKey

    -

    The ScriptContext for Miniscript. Additional type information associated with +

    A Secret Key that can be either a single key or an Xprv

    +

    Enum for extended keys that can be either xprv or xpub

    +

    Errors thrown while working with keys

    +

    Enum representation of the known valid ScriptContexts

    +

    Traits

    +

    Trait for keys that can be derived.

    +

    Trait that adds extra useful methods to ScriptContexts

    +

    Trait that allows generating a key with the default options

    +

    Trait for keys that can be generated

    +

    Trait for objects that can be turned into a public or secret DescriptorKey

    +

    The ScriptContext for Miniscript. Additional type information associated with miniscript that is used for carrying out checks that dependent on the context under which the script is used. For example, disallowing uncompressed keys in Segwit context

    -

    Functions

    -

    Create a set containing mainnet, testnet and regtest

    -

    Create a set only containing mainnet

    -

    Compute the intersection of two sets

    -

    Create a set containing testnet and regtest

    -

    Type Definitions

    -

    Alias type for a map of public key to secret key

    -

    Set of valid networks for a key

    -
    - +

    Functions

    +

    Create a set containing mainnet, testnet and regtest

    +

    Create a set only containing mainnet

    +

    Compute the intersection of two sets

    +

    Create a set containing testnet and regtest

    +

    Type Definitions

    +

    Alias type for a map of public key to secret key

    +

    Set of valid networks for a key

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePriv.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePriv.html index cafc8126d2..b2ce7dba59 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePriv.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePriv.html @@ -1,4 +1,6 @@ -DescriptorSinglePriv in bdk::keys - Rust

    Struct bdk::keys::DescriptorSinglePriv[]

    pub struct DescriptorSinglePriv {
    +DescriptorSinglePriv in bdk::keys - Rust
    +    
    logo

    Struct bdk::keys::DescriptorSinglePriv[]

    pub struct DescriptorSinglePriv {
         pub origin: Option<(Fingerprint, DerivationPath)>,
         pub key: PrivateKey,
     }
    Expand description

    A Single Descriptor Secret Key with optional origin information

    @@ -6,21 +8,19 @@
    key: PrivateKey

    The key

    Trait Implementations

    Formats the value using the given formatter. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePub.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePub.html index c568502a7d..40ca11156f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePub.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.DescriptorSinglePub.html @@ -1,48 +1,47 @@ -DescriptorSinglePub in bdk::keys - Rust

    Struct bdk::keys::DescriptorSinglePub[]

    pub struct DescriptorSinglePub {
    +DescriptorSinglePub in bdk::keys - Rust
    +    
    logo

    Struct bdk::keys::DescriptorSinglePub[]

    pub struct DescriptorSinglePub {
         pub origin: Option<(Fingerprint, DerivationPath)>,
         pub key: PublicKey,
     }
    Expand description

    A Single Descriptor Key with optional origin information

    Fields

    origin: Option<(Fingerprint, DerivationPath)>

    Origin information

    key: PublicKey

    The key

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    Feeds this value into the given Hasher. Read more

    -

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

    +

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

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.GeneratedKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.GeneratedKey.html index 8f36f2d9a5..96ce148b75 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.GeneratedKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.GeneratedKey.html @@ -1,27 +1,27 @@ -GeneratedKey in bdk::keys - Rust

    Struct bdk::keys::GeneratedKey[][src]

    pub struct GeneratedKey<K, Ctx: ScriptContext> { /* fields omitted */ }
    Expand description

    Output of a GeneratableKey key generation

    -

    Implementations

    Consumes self and returns the key

    -

    Trait Implementations

    The resulting type after dereferencing.

    -

    Dereferences the value.

    -

    Consume self and turn it into an ExtendedKey Read more

    -

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as +GeneratedKey in bdk::keys - Rust +

    logo

    Struct bdk::keys::GeneratedKey[][src]

    pub struct GeneratedKey<K, Ctx: ScriptContext> { /* fields omitted */ }
    Expand description

    Output of a GeneratableKey key generation

    +

    Implementations

    Consumes self and returns the key

    +

    Trait Implementations

    The resulting type after dereferencing.

    +

    Dereferences the value.

    +

    Consume self and turn it into an ExtendedKey Read more

    +

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as key origin and derivation path Read more

    -

    Turn the key into a DescriptorKey within the requested ScriptContext

    +

    Turn the key into a DescriptorKey within the requested ScriptContext

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.PrivateKeyGenerateOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.PrivateKeyGenerateOptions.html index 672f14fa46..051910e1fe 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.PrivateKeyGenerateOptions.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.PrivateKeyGenerateOptions.html @@ -1,32 +1,31 @@ -PrivateKeyGenerateOptions in bdk::keys - Rust

    Struct bdk::keys::PrivateKeyGenerateOptions[][src]

    pub struct PrivateKeyGenerateOptions {
    +PrivateKeyGenerateOptions in bdk::keys - Rust
    +    
    logo

    Struct bdk::keys::PrivateKeyGenerateOptions[][src]

    pub struct PrivateKeyGenerateOptions {
         pub compressed: bool,
     }
    Expand description

    Options for generating a [PrivateKey]

    Defaults to creating compressed keys, which save on-chain bytes and fees

    Fields

    compressed: bool

    Whether the generated key should be “compressed” or not

    -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

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

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

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

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.SortedMultiVec.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.SortedMultiVec.html index 3b6320d80b..2144d5aa2a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.SortedMultiVec.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/struct.SortedMultiVec.html @@ -1,18 +1,20 @@ -SortedMultiVec in bdk::keys - Rust

    Struct bdk::keys::SortedMultiVec[]

    pub struct SortedMultiVec<Pk, Ctx> where
        Ctx: ScriptContext,
        Pk: MiniscriptKey, 
    { +SortedMultiVec in bdk::keys - Rust +
    logo

    Struct bdk::keys::SortedMultiVec[]

    pub struct SortedMultiVec<Pk, Ctx> where
        Pk: MiniscriptKey,
        Ctx: ScriptContext
    { pub k: usize, pub pks: Vec<Pk, Global>, // some fields omitted }
    Expand description

    Contents of a “sortedmulti” descriptor

    Fields

    k: usize

    signatures required

    pks: Vec<Pk, Global>

    public keys inside sorted Multi

    -

    Implementations

    Create a new instance of SortedMultiVec given a list of keys and the threshold

    +

    Implementations

    Create a new instance of SortedMultiVec given a list of keys and the threshold

    Internally checks all the applicable size limits and pubkey types limitations according to the current Ctx.

    Parse an expression tree into a SortedMultiVec

    -

    This will panic if translatefpk returns an uncompressed key when +

    This will panic if translatefpk returns an uncompressed key when converting to a Segwit descriptor. To prevent this panic, ensure translatefpk returns an error in this case instead.

    -

    utility function to sanity a sorted multi vec

    -

    Create Terminal::Multi containing sorted pubkeys

    +

    utility function to sanity a sorted multi vec

    +

    Create Terminal::Multi containing sorted pubkeys

    Encode as a Bitcoin script

    Attempt to produce a satisfying witness for the witness script represented by the parse tree

    @@ -36,52 +38,49 @@ will handle the segwit/non-segwit technicalities for you.

    All signatures are assumed to be 73 bytes in size, including the length prefix (segwit) or push opcode (pre-segwit) and sighash postfix.

    -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

    Formats the value using the given formatter. Read more

    -

    Run a predicate on every key in the descriptor, returning whether +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

    Formats the value using the given formatter. Read more

    +

    Run a predicate on every key in the descriptor, returning whether the predicate returned true for every key Read more

    Run a predicate on every key in the descriptor, returning whether the predicate returned true for any key Read more

    -

    Feeds this value into the given Hasher. Read more

    -

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

    -

    Convert the object into an abstract policy

    -

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    -

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

    Feeds this value into the given Hasher. Read more

    +

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

    +

    Convert the object into an abstract policy

    +

    This method returns an Ordering between self and other. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    +

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    -

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method returns an ordering between self and other values if one exists. Read more

    +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.DerivableKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.DerivableKey.html index cff040115c..9dd37e9768 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.DerivableKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.DerivableKey.html @@ -1,16 +1,18 @@ -DerivableKey in bdk::keys - Rust

    Trait bdk::keys::DerivableKey[][src]

    pub trait DerivableKey<Ctx: ScriptContext = Legacy>: Sized {
    +DerivableKey in bdk::keys - Rust
    +    
    logo

    Trait bdk::keys::DerivableKey[][src]

    pub trait DerivableKey<Ctx: ScriptContext = Legacy>: Sized {
         fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError>;
     
         fn into_descriptor_key(
            self,
            origin: Option<KeySource>,
            derivation_path: DerivationPath
        ) -> Result<DescriptorKey<Ctx>, KeyError> { ... } }
    Expand description

    Trait for keys that can be derived.

    -

    When extra metadata are provided, a DerivableKey can be transofrmed into a +

    When extra metadata are provided, a DerivableKey can be transformed into a DescriptorKey: the trait IntoDescriptorKey is automatically implemented for (DerivableKey, DerivationPath) and (DerivableKey, KeySource, DerivationPath) tuples.

    For key types that don’t encode any indication about the path to use (like bip39), it’s generally recommended to implemented this trait instead of IntoDescriptorKey. The same rules regarding script context and valid networks apply.

    -

    Examples

    +

    Examples

    Key types that can be directly converted into an ExtendedPrivKey or an ExtendedPubKey can implement only the required into_extended_key() method.

    @@ -25,7 +27,7 @@ an ExtendedPubKey can impleme } impl<Ctx: ScriptContext> DerivableKey<Ctx> for MyCustomKeyType { - fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> { + fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> { let xprv = bip32::ExtendedPrivKey { network: self.network, depth: 0, @@ -54,7 +56,7 @@ steps to override the set of valid networks, otherwise only the network specifie } impl<Ctx: ScriptContext> DerivableKey<Ctx> for MyCustomKeyType { - fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> { + fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> { let xprv = bip32::ExtendedPrivKey { network: bitcoin::Network::Bitcoin, // pick an arbitrary network here depth: 0, @@ -71,7 +73,7 @@ steps to override the set of valid networks, otherwise only the network specifie self, source: Option<bip32::KeySource>, derivation_path: bip32::DerivationPath, - ) -> Result<DescriptorKey<Ctx>, KeyError> { + ) -> Result<DescriptorKey<Ctx>, KeyError> { let descriptor_key = self .into_extended_key()? .into_descriptor_key(source, derivation_path)?; @@ -80,7 +82,7 @@ steps to override the set of valid networks, otherwise only the network specifie Ok(descriptor_key.override_valid_networks(any_network())) } }
    -

    Required methods

    Consume self and turn it into an ExtendedKey

    +

    Required methods

    Consume self and turn it into an ExtendedKey

    This can be used to get direct access to xprvs and xpubs for types that implement this trait, like Mnemonic when the keys-bip39 feature is enabled.

    @@ -89,15 +91,14 @@ like Mnemonic when the use bdk::keys::bip39::{Mnemonic, Language}; let xkey: ExtendedKey = - Mnemonic::from_phrase( + Mnemonic::parse_in( + Language::English, "jelly crash boy whisper mouse ecology tuna soccer memory million news short", - Language::English )? .into_extended_key()?; let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
    -

    Provided methods

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as +

    Provided methods

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as key origin and derivation path

    -

    Implementations on Foreign Types

    Implementors

    Identity conversion

    -
    - +

    Implementations on Foreign Types

    Implementors

    Identity conversion

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ExtScriptContext.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ExtScriptContext.html index 80e9abffa1..1a52350713 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ExtScriptContext.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ExtScriptContext.html @@ -1,4 +1,6 @@ -ExtScriptContext in bdk::keys - Rust

    Trait bdk::keys::ExtScriptContext[][src]

    pub trait ExtScriptContext: ScriptContext {
    +ExtScriptContext in bdk::keys - Rust
    +    
    logo

    Trait bdk::keys::ExtScriptContext[][src]

    pub trait ExtScriptContext: ScriptContext {
         fn as_enum() -> ScriptContextEnum;
     
         fn is_legacy() -> bool { ... }
    @@ -7,6 +9,5 @@
     

    Required methods

    Provided methods

    Returns whether the script context is Legacy

    Returns whether the script context is Segwitv0

    -

    Implementors

    - +

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableDefaultOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableDefaultOptions.html index 4e6cf622b1..bfd9417516 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableDefaultOptions.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableDefaultOptions.html @@ -1,12 +1,13 @@ -GeneratableDefaultOptions in bdk::keys - Rust

    Trait bdk::keys::GeneratableDefaultOptions[][src]

    pub trait GeneratableDefaultOptions<Ctx>: GeneratableKey<Ctx> where
        Ctx: ScriptContext,
        <Self as GeneratableKey<Ctx>>::Options: Default
    { +GeneratableDefaultOptions in bdk::keys - Rust +
    logo

    Trait bdk::keys::GeneratableDefaultOptions[][src]

    pub trait GeneratableDefaultOptions<Ctx>: GeneratableKey<Ctx> where
        Ctx: ScriptContext,
        <Self as GeneratableKey<Ctx>>::Options: Default
    { fn generate_with_entropy_default(
            entropy: Self::Entropy
        ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> { ... }
    fn generate_default() -> Result<GeneratedKey<Self, Ctx>, Self::Error> { ... } }
    Expand description

    Trait that allows generating a key with the default options

    This trait is automatically implemented if the GeneratableKey::Options implements Default.

    -

    Provided methods

    Generate a key with the default options and a given entropy

    -

    Generate a key with the default options and a random entropy

    -

    Implementors

    Automatic implementation of GeneratableDefaultOptions for GeneratableKeys where +

    Provided methods

    Generate a key with the default options and a given entropy

    +

    Generate a key with the default options and a random entropy

    +

    Implementors

    Automatic implementation of GeneratableDefaultOptions for GeneratableKeys where Options implements Default

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableKey.html index 49dc544363..d1bdeac7e8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.GeneratableKey.html @@ -1,4 +1,6 @@ -GeneratableKey in bdk::keys - Rust

    Trait bdk::keys::GeneratableKey[][src]

    pub trait GeneratableKey<Ctx: ScriptContext>: Sized {
    +GeneratableKey in bdk::keys - Rust
    +    
    logo

    Trait bdk::keys::GeneratableKey[][src]

    pub trait GeneratableKey<Ctx: ScriptContext>: Sized {
         type Entropy: AsMut<[u8]> + Default;
         type Options;
         type Error: Debug;
    @@ -11,11 +13,10 @@
     implements it, the returned GeneratedKey will also implement it. The same is true for
     IntoDescriptorKey: the generated keys can be directly used in descriptors if Self is also
     IntoDescriptorKey.

    -

    Associated Types

    Type specifying the amount of entropy required e.g. [u8;32]

    -

    Extra options required by the generate_with_entropy

    -

    Returned error in case of failure

    -

    Required methods

    Generate a key given the extra options and the entropy

    -

    Provided methods

    Generate a key given the options with a random entropy

    -

    Implementations on Foreign Types

    Implementors

    - +

    Associated Types

    Type specifying the amount of entropy required e.g. [u8;32]

    +

    Extra options required by the generate_with_entropy

    +

    Returned error in case of failure

    +

    Required methods

    Generate a key given the extra options and the entropy

    +

    Provided methods

    Generate a key given the options with a random entropy

    +

    Implementations on Foreign Types

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.IntoDescriptorKey.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.IntoDescriptorKey.html index 5287a61afd..f0b886c1d3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.IntoDescriptorKey.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.IntoDescriptorKey.html @@ -1,4 +1,6 @@ -IntoDescriptorKey in bdk::keys - Rust

    Trait bdk::keys::IntoDescriptorKey[][src]

    pub trait IntoDescriptorKey<Ctx: ScriptContext>: Sized {
    +IntoDescriptorKey in bdk::keys - Rust
    +    
    logo

    Trait bdk::keys::IntoDescriptorKey[][src]

    pub trait IntoDescriptorKey<Ctx: ScriptContext>: Sized {
         fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError>;
     }
    Expand description

    Trait for objects that can be turned into a public or secret DescriptorKey

    The generic type Ctx is used to define the context in which the key is valid: some key @@ -13,7 +15,7 @@ checking.

    Keys also have control over the networks they support: constructing the return object with DescriptorKey::from_public or DescriptorKey::from_secret allows to specify a set of ValidNetworks.

    -

    Examples

    +

    Examples

    Key type valid in any context:

    use bdk::bitcoin::PublicKey;
    @@ -25,7 +27,7 @@ checking.

    } impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for MyKeyType { - fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> { + fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> { self.pubkey.into_descriptor_key() } }
    @@ -43,7 +45,7 @@ checking.

    } impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for MyKeyType { - fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> { + fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> { Ok(DescriptorKey::from_public( DescriptorPublicKey::SinglePub(DescriptorSinglePub { origin: None, @@ -65,8 +67,8 @@ checking.

    } impl<Ctx: ScriptContext + 'static> IntoDescriptorKey<Ctx> for MyKeyType { - fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> { - if Ctx::is_legacy() == self.is_legacy { + fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> { + if Ctx::is_legacy() == self.is_legacy { self.pubkey.into_descriptor_key() } else { Err(KeyError::InvalidScriptContext) @@ -89,7 +91,7 @@ makes the compiler (correctly) fail.

    } impl IntoDescriptorKey<bdk::miniscript::Segwitv0> for MySegwitOnlyKeyType { - fn into_descriptor_key(self) -> Result<DescriptorKey<bdk::miniscript::Segwitv0>, KeyError> { + fn into_descriptor_key(self) -> Result<DescriptorKey<bdk::miniscript::Segwitv0>, KeyError> { self.pubkey.into_descriptor_key() } } @@ -101,7 +103,6 @@ makes the compiler (correctly) fail.

    // ^^^^^ changing this to `wpkh` would make it compile

    Required methods

    Turn the key into a DescriptorKey within the requested ScriptContext

    -

    Implementations on Foreign Types

    Implementors

    The “identity” conversion is used internally by some bdk::fragments

    -
    - +

    Implementations on Foreign Types

    Implementors

    The “identity” conversion is used internally by some bdk::fragments

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ScriptContext.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ScriptContext.html index b7710b728e..444cc79fb6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ScriptContext.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/trait.ScriptContext.html @@ -1,32 +1,34 @@ -ScriptContext in bdk::keys - Rust

    Trait bdk::keys::ScriptContext[]

    pub trait ScriptContext: Debug + Clone + Ord + PartialOrd<Self> + Eq + PartialEq<Self> + Hash + Sealed {
    -    fn check_terminal_non_malleable<Pk, Ctx>(
            _frag: &Terminal<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    ; -
    fn max_satisfaction_size<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Option<usize>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    ; +ScriptContext in bdk::keys - Rust +
    logo

    Trait bdk::keys::ScriptContext[]

    pub trait ScriptContext: Debug + Clone + Ord + PartialOrd<Self> + Eq + PartialEq<Self> + Hash + Sealed {
    +    fn check_terminal_non_malleable<Pk, Ctx>(
            _frag: &Terminal<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    ; +
    fn max_satisfaction_size<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Option<usize>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    ; - fn check_witness<Pk, Ctx>(
            _witness: &[Vec<u8, Global>]
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , + fn check_witness<Pk, Ctx>(
            _witness: &[Vec<u8, Global>]
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_global_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_global_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_global_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_global_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_local_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_local_consensus_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_local_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_local_policy_validity<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_global_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_global_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn check_local_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn check_local_validity<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), ScriptContextError>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn top_level_type_check<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn top_level_type_check<Pk, Ctx>(
            ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn other_top_level_checks<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn other_top_level_checks<Pk, Ctx>(
            _ms: &Miniscript<Pk, Ctx>
        ) -> Result<(), Error>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } -
    fn top_level_checks<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Result<(), Error>
        where
            Ctx: ScriptContext,
            Pk: MiniscriptKey
    , +
    fn top_level_checks<Pk, Ctx>(ms: &Miniscript<Pk, Ctx>) -> Result<(), Error>
        where
            Pk: MiniscriptKey,
            Ctx: ScriptContext
    , { ... } }
    Expand description

    The ScriptContext for Miniscript. Additional type information associated with miniscript that is used for carrying out checks that dependent on the context under which the script is used. For example, disallowing uncompressed keys in Segwit context

    -

    Required methods

    Depending on ScriptContext, fragments can be malleable. For Example, +

    Required methods

    Depending on ScriptContext, fragments can be malleable. For Example, under Legacy context, PkH is malleable because it is possible to estimate the cost of satisfaction because of compressed keys This is currently only used in compiler code for removing malleable @@ -34,11 +36,11 @@ compilations. This does NOT recursively check if the children of the fragment are valid or not. Since the compilation proceeds in a leaf to root fashion, a recursive check is unnecessary.

    -

    Depending on script context, the size of a satifaction witness may slightly differ.

    -

    Provided methods

    Check whether the given satisfaction is valid under the ScriptContext +

    Depending on script context, the size of a satifaction witness may slightly differ.

    +

    Provided methods

    Check whether the given satisfaction is valid under the ScriptContext For example, segwit satisfactions may fail if the witness len is more 3600 or number of stack elements are more than 100.

    -

    Depending on script Context, some of the Terminals might not +

    Depending on script Context, some of the Terminals might not be valid under the current consensus rules. Or some of the script resource limits may have been exceeded. These miniscripts would never be accepted by the Bitcoin network and hence @@ -48,7 +50,7 @@ uncompressed public keys are non-standard and thus invalid. In LegacyP2SH context, scripts above 520 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments.

    -

    Depending on script Context, some of the script resource limits +

    Depending on script Context, some of the script resource limits may have been exceeded under the current bitcoin core policy rules These miniscripts would never be accepted by the Bitcoin network and hence it is safe to discard them. (unless explicitly disabled by non-standard flag) @@ -56,22 +58,21 @@ For example, in Segwit Context with MiniscriptKey as bitcoin::PublicKey scripts over 3600 bytes are invalid. Post Tapscript upgrade, this would have to consider other nodes. This does NOT recursively check the miniscript fragments.

    -

    Consensus rules at the Miniscript satisfaction time. +

    Consensus rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path(Legacy/Segwitv0) may require more than 201 opcodes.

    -

    Policy rules at the Miniscript satisfaction time. +

    Policy rules at the Miniscript satisfaction time. It is possible that some paths of miniscript may exceed resource limits and our current satisfier and lifting analysis would not work correctly. For example, satisfaction path in Legacy context scriptSig more than 1650 bytes

    -

    Check the consensus + policy(if not disabled) rules that are not based +

    Check the consensus + policy(if not disabled) rules that are not based satisfaction

    -

    Check the consensus + policy(if not disabled) rules including the +

    Check the consensus + policy(if not disabled) rules including the ones for satisfaction

    -

    Check whether the top-level is type B

    -

    Other top level checks that are context specific

    -

    Check top level consensus rules.

    -

    Implementations on Foreign Types

    Implementors

    - +

    Check whether the top-level is type B

    +

    Other top level checks that are context specific

    +

    Check top level consensus rules.

    +

    Implementations on Foreign Types

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.KeyMap.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.KeyMap.html index 29c7f03dff..f69cb4ee7f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.KeyMap.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.KeyMap.html @@ -1,8 +1,9 @@ -KeyMap in bdk::keys - Rust

    Type Definition bdk::keys::KeyMap[]

    pub type KeyMap = HashMap<DescriptorPublicKey, DescriptorSecretKey, RandomState>;
    Expand description

    Alias type for a map of public key to secret key

    +KeyMap in bdk::keys - Rust +
    logo

    Type Definition bdk::keys::KeyMap[]

    Expand description

    Alias type for a map of public key to secret key

    This map is returned whenever a descriptor that contains secrets is parsed using Descriptor::parse_descriptor, since the descriptor will always only contain public keys. This map allows looking up the corresponding secret key given a public key from the descriptor.

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.ValidNetworks.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.ValidNetworks.html index 9265ef2898..b895d9a6e5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.ValidNetworks.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/keys/type.ValidNetworks.html @@ -1,4 +1,5 @@ -ValidNetworks in bdk::keys - Rust

    Type Definition bdk::keys::ValidNetworks[][src]

    pub type ValidNetworks = HashSet<Network>;
    Expand description

    Set of valid networks for a key

    -
    - +ValidNetworks in bdk::keys - Rust +
    logo

    Type Definition bdk::keys::ValidNetworks[][src]

    pub type ValidNetworks = HashSet<Network>;
    Expand description

    Set of valid networks for a key

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.descriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.descriptor.html index c5d8ac8e4a..f153fa3814 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.descriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.descriptor.html @@ -1,14 +1,16 @@ -descriptor in bdk - Rust

    Macro bdk::descriptor[][src]

    macro_rules! descriptor {
    -    (bare($($minisc : tt) *)) => { ... };
    -    (sh(wsh($($minisc : tt) *))) => { ... };
    -    (shwsh($($minisc : tt) *)) => { ... };
    -    (pk($key : expr)) => { ... };
    -    (pkh($key : expr)) => { ... };
    -    (wpkh($key : expr)) => { ... };
    -    (sh(wpkh($key : expr))) => { ... };
    -    (shwpkh($key : expr)) => { ... };
    -    (sh($($minisc : tt) *)) => { ... };
    -    (wsh($($minisc : tt) *)) => { ... };
    +descriptor in bdk - Rust
    +    
    logo

    Macro bdk::descriptor[][src]

    macro_rules! descriptor {
    +    (bare($($minisc : tt) *)) => { ... };
    +    (sh(wsh($($minisc : tt) *))) => { ... };
    +    (shwsh($($minisc : tt) *)) => { ... };
    +    (pk($key : expr)) => { ... };
    +    (pkh($key : expr)) => { ... };
    +    (wpkh($key : expr)) => { ... };
    +    (sh(wpkh($key : expr))) => { ... };
    +    (shwpkh($key : expr)) => { ... };
    +    (sh($($minisc : tt) *)) => { ... };
    +    (wsh($($minisc : tt) *)) => { ... };
     }
    Expand description

    Macro to write full descriptors with code

    This macro expands to a Result of @@ -20,7 +22,7 @@ broken up to s:d:v:older(144).

    IntoDescriptorKey. This means that keys can also be written inline as strings, but in that case they must be wrapped in quotes, which is another difference compared to the standard descriptor syntax.

    -

    Example

    +

    Example

    Signature plus timelock descriptor:

    let (my_descriptor, my_keys_map, networks) = bdk::descriptor!(sh(wsh(and_v(v:pk("cVt4o7BGAig1UXywgGSmARhxMdzP5qvQsxKkSsc1XEkw3tDTQFpy"),older(50)))))?;
    @@ -74,6 +76,5 @@ syntax is more suitable for a fixed number of items known at compile time, while bitcoin::PrivateKey::from_wif("cVt4o7BGAig1UXywgGSmARhxMdzP5qvQsxKkSsc1XEkw3tDTQFpy")?; let (descriptor, key_map, networks) = bdk::descriptor!(wpkh(my_key))?;
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.fragment.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.fragment.html index 9f748be2b1..59ada2f3ab 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.fragment.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/macro.fragment.html @@ -1,35 +1,36 @@ -fragment in bdk - Rust

    Macro bdk::fragment[][src]

    macro_rules! fragment {
    -    ($modif : tt : $($tail : tt) *) => { ... };
    -    (true) => { ... };
    -    (false) => { ... };
    -    (pk_k($key : expr)) => { ... };
    -    (pk($key : expr)) => { ... };
    -    (pk_h($key : expr)) => { ... };
    -    (after($value : expr)) => { ... };
    -    (older($value : expr)) => { ... };
    -    (sha256($hash : expr)) => { ... };
    -    (hash256($hash : expr)) => { ... };
    -    (ripemd160($hash : expr)) => { ... };
    -    (hash160($hash : expr)) => { ... };
    -    (and_v($($inner : tt) *)) => { ... };
    -    (and_b($($inner : tt) *)) => { ... };
    -    (and_or($($inner : tt) *)) => { ... };
    -    (andor($($inner : tt) *)) => { ... };
    -    (or_b($($inner : tt) *)) => { ... };
    -    (or_d($($inner : tt) *)) => { ... };
    -    (or_c($($inner : tt) *)) => { ... };
    -    (or_i($($inner : tt) *)) => { ... };
    -    (thresh_vec($thresh : expr, $items : expr)) => { ... };
    -    (thresh($thresh : expr, $($inner : tt) *)) => { ... };
    -    (multi_vec($thresh : expr, $keys : expr)) => { ... };
    -    (multi($thresh : expr $(, $key : expr) +)) => { ... };
    -    (sortedmulti($($inner : tt) *)) => { ... };
    -    (sortedmulti_vec($($inner : tt) *)) => { ... };
    +fragment in bdk - Rust
    +    
    logo

    Macro bdk::fragment[][src]

    macro_rules! fragment {
    +    ($modif : tt : $($tail : tt) *) => { ... };
    +    (true) => { ... };
    +    (false) => { ... };
    +    (pk_k($key : expr)) => { ... };
    +    (pk($key : expr)) => { ... };
    +    (pk_h($key : expr)) => { ... };
    +    (after($value : expr)) => { ... };
    +    (older($value : expr)) => { ... };
    +    (sha256($hash : expr)) => { ... };
    +    (hash256($hash : expr)) => { ... };
    +    (ripemd160($hash : expr)) => { ... };
    +    (hash160($hash : expr)) => { ... };
    +    (and_v($($inner : tt) *)) => { ... };
    +    (and_b($($inner : tt) *)) => { ... };
    +    (and_or($($inner : tt) *)) => { ... };
    +    (andor($($inner : tt) *)) => { ... };
    +    (or_b($($inner : tt) *)) => { ... };
    +    (or_d($($inner : tt) *)) => { ... };
    +    (or_c($($inner : tt) *)) => { ... };
    +    (or_i($($inner : tt) *)) => { ... };
    +    (thresh_vec($thresh : expr, $items : expr)) => { ... };
    +    (thresh($thresh : expr, $($inner : tt) *)) => { ... };
    +    (multi_vec($thresh : expr, $keys : expr)) => { ... };
    +    (multi($thresh : expr $(, $key : expr) +)) => { ... };
    +    (sortedmulti($($inner : tt) *)) => { ... };
    +    (sortedmulti_vec($($inner : tt) *)) => { ... };
     }
    Expand description

    Macro to write descriptor fragments with code

    This macro will be expanded to an object of type Result<(Miniscript<DescriptorPublicKey, _>, KeyMap, ValidNetworks), DescriptorError>. It allows writing fragments of larger descriptors that can be pieced together using fragment!(thresh_vec(m, ...)).

    The syntax to write macro fragment is the same as documented for the descriptor macro.

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/sidebar-items.js index 5670daf604..6b216d6b77 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["Error","Errors that can be thrown by the `Wallet`"],["KeychainKind","Types of keychains"],["Utxo","An unspent transaction output (UTXO)."]],"externcrate":[["bitcoin",""],["electrum_client",""],["miniscript",""],["rusqlite",""],["sled",""]],"fn":[["version","Get the version of BDK at runtime"]],"macro":[["descriptor","Macro to write full descriptors with code"],["fragment","Macro to write descriptor fragments with code"]],"mod":[["blockchain","Blockchain backends"],["database","Database types"],["descriptor","Descriptors"],["keys","Key formats"],["wallet","Wallet"]],"struct":[["ConfirmationTime","Block height and timestamp of the block containing the confirmed transaction"],["FeeRate","Fee rate"],["LocalUtxo","An unspent output owned by a `Wallet`."],["TransactionDetails","A wallet transaction"],["WeightedUtxo","A [`Utxo`] with its `satisfaction_weight`."]],"trait":[["Vbytes","Trait implemented by types that can be used to measure weight units."]]}); \ No newline at end of file +initSidebarItems({"enum":[["Error","Errors that can be thrown by the `Wallet`"],["KeychainKind","Types of keychains"],["Utxo","An unspent transaction output (UTXO)."]],"externcrate":[["bitcoin",""],["electrum_client",""],["miniscript",""],["rusqlite",""],["sled",""]],"fn":[["version","Get the version of BDK at runtime"]],"macro":[["descriptor","Macro to write full descriptors with code"],["fragment","Macro to write descriptor fragments with code"]],"mod":[["blockchain","Blockchain backends"],["database","Database types"],["descriptor","Descriptors"],["keys","Key formats"],["wallet","Wallet"]],"struct":[["BlockTime","Block height and timestamp of a block"],["FeeRate","Fee rate"],["LocalUtxo","An unspent output owned by a `Wallet`."],["TransactionDetails","A wallet transaction"],["WeightedUtxo","A [`Utxo`] with its `satisfaction_weight`."]],"trait":[["Vbytes","Trait implemented by types that can be used to measure weight units."]],"type":[["ConfirmationTime","DEPRECATED: Confirmation time of a transaction"]]}); \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.BlockTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.BlockTime.html new file mode 100644 index 0000000000..44ff521e17 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.BlockTime.html @@ -0,0 +1,38 @@ +BlockTime in bdk - Rust +
    logo

    Struct bdk::BlockTime[][src]

    pub struct BlockTime {
    +    pub height: u32,
    +    pub timestamp: u64,
    +}
    Expand description

    Block height and timestamp of a block

    +

    Fields

    height: u32

    confirmation block height

    +
    timestamp: u64

    confirmation block timestamp

    +

    Implementations

    Returns Some BlockTime if both height and timestamp are Some

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

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

    +

    Deserialize this value from the given Serde deserializer. Read more

    +

    This method tests for self and other values to be equal, and is used +by ==. Read more

    +

    This method tests for !=.

    +

    Serialize this value into the given Serde serializer. Read more

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    +

    The alignment of pointer.

    +

    The type for initializers.

    +

    Initializes a with the given initializer. Read more

    +

    Dereferences the given pointer. Read more

    +

    Mutably dereferences the given pointer. Read more

    +

    Drops the object pointed to by the given pointer. Read more

    +

    The resulting type after obtaining ownership.

    +

    Creates owned data from borrowed data, usually by cloning. Read more

    +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.ConfirmationTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.ConfirmationTime.html deleted file mode 100644 index 492d39ca1a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.ConfirmationTime.html +++ /dev/null @@ -1,39 +0,0 @@ -ConfirmationTime in bdk - Rust

    Struct bdk::ConfirmationTime[][src]

    pub struct ConfirmationTime {
    -    pub height: u32,
    -    pub timestamp: u64,
    -}
    Expand description

    Block height and timestamp of the block containing the confirmed transaction

    -

    Fields

    height: u32

    confirmation block height

    -
    timestamp: u64

    confirmation block timestamp

    -

    Implementations

    Returns Some ConfirmationTime if both height and timestamp are Some

    -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

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

    -

    Deserialize this value from the given Serde deserializer. Read more

    -

    This method tests for self and other values to be equal, and is used -by ==. Read more

    -

    This method tests for !=.

    -

    Serialize this value into the given Serde serializer. Read more

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    -

    The alignment of pointer.

    -

    The type for initializers.

    -

    Initializes a with the given initializer. Read more

    -

    Dereferences the given pointer. Read more

    -

    Mutably dereferences the given pointer. Read more

    -

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The resulting type after obtaining ownership.

    -

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.FeeRate.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.FeeRate.html index 2edd5a044f..467699deb2 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.FeeRate.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.FeeRate.html @@ -1,4 +1,6 @@ -FeeRate in bdk - Rust

    Struct bdk::FeeRate[][src]

    pub struct FeeRate(_);
    Expand description

    Fee rate

    +FeeRate in bdk - Rust +
    logo

    Struct bdk::FeeRate[][src]

    pub struct FeeRate(_);
    Expand description

    Fee rate

    Implementations

    Create a new instance of FeeRate given a float fee rate in btc/kvbytes

    Create a new instance of FeeRate given a float fee rate in satoshi/vbyte

    Create a new FeeRate with the default min relay fee value

    @@ -8,41 +10,38 @@

    Calculate absolute fee in Satoshis using size in weight units.

    Calculate absolute fee in Satoshis using size in virtual bytes.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    The resulting type after applying the - operator.

    Performs the - operation. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html index 2ec1e93e00..8de8244541 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html @@ -1,4 +1,6 @@ -LocalUtxo in bdk - Rust

    Struct bdk::LocalUtxo[][src]

    pub struct LocalUtxo {
    +LocalUtxo in bdk - Rust
    +    
    logo

    Struct bdk::LocalUtxo[][src]

    pub struct LocalUtxo {
         pub outpoint: OutPoint,
         pub txout: TxOut,
         pub keychain: KeychainKind,
    @@ -7,35 +9,32 @@
     
    txout: TxOut

    Transaction output

    keychain: KeychainKind

    Type of keychain

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    -

    Deserialize this value from the given Serde deserializer. Read more

    +

    Deserialize this value from the given Serde deserializer. Read more

    Feeds this value into the given Hasher. Read more

    -

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

    +

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

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    -

    Serialize this value into the given Serde serializer. Read more

    +

    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html index c15c400d81..8050e1b025 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html @@ -1,10 +1,12 @@ -TransactionDetails in bdk - Rust

    Struct bdk::TransactionDetails[][src]

    pub struct TransactionDetails {
    +TransactionDetails in bdk - Rust
    +    
    logo

    Struct bdk::TransactionDetails[][src]

    pub struct TransactionDetails {
         pub transaction: Option<Transaction>,
         pub txid: Txid,
         pub received: u64,
         pub sent: u64,
         pub fee: Option<u64>,
    -    pub confirmation_time: Option<ConfirmationTime>,
    +    pub confirmation_time: Option<BlockTime>,
         pub verified: bool,
     }
    Expand description

    A wallet transaction

    Fields

    transaction: Option<Transaction>

    Optional transaction

    @@ -15,42 +17,39 @@ The availability of the fee depends on the backend. It’s never None with an Electrum Server backend, but it could be None with a Bitcoin RPC node without txindex that receive funds while offline.

    -
    confirmation_time: Option<ConfirmationTime>

    If the transaction is confirmed, contains height and timestamp of the block containing the +

    confirmation_time: Option<BlockTime>

    If the transaction is confirmed, contains height and timestamp of the block containing the transaction, unconfirmed transaction contains None.

    verified: bool

    Whether the tx has been verified against the consensus rules

    Confirmed txs are considered “verified” by default, while unconfirmed txs are checked to ensure an unstrusted Blockchain backend can’t trick the wallet into using an invalid tx as an RBF template.

    -

    The check is only perfomed when the verify feature is enabled.

    +

    The check is only performed when the verify feature is enabled.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    -

    Deserialize this value from the given Serde deserializer. Read more

    +

    Deserialize this value from the given Serde deserializer. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    -

    Serialize this value into the given Serde serializer. Read more

    +

    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.WeightedUtxo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.WeightedUtxo.html index 219f9a145b..93ed352118 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.WeightedUtxo.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.WeightedUtxo.html @@ -1,4 +1,6 @@ -WeightedUtxo in bdk - Rust

    Struct bdk::WeightedUtxo[][src]

    pub struct WeightedUtxo {
    +WeightedUtxo in bdk - Rust
    +    
    logo

    Struct bdk::WeightedUtxo[][src]

    pub struct WeightedUtxo {
         pub satisfaction_weight: usize,
         pub utxo: Utxo,
     }
    Expand description

    A Utxo with its satisfaction_weight.

    @@ -6,31 +8,28 @@ properly maintain the feerate when adding this input to a transaction during coin selection.

    utxo: Utxo

    The UTXO

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/trait.Vbytes.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/trait.Vbytes.html index 3248bdd2a4..d279bc88a3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/trait.Vbytes.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/trait.Vbytes.html @@ -1,7 +1,8 @@ -Vbytes in bdk - Rust

    Trait bdk::Vbytes[][src]

    pub trait Vbytes {
    +Vbytes in bdk - Rust
    +    
    logo

    Trait bdk::Vbytes[][src]

    pub trait Vbytes {
         fn vbytes(self) -> usize;
     }
    Expand description

    Trait implemented by types that can be used to measure weight units.

    Required methods

    Convert weight units to virtual bytes.

    -

    Implementations on Foreign Types

    Implementors

    - +

    Implementations on Foreign Types

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/type.ConfirmationTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/type.ConfirmationTime.html new file mode 100644 index 0000000000..ae03f8713d --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/type.ConfirmationTime.html @@ -0,0 +1,7 @@ +ConfirmationTime in bdk - Rust +
    logo

    Type Definition bdk::ConfirmationTime[][src]

    pub type ConfirmationTime = BlockTime;
    👎 Deprecated:

    This structure has been renamed to BlockTime

    +
    Expand description

    DEPRECATED: Confirmation time of a transaction

    +

    The structure has been renamed to BlockTime

    +
    + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/struct.BlockTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/struct.BlockTime.html new file mode 100644 index 0000000000..1aeb0d712d --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/struct.BlockTime.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

    Redirecting to ../../bdk/struct.BlockTime.html...

    + + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/struct.ConfirmationTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/struct.ConfirmationTime.html deleted file mode 100644 index 31758b8f04..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/struct.ConfirmationTime.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

    Redirecting to ../../bdk/struct.ConfirmationTime.html...

    - - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/type.ConfirmationTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/type.ConfirmationTime.html new file mode 100644 index 0000000000..52ce4499bb --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/types/type.ConfirmationTime.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

    Redirecting to ../../bdk/type.ConfirmationTime.html...

    + + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/enum.AddressValidatorError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/enum.AddressValidatorError.html index 91c9903c60..1d8221e31a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/enum.AddressValidatorError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/enum.AddressValidatorError.html @@ -1,17 +1,19 @@ -AddressValidatorError in bdk::wallet::address_validator - Rust

    Enum bdk::wallet::address_validator::AddressValidatorError[][src]

    pub enum AddressValidatorError {
    +AddressValidatorError in bdk::wallet::address_validator - Rust
    +    
    logo

    Enum bdk::wallet::address_validator::AddressValidatorError[][src]

    pub enum AddressValidatorError {
         UserRejected,
         ConnectionError,
         TimeoutError,
         InvalidScript,
         Message(String),
     }
    Expand description

    Errors that can be returned to fail the validation of an address

    -

    Variants

    UserRejected

    User rejected the address

    -
    ConnectionError

    Network connection error

    -
    TimeoutError

    Network request timeout error

    -
    InvalidScript

    Invalid script

    -
    Message(String)

    A custom error message

    -

    Tuple Fields of Message

    0: String

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Variants

    UserRejected

    User rejected the address

    +

    ConnectionError

    Network connection error

    +

    TimeoutError

    Network request timeout error

    +

    InvalidScript

    Invalid script

    +

    Message(String)

    Tuple Fields

    0: String

    A custom error message

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    Formats the value using the given formatter. Read more

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

    @@ -23,35 +25,23 @@ by ==. Read more

    This method tests for !=.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Converts a reference to Self into a dynamic trait object of Fail.

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Returns the “name” of the error. Read more

    -

    Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

    -

    Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

    -

    Provides context for this failure. Read more

    -

    Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/index.html index f4f4da08f3..709e99130e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/index.html @@ -1,4 +1,6 @@ -bdk::wallet::address_validator - Rust

    Module bdk::wallet::address_validator[][src]

    Expand description

    Address validation callbacks

    +bdk::wallet::address_validator - Rust +
    logo

    Module bdk::wallet::address_validator[][src]

    Expand description

    Address validation callbacks

    The typical usage of those callbacks is for displaying the newly-generated address on a hardware wallet, so that the user can cross-check its correctness.

    More generally speaking though, these callbacks can also be used to “do something” every time @@ -9,7 +11,7 @@ whenever a new address is generated (either explicitly by the user with Wallet::get_address or internally to create a change address) all the attached validators will be polled, in sequence. All of them must complete successfully to continue.

    -

    Example

    +

    Example

    #[derive(Debug)]
     struct PrintAddressAndContinue;
     
    @@ -19,7 +21,7 @@ successfully to continue.

    keychain: KeychainKind, hd_keypaths: &HdKeyPaths, script: &Script - ) -> Result<(), AddressValidatorError> { + ) -> Result<(), AddressValidatorError> { let address = Address::from_script(script, Network::Testnet) .as_ref() .map(Address::to_string) @@ -37,10 +39,9 @@ successfully to continue.

    let address = wallet.get_address(New)?; println!("Address: {}", address);
    -

    Enums

    -

    Errors that can be returned to fail the validation of an address

    -

    Traits

    -

    Trait to build address validators

    -
    - +

    Enums

    +

    Errors that can be returned to fail the validation of an address

    +

    Traits

    +

    Trait to build address validators

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/trait.AddressValidator.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/trait.AddressValidator.html index 6938b2051d..11d1a55491 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/trait.AddressValidator.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/address_validator/trait.AddressValidator.html @@ -1,4 +1,6 @@ -AddressValidator in bdk::wallet::address_validator - Rust

    Trait bdk::wallet::address_validator::AddressValidator[][src]

    pub trait AddressValidator: Send + Sync + Debug {
    +AddressValidator in bdk::wallet::address_validator - Rust
    +    
    logo

    Trait bdk::wallet::address_validator::AddressValidator[][src]

    pub trait AddressValidator: Send + Sync + Debug {
         fn validate(
            &self,
            keychain: KeychainKind,
            hd_keypaths: &HdKeyPaths,
            script: &Script
        ) -> Result<(), AddressValidatorError>; }
    Expand description

    Trait to build address validators

    All the address validators attached to a wallet with Wallet::add_address_validator will be polled @@ -6,6 +8,5 @@ every time an address (external or internal) is generated by the wallet. Errors validator will be propagated up to the original caller that triggered the address generation.

    For a usage example see this module’s documentation.

    Required methods

    Validate or inspect an address

    -

    Implementors

    - +

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html index 03cda120cd..3a178857e7 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html @@ -1,10 +1,12 @@ -bdk::wallet::coin_selection - Rust

    Module bdk::wallet::coin_selection[][src]

    Expand description

    Coin selection

    +bdk::wallet::coin_selection - Rust +
    logo

    Module bdk::wallet::coin_selection[][src]

    Expand description

    Coin selection

    This module provides the trait CoinSelectionAlgorithm that can be implemented to define custom coin selection algorithms.

    You can specify a custom coin selection algorithm through the coin_selection method on TxBuilder. DefaultCoinSelectionAlgorithm aliases the coin selection algorithm that will be used if it is not explicitly set.

    -

    Example

    +

    Example

    #[derive(Debug)]
     struct AlwaysSpendEverything;
     
    @@ -17,14 +19,14 @@ be used if it is not explicitly set.

    fee_rate: FeeRate, amount_needed: u64, fee_amount: u64, - ) -> Result<CoinSelectionResult, bdk::Error> { + ) -> Result<CoinSelectionResult, bdk::Error> { let mut selected_amount = 0; let mut additional_weight = 0; let all_utxos_selected = required_utxos .into_iter() .chain(optional_utxos) .scan( - (&mut selected_amount, &mut additional_weight), + (&mut selected_amount, &mut additional_weight), |(selected_amount, additional_weight), weighted_utxo| { **selected_amount += weighted_utxo.utxo.txout().value; **additional_weight += TXIN_BASE_WEIGHT + weighted_utxo.satisfaction_weight; @@ -59,15 +61,14 @@ be used if it is not explicitly set.

    // inspect, sign, broadcast, ...
    -

    Structs

    -

    Branch and bound coin selection

    -

    Result of a successful coin selection

    -

    Simple and dumb coin selection

    -

    Traits

    -

    Trait for generalized coin selection algorithms

    -

    Type Definitions

    -

    Default coin selection algorithm used by TxBuilder if not +

    Structs

    +

    Branch and bound coin selection

    +

    Result of a successful coin selection

    +

    Simple and dumb coin selection

    +

    Traits

    +

    Trait for generalized coin selection algorithms

    +

    Type Definitions

    +

    Default coin selection algorithm used by TxBuilder if not overridden

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.BranchAndBoundCoinSelection.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.BranchAndBoundCoinSelection.html index da3d47f8fc..58979cc015 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.BranchAndBoundCoinSelection.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.BranchAndBoundCoinSelection.html @@ -1,25 +1,25 @@ -BranchAndBoundCoinSelection in bdk::wallet::coin_selection - Rust

    Struct bdk::wallet::coin_selection::BranchAndBoundCoinSelection[][src]

    pub struct BranchAndBoundCoinSelection { /* fields omitted */ }
    Expand description

    Branch and bound coin selection

    +BranchAndBoundCoinSelection in bdk::wallet::coin_selection - Rust +
    logo

    Struct bdk::wallet::coin_selection::BranchAndBoundCoinSelection[][src]

    pub struct BranchAndBoundCoinSelection { /* fields omitted */ }
    Expand description

    Branch and bound coin selection

    Code adapted from Bitcoin Core’s implementation and from Mark Erhardt Master’s Thesis: http://murch.one/wp-content/uploads/2016/11/erhardt2016coinselection.pdf

    Implementations

    Create new instance with target size for change output

    Trait Implementations

    Perform the coin selection Read more

    Formats the value using the given formatter. Read more

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

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.CoinSelectionResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.CoinSelectionResult.html index 2fc68a28c6..6cb79f5c7a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.CoinSelectionResult.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.CoinSelectionResult.html @@ -1,4 +1,6 @@ -CoinSelectionResult in bdk::wallet::coin_selection - Rust

    Struct bdk::wallet::coin_selection::CoinSelectionResult[][src]

    pub struct CoinSelectionResult {
    +CoinSelectionResult in bdk::wallet::coin_selection - Rust
    +    
    logo

    Struct bdk::wallet::coin_selection::CoinSelectionResult[][src]

    pub struct CoinSelectionResult {
         pub selected: Vec<Utxo>,
         pub fee_amount: u64,
     }
    Expand description

    Result of a successful coin selection

    @@ -8,21 +10,19 @@

    The total value of the inputs selected from the local wallet.

    Trait Implementations

    Formats the value using the given formatter. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.LargestFirstCoinSelection.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.LargestFirstCoinSelection.html index 2967b66122..4a46fa255b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.LargestFirstCoinSelection.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/struct.LargestFirstCoinSelection.html @@ -1,31 +1,30 @@ -LargestFirstCoinSelection in bdk::wallet::coin_selection - Rust

    Struct bdk::wallet::coin_selection::LargestFirstCoinSelection[][src]

    pub struct LargestFirstCoinSelection;
    Expand description

    Simple and dumb coin selection

    +LargestFirstCoinSelection in bdk::wallet::coin_selection - Rust +
    logo

    Struct bdk::wallet::coin_selection::LargestFirstCoinSelection[][src]

    pub struct LargestFirstCoinSelection;
    Expand description

    Simple and dumb coin selection

    This coin selection algorithm sorts the available UTXOs by value and then picks them starting from the largest ones until the required amount is reached.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Perform the coin selection Read more

    Formats the value using the given formatter. Read more

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

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html index 1aadde9c06..2dd742a2b3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html @@ -1,4 +1,6 @@ -CoinSelectionAlgorithm in bdk::wallet::coin_selection - Rust

    Trait bdk::wallet::coin_selection::CoinSelectionAlgorithm[][src]

    pub trait CoinSelectionAlgorithm<D: Database>: Debug {
    +CoinSelectionAlgorithm in bdk::wallet::coin_selection - Rust
    +    
    logo

    Trait bdk::wallet::coin_selection::CoinSelectionAlgorithm[][src]

    pub trait CoinSelectionAlgorithm<D: Database>: Debug {
         fn coin_select(
            &self,
            database: &D,
            required_utxos: Vec<WeightedUtxo>,
            optional_utxos: Vec<WeightedUtxo>,
            fee_rate: FeeRate,
            amount_needed: u64,
            fee_amount: u64
        ) -> Result<CoinSelectionResult, Error>; }
    Expand description

    Trait for generalized coin selection algorithms

    This trait can be implemented to make the Wallet use a customized coin @@ -17,6 +19,5 @@ weight cost

  • fee_amount: the amount of fees in satoshi already accumulated from adding outputs and the transaction’s header
  • -

    Implementors

    - +

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/type.DefaultCoinSelectionAlgorithm.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/type.DefaultCoinSelectionAlgorithm.html index 2a7cee4c38..3f99dd3cdd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/type.DefaultCoinSelectionAlgorithm.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/type.DefaultCoinSelectionAlgorithm.html @@ -1,5 +1,6 @@ -DefaultCoinSelectionAlgorithm in bdk::wallet::coin_selection - Rust

    Type Definition bdk::wallet::coin_selection::DefaultCoinSelectionAlgorithm[][src]

    pub type DefaultCoinSelectionAlgorithm = BranchAndBoundCoinSelection;
    Expand description

    Default coin selection algorithm used by TxBuilder if not +DefaultCoinSelectionAlgorithm in bdk::wallet::coin_selection - Rust +

    logo

    Type Definition bdk::wallet::coin_selection::DefaultCoinSelectionAlgorithm[][src]

    pub type DefaultCoinSelectionAlgorithm = BranchAndBoundCoinSelection;
    Expand description

    Default coin selection algorithm used by TxBuilder if not overridden

    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html index d20d05b94a..2386363714 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html @@ -1,45 +1,45 @@ -AddressIndex in bdk::wallet - Rust

    Enum bdk::wallet::AddressIndex[][src]

    pub enum AddressIndex {
    +AddressIndex in bdk::wallet - Rust
    +    
    logo

    Enum bdk::wallet::AddressIndex[][src]

    pub enum AddressIndex {
         New,
         LastUnused,
         Peek(u32),
         Reset(u32),
     }
    Expand description

    The address index selection strategy to use to derived an address from the wallet’s external descriptor. See Wallet::get_address. If you’re unsure which one to use use WalletIndex::New.

    -

    Variants

    New

    Return a new address after incrementing the current descriptor index.

    -
    LastUnused

    Return the address for the current descriptor index if it has not been used in a received +

    Variants

    New

    Return a new address after incrementing the current descriptor index.

    +

    LastUnused

    Return the address for the current descriptor index if it has not been used in a received transaction. Otherwise return a new address as with AddressIndex::New.

    Use with caution, if the wallet has not yet detected an address has been used it could return an already used address. This function is primarily meant for situations where the caller is untrusted; for example when deriving donation addresses on-demand for a public web page.

    -
    Peek(u32)

    Return the address for a specific descriptor index. Does not change the current descriptor +

    Peek(u32)

    Tuple Fields

    0: u32

    Return the address for a specific descriptor index. Does not change the current descriptor index used by AddressIndex::New and AddressIndex::LastUsed.

    Use with caution, if an index is given that is less than the current descriptor index then the returned address may have already been used.

    -

    Tuple Fields of Peek

    0: u32
    Reset(u32)

    Return the address for a specific descriptor index and reset the current descriptor index +

    Reset(u32)

    Tuple Fields

    0: u32

    Return the address for a specific descriptor index and reset the current descriptor index used by AddressIndex::New and AddressIndex::LastUsed to this value.

    Use with caution, if an index is given that is less than the current descriptor index then the returned address and subsequent addresses returned by calls to AddressIndex::New and AddressIndex::LastUsed may have already been used. Also if the index is reset to a value earlier than the crate::blockchain::Blockchain stop_gap (default is 20) then a larger stop_gap should be used to monitor for all possibly used addresses.

    -

    Tuple Fields of Reset

    0: u32

    Trait Implementations

    Formats the value using the given formatter. Read more

    +

    Trait Implementations

    Formats the value using the given formatter. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html index f5d42285ff..027f7f5fe1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html @@ -1,6 +1,8 @@ -bdk::wallet::export - Rust

    Module bdk::wallet::export[][src]

    Expand description

    Wallet export

    +bdk::wallet::export - Rust +
    logo

    Module bdk::wallet::export[][src]

    Expand description

    Wallet export

    This modules implements the wallet export format used by FullyNoded.

    -

    Examples

    Import from JSON

    +

    Examples

    Import from JSON

    let import = r#"{
         "descriptor": "wpkh([c258d2e4\/84h\/1h\/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe\/0\/*)",
         "blockheight":1782088,
    @@ -14,7 +16,7 @@
         Network::Testnet,
         MemoryDatabase::default(),
     )?;
    -

    Export a Wallet

    +

    Export a Wallet

    let wallet = Wallet::new_offline(
         "wpkh([c258d2e4/84h/1h/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe/0/*)",
         Some("wpkh([c258d2e4/84h/1h/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe/1/*)"),
    @@ -26,8 +28,7 @@
         .map_err(bdk::Error::Generic)?;
     
     println!("Exported: {}", export.to_string());
    -

    Structs

    -

    Structure that contains the export of a wallet

    -
    - +

    Structs

    +

    Structure that contains the export of a wallet

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.WalletExport.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.WalletExport.html index 6ff227a440..da1356ead7 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.WalletExport.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.WalletExport.html @@ -1,4 +1,6 @@ -WalletExport in bdk::wallet::export - Rust

    Struct bdk::wallet::export::WalletExport[][src]

    pub struct WalletExport {
    +WalletExport in bdk::wallet::export - Rust
    +    
    logo

    Struct bdk::wallet::export::WalletExport[][src]

    pub struct WalletExport {
         pub blockheight: u32,
         pub label: String,
         // some fields omitted
    @@ -17,27 +19,25 @@ returned will be 0.

    Return the external descriptor

    Return the internal descriptor, if present

    Trait Implementations

    Formats the value using the given formatter. Read more

    -

    Deserialize this value from the given Serde deserializer. Read more

    -

    The associated error which can be returned from parsing.

    +

    Deserialize this value from the given Serde deserializer. Read more

    +

    The associated error which can be returned from parsing.

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

    -

    Serialize this value into the given Serde serializer. Read more

    +

    Serialize this value into the given Serde serializer. Read more

    Converts the given value to a String. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.get_funded_wallet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.get_funded_wallet.html index e93825a76c..e4e1917b9e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.get_funded_wallet.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.get_funded_wallet.html @@ -1,4 +1,5 @@ -get_funded_wallet in bdk::wallet - Rust

    Function bdk::wallet::get_funded_wallet[][src]

    pub fn get_funded_wallet(
        descriptor: &str
    ) -> (Wallet<(), MemoryDatabase>, (String, Option<String>), Txid)
    Expand description

    Return a fake wallet that appears to be funded for testing.

    -
    - +get_funded_wallet in bdk::wallet - Rust +
    logo

    Function bdk::wallet::get_funded_wallet[][src]

    pub fn get_funded_wallet(
        descriptor: &str
    ) -> (Wallet<(), MemoryDatabase>, (String, Option<String>), Txid)
    Expand description

    Return a fake wallet that appears to be funded for testing.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html new file mode 100644 index 0000000000..4bca670398 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html @@ -0,0 +1,5 @@ +wallet_name_from_descriptor in bdk::wallet - Rust +
    logo

    Function bdk::wallet::wallet_name_from_descriptor[][src]

    pub fn wallet_name_from_descriptor<T>(
        descriptor: T,
        change_descriptor: Option<T>,
        network: Network,
        secp: &Secp256k1<All>
    ) -> Result<String, Error> where
        T: IntoWalletDescriptor
    Expand description

    Deterministically generate a unique name given the descriptors defining the wallet

    +
    + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html index 0d5803ce8c..f321c35c13 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html @@ -1,23 +1,25 @@ -bdk::wallet - Rust

    Module bdk::wallet[][src]

    Expand description

    Wallet

    +bdk::wallet - Rust +
    logo

    Module bdk::wallet[][src]

    Expand description

    Wallet

    This module defines the Wallet structure.

    -

    Modules

    -

    Address validation callbacks

    -

    Coin selection

    -

    Wallet export

    -

    Generalized signers

    -

    Cross-platform time

    -

    Transaction builder

    -

    Structs

    -

    A derived address and the index it was found at +

    Modules

    +

    Address validation callbacks

    +

    Coin selection

    +

    Wallet export

    +

    Generalized signers

    +

    Cross-platform time

    +

    Transaction builder

    +

    Structs

    +

    A derived address and the index it was found at For convenience this automatically derefs to Address

    -

    A Bitcoin wallet

    -

    Enums

    -

    The address index selection strategy to use to derived an address from the wallet’s external +

    A Bitcoin wallet

    +

    Enums

    +

    The address index selection strategy to use to derived an address from the wallet’s external descriptor. See Wallet::get_address. If you’re unsure which one to use use WalletIndex::New.

    -

    Traits

    -

    Trait to check if a value is below the dust limit

    -

    Functions

    -

    Return a fake wallet that appears to be funded for testing.

    -
    - +

    Traits

    +

    Trait to check if a value is below the dust limit

    +

    Functions

    +

    Return a fake wallet that appears to be funded for testing.

    +

    Deterministically generate a unique name given the descriptors defining the wallet

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js index 20bdf7e32f..75382201e9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["AddressIndex","The address index selection strategy to use to derived an address from the wallet’s external descriptor. See [`Wallet::get_address`]. If you’re unsure which one to use use `WalletIndex::New`."]],"fn":[["get_funded_wallet","Return a fake wallet that appears to be funded for testing."]],"mod":[["address_validator","Address validation callbacks"],["coin_selection","Coin selection"],["export","Wallet export"],["signer","Generalized signers"],["time","Cross-platform time"],["tx_builder","Transaction builder"]],"struct":[["AddressInfo","A derived address and the index it was found at For convenience this automatically derefs to `Address`"],["Wallet","A Bitcoin wallet"]],"trait":[["IsDust","Trait to check if a value is below the dust limit"]]}); \ No newline at end of file +initSidebarItems({"enum":[["AddressIndex","The address index selection strategy to use to derived an address from the wallet’s external descriptor. See [`Wallet::get_address`]. If you’re unsure which one to use use `WalletIndex::New`."]],"fn":[["get_funded_wallet","Return a fake wallet that appears to be funded for testing."],["wallet_name_from_descriptor","Deterministically generate a unique name given the descriptors defining the wallet"]],"mod":[["address_validator","Address validation callbacks"],["coin_selection","Coin selection"],["export","Wallet export"],["signer","Generalized signers"],["time","Cross-platform time"],["tx_builder","Transaction builder"]],"struct":[["AddressInfo","A derived address and the index it was found at For convenience this automatically derefs to `Address`"],["Wallet","A Bitcoin wallet"]],"trait":[["IsDust","Trait to check if a value is below the dust limit"]]}); \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerError.html index 3d4cceccd5..316a5c242d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerError.html @@ -1,4 +1,6 @@ -SignerError in bdk::wallet::signer - Rust

    Enum bdk::wallet::signer::SignerError[][src]

    pub enum SignerError {
    +SignerError in bdk::wallet::signer - Rust
    +    
    logo

    Enum bdk::wallet::signer::SignerError[][src]

    pub enum SignerError {
         MissingKey,
         InvalidKey,
         UserCanceled,
    @@ -10,21 +12,21 @@
         MissingHdKeypath,
         NonStandardSighash,
     }
    Expand description

    Signing error

    -

    Variants

    MissingKey

    The private key is missing for the required public key

    -
    InvalidKey

    The private key in use has the right fingerprint but derives differently than expected

    -
    UserCanceled

    The user canceled the operation

    -
    InputIndexOutOfRange

    Input index is out of range

    -
    MissingNonWitnessUtxo

    The non_witness_utxo field of the transaction is required to sign this input

    -
    InvalidNonWitnessUtxo

    The non_witness_utxo specified is invalid

    -
    MissingWitnessUtxo

    The witness_utxo field of the transaction is required to sign this input

    -
    MissingWitnessScript

    The witness_script field of the transaction is requied to sign this input

    -
    MissingHdKeypath

    The fingerprint and derivation path are missing from the psbt input

    -
    NonStandardSighash

    The psbt contains a non-SIGHASH_ALL sighash in one of its input and the user hasn’t +

    Variants

    MissingKey

    The private key is missing for the required public key

    +

    InvalidKey

    The private key in use has the right fingerprint but derives differently than expected

    +

    UserCanceled

    The user canceled the operation

    +

    InputIndexOutOfRange

    Input index is out of range

    +

    MissingNonWitnessUtxo

    The non_witness_utxo field of the transaction is required to sign this input

    +

    InvalidNonWitnessUtxo

    The non_witness_utxo specified is invalid

    +

    MissingWitnessUtxo

    The witness_utxo field of the transaction is required to sign this input

    +

    MissingWitnessScript

    The witness_script field of the transaction is required to sign this input

    +

    MissingHdKeypath

    The fingerprint and derivation path are missing from the psbt input

    +

    NonStandardSighash

    The psbt contains a non-SIGHASH_ALL sighash in one of its input and the user hasn’t explicitly allowed them

    To enable signing transactions with non-standard sighashes set SignOptions::allow_all_sighashes to true.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    Formats the value using the given formatter. Read more

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

    @@ -34,37 +36,25 @@ explicitly allowed them

    Performs the conversion.

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    +

    This method tests for !=.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Converts a reference to Self into a dynamic trait object of Fail.

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Returns the “name” of the error. Read more

    -

    Returns a reference to the underlying cause of this failure, if it -is an error that wraps other errors. Read more

    -

    Returns a reference to the Backtrace carried by this failure, if it -carries one. Read more

    -

    Provides context for this failure. Read more

    -

    Wraps this failure in a compatibility wrapper that implements -std::error::Error. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerId.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerId.html index 291dc0fd42..528841e5c5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerId.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/enum.SignerId.html @@ -1,53 +1,52 @@ -SignerId in bdk::wallet::signer - Rust

    Enum bdk::wallet::signer::SignerId[][src]

    pub enum SignerId {
    +SignerId in bdk::wallet::signer - Rust
    +    
    logo

    Enum bdk::wallet::signer::SignerId[][src]

    pub enum SignerId {
         PkHash(Hash),
         Fingerprint(Fingerprint),
         Dummy(u64),
     }
    Expand description

    Identifier of a signer in the SignersContainers. Used as a key to find the right signer among multiple of them

    -

    Variants

    PkHash(Hash)

    Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA public key

    -

    Tuple Fields of PkHash

    0: Hash
    Fingerprint(Fingerprint)

    The fingerprint of a BIP32 extended key

    -

    Tuple Fields of Fingerprint

    0: Fingerprint
    Dummy(u64)

    Dummy identifier

    -

    Tuple Fields of Dummy

    0: u64

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Variants

    PkHash(Hash)

    Tuple Fields

    0: Hash

    Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA public key

    +

    Fingerprint(Fingerprint)

    Tuple Fields

    0: Fingerprint

    The fingerprint of a BIP32 extended key

    +

    Dummy(u64)

    Tuple Fields

    0: u64

    Dummy identifier

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    Performs the conversion.

    Performs the conversion.

    Feeds this value into the given Hasher. Read more

    -

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

    +

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

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/index.html index 7554ca0ff6..5a18e11d66 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/index.html @@ -1,4 +1,6 @@ -bdk::wallet::signer - Rust

    Module bdk::wallet::signer[][src]

    Expand description

    Structs

    -

    Options for a software signer

    -

    Defines the order in which signers are called

    -

    Container for multiple signers

    -

    Enums

    -

    Signing error

    -

    Identifier of a signer in the SignersContainers. Used as a key to find the right signer among +

    Structs

    +

    Options for a software signer

    +

    Defines the order in which signers are called

    +

    Container for multiple signers

    +

    Enums

    +

    Signing error

    +

    Identifier of a signer in the SignersContainers. Used as a key to find the right signer among multiple of them

    -

    Traits

    -

    Trait for signers

    -
    - +

    Traits

    +

    Trait for signers

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignOptions.html index e981dcc3d4..f6b5f56a4f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignOptions.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignOptions.html @@ -1,4 +1,6 @@ -SignOptions in bdk::wallet::signer - Rust

    Struct bdk::wallet::signer::SignOptions[][src]

    pub struct SignOptions {
    +SignOptions in bdk::wallet::signer - Rust
    +    
    logo

    Struct bdk::wallet::signer::SignOptions[][src]

    pub struct SignOptions {
         pub trust_witness_utxo: bool,
         pub assume_height: Option<u32>,
         pub allow_all_sighashes: bool,
    @@ -22,29 +24,26 @@ wallet use timelocks in the future to spend a coin.

    what its value is

    Defaults to false which will only allow signing using SIGHASH_ALL.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignerOrdering.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignerOrdering.html index 05b7104659..999977db87 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignerOrdering.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignerOrdering.html @@ -1,45 +1,44 @@ -SignerOrdering in bdk::wallet::signer - Rust

    Struct bdk::wallet::signer::SignerOrdering[][src]

    pub struct SignerOrdering(pub usize);
    Expand description

    Defines the order in which signers are called

    +SignerOrdering in bdk::wallet::signer - Rust +
    logo

    Struct bdk::wallet::signer::SignerOrdering[][src]

    pub struct SignerOrdering(pub usize);
    Expand description

    Defines the order in which signers are called

    The default value is 100. Signers with an ordering above that will be called later, and they will thus see the partial signatures added to the transaction once they get to sign themselves.

    Tuple Fields

    0: usize

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    This method tests for self and other values to be equal, and is used by ==. Read more

    This method tests for !=.

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignersContainer.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignersContainer.html index 3f8eae4d00..c4c74fe366 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignersContainer.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/struct.SignersContainer.html @@ -1,4 +1,6 @@ -SignersContainer in bdk::wallet::signer - Rust

    Struct bdk::wallet::signer::SignersContainer[][src]

    pub struct SignersContainer(_);
    Expand description

    Container for multiple signers

    +SignersContainer in bdk::wallet::signer - Rust +
    logo

    Struct bdk::wallet::signer::SignersContainer[][src]

    pub struct SignersContainer(_);
    Expand description

    Container for multiple signers

    Implementations

    Create a map of public keys to secret keys

    Default constructor

    Adds an external signer to the container for the specified id. Optionally returns the @@ -8,30 +10,27 @@ signer that was previously in the container, if any

    Returns the list of signers in the container, sorted by lowest to highest ordering

    Finds the signer with lowest ordering for a given id in the container.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    Performs the conversion.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/trait.Signer.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/trait.Signer.html index 0ebe55a44a..df9c794f7e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/trait.Signer.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/signer/trait.Signer.html @@ -1,4 +1,6 @@ -Signer in bdk::wallet::signer - Rust

    Trait bdk::wallet::signer::Signer[][src]

    pub trait Signer: Debug + Send + Sync {
    +Signer in bdk::wallet::signer - Rust
    +    
    logo

    Trait bdk::wallet::signer::Signer[][src]

    pub trait Signer: Debug + Send + Sync {
         fn sign(
            &self,
            psbt: &mut PartiallySignedTransaction,
            input_index: Option<usize>,
            secp: &Secp256k1<All>
        ) -> Result<(), SignerError>;
    fn sign_whole_tx(&self) -> bool;
    fn id(&self, secp: &Secp256k1<All>) -> SignerId; @@ -20,6 +22,5 @@ compare two signers.

    This is used internally to reconstruct the original descriptor that may contain secrets. External signers that are meant to keep key isolated should just return None here (which is the default for this method, if not overridden).

    -

    Implementations on Foreign Types

    Implementors

    - +

    Implementations on Foreign Types

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html index bdc923b2c3..f62c413967 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html @@ -1,11 +1,13 @@ -AddressInfo in bdk::wallet - Rust

    Struct bdk::wallet::AddressInfo[][src]

    pub struct AddressInfo {
    +AddressInfo in bdk::wallet - Rust
    +    
    logo

    Struct bdk::wallet::AddressInfo[][src]

    pub struct AddressInfo {
         pub index: u32,
         pub address: Address,
     }
    Expand description

    A derived address and the index it was found at For convenience this automatically derefs to Address

    Fields

    index: u32

    Child index of this address

    address: Address

    Address

    -

    Methods from Deref<Target = Address>

    Get the address type of the address. +

    Methods from Deref<Target = Address>

    Get the address type of the address. None if unknown or non-standard.

    Check whether or not the address is following Bitcoin standardness rules.

    @@ -25,22 +27,20 @@ alphanumeric mode, which is 45% more compact than the normal byte mode.”

    by ==. Read more

    This method tests for !=.

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    Converts the given value to a String. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    Converts the given value to a String. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html index 927f2e3cab..4eb73de5c2 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html @@ -1,4 +1,6 @@ -Wallet in bdk::wallet - Rust

    Struct bdk::wallet::Wallet[][src]

    pub struct Wallet<B, D> { /* fields omitted */ }
    Expand description

    A Bitcoin wallet

    +Wallet in bdk::wallet - Rust +
    logo

    Struct bdk::wallet::Wallet[][src]

    pub struct Wallet<B, D> { /* fields omitted */ }
    Expand description

    A Bitcoin wallet

    A wallet takes descriptors, a database and a blockchain and implements the basic functions that a Bitcoin wallets needs to operate, like generating addresses, returning the balance, @@ -8,30 +10,35 @@ implements

    Implementations

    Create a new “offline” wallet

    Get the Bitcoin network the wallet is using.

    -

    Return a derived address using the external descriptor, see AddressIndex for +

    Return a derived address using the external descriptor, see AddressIndex for available address index selection strategies. If none of the keys in the descriptor are derivable (ie. does not end with /*) then the same address will always be returned for any AddressIndex.

    Return whether or not a script is part of this wallet (either internal or external)

    Return the list of unspent outputs of this wallet

    -

    Note that this methods only operate on the internal database, which first needs to be +

    Note that this method only operates on the internal database, which first needs to be Wallet::sync manually.

    Returns the UTXO owned by this wallet corresponding to outpoint if it exists in the wallet’s database.

    -

    Return the list of transactions made and received by the wallet

    +

    Return a single transactions made and received by the wallet

    +

    Optionally fill the TransactionDetails::transaction field with the raw transaction if +include_raw is true.

    +

    Note that this method only operates on the internal database, which first needs to be +Wallet::sync manually.

    +

    Return the list of transactions made and received by the wallet

    Optionally fill the TransactionDetails::transaction field with the raw transaction if include_raw is true.

    Note that this methods only operate on the internal database, which first needs to be Wallet::sync manually.

    -

    Return the balance, meaning the sum of this wallet’s unspent outputs’ values

    +

    Return the balance, meaning the sum of this wallet’s unspent outputs’ values

    Note that this methods only operate on the internal database, which first needs to be Wallet::sync manually.

    -

    Add an external signer

    +

    Add an external signer

    See the signer module for an example.

    -

    Add an address validator

    +

    Add an address validator

    See the address_validator module for an example.

    -

    Start building a transaction.

    +

    Start building a transaction.

    This returns a blank TxBuilder from which you can specify the parameters for the transaction.

    -

    Example

    +
    Example
    let (psbt, details) = {
        let mut builder =  wallet.build_tx();
        builder
    @@ -40,11 +47,11 @@ wallet’s database.

    }; // sign and broadcast ...
    -

    Bump the fee of a transaction previously created with this wallet.

    +

    Bump the fee of a transaction previously created with this wallet.

    Returns an error if the transaction is already confirmed or doesn’t explicitly signal -repalce by fee (RBF). If the transaction can be fee bumped then it returns a TxBuilder +replace by fee (RBF). If the transaction can be fee bumped then it returns a TxBuilder pre-populated with the inputs and outputs of the original transaction.

    -

    Example

    +
    Example
    let (mut psbt, _) = {
         let mut builder = wallet.build_tx();
         builder
    @@ -52,7 +59,7 @@ pre-populated with the inputs and outputs of the original transaction.

    .enable_rbf(); builder.finish()? }; -let _ = wallet.sign(&mut psbt, SignOptions::default())?; +let _ = wallet.sign(&mut psbt, SignOptions::default())?; let tx = psbt.extract_tx(); // broadcast tx but it's taking too long to confirm so we want to bump the fee let (mut psbt, _) = { @@ -62,53 +69,52 @@ pre-populated with the inputs and outputs of the original transaction.

    builder.finish()? }; -let _ = wallet.sign(&mut psbt, SignOptions::default())?; +let _ = wallet.sign(&mut psbt, SignOptions::default())?; let fee_bumped_tx = psbt.extract_tx(); // broadcast fee_bumped_tx to replace original
    -

    Sign a transaction with all the wallet’s signers, in the order specified by every signer’s +

    Sign a transaction with all the wallet’s signers, in the order specified by every signer’s SignerOrdering

    The SignOptions can be used to tweak the behavior of the software signers, and the way the transaction is finalized at the end. Note that it can’t be guaranteed that every signers will follow the options, but the “software signers” (WIF keys and xprv) defined in this library will.

    -

    Example

    +
    Example
    let (mut psbt, _) = {
         let mut builder = wallet.build_tx();
         builder.add_recipient(to_address.script_pubkey(), 50_000);
         builder.finish()?
     };
    -let  finalized = wallet.sign(&mut psbt, SignOptions::default())?;
    +let  finalized = wallet.sign(&mut psbt, SignOptions::default())?;
     assert!(finalized, "we should have signed all the inputs");
    -

    Return the spending policies for the wallet’s descriptor

    -

    Return the “public” version of the wallet’s descriptor, meaning a new descriptor that has +

    Return the spending policies for the wallet’s descriptor

    +

    Return the “public” version of the wallet’s descriptor, meaning a new descriptor that has the same structure but with every secret key removed

    This can be used to build a watch-only version of a wallet

    -

    Try to finalize a PSBT

    +

    Try to finalize a PSBT

    The SignOptions can be used to tweak the behavior of the finalizer.

    -

    Return the secp256k1 context used for all signing operations

    -

    Returns the descriptor used to create adddresses for a particular keychain.

    -

    get the corresponding PSBT Input for a LocalUtxo

    -

    Create a new “online” wallet

    -

    Sync the internal database with the blockchain

    -

    Return a reference to the internal blockchain client

    -

    Broadcast a transaction to the network

    +

    Return the secp256k1 context used for all signing operations

    +

    Returns the descriptor used to create addresses for a particular keychain.

    +

    get the corresponding PSBT Input for a LocalUtxo

    +

    Return an immutable reference to the internal database

    +

    Create a new “online” wallet

    +

    Sync the internal database with the blockchain

    +

    Return a reference to the internal blockchain client

    +

    Broadcast a transaction to the network

    Trait Implementations

    Formats the value using the given formatter. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/fn.get_timestamp.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/fn.get_timestamp.html index b08cbaaa2a..e0ac4bc84a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/fn.get_timestamp.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/fn.get_timestamp.html @@ -1,4 +1,5 @@ -get_timestamp in bdk::wallet::time - Rust

    Function bdk::wallet::time::get_timestamp[][src]

    pub fn get_timestamp() -> u64
    Expand description

    Return the current timestamp in seconds

    -
    - +get_timestamp in bdk::wallet::time - Rust +
    logo

    Function bdk::wallet::time::get_timestamp[][src]

    pub fn get_timestamp() -> u64
    Expand description

    Return the current timestamp in seconds

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/index.html index 8b626f260e..ff34781cfd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/time/index.html @@ -1,10 +1,11 @@ -bdk::wallet::time - Rust

    Module bdk::wallet::time[][src]

    Expand description

    Cross-platform time

    +bdk::wallet::time - Rust +
    logo

    Module bdk::wallet::time[][src]

    Expand description

    Cross-platform time

    This module provides a function to get the current timestamp that works on all the platforms supported by the library.

    It can be useful to compare it with the timestamps found in TransactionDetails.

    -

    Functions

    -

    Return the current timestamp in seconds

    -
    - +

    Functions

    +

    Return the current timestamp in seconds

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/trait.IsDust.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/trait.IsDust.html index 368609d8ab..8cea92eb12 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/trait.IsDust.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/trait.IsDust.html @@ -1,7 +1,8 @@ -IsDust in bdk::wallet - Rust

    Trait bdk::wallet::IsDust[][src]

    pub trait IsDust {
    +IsDust in bdk::wallet - Rust
    +    
    logo

    Trait bdk::wallet::IsDust[][src]

    pub trait IsDust {
         fn is_dust(&self) -> bool;
     }
    Expand description

    Trait to check if a value is below the dust limit

    Required methods

    Check whether or not a value is below dust limit

    -

    Implementations on Foreign Types

    Implementors

    - +

    Implementations on Foreign Types

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.ChangeSpendPolicy.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.ChangeSpendPolicy.html index ee7b4f8ee2..6fcfc5aeb1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.ChangeSpendPolicy.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.ChangeSpendPolicy.html @@ -1,51 +1,50 @@ -ChangeSpendPolicy in bdk::wallet::tx_builder - Rust

    Enum bdk::wallet::tx_builder::ChangeSpendPolicy[][src]

    pub enum ChangeSpendPolicy {
    +ChangeSpendPolicy in bdk::wallet::tx_builder - Rust
    +    
    logo

    Enum bdk::wallet::tx_builder::ChangeSpendPolicy[][src]

    pub enum ChangeSpendPolicy {
         ChangeAllowed,
         OnlyChange,
         ChangeForbidden,
     }
    Expand description

    Policy regarding the use of change outputs when creating a transaction

    -

    Variants

    ChangeAllowed

    Use both change and non-change outputs (default)

    -
    OnlyChange

    Only use change outputs (see TxBuilder::only_spend_change)

    -
    ChangeForbidden

    Only use non-change outputs (see TxBuilder::do_not_spend_change)

    -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

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

    -

    Feeds this value into the given Hasher. Read more

    -

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

    -

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    -

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

    Variants

    ChangeAllowed

    Use both change and non-change outputs (default)

    +

    OnlyChange

    Only use change outputs (see TxBuilder::only_spend_change)

    +

    ChangeForbidden

    Only use non-change outputs (see TxBuilder::do_not_spend_change)

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

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

    +

    Feeds this value into the given Hasher. Read more

    +

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

    +

    This method returns an Ordering between self and other. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    +

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    -

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests for !=.

    +

    This method returns an ordering between self and other values if one exists. Read more

    +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.TxOrdering.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.TxOrdering.html index dbc248f800..4f17e1d8bc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.TxOrdering.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/enum.TxOrdering.html @@ -1,52 +1,51 @@ -TxOrdering in bdk::wallet::tx_builder - Rust

    Enum bdk::wallet::tx_builder::TxOrdering[][src]

    pub enum TxOrdering {
    +TxOrdering in bdk::wallet::tx_builder - Rust
    +    
    logo

    Enum bdk::wallet::tx_builder::TxOrdering[][src]

    pub enum TxOrdering {
         Shuffle,
         Untouched,
         Bip69Lexicographic,
     }
    Expand description

    Ordering of the transaction’s inputs and outputs

    -

    Variants

    Shuffle

    Randomized (default)

    -
    Untouched

    Unchanged

    -
    Bip69Lexicographic

    BIP69 / Lexicographic

    -

    Implementations

    Sort transaction inputs and outputs by TxOrdering variant

    -

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    -

    Formats the value using the given formatter. Read more

    -

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

    -

    Feeds this value into the given Hasher. Read more

    -

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

    -

    This method returns an Ordering between self and other. Read more

    -

    Compares and returns the maximum of two values. Read more

    -

    Compares and returns the minimum of two values. Read more

    -

    Restrict a value to a certain interval. Read more

    -

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

    Variants

    Shuffle

    Randomized (default)

    +

    Untouched

    Unchanged

    +

    Bip69Lexicographic

    BIP69 / Lexicographic

    +

    Implementations

    Sort transaction inputs and outputs by TxOrdering variant

    +

    Trait Implementations

    Returns a copy of the value. Read more

    +

    Performs copy-assignment from source. Read more

    +

    Formats the value using the given formatter. Read more

    +

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

    +

    Feeds this value into the given Hasher. Read more

    +

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

    +

    This method returns an Ordering between self and other. Read more

    +

    Compares and returns the maximum of two values. Read more

    +

    Compares and returns the minimum of two values. Read more

    +

    Restrict a value to a certain interval. Read more

    +

    This method tests for self and other values to be equal, and is used by ==. Read more

    -

    This method tests for !=.

    -

    This method returns an ordering between self and other values if one exists. Read more

    -

    This method tests less than (for self and other) and is used by the < operator. Read more

    -

    This method tests less than or equal to (for self and other) and is used by the <= +

    This method tests for !=.

    +

    This method returns an ordering between self and other values if one exists. Read more

    +

    This method tests less than (for self and other) and is used by the < operator. Read more

    +

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

    -

    This method tests greater than (for self and other) and is used by the > operator. Read more

    -

    This method tests greater than or equal to (for self and other) and is used by the >= +

    This method tests greater than (for self and other) and is used by the > operator. Read more

    +

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

    -

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/index.html index abe616a8c4..292bd80211 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/index.html @@ -1,5 +1,7 @@ -bdk::wallet::tx_builder - Rust

    Module bdk::wallet::tx_builder[][src]

    Expand description

    Transaction builder

    -

    Example

    +bdk::wallet::tx_builder - Rust +
    logo

    Module bdk::wallet::tx_builder[][src]

    Expand description

    Transaction builder

    +

    Example

    // create a TxBuilder from a wallet
     let mut tx_builder = wallet.build_tx();
     
    @@ -13,16 +15,15 @@
         // Turn on RBF signaling
         .enable_rbf();
     let (psbt, tx_details) = tx_builder.finish()?;
    -

    Structs

    -

    Marker type to indicate the TxBuilder is being used to bump the fee of an existing transaction.

    -

    Marker type to indicate the TxBuilder is being used to create a new transaction (as opposed +

    Structs

    +

    Marker type to indicate the TxBuilder is being used to bump the fee of an existing transaction.

    +

    Marker type to indicate the TxBuilder is being used to create a new transaction (as opposed to bumping the fee of an existing one).

    -

    A transaction builder

    -

    Enums

    -

    Policy regarding the use of change outputs when creating a transaction

    -

    Ordering of the transaction’s inputs and outputs

    -

    Traits

    -

    Context in which the TxBuilder is valid

    -
    - +

    A transaction builder

    +

    Enums

    +

    Policy regarding the use of change outputs when creating a transaction

    +

    Ordering of the transaction’s inputs and outputs

    +

    Traits

    +

    Context in which the TxBuilder is valid

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.BumpFee.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.BumpFee.html index 82a9195942..53aa7245b8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.BumpFee.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.BumpFee.html @@ -1,28 +1,27 @@ -BumpFee in bdk::wallet::tx_builder - Rust

    Struct bdk::wallet::tx_builder::BumpFee[][src]

    pub struct BumpFee;
    Expand description

    Marker type to indicate the TxBuilder is being used to bump the fee of an existing transaction.

    +BumpFee in bdk::wallet::tx_builder - Rust +
    logo

    Struct bdk::wallet::tx_builder::BumpFee[][src]

    pub struct BumpFee;
    Expand description

    Marker type to indicate the TxBuilder is being used to bump the fee of an existing transaction.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.CreateTx.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.CreateTx.html index bc3c167a86..de4ea483c4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.CreateTx.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.CreateTx.html @@ -1,29 +1,28 @@ -CreateTx in bdk::wallet::tx_builder - Rust

    Struct bdk::wallet::tx_builder::CreateTx[][src]

    pub struct CreateTx;
    Expand description

    Marker type to indicate the TxBuilder is being used to create a new transaction (as opposed +CreateTx in bdk::wallet::tx_builder - Rust +

    logo

    Struct bdk::wallet::tx_builder::CreateTx[][src]

    pub struct CreateTx;
    Expand description

    Marker type to indicate the TxBuilder is being used to create a new transaction (as opposed to bumping the fee of an existing one).

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

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

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html index 2cad412b0e..efe4cd4030 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html @@ -1,4 +1,6 @@ -TxBuilder in bdk::wallet::tx_builder - Rust

    Struct bdk::wallet::tx_builder::TxBuilder[][src]

    pub struct TxBuilder<'a, B, D, Cs, Ctx> { /* fields omitted */ }
    Expand description

    A transaction builder

    +TxBuilder in bdk::wallet::tx_builder - Rust +
    logo

    Struct bdk::wallet::tx_builder::TxBuilder[][src]

    pub struct TxBuilder<'a, B, D, Cs, Ctx> { /* fields omitted */ }
    Expand description

    A transaction builder

    A TxBuilder is created by calling build_tx or build_fee_bump on a wallet. After assigning it, you set options on it until finally calling finish to consume the builder and generate the transaction.

    @@ -39,7 +41,7 @@ This means it is usually best to call Policy::id) and the value is the list of the indexes of the items that are intended to be satisfied from the policy node (see SatisfiableItem::Thresh::items).

    -

    Example

    +
    Example

    An example of when the policy path is needed is the following descriptor: wsh(thresh(2,pk(A),sj:and_v(v:pk(B),n:older(6)),snj:and_v(v:pk(C),after(630000)))), derived from the miniscript policy thresh(2,pk(A),and(pk(B),older(6)),and(pk(C),after(630000))). @@ -92,7 +94,7 @@ the “utxos” and the “unspendable” list, it will be spent.

  • psbt_input: To know the value.
  • satisfaction_weight: To know how much weight/vbytes the input will add to the transaction for fee calculation.
  • -

    There are several security concerns about adding foregin UTXOs that application +

    There are several security concerns about adding foreign UTXOs that application developers should consider. First, how do you know the value of the input is correct? If a non_witness_utxo is provided in the psbt_input then this method implicitly verifies the value by checking it against the transaction. If only a witness_utxo is provided then this @@ -108,7 +110,7 @@ of course check the real input weight matches the expected weight prior to broad psbt_input provide a miniscript descriptor for the input so you can check it against the script_pubkey and then ask it for the max_satisfaction_weight.

    This is an EXPERIMENTAL feature, API and other major changes are expected.

    -

    Errors

    +
    Errors

    This method returns errors in the following circumstances:

    1. The psbt_input does not contain a witness_utxo or non_witness_utxo.
    2. @@ -165,9 +167,10 @@ BitBox and ColdCard are known to require this.

      and the given nsequence is lower than the CSV value.

      If the nsequence is higher than 0xFFFFFFFD an error will be thrown, since it would not be a valid nSequence to signal RBF.

      -

    Replace the recipients already added with a new list

    +

    Replace the recipients already added with a new list

    Add a recipient to the internal list

    -

    Sets the address to drain excess coins to.

    +

    Add data as an output, using OP_RETURN

    +

    Sets the address to drain excess coins to.

    Usually, when there are excess coins they are sent to a change address generated by the wallet. This option replaces the usual change address with an arbitrary script_pubkey of your choosing. Just as with a change output, if the drain output is not needed (the excess @@ -176,7 +179,7 @@ difference is that it is valid to use drain_to without setting any with add_recipient (but it is perfectly fine to add recipients as well).

    When bumping the fees of a transaction made with this option, you probably want to use allow_shrinking to allow this output to be reduced to pay for the extra fees.

    -

    Example

    +
    Example

    drain_to is very useful for draining all the coins in a wallet with drain_wallet to a single address.

    @@ -190,7 +193,7 @@ single address.

    .fee_rate(FeeRate::from_sat_per_vb(5.0)) .enable_rbf(); let (psbt, tx_details) = tx_builder.finish()?;
    -

    Explicitly tells the wallet that it is allowed to reduce the fee of the output matching this +

    Explicitly tells the wallet that it is allowed to reduce the fee of the output matching this script_pubkey in order to bump the transaction fee. Without specifying this the wallet will attempt to find a change output to shrink instead.

    Note that the output may shrink to below the dust limit and therefore be removed. If it is @@ -199,28 +202,25 @@ originally.

    Returns an Err if script_pubkey can’t be found among the recipients of the transaction we are bumping.

    Trait Implementations

    Returns a copy of the value. Read more

    -

    Performs copy-assignment from source. Read more

    +

    Performs copy-assignment from source. Read more

    Formats the value using the given formatter. Read more

    Auto Trait Implementations

    Blanket Implementations

    Gets the TypeId of self. Read more

    -

    Immutably borrows from an owned value. Read more

    -

    Mutably borrows from an owned value. Read more

    -

    Performs the conversion.

    -

    Performs the conversion.

    +

    Immutably borrows from an owned value. Read more

    +

    Mutably borrows from an owned value. Read more

    +

    Performs the conversion.

    +

    Performs the conversion.

    The alignment of pointer.

    The type for initializers.

    Initializes a with the given initializer. Read more

    Dereferences the given pointer. Read more

    Mutably dereferences the given pointer. Read more

    Drops the object pointed to by the given pointer. Read more

    -

    Should always be Self

    The resulting type after obtaining ownership.

    Creates owned data from borrowed data, usually by cloning. Read more

    -
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    recently added

    -

    Uses borrowed data to replace owned data, usually by cloning. Read more

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -

    The type returned in the event of a conversion error.

    -

    Performs the conversion.

    -
    - +
    🔬 This is a nightly-only experimental API. (toowned_clone_into)

    Uses borrowed data to replace owned data, usually by cloning. Read more

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +

    The type returned in the event of a conversion error.

    +

    Performs the conversion.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/trait.TxBuilderContext.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/trait.TxBuilderContext.html index 15e506e385..b84a230107 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/trait.TxBuilderContext.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/trait.TxBuilderContext.html @@ -1,4 +1,5 @@ -TxBuilderContext in bdk::wallet::tx_builder - Rust

    Trait bdk::wallet::tx_builder::TxBuilderContext[][src]

    pub trait TxBuilderContext: Debug + Default + Clone { }
    Expand description

    Context in which the TxBuilder is valid

    -

    Implementors

    - +TxBuilderContext in bdk::wallet::tx_builder - Rust +
    logo

    Trait bdk::wallet::tx_builder::TxBuilderContext[][src]

    pub trait TxBuilderContext: Debug + Default + Clone { }
    Expand description

    Context in which the TxBuilder is valid

    +

    Implementors

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/dark.css b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/dark.css index 56782e49a2..b97fa52f48 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/dark.css +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/dark.css @@ -1 +1 @@ -body{background-color:#353535;color:#ddd;}h1,h2,h3,h4{color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3,h4{border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre,.rustdoc.source .example-wrap{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.logo-container.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff)}*{scrollbar-color:rgb(64,65,67) #717171;}.sidebar{scrollbar-color:rgba(32,34,37,.6) transparent;}::-webkit-scrollbar-track{background-color:#717171;}::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar::-webkit-scrollbar-track{background-color:#717171;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#353535;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.search-results a:hover{background-color:#777;}.search-results a:focus{color:#eee !important;background-color:#616161;}.search-results a:focus span{color:#eee !important;}a.result-trait:focus{background-color:#013191;}a.result-traitalias:focus{background-color:#013191;}a.result-mod:focus,a.result-externcrate:focus{background-color:#afc6e4;}a.result-mod:focus{background-color:#803a1b;}a.result-externcrate:focus{background-color:#396bac;}a.result-enum:focus{background-color:#5b4e68;}a.result-struct:focus{background-color:#194e9f;}a.result-union:focus{background-color:#b7bd49;}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{background-color:#4950ed;}a.result-type:focus{background-color:#38902c;}a.result-foreigntype:focus{background-color:#b200d6;}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{background-color:#217d1c;}a.result-constant:focus,a.result-static:focus{background-color:#0063cc;}a.result-primitive:focus{background-color:#00708a;}a.result-keyword:focus{background-color:#884719;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#82b089;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#ff7f00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#dd7de8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#a6ae37;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#82a5c9;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#43aec7;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#bda000;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#b397da;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav:not(.sidebar){border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#ddd;}body.source .example-wrap pre.rust a{background:#333;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#D2991D;}a.test-arrow{color:#dedede;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}details.rustdoc-toggle>summary::before,details.undocumented>summary::before{filter:invert(100%);}#crate-search{color:#111;background-color:#f0f0f0;border-color:#000;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input{color:#111;background-color:#f0f0f0;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input:focus{border-color:#008dfd;}.search-input:disabled{background-color:#c5c4c4;}#crate-search+.search-input:focus{box-shadow:0 0 8px 4px #078dd8;}.module-item .stab,.import-item .stab{color:#ddd;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#2f2f2f;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;color:#2f2f2f;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;color:#2f2f2f;}.stab.portability>code{background:none;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help span.bottom,#help span.top{border-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);}.since{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target,:target>*{background-color:#494a3d;}:target{border-right:3px solid #bb7410;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.8);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.8);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.8);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.8);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;border-color:#000;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#111;border-color:#777;}.notable-traits-tooltiptext .notable{border-bottom-color:#d2d2d2;}#titles>button:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>button:hover,#titles>button.selected{border-top-color:#0089ff;background-color:#353535;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#e0e0e0;background:#f0f0f0;color:#000;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#ffb900;}#copy-path{color:#999;}#copy-path>img{filter:invert(50%);}#copy-path:hover>img{filter:invert(65%);}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results .result-name span.alias{color:#fff;}.search-results .result-name span.grey{color:#ccc;}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;}.setting-line>.title{border-bottom-color:#ddd;} \ No newline at end of file +body{background-color:#353535;color:#ddd;}h1,h2,h3,h4{color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3,h4{border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre,.rustdoc.source .example-wrap{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff)}*{scrollbar-color:rgb(64,65,67) #717171;}.sidebar{scrollbar-color:rgba(32,34,37,.6) #5a5a5a;}::-webkit-scrollbar-track{background-color:#717171;}::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar::-webkit-scrollbar-track{background-color:#717171;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#565656;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5,.docblock h6{border-bottom-color:#DDD;}.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.search-results a:hover{background-color:#777;}.search-results a:focus{color:#eee !important;background-color:#616161;}.search-results a:focus span{color:#eee !important;}a.result-trait:focus{background-color:#013191;}a.result-traitalias:focus{background-color:#013191;}a.result-mod:focus,a.result-externcrate:focus{background-color:#afc6e4;}a.result-mod:focus{background-color:#803a1b;}a.result-externcrate:focus{background-color:#396bac;}a.result-enum:focus{background-color:#5b4e68;}a.result-struct:focus{background-color:#194e9f;}a.result-union:focus{background-color:#b7bd49;}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{background-color:#4950ed;}a.result-type:focus{background-color:#38902c;}a.result-foreigntype:focus{background-color:#b200d6;}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{background-color:#217d1c;}a.result-constant:focus,a.result-static:focus{background-color:#0063cc;}a.result-primitive:focus{background-color:#00708a;}a.result-keyword:focus{background-color:#884719;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#82b089;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#ff7f00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#dd7de8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#a6ae37;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#82a5c9;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#43aec7;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#bda000;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#b397da;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav:not(.sidebar){border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#D2991D;}a.srclink,a#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,pre.rust a,.sidebar a,.in-band a{color:#ddd;}.search-results a{color:#ddd;}a.test-arrow{color:#dedede;}body.source .example-wrap pre.rust a{background:#333;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}details.rustdoc-toggle>summary::before,details.undocumented>summary::before{filter:invert(100%);}#crate-search{color:#111;background-color:#f0f0f0;border-color:#000;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input{color:#111;background-color:#f0f0f0;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input:focus{border-color:#008dfd;}#crate-search+.search-input:focus{box-shadow:0 0 8px 4px #078dd8;}.module-item .stab,.import-item .stab{color:#ddd;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#2f2f2f;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;color:#2f2f2f;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;color:#2f2f2f;}.stab.portability>code{background:none;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help span.bottom,#help span.top{border-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);}.since{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target,:target>*{background-color:#494a3d;}:target{border-right:3px solid #bb7410;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.8);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.8);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.8);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.8);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;border-color:#000;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#111;border-color:#777;}.notable-traits-tooltiptext .notable{border-bottom-color:#d2d2d2;}#titles>button:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>button:hover,#titles>button.selected{border-top-color:#0089ff;background-color:#353535;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#e0e0e0;background:#f0f0f0;color:#000;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#ffb900;}#copy-path{color:#999;}#copy-path>img{filter:invert(50%);}#copy-path:hover>img{filter:invert(65%);}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results .result-name span.alias{color:#fff;}.search-results .result-name span.grey{color:#ccc;}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;}.setting-line>.title{border-bottom-color:#ddd;}.scraped-example .example-wrap .rust span.highlight{background:rgb(91,59,1);}.scraped-example .example-wrap .rust span.highlight.focus{background:rgb(124,75,15);}.scraped-example:not(.expanded) .code-wrapper:before{background:linear-gradient(to bottom,rgba(53,53,53,1),rgba(53,53,53,0));}.scraped-example:not(.expanded) .code-wrapper:after{background:linear-gradient(to top,rgba(53,53,53,1),rgba(53,53,53,0));}.toggle-line-inner{background:#616161;}.toggle-line:hover .toggle-line-inner{background:##898989;} \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js index fc88bc958d..ac41cfd89a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Clone for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Clone for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Clone for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Clone for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Clone for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Clone for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl Clone for NoopProgress","synthetic":false,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Clone for LogProgress","synthetic":false,"types":["bdk::blockchain::LogProgress"]},{"text":"impl<'s> Clone for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Clone for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Clone for SatisfiableItem","synthetic":false,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Clone for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Clone for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Clone for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl<'a> Clone for BuildSatisfaction<'a>","synthetic":false,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl Clone for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl Clone for PrivateKeyGenerateOptions","synthetic":false,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Clone for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Clone for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl Clone for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Clone for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Clone for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl Clone for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Clone for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Clone for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Clone for LargestFirstCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Clone for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Clone for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Clone for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Clone for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Clone for SignOptions","synthetic":false,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Clone for CreateTx","synthetic":false,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Clone for BumpFee","synthetic":false,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, Cs: Clone, Ctx, B, D> Clone for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":false,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Clone for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Clone for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; +implementors["bdk"] = [{"text":"impl Clone for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Clone for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Clone for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl Clone for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Clone for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Clone for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl Clone for NoopProgress","synthetic":false,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Clone for LogProgress","synthetic":false,"types":["bdk::blockchain::LogProgress"]},{"text":"impl Clone for SyncTime","synthetic":false,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> Clone for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Clone for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Clone for SatisfiableItem","synthetic":false,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Clone for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Clone for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Clone for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl<'a> Clone for BuildSatisfaction<'a>","synthetic":false,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl Clone for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl Clone for PrivateKeyGenerateOptions","synthetic":false,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Clone for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Clone for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl Clone for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Clone for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Clone for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl Clone for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Clone for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl Clone for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Clone for LargestFirstCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Clone for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Clone for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Clone for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Clone for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Clone for SignOptions","synthetic":false,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Clone for CreateTx","synthetic":false,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Clone for BumpFee","synthetic":false,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, Cs: Clone, Ctx, B, D> Clone for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":false,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Clone for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Clone for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js index f7925a3bf8..e71bd0b280 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Eq for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl<'s> Eq for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Eq for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Eq for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl Eq for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl Eq for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Eq for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Eq for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Eq for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Eq for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Eq for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Eq for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Eq for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Eq for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Eq for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; +implementors["bdk"] = [{"text":"impl Eq for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl<'s> Eq for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Eq for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Eq for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl Eq for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl Eq for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Eq for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Eq for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Eq for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl Eq for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Eq for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Eq for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Eq for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Eq for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Eq for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js index d505fe207f..653d499bd3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl PartialEq<AnyBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl PartialEq<ElectrumBlockchainConfig> for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl PartialEq<EsploraBlockchainConfig> for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl PartialEq<BitcoinPeerConfig> for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl PartialEq<CompactFiltersBlockchainConfig> for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl PartialEq<Capability> for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl<'s> PartialEq<DerivedDescriptorKey<'s>> for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl PartialEq<Condition> for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl PartialEq<PolicyError> for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl PartialEq<ScriptContextEnum> for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl PartialEq<KeychainKind> for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl PartialEq<FeeRate> for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl PartialEq<LocalUtxo> for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl PartialEq<WeightedUtxo> for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl PartialEq<Utxo> for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl PartialEq<TransactionDetails> for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl PartialEq<ConfirmationTime> for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl PartialEq<AddressValidatorError> for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl PartialEq<SignerId> for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl PartialEq<SignerError> for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl PartialEq<SignerOrdering> for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl PartialEq<TxOrdering> for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl PartialEq<ChangeSpendPolicy> for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl PartialEq<AddressInfo> for AddressInfo","synthetic":false,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl PartialEq<AnyBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl PartialEq<ElectrumBlockchainConfig> for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl PartialEq<EsploraBlockchainConfig> for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl PartialEq<BitcoinPeerConfig> for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl PartialEq<CompactFiltersBlockchainConfig> for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl PartialEq<Capability> for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl<'s> PartialEq<DerivedDescriptorKey<'s>> for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl PartialEq<Condition> for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl PartialEq<PolicyError> for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl PartialEq<ScriptContextEnum> for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl PartialEq<KeychainKind> for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl PartialEq<FeeRate> for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl PartialEq<LocalUtxo> for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl PartialEq<WeightedUtxo> for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl PartialEq<Utxo> for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl PartialEq<TransactionDetails> for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl PartialEq<BlockTime> for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl PartialEq<AddressValidatorError> for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl PartialEq<SignerId> for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl PartialEq<SignerError> for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl PartialEq<SignerOrdering> for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl PartialEq<TxOrdering> for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl PartialEq<ChangeSpendPolicy> for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl PartialEq<AddressInfo> for AddressInfo","synthetic":false,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js index ee9e5bfa5c..ee58911780 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<AddressValidatorError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<PolicyError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<SignerError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<KeyError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<PsbtParseError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<CompactFiltersError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<EsploraError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<ElectrumBlockchain> for AnyBlockchain","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl From<EsploraBlockchain> for AnyBlockchain","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl From<CompactFiltersBlockchain> for AnyBlockchain","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl From<ElectrumBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl From<EsploraBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl From<CompactFiltersBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl From<Client> for ElectrumBlockchain","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Transport> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<ParseIntError> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<SystemTimeError> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<MemoryDatabase> for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl From<Tree> for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl From<SqliteDatabase> for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl From<<MemoryDatabase as BatchDatabase>::Batch> for AnyBatch","synthetic":false,"types":["bdk::database::any::AnyBatch"]},{"text":"impl From<<Tree as BatchDatabase>::Batch> for AnyBatch","synthetic":false,"types":["bdk::database::any::AnyBatch"]},{"text":"impl From<<SqliteDatabase as BatchDatabase>::Batch> for AnyBatch","synthetic":false,"types":["bdk::database::any::AnyBatch"]},{"text":"impl From<()> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl From<SledDbConfiguration> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl From<SqliteDbConfiguration> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl From<KeyError> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<PolicyError> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<bool> for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl From<SatisfiableItem> for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl<Ctx: ScriptContext> From<ExtendedPubKey> for ExtendedKey<Ctx>","synthetic":false,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<Ctx: ScriptContext> From<ExtendedPrivKey> for ExtendedKey<Ctx>","synthetic":false,"types":["bdk::keys::ExtendedKey"]},{"text":"impl From<Error> for KeyError","synthetic":false,"types":["bdk::keys::KeyError"]},{"text":"impl From<Error> for KeyError","synthetic":false,"types":["bdk::keys::KeyError"]},{"text":"impl From<Hash> for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl From<Fingerprint> for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl From<HashMap<DescriptorPublicKey, DescriptorSecretKey, RandomState>> for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]}]; +implementors["bdk"] = [{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<AddressValidatorError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<PolicyError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<SignerError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<KeyError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<PsbtParseError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<CompactFiltersError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<EsploraError> for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl From<ElectrumBlockchain> for AnyBlockchain","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl From<EsploraBlockchain> for AnyBlockchain","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl From<CompactFiltersBlockchain> for AnyBlockchain","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl From<ElectrumBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl From<EsploraBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl From<CompactFiltersBlockchainConfig> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl From<Client> for ElectrumBlockchain","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Transport> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<ParseIntError> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<SystemTimeError> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<Error> for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl From<MemoryDatabase> for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl From<Tree> for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl From<SqliteDatabase> for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl From<<MemoryDatabase as BatchDatabase>::Batch> for AnyBatch","synthetic":false,"types":["bdk::database::any::AnyBatch"]},{"text":"impl From<<Tree as BatchDatabase>::Batch> for AnyBatch","synthetic":false,"types":["bdk::database::any::AnyBatch"]},{"text":"impl From<<SqliteDatabase as BatchDatabase>::Batch> for AnyBatch","synthetic":false,"types":["bdk::database::any::AnyBatch"]},{"text":"impl From<()> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl From<SledDbConfiguration> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl From<SqliteDbConfiguration> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl From<KeyError> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<Error> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<PolicyError> for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl From<bool> for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl From<SatisfiableItem> for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl<Ctx: ScriptContext> From<ExtendedPubKey> for ExtendedKey<Ctx>","synthetic":false,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<Ctx: ScriptContext> From<ExtendedPrivKey> for ExtendedKey<Ctx>","synthetic":false,"types":["bdk::keys::ExtendedKey"]},{"text":"impl From<Error> for KeyError","synthetic":false,"types":["bdk::keys::KeyError"]},{"text":"impl From<Error> for KeyError","synthetic":false,"types":["bdk::keys::KeyError"]},{"text":"impl From<Hash> for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl From<Fingerprint> for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl From<HashMap<DescriptorPublicKey, DescriptorSecretKey, RandomState>> for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js index f8973ba8b2..6c7914178f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Default for Mempool","synthetic":false,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Default for MemoryDatabase","synthetic":false,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Default for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Default for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Default for PrivateKeyGenerateOptions","synthetic":false,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Default for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl Default for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Default for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Default for LargestFirstCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Default for BranchAndBoundCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Default for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Default for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Default for SignOptions","synthetic":false,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Default for CreateTx","synthetic":false,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Default for BumpFee","synthetic":false,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl Default for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Default for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; +implementors["bdk"] = [{"text":"impl Default for Mempool","synthetic":false,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Default for MemoryDatabase","synthetic":false,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Default for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Default for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Default for PrivateKeyGenerateOptions","synthetic":false,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Default for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl Default for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Default for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl Default for LargestFirstCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Default for BranchAndBoundCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Default for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Default for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Default for SignOptions","synthetic":false,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Default for CreateTx","synthetic":false,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Default for BumpFee","synthetic":false,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl Default for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Default for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js index f8b8e915aa..d3b7ea02df 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Debug for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl Debug for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Debug for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Debug for EsploraBlockchain","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Debug for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Debug for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Debug for Mempool","synthetic":false,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Debug for Peer","synthetic":false,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Debug for CompactFiltersBlockchain","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Debug for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Debug for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Debug for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Debug for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl Debug for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl Debug for SledDbConfiguration","synthetic":false,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Debug for SqliteDbConfiguration","synthetic":false,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Debug for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Debug for SqliteDatabase","synthetic":false,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Debug for MemoryDatabase","synthetic":false,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> Debug for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Debug for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl Debug for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Debug for SatisfiableItem","synthetic":false,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Debug for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Debug for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Debug for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Debug for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Debug for BuildSatisfaction<'a>","synthetic":false,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<Ctx: Debug + ScriptContext> Debug for DescriptorKey<Ctx>","synthetic":false,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Debug for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl Debug for PrivateKeyGenerateOptions","synthetic":false,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Debug for KeyError","synthetic":false,"types":["bdk::keys::KeyError"]},{"text":"impl Debug for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Debug for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl Debug for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Debug for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Debug for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl Debug for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Debug for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Debug for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Debug for CoinSelectionResult","synthetic":false,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Debug for LargestFirstCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Debug for BranchAndBoundCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Debug for WalletExport","synthetic":false,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Debug for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Debug for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Debug for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Debug for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Debug for SignOptions","synthetic":false,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Debug for CreateTx","synthetic":false,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Debug for BumpFee","synthetic":false,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B: Debug, D: Debug, Cs: Debug, Ctx: Debug> Debug for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":false,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Debug for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Debug for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B: Debug, D: Debug> Debug for Wallet<B, D>","synthetic":false,"types":["bdk::wallet::Wallet"]},{"text":"impl Debug for AddressIndex","synthetic":false,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Debug for AddressInfo","synthetic":false,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl Debug for Error","synthetic":false,"types":["bdk::error::Error"]},{"text":"impl Debug for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Debug for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Debug for EsploraBlockchain","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Debug for EsploraError","synthetic":false,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Debug for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl Debug for Mempool","synthetic":false,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Debug for Peer","synthetic":false,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Debug for CompactFiltersBlockchain","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Debug for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Debug for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Debug for CompactFiltersError","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Debug for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl Debug for AnyDatabase","synthetic":false,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl Debug for SledDbConfiguration","synthetic":false,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Debug for SqliteDbConfiguration","synthetic":false,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Debug for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Debug for SqliteDatabase","synthetic":false,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Debug for MemoryDatabase","synthetic":false,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Debug for SyncTime","synthetic":false,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> Debug for DerivedDescriptorKey<'s>","synthetic":false,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Debug for Error","synthetic":false,"types":["bdk::descriptor::error::Error"]},{"text":"impl Debug for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Debug for SatisfiableItem","synthetic":false,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Debug for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Debug for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Debug for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Debug for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Debug for BuildSatisfaction<'a>","synthetic":false,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<Ctx: Debug + ScriptContext> Debug for DescriptorKey<Ctx>","synthetic":false,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Debug for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl Debug for PrivateKeyGenerateOptions","synthetic":false,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Debug for KeyError","synthetic":false,"types":["bdk::keys::KeyError"]},{"text":"impl Debug for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Debug for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl Debug for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Debug for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Debug for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl Debug for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Debug for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl Debug for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Debug for CoinSelectionResult","synthetic":false,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Debug for LargestFirstCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Debug for BranchAndBoundCoinSelection","synthetic":false,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Debug for WalletExport","synthetic":false,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Debug for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Debug for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Debug for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Debug for SignersContainer","synthetic":false,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Debug for SignOptions","synthetic":false,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Debug for CreateTx","synthetic":false,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Debug for BumpFee","synthetic":false,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B: Debug, D: Debug, Cs: Debug, Ctx: Debug> Debug for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":false,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Debug for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Debug for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B: Debug, D: Debug> Debug for Wallet<B, D>","synthetic":false,"types":["bdk::wallet::Wallet"]},{"text":"impl Debug for AddressIndex","synthetic":false,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Debug for AddressInfo","synthetic":false,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js index 469a139430..6d4d4cfb98 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Freeze for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl !Freeze for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Freeze for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl !Freeze for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Freeze for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Freeze for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Freeze for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Freeze for EsploraGetHistory","synthetic":true,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl Freeze for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl !Freeze for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Freeze for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Freeze for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Freeze for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Freeze for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Freeze for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Freeze for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Freeze for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Freeze for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !Freeze for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !Freeze for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Freeze for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Freeze for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Freeze for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !Freeze for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Freeze for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> Freeze for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Freeze for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Freeze for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Freeze for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Freeze for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Freeze for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Freeze for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Freeze for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Freeze for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Freeze for P2Pkh<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Freeze for P2Wpkh_P2Sh<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Freeze for P2Wpkh<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Freeze for Bip44<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Freeze for Bip44Public<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Freeze for Bip49<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Freeze for Bip49Public<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Freeze for Bip84<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Freeze for Bip84Public<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl<Ctx> Freeze for DescriptorKey<Ctx>","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Freeze for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Freeze for ExtendedKey<Ctx>","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Freeze for GeneratedKey<K, Ctx> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Freeze for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Freeze for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Freeze for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Freeze for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Freeze for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Freeze for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Freeze for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Freeze for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Freeze for ConfirmationTime","synthetic":true,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Freeze for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Freeze for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Freeze for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Freeze for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Freeze for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Freeze for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Freeze for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Freeze for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Freeze for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Freeze for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Freeze for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Freeze for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> Freeze for TxBuilder<'a, B, D, Cs, Ctx> where
        Cs: Freeze, 
    ","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Freeze for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Freeze for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !Freeze for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Freeze for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Freeze for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl Freeze for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl !Freeze for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Freeze for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl !Freeze for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Freeze for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Freeze for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Freeze for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Freeze for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl !Freeze for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Freeze for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Freeze for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Freeze for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Freeze for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Freeze for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Freeze for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Freeze for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Freeze for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !Freeze for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !Freeze for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Freeze for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Freeze for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Freeze for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !Freeze for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Freeze for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Freeze for SyncTime","synthetic":true,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> Freeze for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Freeze for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Freeze for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Freeze for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Freeze for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Freeze for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Freeze for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Freeze for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Freeze for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Freeze for P2Pkh<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Freeze for P2Wpkh_P2Sh<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Freeze for P2Wpkh<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Freeze for Bip44<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Freeze for Bip44Public<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Freeze for Bip49<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Freeze for Bip49Public<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Freeze for Bip84<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Freeze for Bip84Public<K> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl Freeze for WordCount","synthetic":true,"types":["bdk::keys::bip39::WordCount"]},{"text":"impl<Ctx> Freeze for DescriptorKey<Ctx>","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Freeze for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Freeze for ExtendedKey<Ctx>","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Freeze for GeneratedKey<K, Ctx> where
        K: Freeze, 
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Freeze for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Freeze for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Freeze for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Freeze for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Freeze for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Freeze for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Freeze for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Freeze for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Freeze for BlockTime","synthetic":true,"types":["bdk::types::BlockTime"]},{"text":"impl Freeze for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Freeze for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Freeze for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Freeze for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Freeze for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Freeze for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Freeze for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Freeze for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Freeze for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Freeze for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Freeze for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Freeze for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> Freeze for TxBuilder<'a, B, D, Cs, Ctx> where
        Cs: Freeze, 
    ","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Freeze for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Freeze for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !Freeze for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Freeze for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Freeze for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js index 8af424700c..e4d80a88fb 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Send for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl Send for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Send for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Send for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Send for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Send for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Send for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Send for EsploraGetHistory","synthetic":true,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl Send for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Send for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Send for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Send for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Send for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Send for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Send for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Send for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Send for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Send for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !Send for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !Send for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Send for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Send for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Send for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Send for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl !Send for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> Send for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Send for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Send for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Send for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Send for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Send for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Send for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Send for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Send for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Send for P2Pkh<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Send for P2Wpkh_P2Sh<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Send for P2Wpkh<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Send for Bip44<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Send for Bip44Public<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Send for Bip49<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Send for Bip49Public<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Send for Bip84<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Send for Bip84Public<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl<Ctx> Send for DescriptorKey<Ctx> where
        Ctx: Send
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Send for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Send for ExtendedKey<Ctx> where
        Ctx: Send
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Send for GeneratedKey<K, Ctx> where
        Ctx: Send,
        K: Send
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Send for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Send for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Send for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Send for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Send for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Send for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Send for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Send for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Send for ConfirmationTime","synthetic":true,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Send for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Send for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Send for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Send for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Send for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Send for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Send for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Send for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Send for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Send for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Send for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Send for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !Send for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Send for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Send for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> Send for Wallet<B, D> where
        B: Send,
        D: Send
    ","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Send for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Send for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl Send for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl Send for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Send for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Send for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Send for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Send for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Send for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Send for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl Send for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Send for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Send for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Send for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Send for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Send for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Send for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Send for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Send for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl Send for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl Send for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Send for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Send for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Send for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Send for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Send for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Send for SyncTime","synthetic":true,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> Send for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Send for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Send for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Send for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Send for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Send for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Send for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Send for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Send for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Send for P2Pkh<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Send for P2Wpkh_P2Sh<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Send for P2Wpkh<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Send for Bip44<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Send for Bip44Public<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Send for Bip49<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Send for Bip49Public<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Send for Bip84<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Send for Bip84Public<K> where
        K: Send
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl Send for WordCount","synthetic":true,"types":["bdk::keys::bip39::WordCount"]},{"text":"impl<Ctx> Send for DescriptorKey<Ctx> where
        Ctx: Send
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Send for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Send for ExtendedKey<Ctx> where
        Ctx: Send
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Send for GeneratedKey<K, Ctx> where
        Ctx: Send,
        K: Send
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Send for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Send for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Send for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Send for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Send for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Send for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Send for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Send for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Send for BlockTime","synthetic":true,"types":["bdk::types::BlockTime"]},{"text":"impl Send for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Send for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Send for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Send for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Send for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Send for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Send for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Send for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Send for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Send for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Send for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Send for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !Send for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Send for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Send for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> Send for Wallet<B, D> where
        B: Send,
        D: Send
    ","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Send for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Send for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js index f0a5dbaf05..4d6d4c9098 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl StructuralEq for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl StructuralEq for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl StructuralEq for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl StructuralEq for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl StructuralEq for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl StructuralEq for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl StructuralEq for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl StructuralEq for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl StructuralEq for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl StructuralEq for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl StructuralEq for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl StructuralEq for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl StructuralEq for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl StructuralEq for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; +implementors["bdk"] = [{"text":"impl StructuralEq for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl StructuralEq for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl StructuralEq for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl StructuralEq for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl StructuralEq for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl StructuralEq for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl StructuralEq for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl StructuralEq for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl StructuralEq for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl StructuralEq for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl StructuralEq for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl StructuralEq for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl StructuralEq for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl StructuralEq for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js index faa39c8c1e..1054145a0f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl StructuralPartialEq for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl StructuralPartialEq for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl StructuralPartialEq for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl StructuralPartialEq for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl StructuralPartialEq for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl StructuralPartialEq for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl StructuralPartialEq for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl StructuralPartialEq for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl StructuralPartialEq for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl StructuralPartialEq for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl StructuralPartialEq for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl StructuralPartialEq for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl StructuralPartialEq for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl StructuralPartialEq for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl StructuralPartialEq for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl StructuralPartialEq for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl StructuralPartialEq for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl StructuralPartialEq for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl StructuralPartialEq for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl StructuralPartialEq for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl StructuralPartialEq for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl StructuralPartialEq for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl StructuralPartialEq for AddressInfo","synthetic":false,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl StructuralPartialEq for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl StructuralPartialEq for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl StructuralPartialEq for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl StructuralPartialEq for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl StructuralPartialEq for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl StructuralPartialEq for Capability","synthetic":false,"types":["bdk::blockchain::Capability"]},{"text":"impl StructuralPartialEq for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl StructuralPartialEq for PolicyError","synthetic":false,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl StructuralPartialEq for ScriptContextEnum","synthetic":false,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl StructuralPartialEq for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl StructuralPartialEq for FeeRate","synthetic":false,"types":["bdk::types::FeeRate"]},{"text":"impl StructuralPartialEq for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl StructuralPartialEq for WeightedUtxo","synthetic":false,"types":["bdk::types::WeightedUtxo"]},{"text":"impl StructuralPartialEq for Utxo","synthetic":false,"types":["bdk::types::Utxo"]},{"text":"impl StructuralPartialEq for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl StructuralPartialEq for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl StructuralPartialEq for AddressValidatorError","synthetic":false,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl StructuralPartialEq for SignerId","synthetic":false,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl StructuralPartialEq for SignerError","synthetic":false,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl StructuralPartialEq for SignerOrdering","synthetic":false,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl StructuralPartialEq for TxOrdering","synthetic":false,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl StructuralPartialEq for ChangeSpendPolicy","synthetic":false,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl StructuralPartialEq for AddressInfo","synthetic":false,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js index 2d66194d8d..9826f90a6e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Sync for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl Sync for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Sync for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Sync for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Sync for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Sync for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Sync for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Sync for EsploraGetHistory","synthetic":true,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl Sync for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Sync for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Sync for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Sync for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Sync for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Sync for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Sync for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Sync for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Sync for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Sync for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !Sync for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !Sync for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Sync for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Sync for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Sync for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !Sync for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl !Sync for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> Sync for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Sync for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Sync for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Sync for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Sync for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Sync for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Sync for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Sync for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Sync for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Sync for P2Pkh<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Sync for P2Wpkh_P2Sh<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Sync for P2Wpkh<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Sync for Bip44<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Sync for Bip44Public<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Sync for Bip49<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Sync for Bip49Public<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Sync for Bip84<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Sync for Bip84Public<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl<Ctx> Sync for DescriptorKey<Ctx> where
        Ctx: Sync
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Sync for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Sync for ExtendedKey<Ctx> where
        Ctx: Sync
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Sync for GeneratedKey<K, Ctx> where
        Ctx: Sync,
        K: Sync
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Sync for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Sync for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Sync for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Sync for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Sync for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Sync for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Sync for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Sync for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Sync for ConfirmationTime","synthetic":true,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Sync for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Sync for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Sync for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Sync for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Sync for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Sync for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Sync for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Sync for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Sync for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Sync for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Sync for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Sync for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !Sync for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Sync for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Sync for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !Sync for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Sync for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Sync for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl Sync for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl Sync for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Sync for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Sync for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Sync for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Sync for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Sync for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Sync for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl Sync for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Sync for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Sync for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Sync for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Sync for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Sync for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Sync for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Sync for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Sync for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !Sync for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !Sync for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Sync for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Sync for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Sync for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !Sync for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Sync for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Sync for SyncTime","synthetic":true,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> Sync for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Sync for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Sync for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Sync for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Sync for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Sync for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Sync for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Sync for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Sync for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Sync for P2Pkh<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Sync for P2Wpkh_P2Sh<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Sync for P2Wpkh<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Sync for Bip44<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Sync for Bip44Public<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Sync for Bip49<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Sync for Bip49Public<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Sync for Bip84<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Sync for Bip84Public<K> where
        K: Sync
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl Sync for WordCount","synthetic":true,"types":["bdk::keys::bip39::WordCount"]},{"text":"impl<Ctx> Sync for DescriptorKey<Ctx> where
        Ctx: Sync
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Sync for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Sync for ExtendedKey<Ctx> where
        Ctx: Sync
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Sync for GeneratedKey<K, Ctx> where
        Ctx: Sync,
        K: Sync
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Sync for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Sync for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Sync for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Sync for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Sync for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Sync for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Sync for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Sync for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Sync for BlockTime","synthetic":true,"types":["bdk::types::BlockTime"]},{"text":"impl Sync for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Sync for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Sync for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Sync for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Sync for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Sync for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Sync for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Sync for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Sync for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Sync for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Sync for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Sync for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !Sync for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Sync for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Sync for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !Sync for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Sync for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Sync for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js index 834a73d904..5ff37cf49d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Unpin for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl Unpin for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Unpin for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Unpin for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Unpin for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Unpin for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Unpin for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Unpin for EsploraGetHistory","synthetic":true,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl Unpin for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Unpin for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Unpin for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Unpin for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Unpin for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Unpin for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Unpin for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Unpin for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Unpin for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Unpin for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl Unpin for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl Unpin for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Unpin for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Unpin for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Unpin for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Unpin for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Unpin for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> Unpin for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Unpin for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Unpin for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Unpin for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Unpin for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Unpin for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Unpin for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Unpin for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Unpin for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Unpin for P2Pkh<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Unpin for P2Wpkh_P2Sh<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Unpin for P2Wpkh<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Unpin for Bip44<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Unpin for Bip44Public<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Unpin for Bip49<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Unpin for Bip49Public<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Unpin for Bip84<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Unpin for Bip84Public<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl<Ctx> Unpin for DescriptorKey<Ctx> where
        Ctx: Unpin
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Unpin for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Unpin for ExtendedKey<Ctx> where
        Ctx: Unpin
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Unpin for GeneratedKey<K, Ctx> where
        Ctx: Unpin,
        K: Unpin
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Unpin for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Unpin for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Unpin for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Unpin for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Unpin for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Unpin for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Unpin for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Unpin for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Unpin for ConfirmationTime","synthetic":true,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Unpin for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Unpin for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Unpin for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Unpin for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Unpin for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Unpin for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Unpin for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Unpin for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Unpin for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Unpin for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Unpin for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Unpin for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> Unpin for TxBuilder<'a, B, D, Cs, Ctx> where
        Cs: Unpin,
        Ctx: Unpin
    ","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Unpin for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Unpin for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> Unpin for Wallet<B, D> where
        B: Unpin,
        D: Unpin
    ","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Unpin for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Unpin for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl Unpin for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl Unpin for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl Unpin for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Unpin for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl Unpin for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Unpin for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl Unpin for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl Unpin for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl Unpin for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl Unpin for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl Unpin for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl Unpin for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Unpin for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Unpin for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl Unpin for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl Unpin for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl Unpin for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl Unpin for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl Unpin for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl Unpin for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Unpin for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Unpin for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Unpin for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl Unpin for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl Unpin for SyncTime","synthetic":true,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> Unpin for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl Unpin for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl Unpin for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Unpin for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Unpin for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Unpin for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Unpin for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Unpin for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> Unpin for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> Unpin for P2Pkh<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> Unpin for P2Wpkh_P2Sh<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> Unpin for P2Wpkh<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> Unpin for Bip44<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> Unpin for Bip44Public<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> Unpin for Bip49<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> Unpin for Bip49Public<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> Unpin for Bip84<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> Unpin for Bip84Public<K> where
        K: Unpin
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl Unpin for WordCount","synthetic":true,"types":["bdk::keys::bip39::WordCount"]},{"text":"impl<Ctx> Unpin for DescriptorKey<Ctx> where
        Ctx: Unpin
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl Unpin for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> Unpin for ExtendedKey<Ctx> where
        Ctx: Unpin
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> Unpin for GeneratedKey<K, Ctx> where
        Ctx: Unpin,
        K: Unpin
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl Unpin for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl Unpin for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl Unpin for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl Unpin for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl Unpin for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl Unpin for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl Unpin for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl Unpin for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl Unpin for BlockTime","synthetic":true,"types":["bdk::types::BlockTime"]},{"text":"impl Unpin for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl Unpin for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl Unpin for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl Unpin for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl Unpin for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl Unpin for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl Unpin for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl Unpin for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl Unpin for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl Unpin for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl Unpin for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl Unpin for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> Unpin for TxBuilder<'a, B, D, Cs, Ctx> where
        Cs: Unpin,
        Ctx: Unpin
    ","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl Unpin for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl Unpin for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> Unpin for Wallet<B, D> where
        B: Unpin,
        D: Unpin
    ","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl Unpin for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl Unpin for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js index 43f5c13951..aba091cb3e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl !RefUnwindSafe for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl !RefUnwindSafe for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl RefUnwindSafe for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl RefUnwindSafe for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl RefUnwindSafe for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl !RefUnwindSafe for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl RefUnwindSafe for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl RefUnwindSafe for EsploraGetHistory","synthetic":true,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl !RefUnwindSafe for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl RefUnwindSafe for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl !RefUnwindSafe for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl !RefUnwindSafe for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl RefUnwindSafe for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl RefUnwindSafe for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl !RefUnwindSafe for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl RefUnwindSafe for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl RefUnwindSafe for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl RefUnwindSafe for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !RefUnwindSafe for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !RefUnwindSafe for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl RefUnwindSafe for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl RefUnwindSafe for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl RefUnwindSafe for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !RefUnwindSafe for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl !RefUnwindSafe for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> RefUnwindSafe for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl RefUnwindSafe for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl RefUnwindSafe for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl RefUnwindSafe for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl RefUnwindSafe for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl RefUnwindSafe for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl RefUnwindSafe for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl RefUnwindSafe for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> RefUnwindSafe for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> RefUnwindSafe for P2Pkh<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> RefUnwindSafe for P2Wpkh_P2Sh<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> RefUnwindSafe for P2Wpkh<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> RefUnwindSafe for Bip44<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> RefUnwindSafe for Bip44Public<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> RefUnwindSafe for Bip49<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> RefUnwindSafe for Bip49Public<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> RefUnwindSafe for Bip84<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> RefUnwindSafe for Bip84Public<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl<Ctx> RefUnwindSafe for DescriptorKey<Ctx> where
        Ctx: RefUnwindSafe
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl RefUnwindSafe for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx> where
        Ctx: RefUnwindSafe
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> RefUnwindSafe for GeneratedKey<K, Ctx> where
        Ctx: RefUnwindSafe,
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl RefUnwindSafe for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl RefUnwindSafe for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl RefUnwindSafe for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl RefUnwindSafe for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl RefUnwindSafe for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl RefUnwindSafe for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl RefUnwindSafe for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl RefUnwindSafe for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl RefUnwindSafe for ConfirmationTime","synthetic":true,"types":["bdk::types::ConfirmationTime"]},{"text":"impl RefUnwindSafe for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl RefUnwindSafe for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl RefUnwindSafe for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl RefUnwindSafe for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl RefUnwindSafe for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl RefUnwindSafe for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl RefUnwindSafe for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl RefUnwindSafe for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl !RefUnwindSafe for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl RefUnwindSafe for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl RefUnwindSafe for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl RefUnwindSafe for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !RefUnwindSafe for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl RefUnwindSafe for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl RefUnwindSafe for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !RefUnwindSafe for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl RefUnwindSafe for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl RefUnwindSafe for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl !RefUnwindSafe for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl !RefUnwindSafe for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl RefUnwindSafe for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl RefUnwindSafe for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl RefUnwindSafe for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl !RefUnwindSafe for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl !RefUnwindSafe for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl RefUnwindSafe for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl RefUnwindSafe for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl !RefUnwindSafe for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl !RefUnwindSafe for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl RefUnwindSafe for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl RefUnwindSafe for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl !RefUnwindSafe for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl RefUnwindSafe for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl RefUnwindSafe for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl RefUnwindSafe for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !RefUnwindSafe for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !RefUnwindSafe for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl RefUnwindSafe for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl RefUnwindSafe for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl RefUnwindSafe for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !RefUnwindSafe for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl !RefUnwindSafe for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl RefUnwindSafe for SyncTime","synthetic":true,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> RefUnwindSafe for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl RefUnwindSafe for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl RefUnwindSafe for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl RefUnwindSafe for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl RefUnwindSafe for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl RefUnwindSafe for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl RefUnwindSafe for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl RefUnwindSafe for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> RefUnwindSafe for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> RefUnwindSafe for P2Pkh<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> RefUnwindSafe for P2Wpkh_P2Sh<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> RefUnwindSafe for P2Wpkh<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> RefUnwindSafe for Bip44<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> RefUnwindSafe for Bip44Public<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> RefUnwindSafe for Bip49<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> RefUnwindSafe for Bip49Public<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> RefUnwindSafe for Bip84<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> RefUnwindSafe for Bip84Public<K> where
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl RefUnwindSafe for WordCount","synthetic":true,"types":["bdk::keys::bip39::WordCount"]},{"text":"impl<Ctx> RefUnwindSafe for DescriptorKey<Ctx> where
        Ctx: RefUnwindSafe
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl RefUnwindSafe for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx> where
        Ctx: RefUnwindSafe
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> RefUnwindSafe for GeneratedKey<K, Ctx> where
        Ctx: RefUnwindSafe,
        K: RefUnwindSafe
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl RefUnwindSafe for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl RefUnwindSafe for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl RefUnwindSafe for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl RefUnwindSafe for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl RefUnwindSafe for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl RefUnwindSafe for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl RefUnwindSafe for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl RefUnwindSafe for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl RefUnwindSafe for BlockTime","synthetic":true,"types":["bdk::types::BlockTime"]},{"text":"impl RefUnwindSafe for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl RefUnwindSafe for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl RefUnwindSafe for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl RefUnwindSafe for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl RefUnwindSafe for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl RefUnwindSafe for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl RefUnwindSafe for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl RefUnwindSafe for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl !RefUnwindSafe for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl RefUnwindSafe for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl RefUnwindSafe for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl RefUnwindSafe for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !RefUnwindSafe for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl RefUnwindSafe for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl RefUnwindSafe for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !RefUnwindSafe for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl RefUnwindSafe for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl RefUnwindSafe for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js index 8eff90f98d..d4f28bacf6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl !UnwindSafe for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl !UnwindSafe for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl UnwindSafe for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl UnwindSafe for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl UnwindSafe for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl !UnwindSafe for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl UnwindSafe for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl UnwindSafe for EsploraGetHistory","synthetic":true,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl !UnwindSafe for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl UnwindSafe for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl !UnwindSafe for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl !UnwindSafe for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl UnwindSafe for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl UnwindSafe for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl !UnwindSafe for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl UnwindSafe for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl UnwindSafe for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl UnwindSafe for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !UnwindSafe for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !UnwindSafe for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl UnwindSafe for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl UnwindSafe for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl UnwindSafe for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !UnwindSafe for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl !UnwindSafe for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl<'s> UnwindSafe for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl UnwindSafe for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl UnwindSafe for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl UnwindSafe for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl UnwindSafe for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl UnwindSafe for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl UnwindSafe for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl UnwindSafe for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> UnwindSafe for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> UnwindSafe for P2Pkh<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> UnwindSafe for P2Wpkh_P2Sh<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> UnwindSafe for P2Wpkh<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> UnwindSafe for Bip44<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> UnwindSafe for Bip44Public<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> UnwindSafe for Bip49<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> UnwindSafe for Bip49Public<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> UnwindSafe for Bip84<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> UnwindSafe for Bip84Public<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl<Ctx> UnwindSafe for DescriptorKey<Ctx> where
        Ctx: UnwindSafe
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl UnwindSafe for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> UnwindSafe for ExtendedKey<Ctx> where
        Ctx: UnwindSafe
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> UnwindSafe for GeneratedKey<K, Ctx> where
        Ctx: UnwindSafe,
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl UnwindSafe for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl UnwindSafe for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl UnwindSafe for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl UnwindSafe for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl UnwindSafe for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl UnwindSafe for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl UnwindSafe for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl UnwindSafe for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl UnwindSafe for ConfirmationTime","synthetic":true,"types":["bdk::types::ConfirmationTime"]},{"text":"impl UnwindSafe for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl UnwindSafe for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl UnwindSafe for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl UnwindSafe for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl UnwindSafe for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl UnwindSafe for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl UnwindSafe for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl UnwindSafe for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl !UnwindSafe for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl UnwindSafe for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl UnwindSafe for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl UnwindSafe for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !UnwindSafe for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl UnwindSafe for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl UnwindSafe for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !UnwindSafe for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl UnwindSafe for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl UnwindSafe for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; +implementors["bdk"] = [{"text":"impl !UnwindSafe for Error","synthetic":true,"types":["bdk::error::Error"]},{"text":"impl !UnwindSafe for AnyBlockchain","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchain"]},{"text":"impl UnwindSafe for AnyBlockchainConfig","synthetic":true,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl UnwindSafe for ElectrumBlockchain","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchain"]},{"text":"impl UnwindSafe for ElectrumBlockchainConfig","synthetic":true,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl !UnwindSafe for EsploraBlockchain","synthetic":true,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchain"]},{"text":"impl !UnwindSafe for EsploraError","synthetic":true,"types":["bdk::blockchain::esplora::EsploraError"]},{"text":"impl UnwindSafe for EsploraBlockchainConfig","synthetic":true,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl UnwindSafe for Mempool","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Mempool"]},{"text":"impl !UnwindSafe for Peer","synthetic":true,"types":["bdk::blockchain::compact_filters::peer::Peer"]},{"text":"impl !UnwindSafe for CompactFiltersBlockchain","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchain"]},{"text":"impl UnwindSafe for BitcoinPeerConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl UnwindSafe for CompactFiltersBlockchainConfig","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl !UnwindSafe for CompactFiltersError","synthetic":true,"types":["bdk::blockchain::compact_filters::CompactFiltersError"]},{"text":"impl UnwindSafe for Capability","synthetic":true,"types":["bdk::blockchain::Capability"]},{"text":"impl UnwindSafe for NoopProgress","synthetic":true,"types":["bdk::blockchain::NoopProgress"]},{"text":"impl UnwindSafe for LogProgress","synthetic":true,"types":["bdk::blockchain::LogProgress"]},{"text":"impl !UnwindSafe for AnyDatabase","synthetic":true,"types":["bdk::database::any::AnyDatabase"]},{"text":"impl !UnwindSafe for AnyBatch","synthetic":true,"types":["bdk::database::any::AnyBatch"]},{"text":"impl UnwindSafe for SledDbConfiguration","synthetic":true,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl UnwindSafe for SqliteDbConfiguration","synthetic":true,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl UnwindSafe for AnyDatabaseConfig","synthetic":true,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl !UnwindSafe for SqliteDatabase","synthetic":true,"types":["bdk::database::sqlite::SqliteDatabase"]},{"text":"impl !UnwindSafe for MemoryDatabase","synthetic":true,"types":["bdk::database::memory::MemoryDatabase"]},{"text":"impl UnwindSafe for SyncTime","synthetic":true,"types":["bdk::database::SyncTime"]},{"text":"impl<'s> UnwindSafe for DerivedDescriptorKey<'s>","synthetic":true,"types":["bdk::descriptor::derived::DerivedDescriptorKey"]},{"text":"impl UnwindSafe for Error","synthetic":true,"types":["bdk::descriptor::error::Error"]},{"text":"impl UnwindSafe for PkOrF","synthetic":true,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl UnwindSafe for SatisfiableItem","synthetic":true,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl UnwindSafe for Satisfaction","synthetic":true,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl UnwindSafe for Policy","synthetic":true,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl UnwindSafe for Condition","synthetic":true,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl UnwindSafe for PolicyError","synthetic":true,"types":["bdk::descriptor::policy::PolicyError"]},{"text":"impl<'a> UnwindSafe for BuildSatisfaction<'a>","synthetic":true,"types":["bdk::descriptor::policy::BuildSatisfaction"]},{"text":"impl<K> UnwindSafe for P2Pkh<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Pkh"]},{"text":"impl<K> UnwindSafe for P2Wpkh_P2Sh<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh_P2Sh"]},{"text":"impl<K> UnwindSafe for P2Wpkh<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::P2Wpkh"]},{"text":"impl<K> UnwindSafe for Bip44<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44"]},{"text":"impl<K> UnwindSafe for Bip44Public<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip44Public"]},{"text":"impl<K> UnwindSafe for Bip49<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49"]},{"text":"impl<K> UnwindSafe for Bip49Public<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip49Public"]},{"text":"impl<K> UnwindSafe for Bip84<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84"]},{"text":"impl<K> UnwindSafe for Bip84Public<K> where
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::descriptor::template::Bip84Public"]},{"text":"impl UnwindSafe for WordCount","synthetic":true,"types":["bdk::keys::bip39::WordCount"]},{"text":"impl<Ctx> UnwindSafe for DescriptorKey<Ctx> where
        Ctx: UnwindSafe
    ","synthetic":true,"types":["bdk::keys::DescriptorKey"]},{"text":"impl UnwindSafe for ScriptContextEnum","synthetic":true,"types":["bdk::keys::ScriptContextEnum"]},{"text":"impl<Ctx> UnwindSafe for ExtendedKey<Ctx> where
        Ctx: UnwindSafe
    ","synthetic":true,"types":["bdk::keys::ExtendedKey"]},{"text":"impl<K, Ctx> UnwindSafe for GeneratedKey<K, Ctx> where
        Ctx: UnwindSafe,
        K: UnwindSafe
    ","synthetic":true,"types":["bdk::keys::GeneratedKey"]},{"text":"impl UnwindSafe for PrivateKeyGenerateOptions","synthetic":true,"types":["bdk::keys::PrivateKeyGenerateOptions"]},{"text":"impl UnwindSafe for KeyError","synthetic":true,"types":["bdk::keys::KeyError"]},{"text":"impl UnwindSafe for KeychainKind","synthetic":true,"types":["bdk::types::KeychainKind"]},{"text":"impl UnwindSafe for FeeRate","synthetic":true,"types":["bdk::types::FeeRate"]},{"text":"impl UnwindSafe for LocalUtxo","synthetic":true,"types":["bdk::types::LocalUtxo"]},{"text":"impl UnwindSafe for WeightedUtxo","synthetic":true,"types":["bdk::types::WeightedUtxo"]},{"text":"impl UnwindSafe for Utxo","synthetic":true,"types":["bdk::types::Utxo"]},{"text":"impl UnwindSafe for TransactionDetails","synthetic":true,"types":["bdk::types::TransactionDetails"]},{"text":"impl UnwindSafe for BlockTime","synthetic":true,"types":["bdk::types::BlockTime"]},{"text":"impl UnwindSafe for AddressValidatorError","synthetic":true,"types":["bdk::wallet::address_validator::AddressValidatorError"]},{"text":"impl UnwindSafe for CoinSelectionResult","synthetic":true,"types":["bdk::wallet::coin_selection::CoinSelectionResult"]},{"text":"impl UnwindSafe for LargestFirstCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::LargestFirstCoinSelection"]},{"text":"impl UnwindSafe for BranchAndBoundCoinSelection","synthetic":true,"types":["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]},{"text":"impl UnwindSafe for WalletExport","synthetic":true,"types":["bdk::wallet::export::WalletExport"]},{"text":"impl UnwindSafe for SignerId","synthetic":true,"types":["bdk::wallet::signer::SignerId"]},{"text":"impl UnwindSafe for SignerError","synthetic":true,"types":["bdk::wallet::signer::SignerError"]},{"text":"impl UnwindSafe for SignerOrdering","synthetic":true,"types":["bdk::wallet::signer::SignerOrdering"]},{"text":"impl !UnwindSafe for SignersContainer","synthetic":true,"types":["bdk::wallet::signer::SignersContainer"]},{"text":"impl UnwindSafe for SignOptions","synthetic":true,"types":["bdk::wallet::signer::SignOptions"]},{"text":"impl UnwindSafe for CreateTx","synthetic":true,"types":["bdk::wallet::tx_builder::CreateTx"]},{"text":"impl UnwindSafe for BumpFee","synthetic":true,"types":["bdk::wallet::tx_builder::BumpFee"]},{"text":"impl<'a, B, D, Cs, Ctx> !UnwindSafe for TxBuilder<'a, B, D, Cs, Ctx>","synthetic":true,"types":["bdk::wallet::tx_builder::TxBuilder"]},{"text":"impl UnwindSafe for TxOrdering","synthetic":true,"types":["bdk::wallet::tx_builder::TxOrdering"]},{"text":"impl UnwindSafe for ChangeSpendPolicy","synthetic":true,"types":["bdk::wallet::tx_builder::ChangeSpendPolicy"]},{"text":"impl<B, D> !UnwindSafe for Wallet<B, D>","synthetic":true,"types":["bdk::wallet::Wallet"]},{"text":"impl UnwindSafe for AddressIndex","synthetic":true,"types":["bdk::wallet::AddressIndex"]},{"text":"impl UnwindSafe for AddressInfo","synthetic":true,"types":["bdk::wallet::AddressInfo"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js index 4dddf8a258..b9adbc2a7b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl<'de> Deserialize<'de> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for EsploraGetHistory","synthetic":false,"types":["bdk::blockchain::esplora::EsploraGetHistory"]},{"text":"impl<'de> Deserialize<'de> for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl<'de> Deserialize<'de> for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for SledDbConfiguration","synthetic":false,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl<'de> Deserialize<'de> for SqliteDbConfiguration","synthetic":false,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl<'de> Deserialize<'de> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl<'de> Deserialize<'de> for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl<'de> Deserialize<'de> for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl<'de> Deserialize<'de> for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl<'de> Deserialize<'de> for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl<'de> Deserialize<'de> for WalletExport","synthetic":false,"types":["bdk::wallet::export::WalletExport"]}]; +implementors["bdk"] = [{"text":"impl<'de> Deserialize<'de> for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl<'de> Deserialize<'de> for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl<'de> Deserialize<'de> for SledDbConfiguration","synthetic":false,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl<'de> Deserialize<'de> for SqliteDbConfiguration","synthetic":false,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl<'de> Deserialize<'de> for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl<'de> Deserialize<'de> for SyncTime","synthetic":false,"types":["bdk::database::SyncTime"]},{"text":"impl<'de> Deserialize<'de> for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl<'de> Deserialize<'de> for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl<'de> Deserialize<'de> for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl<'de> Deserialize<'de> for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl<'de> Deserialize<'de> for WalletExport","synthetic":false,"types":["bdk::wallet::export::WalletExport"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js index 11272bbb51..fe77a57500 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["bdk"] = [{"text":"impl Serialize for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Serialize for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Serialize for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::ureq::EsploraBlockchainConfig"]},{"text":"impl Serialize for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Serialize for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Serialize for SledDbConfiguration","synthetic":false,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Serialize for SqliteDbConfiguration","synthetic":false,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Serialize for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Serialize for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Serialize for SatisfiableItem","synthetic":false,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Serialize for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Serialize for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Serialize for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Serialize for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Serialize for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Serialize for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Serialize for ConfirmationTime","synthetic":false,"types":["bdk::types::ConfirmationTime"]},{"text":"impl Serialize for WalletExport","synthetic":false,"types":["bdk::wallet::export::WalletExport"]}]; +implementors["bdk"] = [{"text":"impl Serialize for AnyBlockchainConfig","synthetic":false,"types":["bdk::blockchain::any::AnyBlockchainConfig"]},{"text":"impl Serialize for ElectrumBlockchainConfig","synthetic":false,"types":["bdk::blockchain::electrum::ElectrumBlockchainConfig"]},{"text":"impl Serialize for EsploraBlockchainConfig","synthetic":false,"types":["bdk::blockchain::esplora::EsploraBlockchainConfig"]},{"text":"impl Serialize for BitcoinPeerConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::BitcoinPeerConfig"]},{"text":"impl Serialize for CompactFiltersBlockchainConfig","synthetic":false,"types":["bdk::blockchain::compact_filters::CompactFiltersBlockchainConfig"]},{"text":"impl Serialize for SledDbConfiguration","synthetic":false,"types":["bdk::database::any::SledDbConfiguration"]},{"text":"impl Serialize for SqliteDbConfiguration","synthetic":false,"types":["bdk::database::any::SqliteDbConfiguration"]},{"text":"impl Serialize for AnyDatabaseConfig","synthetic":false,"types":["bdk::database::any::AnyDatabaseConfig"]},{"text":"impl Serialize for SyncTime","synthetic":false,"types":["bdk::database::SyncTime"]},{"text":"impl Serialize for PkOrF","synthetic":false,"types":["bdk::descriptor::policy::PkOrF"]},{"text":"impl Serialize for SatisfiableItem","synthetic":false,"types":["bdk::descriptor::policy::SatisfiableItem"]},{"text":"impl Serialize for Satisfaction","synthetic":false,"types":["bdk::descriptor::policy::Satisfaction"]},{"text":"impl Serialize for Policy","synthetic":false,"types":["bdk::descriptor::policy::Policy"]},{"text":"impl Serialize for Condition","synthetic":false,"types":["bdk::descriptor::policy::Condition"]},{"text":"impl Serialize for KeychainKind","synthetic":false,"types":["bdk::types::KeychainKind"]},{"text":"impl Serialize for LocalUtxo","synthetic":false,"types":["bdk::types::LocalUtxo"]},{"text":"impl Serialize for TransactionDetails","synthetic":false,"types":["bdk::types::TransactionDetails"]},{"text":"impl Serialize for BlockTime","synthetic":false,"types":["bdk::types::BlockTime"]},{"text":"impl Serialize for WalletExport","synthetic":false,"types":["bdk::wallet::export::WalletExport"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/light.css b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/light.css index 14c65509e8..df49ab3e00 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/light.css +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/light.css @@ -1 +1 @@ - body{background-color:white;color:black;}h1,h2,h3,h4{color:black;}h1.fqn{border-bottom-color:#D5D5D5;}h2,h3,h4{border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre,.rustdoc.source .example-wrap{background-color:#F5F5F5;}.sidebar{background-color:#F1F1F1;}*{scrollbar-color:rgba(36,37,39,0.6) #e6e6e6;}.sidebar{scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;}.logo-container.rust-logo>img{}::-webkit-scrollbar-track{background-color:#ecebeb;}::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar::-webkit-scrollbar-track{background-color:#dcdcdc;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#fff;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#f6fdb0 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#ddd;}.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.search-results a:hover{background-color:#ddd;}.search-results a:focus{color:#000 !important;background-color:#ccc;}.search-results a:focus span{color:#000 !important;}a.result-trait:focus{background-color:#c7b6ff;}a.result-traitalias:focus{background-color:#c7b6ff;}a.result-mod:focus,a.result-externcrate:focus{background-color:#afc6e4;}a.result-enum:focus{background-color:#b4d1b9;}a.result-struct:focus{background-color:#e7b1a0;}a.result-union:focus{background-color:#b7bd49;}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{background-color:#c6afb3;}a.result-type:focus{background-color:#ffc891;}a.result-foreigntype:focus{background-color:#f5c4ff;}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{background-color:#8ce488;}a.result-constant:focus,a.result-static:focus{background-color:#c3e0ff;}a.result-primitive:focus{background-color:#9aecff;}a.result-keyword:focus{background-color:#f99650;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#508157;}.content span.struct,.content a.struct,.block a.current.struct{color:#ad448e;}.content span.type,.content a.type,.block a.current.type{color:#ba5d00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#cd00e2;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#767b27;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#546e8a;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2c8093;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#4d76ae;}.content span.trait,.content a.trait,.block a.current.trait{color:#7c5af3;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#6841f1;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#9a6e31;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}nav:not(.sidebar){border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#000;}body.source .example-wrap pre.rust a{background:#eee;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#3873AD;}a.test-arrow{color:#f5f5f5;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}#crate-search{color:#555;background-color:white;border-color:#e0e0e0;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input{color:#555;background-color:white;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input:focus{border-color:#66afe9;}.search-input:disabled{background-color:#e6e6e6;}#crate-search+.search-input:focus{box-shadow:0 0 8px #078dd8;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;}.stab.portability>code{background:none;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}#help span.bottom,#help span.top{border-color:#bfbfbf;}.since{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target,:target>*{background:#FDFFD3;}:target{border-right:3px solid #ffb44c;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.5);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.5);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#eee;border-color:#999;}.notable-traits-tooltiptext .notable{border-bottom-color:#DDDDDD;}#titles>button:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>button:hover,#titles>button.selected{background-color:#ffffff;border-top-color:#0089ff;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#F1F1F1;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F1F1F1;border-right-color:#000;}#sidebar-filler{background-color:#F1F1F1;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#717171;}#copy-path{color:#999;}#copy-path>img{filter:invert(50%);}#copy-path:hover>img{filter:invert(35%);}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results .result-name span.alias{color:#000;}.search-results .result-name span.grey{color:#999;}#sidebar-toggle{background-color:#F1F1F1;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F1F1F1;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;}.setting-line>.title{border-bottom-color:#D5D5D5;} \ No newline at end of file + body{background-color:white;color:black;}h1,h2,h3,h4{color:black;}h1.fqn{border-bottom-color:#D5D5D5;}h2,h3,h4{border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre,.rustdoc.source .example-wrap{background-color:#F5F5F5;}.sidebar{background-color:#F1F1F1;}*{scrollbar-color:rgba(36,37,39,0.6) #e6e6e6;}.sidebar{scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;}.rust-logo>img{}::-webkit-scrollbar-track{background-color:#ecebeb;}::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar::-webkit-scrollbar-track{background-color:#dcdcdc;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#f1f1f1;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#f6fdb0 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5,.docblock h6{border-bottom-color:#ddd;}.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.search-results a:hover{background-color:#ddd;}.search-results a:focus{color:#000 !important;background-color:#ccc;}.search-results a:focus span{color:#000 !important;}a.result-trait:focus{background-color:#c7b6ff;}a.result-traitalias:focus{background-color:#c7b6ff;}a.result-mod:focus,a.result-externcrate:focus{background-color:#afc6e4;}a.result-enum:focus{background-color:#b4d1b9;}a.result-struct:focus{background-color:#e7b1a0;}a.result-union:focus{background-color:#b7bd49;}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{background-color:#c6afb3;}a.result-type:focus{background-color:#ffc891;}a.result-foreigntype:focus{background-color:#f5c4ff;}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{background-color:#8ce488;}a.result-constant:focus,a.result-static:focus{background-color:#c3e0ff;}a.result-primitive:focus{background-color:#9aecff;}a.result-keyword:focus{background-color:#f99650;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#508157;}.content span.struct,.content a.struct,.block a.current.struct{color:#ad448e;}.content span.type,.content a.type,.block a.current.type{color:#ba5d00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#cd00e2;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#767b27;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#546e8a;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2c8093;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#4d76ae;}.content span.trait,.content a.trait,.block a.current.trait{color:#7c5af3;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#6841f1;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#9a6e31;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}nav:not(.sidebar){border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#3873AD;}a.srclink,a#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,pre.rust a,.sidebar a,.in-band a{color:#000;}.search-results a{color:initial;}a.test-arrow{color:#f5f5f5;}body.source .example-wrap pre.rust a{background:#eee;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}#crate-search{color:#555;background-color:white;border-color:#e0e0e0;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input{color:#555;background-color:white;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input:focus{border-color:#66afe9;}#crate-search+.search-input:focus{box-shadow:0 0 8px #078dd8;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;}.stab.portability>code{background:none;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}#help span.bottom,#help span.top{border-color:#bfbfbf;}.since{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target,:target>*{background:#FDFFD3;}:target{border-right:3px solid #ffb44c;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.5);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.5);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#eee;border-color:#999;}.notable-traits-tooltiptext .notable{border-bottom-color:#DDDDDD;}#titles>button:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>button:hover,#titles>button.selected{background-color:#ffffff;border-top-color:#0089ff;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#F1F1F1;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F1F1F1;border-right-color:#000;}#sidebar-filler{background-color:#F1F1F1;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#717171;}#copy-path{color:#999;}#copy-path>img{filter:invert(50%);}#copy-path:hover>img{filter:invert(35%);}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results .result-name span.alias{color:#000;}.search-results .result-name span.grey{color:#999;}#sidebar-toggle{background-color:#F1F1F1;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F1F1F1;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;}.setting-line>.title{border-bottom-color:#D5D5D5;} \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/main.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/main.js index 8ccfe56500..57cd8d1711 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/main.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/main.js @@ -1,8 +1,8 @@ -if(!String.prototype.startsWith){String.prototype.startsWith=function(searchString,position){position=position||0;return this.indexOf(searchString,position)===position}}if(!String.prototype.endsWith){String.prototype.endsWith=function(suffix,length){var l=length||this.length;return this.indexOf(suffix,l-suffix.length)!==-1}}if(!DOMTokenList.prototype.add){DOMTokenList.prototype.add=function(className){if(className&&!hasClass(this,className)){if(this.className&&this.className.length>0){this.className+=" "+className}else{this.className=className}}}}if(!DOMTokenList.prototype.remove){DOMTokenList.prototype.remove=function(className){if(className&&this.className){this.className=(" "+this.className+" ").replace(" "+className+" "," ").trim()}}}(function(){var rustdocVars=document.getElementById("rustdoc-vars");if(rustdocVars){window.rootPath=rustdocVars.attributes["data-root-path"].value;window.currentCrate=rustdocVars.attributes["data-current-crate"].value;window.searchJS=rustdocVars.attributes["data-search-js"].value;window.searchIndexJS=rustdocVars.attributes["data-search-index-js"].value}var sidebarVars=document.getElementById("sidebar-vars");if(sidebarVars){window.sidebarCurrent={name:sidebarVars.attributes["data-name"].value,ty:sidebarVars.attributes["data-ty"].value,relpath:sidebarVars.attributes["data-relpath"].value,}}}());function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined"){return ev.key}var c=ev.charCode||ev.keyCode;if(c==27){return"Escape"}return String.fromCharCode(c)}var THEME_PICKER_ELEMENT_ID="theme-picker";var THEMES_ELEMENT_ID="theme-choices";function getThemesElement(){return document.getElementById(THEMES_ELEMENT_ID)}function getThemePickerElement(){return document.getElementById(THEME_PICKER_ELEMENT_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function showThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="block";themePicker.style.borderBottomRightRadius="0";themePicker.style.borderBottomLeftRadius="0"}function hideThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="none";themePicker.style.borderBottomRightRadius="3px";themePicker.style.borderBottomLeftRadius="3px"}(function(){var themeChoices=getThemesElement();var themePicker=getThemePickerElement();var availableThemes=["ayu","dark","light"];function switchThemeButtonState(){if(themeChoices.style.display==="block"){hideThemeButtonState()}else{showThemeButtonState()}}function handleThemeButtonsBlur(e){var active=document.activeElement;var related=e.relatedTarget;if(active.id!==THEME_PICKER_ELEMENT_ID&&(!active.parentNode||active.parentNode.id!==THEMES_ELEMENT_ID)&&(!related||(related.id!==THEME_PICKER_ELEMENT_ID&&(!related.parentNode||related.parentNode.id!==THEMES_ELEMENT_ID)))){hideThemeButtonState()}}themePicker.onclick=switchThemeButtonState;themePicker.onblur=handleThemeButtonsBlur;availableThemes.forEach(function(item){var but=document.createElement("button");but.textContent=item;but.onclick=function(){switchTheme(window.currentTheme,window.mainTheme,item,true);useSystemTheme(false)};but.onblur=handleThemeButtonsBlur;themeChoices.appendChild(but)})}());(function(){"use strict";window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:function(){return document.getElementById("search")},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:function(){if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},focus:function(){searchState.input.focus()},defocus:function(){searchState.input.blur()},showResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(main,"hidden");removeClass(search,"hidden");searchState.mouseMovedAfterSearch=false;document.title=searchState.title},hideResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(search,"hidden");removeClass(main,"hidden");document.title=searchState.titleBeforeSearch;if(searchState.browserSupportsHistoryApi()){history.replaceState("",window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}},getQueryStringParams:function(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},putBackSearch:function(search_input){var search=searchState.outputElement();if(search_input.value!==""&&hasClass(search,"hidden")){searchState.showResults(search);if(searchState.browserSupportsHistoryApi()){var extra="?search="+encodeURIComponent(search_input.value);history.replaceState(search_input.value,"",getNakedUrl()+extra+window.location.hash)}document.title=searchState.title}},browserSupportsHistoryApi:function(){return window.history&&typeof window.history.pushState==="function"},setup:function(){var search_input=searchState.input;if(!searchState.input){return}function loadScript(url){var script=document.createElement('script');script.src=url;document.head.append(script)}var searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(window.searchJS);loadScript(window.searchIndexJS)}}search_input.addEventListener("focus",function(){searchState.putBackSearch(this);search_input.origPlaceholder=searchState.input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});search_input.addEventListener("blur",function(){search_input.placeholder=searchState.input.origPlaceholder});search_input.removeAttribute('disabled');searchState.addCrateDropdown(window.ALL_CRATES);var params=searchState.getQueryStringParams();if(params.search!==undefined){var search=searchState.outputElement();search.innerHTML="

    "+searchState.loadingText+"

    ";searchState.showResults(search);loadSearch()}},addCrateDropdown:function(crates){var elem=document.getElementById("crate-search");if(!elem){return}var savedCrate=getSettingValue("saved-filter-crate");for(var i=0,len=crates.length;i0){return tmp}}return null}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];if(sidebar){addClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div)}}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(filler){filler.remove()}document.getElementsByTagName("body")[0].style.marginTop=""}var toggleAllDocsId="toggle-all-docs";var main=document.getElementById("main");var savedHash="";function handleHashes(ev){var elem;var search=searchState.outputElement();if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){searchState.hideResults(search);var hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(searchState.browserSupportsHistoryApi()){history.replaceState(hash,"",getNakedUrl()+window.location.search+"#"+hash)}elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}if(savedHash!==window.location.hash){savedHash=window.location.hash;if(savedHash.length===0){return}expandSection(savedHash.slice(1))}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function getHelpElement(build){if(build){buildHelperPopup()}return document.getElementById("help")}function displayHelp(display,ev,help){if(display){help=help?help:getHelpElement(true);if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur")}}else{help=help?help:getHelpElement(false);if(help&&!hasClass(help,"hidden")){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur")}}}function handleEscape(ev){var help=getHelpElement(false);var search=searchState.outputElement();if(help&&!hasClass(help,"hidden")){displayHelp(false,ev,help)}else if(search&&!hasClass(search,"hidden")){searchState.clearInputTimeout();ev.preventDefault();searchState.hideResults(search)}searchState.defocus();hideThemeButtonState()}var disableShortcuts=getSettingValue("disable-shortcuts")==="true";function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":displayHelp(false,ev);ev.preventDefault();searchState.focus();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":displayHelp(true,ev);break;case"t":case"T":displayHelp(false,ev);ev.preventDefault();var themePicker=getThemePickerElement();themePicker.click();themePicker.focus();break;default:if(getThemePickerElement().parentNode.contains(ev.target)){handleThemeKeyDown(ev)}}}}function handleThemeKeyDown(ev){var active=document.activeElement;var themes=getThemesElement();switch(getVirtualKey(ev)){case"ArrowUp":ev.preventDefault();if(active.previousElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.previousElementSibling.focus()}else{showThemeButtonState();themes.lastElementChild.focus()}break;case"ArrowDown":ev.preventDefault();if(active.nextElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.nextElementSibling.focus()}else{showThemeButtonState();themes.firstElementChild.focus()}break;case"Enter":case"Return":case"Space":if(ev.target.id===THEME_PICKER_ELEMENT_ID&&themes.style.display==="none"){ev.preventDefault();showThemeButtonState();themes.firstElementChild.focus()}break;case"Home":ev.preventDefault();themes.firstElementChild.focus();break;case"End":ev.preventDefault();themes.lastElementChild.focus();break}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);(function(){var x=document.getElementsByClassName("version-selector");if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped="",len=window.rootPath.match(/\.\.\//g).length+1;for(i=0;i .in-band > .trait").textContent;var baseIdName="impl-"+traitName+"-";var libs=Object.getOwnPropertyNames(imp);for(var i=0,llength=libs.length;i0){this.className+=" "+className}else{this.className=className}}}}if(!DOMTokenList.prototype.remove){DOMTokenList.prototype.remove=function(className){if(className&&this.className){this.className=(" "+this.className+" ").replace(" "+className+" "," ").trim()}}}function getVar(name){var el=document.getElementById("rustdoc-vars");if(el){return el.attributes["data-"+name].value}else{return null}}function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}(function(){window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");window.searchJS=resourcePath("search",".js");window.searchIndexJS=resourcePath("search-index",".js");var sidebarVars=document.getElementById("sidebar-vars");if(sidebarVars){window.sidebarCurrent={name:sidebarVars.attributes["data-name"].value,ty:sidebarVars.attributes["data-ty"].value,relpath:sidebarVars.attributes["data-relpath"].value,}}}());function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined"){return ev.key}var c=ev.charCode||ev.keyCode;if(c==27){return"Escape"}return String.fromCharCode(c)}var THEME_PICKER_ELEMENT_ID="theme-picker";var THEMES_ELEMENT_ID="theme-choices";var MAIN_ID="main-content";function getThemesElement(){return document.getElementById(THEMES_ELEMENT_ID)}function getThemePickerElement(){return document.getElementById(THEME_PICKER_ELEMENT_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function showThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="block";themePicker.style.borderBottomRightRadius="0";themePicker.style.borderBottomLeftRadius="0"}function hideThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="none";themePicker.style.borderBottomRightRadius="3px";themePicker.style.borderBottomLeftRadius="3px"}(function(){var themeChoices=getThemesElement();var themePicker=getThemePickerElement();var availableThemes=getVar("themes").split(",");function switchThemeButtonState(){if(themeChoices.style.display==="block"){hideThemeButtonState()}else{showThemeButtonState()}}function handleThemeButtonsBlur(e){var active=document.activeElement;var related=e.relatedTarget;if(active.id!==THEME_PICKER_ELEMENT_ID&&(!active.parentNode||active.parentNode.id!==THEMES_ELEMENT_ID)&&(!related||(related.id!==THEME_PICKER_ELEMENT_ID&&(!related.parentNode||related.parentNode.id!==THEMES_ELEMENT_ID)))){hideThemeButtonState()}}themePicker.onclick=switchThemeButtonState;themePicker.onblur=handleThemeButtonsBlur;availableThemes.forEach(function(item){var but=document.createElement("button");but.textContent=item;but.onclick=function(){switchTheme(window.currentTheme,window.mainTheme,item,true);useSystemTheme(false)};but.onblur=handleThemeButtonsBlur;themeChoices.appendChild(but)})}());(function(){"use strict";window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:function(){return document.getElementById("search")},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:function(){if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},focus:function(){searchState.input.focus()},defocus:function(){searchState.input.blur()},showResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(main,"hidden");removeClass(search,"hidden");searchState.mouseMovedAfterSearch=false;document.title=searchState.title},hideResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(search,"hidden");removeClass(main,"hidden");document.title=searchState.titleBeforeSearch;if(searchState.browserSupportsHistoryApi()){history.replaceState("",window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}},getQueryStringParams:function(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},putBackSearch:function(search_input){var search=searchState.outputElement();if(search_input.value!==""&&hasClass(search,"hidden")){searchState.showResults(search);if(searchState.browserSupportsHistoryApi()){var extra="?search="+encodeURIComponent(search_input.value);history.replaceState(search_input.value,"",getNakedUrl()+extra+window.location.hash)}document.title=searchState.title}},browserSupportsHistoryApi:function(){return window.history&&typeof window.history.pushState==="function"},setup:function(){var search_input=searchState.input;if(!searchState.input){return}function loadScript(url){var script=document.createElement('script');script.src=url;document.head.append(script)}var searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(window.searchJS);loadScript(window.searchIndexJS)}}search_input.addEventListener("focus",function(){searchState.putBackSearch(this);search_input.origPlaceholder=searchState.input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});search_input.addEventListener("blur",function(){search_input.placeholder=searchState.input.origPlaceholder});if(search_input.value!=''){loadSearch()}searchState.addCrateDropdown(window.ALL_CRATES);var params=searchState.getQueryStringParams();if(params.search!==undefined){var search=searchState.outputElement();search.innerHTML="

    "+searchState.loadingText+"

    ";searchState.showResults(search);loadSearch()}},addCrateDropdown:function(crates){var elem=document.getElementById("crate-search");if(!elem){return}var savedCrate=getSettingValue("saved-filter-crate");for(var i=0,len=crates.length;i0){return tmp}}return null}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];if(sidebar){addClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div)}}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(filler){filler.remove()}document.getElementsByTagName("body")[0].style.marginTop=""}var toggleAllDocsId="toggle-all-docs";var main=document.getElementById(MAIN_ID);var savedHash="";function handleHashes(ev){var elem;var search=searchState.outputElement();if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){searchState.hideResults(search);var hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(searchState.browserSupportsHistoryApi()){history.replaceState(hash,"",getNakedUrl()+window.location.search+"#"+hash)}elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}if(savedHash!==window.location.hash){savedHash=window.location.hash;if(savedHash.length===0){return}expandSection(savedHash.slice(1))}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function getHelpElement(build){if(build){buildHelperPopup()}return document.getElementById("help")}function displayHelp(display,ev,help){if(display){help=help?help:getHelpElement(true);if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur")}}else{help=help?help:getHelpElement(false);if(help&&!hasClass(help,"hidden")){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur")}}}function handleEscape(ev){var help=getHelpElement(false);var search=searchState.outputElement();if(help&&!hasClass(help,"hidden")){displayHelp(false,ev,help)}else if(search&&!hasClass(search,"hidden")){searchState.clearInputTimeout();ev.preventDefault();searchState.hideResults(search)}searchState.defocus();hideThemeButtonState()}var disableShortcuts=getSettingValue("disable-shortcuts")==="true";function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":displayHelp(false,ev);ev.preventDefault();searchState.focus();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":displayHelp(true,ev);break;case"t":case"T":displayHelp(false,ev);ev.preventDefault();var themePicker=getThemePickerElement();themePicker.click();themePicker.focus();break;default:if(getThemePickerElement().parentNode.contains(ev.target)){handleThemeKeyDown(ev)}}}}function handleThemeKeyDown(ev){var active=document.activeElement;var themes=getThemesElement();switch(getVirtualKey(ev)){case"ArrowUp":ev.preventDefault();if(active.previousElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.previousElementSibling.focus()}else{showThemeButtonState();themes.lastElementChild.focus()}break;case"ArrowDown":ev.preventDefault();if(active.nextElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.nextElementSibling.focus()}else{showThemeButtonState();themes.firstElementChild.focus()}break;case"Enter":case"Return":case"Space":if(ev.target.id===THEME_PICKER_ELEMENT_ID&&themes.style.display==="none"){ev.preventDefault();showThemeButtonState();themes.firstElementChild.focus()}break;case"Home":ev.preventDefault();themes.firstElementChild.focus();break;case"End":ev.preventDefault();themes.lastElementChild.focus();break}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);(function(){var x=document.getElementsByClassName("version-selector");if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped="",len=window.rootPath.match(/\.\.\//g).length+1;for(i=0;i .in-band > .trait").textContent;var baseIdName="impl-"+traitName+"-";var libs=Object.getOwnPropertyNames(imp);for(var i=0,llength=libs.length;i summary:not(.hideme)"),function(el){el.addEventListener("click",function(e){if(e.target.tagName!="SUMMARY"&&e.target.tagName!="A"){e.preventDefault()}})});onEachLazy(document.getElementsByClassName("notable-traits"),function(e){e.onclick=function(){this.getElementsByClassName('notable-traits-tooltiptext')[0].classList.toggle("force-tooltip")}});var sidebar_menu=document.getElementsByClassName("sidebar-menu")[0];if(sidebar_menu){sidebar_menu.onclick=function(){var sidebar=document.getElementsByClassName("sidebar")[0];if(hasClass(sidebar,"mobile")){hideSidebar()}else{showSidebar()}}}var buildHelperPopup=function(){var popup=document.createElement("aside");addClass(popup,"hidden");popup.id="help";popup.addEventListener("click",function(ev){if(ev.target===popup){displayHelp(false,ev)}});var book_info=document.createElement("span");book_info.className="top";book_info.innerHTML="You can find more information in \ the rustdoc book.";var container=document.createElement("div");var shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["T","Focus the theme picker menu"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(function(x){return"
    "+x[0].split(" ").map(function(y,index){return(index&1)===0?""+y+"":" "+y+" "}).join("")+"
    "+x[1]+"
    "}).join("");var div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

    Keyboard Shortcuts

    "+shortcuts+"
    ";var infos=["Prefix searches with a type followed by a colon (e.g., fn:) to \ restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ enum, trait, type, macro, \ and const.","Search functions by type signature (e.g., vec -> usize or \ * -> vec)","Search multiple things at once by splitting your query with comma (e.g., \ str,u8 or String,struct:Vec,test)","You can look for items with an exact name by putting double quotes around \ - your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(function(x){return"

    "+x+"

    "}).join("");var div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

    Search Tricks

    "+infos;container.appendChild(book_info);container.appendChild(div_shortcuts);container.appendChild(div_infos);var rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";var rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc 1.57.0-nightly (05044c2e6 2021-09-26)";rustdoc_version.appendChild(rustdoc_version_code);container.appendChild(rustdoc_version);popup.appendChild(container);insertAfter(popup,searchState.outputElement());buildHelperPopup=function(){}};onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){var reset_button_timeout=null;window.copy_path=function(but){var parent=but.parentElement;var path=[];onEach(parent.childNodes,function(child){if(child.tagName==='A'){path.push(child.textContent)}});var el=document.createElement('textarea');el.value=path.join('::');el.setAttribute('readonly','');el.style.position='absolute';el.style.left='-9999px';document.body.appendChild(el);el.select();document.execCommand('copy');document.body.removeChild(el);but.children[0].style.display='none';var tmp;if(but.childNodes.length<2){tmp=document.createTextNode('✓');but.appendChild(tmp)}else{onEachLazy(but.childNodes,function(e){if(e.nodeType===Node.TEXT_NODE){tmp=e;return true}});tmp.textContent='✓'}if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){tmp.textContent='';reset_button_timeout=null;but.children[0].style.display=""}reset_button_timeout=window.setTimeout(reset_button,1000)}}()) \ No newline at end of file + your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(function(x){return"

    "+x+"

    "}).join("");var div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

    Search Tricks

    "+infos;container.appendChild(book_info);container.appendChild(div_shortcuts);container.appendChild(div_infos);var rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";var rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);container.appendChild(rustdoc_version);popup.appendChild(container);insertAfter(popup,document.querySelector("main"));buildHelperPopup=function(){}};onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){var reset_button_timeout=null;window.copy_path=function(but){var parent=but.parentElement;var path=[];onEach(parent.childNodes,function(child){if(child.tagName==='A'){path.push(child.textContent)}});var el=document.createElement('textarea');el.value=path.join('::');el.setAttribute('readonly','');el.style.position='absolute';el.style.left='-9999px';document.body.appendChild(el);el.select();document.execCommand('copy');document.body.removeChild(el);but.children[0].style.display='none';var tmp;if(but.childNodes.length<2){tmp=document.createTextNode('✓');but.appendChild(tmp)}else{onEachLazy(but.childNodes,function(e){if(e.nodeType===Node.TEXT_NODE){tmp=e;return true}});tmp.textContent='✓'}if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){tmp.textContent='';reset_button_timeout=null;but.children[0].style.display=""}reset_button_timeout=window.setTimeout(reset_button,1000)}}()) \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noscript.css b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noscript.css index aea68efbc9..8ad88640ab 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noscript.css +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noscript.css @@ -1 +1 @@ - #main .attributes{margin-left:0 !important;}#copy-path{display:none;} \ No newline at end of file + #main-content .attributes{margin-left:0 !important;}#copy-path{display:none;}.sub{display:none;}#theme-picker{display:none;} \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noto-sans-kr-v13-korean-regular-LICENSE.txt b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noto-sans-kr-v13-korean-regular-LICENSE.txt deleted file mode 100644 index 922d5fdc18..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noto-sans-kr-v13-korean-regular-LICENSE.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. - -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noto-sans-kr-v13-korean-regular.woff b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noto-sans-kr-v13-korean-regular.woff deleted file mode 100644 index 01d6b6b546..0000000000 Binary files a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/noto-sans-kr-v13-korean-regular.woff and /dev/null differ diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rust-logo.png b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rust-logo.png deleted file mode 100644 index 74b4bd6950..0000000000 Binary files a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rust-logo.png and /dev/null differ diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rustdoc.css b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rustdoc.css index 79235e3d63..1f77c75cbe 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rustdoc.css +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/rustdoc.css @@ -1 +1 @@ - @font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular.woff2") format("woff2"),url("FiraSans-Regular.woff") format('woff');font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium.woff2") format("woff2"),url("FiraSans-Medium.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular.ttf.woff2") format("woff2"),url("SourceSerif4-Regular.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It.ttf.woff2") format("woff2"),url("SourceSerif4-It.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold.ttf.woff2") format("woff2"),url("SourceSerif4-Bold.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular.ttf.woff2") format("woff2"),url("SourceCodePro-Regular.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It.ttf.woff2") format("woff2"),url("SourceCodePro-It.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold.ttf.woff2") format("woff2"),url("SourceCodePro-Semibold.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Noto Sans KR';src:url("noto-sans-kr-v13-korean-regular.woff") format("woff");font-display:swap;unicode-range:U+A960-A97F,U+AC00-D7AF,U+D7B0-D7FF;}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}html{content:"";}@media (prefers-color-scheme:light){html{content:"light";}}@media (prefers-color-scheme:dark){html{content:"dark";}}body{font:16px/1.4 "Source Serif 4","Noto Sans KR",serif;margin:0;position:relative;padding:10px 15px 20px 15px;-webkit-font-feature-settings:"kern","liga";-moz-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";}h1{font-size:1.5em;}h2{font-size:1.4em;}h3{font-size:1.3em;}h1,h2,h3,h4{font-weight:500;margin:20px 0 15px 0;padding-bottom:6px;}h1.fqn{display:flex;border-bottom:1px dashed;margin-top:0;padding-left:1px;}h1.fqn>.in-band>a:hover{text-decoration:underline;}h2,h3,h4{border-bottom:1px solid;}h3.code-header,h4.code-header{font-size:1em;font-weight:600;border:none;padding:0;margin:0;}.impl,.impl-items .method,.methods .method,.impl-items .type,.methods .type,.impl-items .associatedconstant,.methods .associatedconstant,.impl-items .associatedtype,.methods .associatedtype{flex-basis:100%;font-weight:600;margin-top:16px;margin-bottom:10px;position:relative;}.impl,.method.trait-impl,.type.trait-impl,.associatedconstant.trait-impl,.associatedtype.trait-impl{padding-left:15px;}div.impl-items>div{padding-left:0;}h1,h2,h3,h4,.sidebar,a.source,.search-input,.search-results .result-name,.content table td:first-child>a,.item-left>a,div.item-list .out-of-band,span.since,#source-sidebar,#sidebar-toggle,details.rustdoc-toggle>summary::before,details.undocumented>summary::before,div.impl-items>div:not(.docblock):not(.item-info),.content ul.crate a.crate,a.srclink,#main>ul.docblock>li>a{font-family:"Fira Sans",Arial,sans-serif;}.content ul.crate a.crate{font-size:16px/1.6;}ol,ul{padding-left:25px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.6em;}p{margin:0 0 .6em 0;}summary{outline:none;}td,th{padding:0;}table{border-collapse:collapse;}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;}details:not(.rustdoc-toggle) summary{margin-bottom:.6em;}code,pre,a.test-arrow,.code-header{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.1em;}.docblock pre code,.docblock-short pre code{padding:0;}pre{padding:14px;}.type-decl pre{overflow-x:auto;}.source .content pre{padding:20px;}img{max-width:100%;}li{position:relative;}.source .content{margin-top:50px;max-width:none;overflow:visible;margin-left:0px;}nav.sub{font-size:16px;text-transform:uppercase;}.sidebar{width:200px;position:fixed;left:0;top:0;bottom:0;overflow:auto;}*{scrollbar-width:initial;}.sidebar{scrollbar-width:thin;}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;}.sidebar .block>ul>li{margin-right:-10px;}.content,nav{max-width:960px;}.hidden{display:none !important;}.logo-container{height:100px;width:100px;position:relative;margin:20px auto;display:block;margin-top:10px;}.logo-container>img{max-width:100px;max-height:100px;height:100%;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;}.sidebar .location{border:1px solid;font-size:17px;margin:30px 10px 20px 10px;text-align:center;word-wrap:break-word;font-weight:inherit;padding:0;}.sidebar .version{font-size:15px;text-align:center;border-bottom:1px solid;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;}.location:empty{border:none;}.location a:first-of-type{font-weight:500;}.location a:hover{text-decoration:underline;}.block{padding:0;margin-bottom:14px;}.block h2,.block h3{text-align:center;}.block ul,.block li{margin:0 10px;padding:0;list-style:none;}.block a{display:block;text-overflow:ellipsis;overflow:hidden;line-height:15px;padding:7px 5px;font-size:14px;font-weight:300;transition:border 500ms ease-out;}.sidebar-title{border-top:1px solid;border-bottom:1px solid;text-align:center;font-size:17px;margin-bottom:5px;font-weight:inherit;padding:0;}.sidebar-links{margin-bottom:15px;}.sidebar-links>a{padding-left:10px;width:100%;}.sidebar-menu{display:none;}.content{padding:15px 0;}.source .content pre.rust{white-space:pre;overflow:auto;padding-left:0;}.rustdoc .example-wrap{display:inline-flex;margin-bottom:10px;}.example-wrap{position:relative;width:100%;}.example-wrap>pre.line-number{overflow:initial;border:1px solid;padding:13px 8px;text-align:right;border-top-left-radius:5px;border-bottom-left-radius:5px;}.example-wrap>pre.rust a:hover{text-decoration:underline;}.rustdoc:not(.source) .example-wrap>pre:not(.line-number){width:100%;overflow-x:auto;}.rustdoc .example-wrap>pre{margin:0;}#search{margin-left:230px;position:relative;}#results>table{width:100%;table-layout:fixed;}.content>.example-wrap pre.line-numbers{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers span{cursor:pointer;}.docblock-short{overflow-wrap:anywhere;}.docblock-short p{display:inline;}.docblock-short p{overflow:hidden;text-overflow:ellipsis;margin:0;}.docblock>:not(pre)>code,.docblock-short>:not(pre)>code{white-space:pre-wrap;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom:1px solid;}.top-doc .docblock h1{font-size:1.3em;}.top-doc .docblock h2{font-size:1.15em;}.top-doc .docblock h3,.top-doc .docblock h4,.top-doc .docblock h5{font-size:1em;}.docblock h1{font-size:1em;}.docblock h2{font-size:0.95em;}.docblock h3,.docblock h4,.docblock h5{font-size:0.9em;}.docblock{margin-left:24px;position:relative;}.docblock>*{max-width:100%;overflow-x:auto;}.content .out-of-band{flex-grow:0;text-align:right;font-size:23px;margin:0px;padding:0 0 0 12px;font-weight:normal;}.method>.code-header,.trait-impl>.code-header,.invisible>.code-header{max-width:calc(100% - 41px);display:block;}.invisible{width:100%;display:inline-block;}.content .in-band{flex-grow:1;margin:0px;padding:0px;}.in-band>code,.in-band>.code-header{display:inline-block;}#main{position:relative;}#main>.since{top:inherit;font-family:"Fira Sans",Arial,sans-serif;}.content table:not(.table-display){border-spacing:0 5px;}.content td{vertical-align:top;}.content td:first-child{padding-right:20px;}.content td p:first-child{margin-top:0;}.content td h1,.content td h2{margin-left:0;font-size:1.1em;}.content tr:first-child td{border-top:0;}.docblock table{margin:.5em 0;width:calc(100% - 2px);overflow-x:auto;display:block;}.docblock table td{padding:.5em;border:1px dashed;}.docblock table th{padding:.5em;text-align:left;border:1px solid;}.fields+table{margin-bottom:1em;}.content .item-list{list-style-type:none;padding:0;}.content .multi-column{-moz-column-count:5;-moz-column-gap:2.5em;-webkit-column-count:5;-webkit-column-gap:2.5em;column-count:5;column-gap:2.5em;}.content .multi-column li{width:100%;display:inline-block;}.content>.methods>.method{font-size:1em;position:relative;}.content .method .where,.content .fn .where,.content .where.fmt-newline{display:block;font-size:0.8em;}.content .methods>div:not(.notable-traits):not(.method){margin-left:40px;margin-bottom:15px;}.content .docblock>.impl-items{margin-left:20px;margin-top:-34px;}.content .docblock>.impl-items .table-display{margin:0;}.content .docblock>.impl-items table td{padding:0;}.content .docblock>.impl-items .table-display,.impl-items table td{border:none;}.content .item-info code{font-size:90%;}.content .item-info{position:relative;margin-left:33px;}.sub-variant>div>.item-info{margin-top:initial;}.content .item-info::before{content:'⬑';font-size:25px;position:absolute;top:-6px;left:-19px;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant,.impl-items>.associatedtype,.content .impl-items details>summary>.type,.impl-items details>summary>.associatedconstant,.impl-items details>summary>.associatedtype{margin-left:20px;}.content .impl-items .docblock,.content .impl-items .item-info{margin-bottom:.6em;}.content .impl-items>.item-info{margin-left:40px;}.methods>.item-info,.content .impl-items>.item-info{margin-top:-8px;}.impl-items{flex-basis:100%;}#main>.item-info{margin-top:0;}nav:not(.sidebar){border-bottom:1px solid;padding-bottom:10px;margin-bottom:10px;}nav.main{padding:20px 0;text-align:center;}nav.main .current{border-top:1px solid;border-bottom:1px solid;}nav.main .separator{border:1px solid;display:inline-block;height:23px;margin:0 20px;}nav.sum{text-align:right;}nav.sub form{display:inline;}nav.sub,.content{margin-left:230px;}a{text-decoration:none;background:transparent;}.small-section-header{display:flex;justify-content:space-between;position:relative;}.small-section-header:hover>.anchor{display:initial;}.in-band:hover>.anchor,.impl:hover>.anchor,.method.trait-impl:hover>.anchor,.type.trait-impl:hover>.anchor,.associatedconstant.trait-impl:hover>.anchor,.associatedtype.trait-impl:hover>.anchor{display:inline-block;position:absolute;}.anchor{display:none;position:absolute;left:0;background:none !important;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-15px;padding-right:8px;}h2.small-section-header>.anchor{padding-right:6px;}.anchor::before{content:'§';}.docblock a:not(.srclink):not(.test-arrow):hover,.docblock-short a:not(.srclink):not(.test-arrow):hover,.item-info a{text-decoration:underline;}.invisible>.srclink,.method>.code-header+.srclink{position:absolute;top:0;right:0;font-size:17px;font-weight:normal;}.block a.current.crate{font-weight:500;}.item-table{display:grid;column-gap:1.2rem;row-gap:0.0rem;grid-template-columns:auto 1fr;justify-items:start;}.item-left,.item-right{display:block;}.item-left{grid-column:1;}.item-right{grid-column:2;}.search-container{position:relative;}.search-container>div{display:inline-flex;width:calc(100% - 63px);}#crate-search{min-width:115px;margin-top:5px;padding:6px;padding-right:19px;flex:none;border:0;border-right:0;border-radius:4px 0 0 4px;outline:none;cursor:pointer;border-right:1px solid;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;text-overflow:"";background-repeat:no-repeat;background-color:transparent;background-size:20px;background-position:calc(100% - 1px) 56%;}.search-container>.top-button{position:absolute;right:0;top:10px;}.search-input{-moz-box-sizing:border-box !important;box-sizing:border-box !important;outline:none;border:none;border-radius:1px;margin-top:5px;padding:10px 16px;font-size:17px;transition:border-color 300ms ease;transition:border-radius 300ms ease-in-out;transition:box-shadow 300ms ease-in-out;width:100%;}#crate-search+.search-input{border-radius:0 1px 1px 0;width:calc(100% - 32px);}.search-input:focus{border-radius:2px;border:0;outline:0;}.search-results{display:none;padding-bottom:2em;}.search-results.active{display:block;clear:both;}.search-results .desc>span{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;}.search-results>a{display:block;width:100%;margin-left:2px;margin-right:2px;border-bottom:1px solid #aaa3;}.search-results>a>div{display:flex;flex-flow:row wrap;}.search-results .result-name,.search-results div.desc,.search-results .result-description{width:50%;}.search-results .result-name{padding-right:1em;}.search-results .result-name>span{display:inline-block;margin:0;font-weight:normal;}body.blur>:not(#help){filter:blur(8px);-webkit-filter:blur(8px);opacity:.7;}#help{width:100%;height:100vh;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;}#help>div{flex:0 0 auto;box-shadow:0 0 6px rgba(0,0,0,.2);width:550px;height:auto;border:1px solid;}#help dt{float:left;clear:left;display:block;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:18px;}#help span.top{text-align:center;display:block;margin:10px 0;border-bottom:1px solid;padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid;}#help dd{margin:5px 35px;}#help .infos{padding-left:0;}#help h1,#help h2{margin-top:0;}#help>div div{width:50%;float:left;padding:0 20px 20px 17px;;}.item-info .stab{display:table;}.stab{border-width:1px;border-style:solid;padding:3px;margin-bottom:5px;font-size:90%;font-weight:normal;}.stab p{display:inline;}.stab .emoji{font-size:1.5em;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.module-item .stab,.import-item .stab{border-radius:3px;display:inline-block;font-size:80%;line-height:1.2;margin-bottom:0;margin-left:.3em;padding:2px;vertical-align:text-bottom;}.module-item.unstable,.import-item.unstable{opacity:0.65;}.since{font-weight:normal;font-size:initial;}.impl-items .since,.impl .since,.methods .since{padding-left:12px;padding-right:2px;position:initial;}.impl-items .srclink,.impl .srclink,.methods .srclink{font-size:17px;font-weight:normal;}.rightside{float:right;}.has-srclink{font-size:16px;margin-bottom:12px;justify-content:space-between;}.variants_table{width:100%;}.variants_table tbody tr td:first-child{width:1%;}td.summary-column{width:100%;}.summary{padding-right:0px;}pre.rust .question-mark{font-weight:bold;}a.test-arrow{display:inline-block;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:130%;top:5px;right:5px;z-index:1;}a.test-arrow:hover{text-decoration:none;}.section-header:hover a:before{position:absolute;left:-25px;padding-right:10px;content:'\2002\00a7\2002';}.section-header:hover a{text-decoration:none;}.section-header a{color:inherit;}.code-attribute{font-weight:300;}.since+.srclink{padding-left:10px;}.item-spacer{width:100%;height:12px;}.out-of-band>span.since{position:initial;font-size:20px;margin-right:5px;}.sub-variant,.sub-variant>h3{margin-top:0px !important;padding-top:1px;}#main .sub-variant>h3{font-size:15px;margin-left:25px;margin-bottom:5px;}.sub-variant>div{margin-left:20px;margin-bottom:10px;}.sub-variant>div>span{display:block;position:relative;}.toggle-label{display:inline-block;margin-left:4px;margin-top:3px;}.docblock>.section-header:first-child{margin-left:15px;margin-top:0;}.docblock>.section-header:first-child:hover>a:before{left:-10px;}:target>code,:target>.code-header{opacity:1;}:target{padding-right:3px;}.information{position:absolute;left:-25px;margin-top:7px;z-index:1;}.tooltip{position:relative;display:inline-block;cursor:pointer;}.tooltip::after{display:none;text-align:center;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;font-size:16px;}.tooltip.ignore::after{content:"This example is not tested";}.tooltip.compile_fail::after{content:"This example deliberately fails to compile";}.tooltip.should_panic::after{content:"This example panics";}.tooltip.edition::after{content:"This code runs with edition " attr(data-edition);}.tooltip::before{content:" ";position:absolute;top:50%;left:16px;margin-top:-5px;border-width:5px;border-style:solid;display:none;}.tooltip:hover::before,.tooltip:hover::after{display:inline;}.tooltip.compile_fail,.tooltip.should_panic,.tooltip.ignore{font-weight:bold;font-size:20px;}.notable-traits-tooltip{display:inline-block;cursor:pointer;}.notable-traits:hover .notable-traits-tooltiptext,.notable-traits .notable-traits-tooltiptext.force-tooltip{display:inline-block;}.notable-traits .notable-traits-tooltiptext{display:none;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;z-index:10;font-size:16px;cursor:default;position:absolute;border:1px solid;}.notable-traits-tooltip::after{content:"\00a0\00a0\00a0";}.notable-traits .notable,.notable-traits .docblock{margin:0;}.notable-traits .notable{margin:0;margin-bottom:13px;font-size:19px;font-weight:600;}.notable-traits .docblock code.content{margin:0;padding:0;font-size:20px;}pre.rust.rust-example-rendered{position:relative;}pre.rust{tab-size:4;-moz-tab-size:4;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#titles{height:35px;}#titles>button{float:left;width:33.3%;text-align:center;font-size:18px;cursor:pointer;border:0;border-top:2px solid;}#titles>button:not(:last-child){margin-right:1px;width:calc(33.3% - 1px);}#titles>button>div.count{display:inline-block;font-size:16px;}.notable-traits{cursor:pointer;z-index:2;margin-left:5px;}#all-types{text-align:center;border:1px solid;margin:0 10px;margin-bottom:10px;display:block;border-radius:7px;}#all-types>p{margin:5px 0;}#sidebar-toggle{position:fixed;top:30px;left:300px;z-index:10;padding:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;cursor:pointer;font-weight:bold;transition:left .5s;font-size:1.2em;border:1px solid;border-left:0;}#source-sidebar{position:fixed;top:0;bottom:0;left:0;width:300px;z-index:1;overflow:auto;transition:left .5s;border-right:1px solid;}#source-sidebar>.title{font-size:1.5em;text-align:center;border-bottom:1px solid;margin-bottom:6px;}.theme-picker{position:absolute;left:211px;top:19px;}.theme-picker button{outline:none;}#settings-menu,#help-button{position:absolute;top:10px;}#settings-menu{right:0;outline:none;}#theme-picker,#settings-menu,#help-button,#copy-path{padding:4px;width:27px;height:29px;border:1px solid;border-radius:3px;cursor:pointer;}#help-button{right:30px;font-family:"Fira Sans",Arial,sans-serif;text-align:center;font-size:17px;padding-top:2px;}#copy-path{background:initial;margin-left:10px;padding:0;padding-left:2px;border:0;}#theme-choices{display:none;position:absolute;left:0;top:28px;border:1px solid;border-radius:3px;z-index:1;cursor:pointer;}#theme-choices>button{border:none;width:100%;padding:4px 8px;text-align:center;background:rgba(0,0,0,0);}#theme-choices>button:not(:first-child){border-top:1px solid;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px;border-radius:3px;box-shadow:inset 0 -1px 0;cursor:default;}.hidden-by-impl-hider,.hidden-by-usual-hider{display:none !important;}#implementations-list>h3>span.in-band{width:100%;}.table-display{width:100%;border:0;border-collapse:collapse;border-spacing:0;font-size:16px;}.table-display tr td:first-child{padding-right:0;}.table-display tr td:last-child{float:right;}.table-display .out-of-band{position:relative;font-size:19px;display:block;}#implementors-list>.impl-items .table-display .out-of-band{font-size:17px;}.table-display td:hover .anchor{display:block;top:2px;left:-5px;}#main>ul{padding-left:10px;}#main>ul>li{list-style:none;}.non-exhaustive{margin-bottom:1em;}div.children{padding-left:27px;display:none;}div.name{cursor:pointer;position:relative;margin-left:16px;}div.files>a{display:block;padding:0 3px;}div.files>a:hover,div.name:hover{background-color:#a14b4b;}div.name.expand+.children{display:block;}div.name::before{content:"\25B6";padding-left:4px;font-size:0.7em;position:absolute;left:-16px;top:4px;}div.name.expand::before{transform:rotate(90deg);left:-15px;top:2px;}details.rustdoc-toggle>summary.hideme{cursor:pointer;}details.rustdoc-toggle>summary,details.undocumented>summary{list-style:none;}details.rustdoc-toggle>summary::-webkit-details-marker,details.rustdoc-toggle>summary::marker,details.undocumented>summary::-webkit-details-marker,details.undocumented>summary::marker{display:none;}details.rustdoc-toggle>summary.hideme>span{margin-left:9px;}details.rustdoc-toggle>summary::before{content:"";cursor:pointer;width:17px;height:max(17px,1.1em);background-repeat:no-repeat;background-position:top left;display:inline-block;vertical-align:middle;opacity:.5;}details.rustdoc-toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.rustdoc-toggle>summary.hideme::after{content:"";}details.rustdoc-toggle>summary:focus::before,details.rustdoc-toggle>summary:hover::before{opacity:1;}details.rustdoc-toggle.top-doc>summary,details.rustdoc-toggle.top-doc>summary::before,details.rustdoc-toggle.non-exhaustive>summary,details.rustdoc-toggle.non-exhaustive>summary::before{font-family:'Fira Sans';font-size:16px;}details.non-exhaustive{margin-bottom:8px;}details.rustdoc-toggle>summary.hideme::before{position:relative;}details.rustdoc-toggle>summary:not(.hideme)::before{position:absolute;left:-23px;top:3px;}.impl-items>details.rustdoc-toggle>summary:not(.hideme)::before,.undocumented>details.rustdoc-toggle>summary:not(.hideme)::before{position:absolute;left:-2px;}details.rustdoc-toggle[open] >summary.hideme{position:absolute;}details.rustdoc-toggle,details.undocumented{position:relative;}details.rustdoc-toggle[open] >summary.hideme>span{display:none;}details.rustdoc-toggle[open] >summary::before,details.rustdoc-toggle[open] >summary.hideme::before{width:17px;height:max(17px,1.1em);background-repeat:no-repeat;background-position:top left;display:inline-block;content:"";}details.rustdoc-toggle[open] >summary::after,details.rustdoc-toggle[open] >summary.hideme::after{content:"Collapse";}details.undocumented>summary::before{padding-left:17px;height:max(17px,1.1em);background-repeat:no-repeat;background-position:top left;content:"Show hidden undocumented items";cursor:pointer;font-size:16px;font-weight:300;opacity:.5;}details.undocumented>summary:focus::before,details.undocumented>summary:hover::before{opacity:1;}details.undocumented[open] >summary::before{padding-left:17px;height:max(17px,1.1em);background-repeat:no-repeat background-position:top left;content:"Hide undocumented items";}@media (min-width:701px){.docblock>.information:first-child>.tooltip{margin-top:16px;}}@media (max-width:700px){body{padding-top:0px;}.rustdoc>.sidebar{height:45px;min-height:40px;margin:0;margin-left:-15px;padding:0 15px;position:static;z-index:11;}.sidebar>.location{float:right;margin:0px;margin-top:2px;padding:3px 10px 1px 10px;min-height:39px;background:inherit;text-align:left;font-size:24px;}.sidebar .location:empty{padding:0;}.sidebar .logo-container{width:35px;height:35px;margin-top:5px;margin-bottom:5px;float:left;margin-left:50px;}.sidebar .logo-container>img{max-width:35px;max-height:35px;}.sidebar-menu{position:fixed;z-index:10;font-size:2rem;cursor:pointer;width:45px;left:0;text-align:center;display:block;border-bottom:1px solid;border-right:1px solid;height:45px;}.rustdoc.source>.sidebar>.sidebar-menu{display:none;}.sidebar-elems{position:fixed;z-index:1;top:45px;bottom:0;width:246px;left:-246px;overflow-y:auto;border-right:1px solid;}.sidebar>.block.version{overflow:hidden;border-bottom:none;margin-bottom:0;height:100%;padding-left:12px;}.sidebar>.block.version>div.narrow-helper{float:left;width:1px;height:100%;}.sidebar>.block.version>p{margin:0;min-width:55px;display:flex;align-items:center;height:100%;}nav.sub{width:calc(100% - 32px);float:right;}.content{margin-left:0px;}#main,#search{margin-top:45px;padding:0;}#search{margin-left:0;}.anchor{display:none !important;}.theme-picker{left:10px;top:54px;z-index:1;}.notable-traits{position:absolute;left:-22px;top:24px;}#titles>button>div.count{float:left;width:100%;}#titles{height:50px;}.sidebar.mobile{position:fixed;width:100%;margin-left:0;background-color:rgba(0,0,0,0);height:100%;}.sidebar.mobile>div.version{overflow:hidden;max-height:33px;}.sidebar{width:calc(100% + 30px);}.show-it,.sidebar-elems:focus-within{z-index:2;left:0;}.show-it>.block.items{margin:8px 0;}.show-it>.block.items>ul{margin:0;}.show-it>.block.items>ul>li{text-align:center;margin:2px 0;}.show-it>.block.items>ul>li>a{font-size:21px;}#sidebar-filler{position:fixed;left:45px;width:calc(100% - 45px);top:0;height:45px;z-index:-1;border-bottom:1px solid;}#main>details.rustdoc-toggle>summary::before,#main>div>details.rustdoc-toggle>summary::before{left:-11px;}#all-types{margin:10px;}#sidebar-toggle{top:100px;width:30px;font-size:1.5rem;text-align:center;padding:0;}#source-sidebar{z-index:11;}#main>.line-numbers{margin-top:0;}.notable-traits .notable-traits-tooltiptext{left:0;top:100%;}#help-button{display:none;}.item-table{display:flex;flex-flow:column wrap;}.item-left,.item-right{width:100%;}.search-container>div{width:calc(100% - 32px);}.search-results>a{border-bottom:1px solid #aaa9;padding:5px 0px;}.search-results .result-name,.search-results div.desc,.search-results .result-description{width:100%;}.search-results div.desc,.search-results .result-description,.item-right{padding-left:2em;}}@media print{nav.sub,.content .out-of-band{display:none;}}@media (max-width:464px){#titles,#titles>button{height:73px;}#main,#search{margin-top:100px;}#main>table:not(.table-display) td{word-break:break-word;width:50%;}.search-container>div{display:block;width:calc(100% - 37px);}#crate-search{width:100%;border-radius:4px;border:0;}#crate-search+.search-input{width:calc(100% + 71px);margin-left:-36px;}#theme-picker,#settings-menu{padding:5px;width:31px;height:31px;}#theme-picker{margin-top:-2px;}#settings-menu{top:7px;}.docblock{margin-left:12px;}}details.undocumented[open] >summary::before,details.rustdoc-toggle[open] >summary::before,details.rustdoc-toggle[open] >summary.hideme::before{background-image:url(toggle-minus.svg);}details.undocumented>summary::before,details.rustdoc-toggle>summary::before{background-image:url(toggle-plus.svg);} \ No newline at end of file + @font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular.woff2") format("woff2"),url("FiraSans-Regular.woff") format('woff');font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium.woff2") format("woff2"),url("FiraSans-Medium.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular.ttf.woff2") format("woff2"),url("SourceSerif4-Regular.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It.ttf.woff2") format("woff2"),url("SourceSerif4-It.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold.ttf.woff2") format("woff2"),url("SourceSerif4-Bold.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular.ttf.woff2") format("woff2"),url("SourceCodePro-Regular.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It.ttf.woff2") format("woff2"),url("SourceCodePro-It.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold.ttf.woff2") format("woff2"),url("SourceCodePro-Semibold.ttf.woff") format("woff");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic.ttf.woff2") format("woff2"),url("NanumBarunGothic.ttf.woff") format("woff");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}html{content:"";}@media (prefers-color-scheme:light){html{content:"light";}}@media (prefers-color-scheme:dark){html{content:"dark";}}body{font:16px/1.4 "Source Serif 4",NanumBarunGothic,serif;margin:0;position:relative;-webkit-font-feature-settings:"kern","liga";-moz-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";}h1{font-size:1.5em;}h2{font-size:1.4em;}h3{font-size:1.3em;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:20px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}h1.fqn{display:flex;border-bottom:1px dashed;margin-top:0;padding-left:1px;}h1.fqn>.in-band>a:hover{text-decoration:underline;}h2,.top-doc h3,.top-doc h4,.sidebar .others h3{border-bottom:1px solid;}h3.code-header{font-size:1.1em;}h4.code-header{font-size:1em;}h3.code-header,h4.code-header{font-weight:600;border-bottom-style:none;padding:0;margin:0;}.impl,.impl-items .method,.methods .method,.impl-items .type,.methods .type,.impl-items .associatedconstant,.methods .associatedconstant,.impl-items .associatedtype,.methods .associatedtype{flex-basis:100%;font-weight:600;margin-top:16px;margin-bottom:10px;position:relative;}div.impl-items>div{padding-left:0;}h1,h2,h3,h4,h5,h6,.sidebar,a.source,.search-input,.search-results .result-name,.content table td:first-child>a,.item-left>a,div.item-list .out-of-band,span.since,#source-sidebar,#sidebar-toggle,details.rustdoc-toggle>summary::before,div.impl-items>div:not(.docblock):not(.item-info),.content ul.crate a.crate,a.srclink,#main-content>ul.docblock>li>a{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}.content ul.crate a.crate{font-size:16px/1.6;}ol,ul{padding-left:25px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.6em;}p{margin:0 0 .6em 0;}summary{outline:none;}td,th{padding:0;}table{border-collapse:collapse;}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.source main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}.source .width-limiter{max-width:unset;}details:not(.rustdoc-toggle) summary{margin-bottom:.6em;}code,pre,a.test-arrow,.code-header{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.1em;}.docblock pre code,.docblock-short pre code{padding:0;}pre{padding:14px;}.docblock.item-decl{margin-left:0;}.item-decl pre{overflow-x:auto;}.source .content pre{padding:20px;}img{max-width:100%;}li{position:relative;}.source .content{max-width:none;overflow:visible;margin-left:0px;}nav.sub{position:relative;font-size:16px;text-transform:uppercase;}.sub-container{display:flex;flex-direction:row;flex-wrap:nowrap;}.sub-logo-container{display:none;margin-right:20px;}.source .sub-logo-container{display:block;}.source .sub-logo-container>img{height:60px;width:60px;object-fit:contain;}.sidebar{width:200px;overflow-y:scroll;position:sticky;min-width:200px;height:100vh;top:0;left:0;}.rustdoc.source .sidebar{width:50px;min-width:0px;max-width:300px;flex-grow:0;flex-shrink:0;flex-basis:auto;border-right:1px solid;overflow-x:hidden;overflow-y:hidden;}.source .sidebar>*:not(:first-child){transition:opacity 0.5s,visibility 0.2s;opacity:0;visibility:hidden;}.source .sidebar.expanded{overflow-y:auto;}.source .sidebar.expanded>*{opacity:1;visibility:visible;}*{scrollbar-width:initial;}.sidebar{scrollbar-width:thin;}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;}.sidebar .block>ul>li{margin-right:-10px;}.hidden{display:none !important;}.logo-container{display:flex;margin-top:10px;margin-bottom:10px;justify-content:center;}.logo-container>img{height:100px;width:100px;}.sidebar .location{border:1px solid;font-size:17px;margin:30px 10px 20px 10px;text-align:center;word-wrap:break-word;font-weight:inherit;padding:0;}.sidebar .version{font-size:15px;text-align:center;border-bottom:1px solid;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;}.location:empty{border:none;}.location a:first-of-type{font-weight:500;}.location a:hover{text-decoration:underline;}.block{padding:0;margin-bottom:14px;}.block h2,.block h3{text-align:center;}.block ul,.block li{margin:0 10px;padding:0;list-style:none;}.block a{display:block;text-overflow:ellipsis;overflow:hidden;line-height:15px;padding:7px 5px;font-size:14px;font-weight:300;transition:border 500ms ease-out;}.sidebar-title{border-top:1px solid;border-bottom:1px solid;text-align:center;font-size:17px;margin-bottom:5px;font-weight:inherit;padding:0;}.sidebar-links{margin-bottom:15px;}.sidebar-links>a{padding-left:10px;width:100%;}.sidebar-menu{display:none;}.source .content pre.rust{white-space:pre;overflow:auto;padding-left:0;}.rustdoc .example-wrap{display:inline-flex;margin-bottom:10px;}.example-wrap{position:relative;width:100%;}.example-wrap>pre.line-number{overflow:initial;border:1px solid;padding:13px 8px;text-align:right;border-top-left-radius:5px;border-bottom-left-radius:5px;}.example-wrap>pre.rust a:hover{text-decoration:underline;}.rustdoc:not(.source) .example-wrap>pre:not(.line-number){width:100%;overflow-x:auto;}.rustdoc:not(.source) .example-wrap>pre.line-numbers{width:auto;overflow-x:visible;}.rustdoc .example-wrap>pre{margin:0;}#search{position:relative;}#results>table{width:100%;table-layout:fixed;}.content>.example-wrap pre.line-numbers{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers span{cursor:pointer;}.docblock-short{overflow-wrap:anywhere;}.docblock-short p{display:inline;}.docblock-short p{overflow:hidden;text-overflow:ellipsis;margin:0;}.docblock>:not(pre)>code,.docblock-short>:not(pre)>code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.3em;}.top-doc .docblock h3{font-size:1.15em;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.1em;}.top-doc .docblock h6{font-size:1em;}.docblock h5{font-size:1em;}.docblock h6{font-size:0.95em;}.docblock{margin-left:24px;position:relative;}.docblock>:not(.information){max-width:100%;overflow-x:auto;}.content .out-of-band{flex-grow:0;text-align:right;font-size:23px;margin:0px;padding:0 0 0 12px;font-weight:normal;}.method>.code-header,.trait-impl>.code-header,.invisible>.code-header{max-width:calc(100% - 41px);display:block;}.invisible{width:100%;display:inline-block;}.content .in-band{flex-grow:1;margin:0px;padding:0px;overflow-wrap:anywhere;}.in-band>code,.in-band>.code-header{display:inline-block;}#main-content{position:relative;}#main-content>.since{top:inherit;font-family:"Fira Sans",Arial,sans-serif;}.content table:not(.table-display){border-spacing:0 5px;}.content td{vertical-align:top;}.content td:first-child{padding-right:20px;}.content td p:first-child{margin-top:0;}.content td h1,.content td h2{margin-left:0;font-size:1.1em;}.content tr:first-child td{border-top:0;}.docblock table{margin:.5em 0;width:calc(100% - 2px);overflow-x:auto;display:block;}.docblock table td{padding:.5em;border:1px dashed;}.docblock table th{padding:.5em;text-align:left;border:1px solid;}.fields+table{margin-bottom:1em;}.content .item-list{list-style-type:none;padding:0;}.content .multi-column{-moz-column-count:5;-moz-column-gap:2.5em;-webkit-column-count:5;-webkit-column-gap:2.5em;column-count:5;column-gap:2.5em;}.content .multi-column li{width:100%;display:inline-block;}.content>.methods>.method{font-size:1em;position:relative;}.content .method .where,.content .fn .where,.content .where.fmt-newline{display:block;font-size:0.8em;}.content .methods>div:not(.notable-traits):not(.method){margin-left:40px;margin-bottom:15px;}.content .docblock>.impl-items{margin-left:20px;margin-top:-34px;}.content .docblock>.impl-items .table-display{margin:0;}.content .docblock>.impl-items table td{padding:0;}.content .docblock>.impl-items .table-display,.impl-items table td{border:none;}.content .item-info code{font-size:90%;}.content .item-info{position:relative;margin-left:33px;}.sub-variant>div>.item-info{margin-top:initial;}.content .item-info::before{content:'⬑';font-size:25px;position:absolute;top:-6px;left:-19px;}.content .impl-items .docblock,.content .impl-items .item-info{margin-bottom:.6em;}.content .impl-items>.item-info{margin-left:40px;}.methods>.item-info,.content .impl-items>.item-info{margin-top:-8px;}.impl-items{flex-basis:100%;}#main-content>.item-info{margin-top:0;}nav:not(.sidebar){flex-grow:1;border-bottom:1px solid;padding-bottom:10px;margin-bottom:25px;}.source nav:not(.sidebar).sub{margin-left:32px;}nav.main{padding:20px 0;text-align:center;}nav.main .current{border-top:1px solid;border-bottom:1px solid;}nav.main .separator{border:1px solid;display:inline-block;height:23px;margin:0 20px;}nav.sum{text-align:right;}nav.sub form{display:inline;}a{text-decoration:none;background:transparent;}.small-section-header{display:flex;justify-content:space-between;position:relative;}.small-section-header:hover>.anchor{display:initial;}.in-band:hover>.anchor,.impl:hover>.anchor,.method.trait-impl:hover>.anchor,.type.trait-impl:hover>.anchor,.associatedconstant.trait-impl:hover>.anchor,.associatedtype.trait-impl:hover>.anchor{display:inline-block;position:absolute;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-15px;padding-right:8px;}h2.small-section-header>.anchor{padding-right:6px;}.anchor::before{content:'§';}.docblock a:not(.srclink):not(.test-arrow):hover,.docblock-short a:not(.srclink):not(.test-arrow):hover,.item-info a{text-decoration:underline;}.invisible>.srclink,.method>.code-header+.srclink{position:absolute;top:0;right:0;font-size:17px;font-weight:normal;}.block a.current.crate{font-weight:500;}.item-table{display:table;}.item-row{display:table-row;}.item-left,.item-right{display:table-cell;}.item-left{padding-right:1.2rem;}.search-container{position:relative;max-width:960px;}.search-container>div{display:inline-flex;width:calc(100% - 63px);}#crate-search{min-width:115px;margin-top:5px;padding:6px;padding-right:19px;flex:none;border:0;border-right:0;border-radius:4px 0 0 4px;outline:none;cursor:pointer;border-right:1px solid;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;text-overflow:"";background-repeat:no-repeat;background-color:transparent;background-size:20px;background-position:calc(100% - 1px) 56%;background-image:url("down-arrow.svg");}.search-container>.top-button{position:absolute;right:0;top:10px;}.search-input{-webkit-appearance:none;-moz-box-sizing:border-box !important;box-sizing:border-box !important;outline:none;border:none;border-radius:1px;margin-top:5px;padding:10px 16px;font-size:17px;transition:border-color 300ms ease;transition:border-radius 300ms ease-in-out;transition:box-shadow 300ms ease-in-out;width:100%;}#crate-search+.search-input{border-radius:0 1px 1px 0;width:calc(100% - 32px);}.search-input:focus{border-radius:2px;border:0;outline:0;}.search-results{display:none;padding-bottom:2em;}.search-results.active{display:block;clear:both;}.search-results .desc>span{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;}.search-results>a{display:block;width:100%;margin-left:2px;margin-right:2px;border-bottom:1px solid #aaa3;}.search-results>a>div{display:flex;flex-flow:row wrap;}.search-results .result-name,.search-results div.desc,.search-results .result-description{width:50%;}.search-results .result-name{padding-right:1em;}.search-results .result-name>span{display:inline-block;margin:0;font-weight:normal;}body.blur>:not(#help){filter:blur(8px);-webkit-filter:blur(8px);opacity:.7;}#help{width:100%;height:100vh;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;}#help>div{flex:0 0 auto;box-shadow:0 0 6px rgba(0,0,0,.2);width:550px;height:auto;border:1px solid;}#help dt{float:left;clear:left;display:block;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:18px;}#help span.top{text-align:center;display:block;margin:10px 0;border-bottom:1px solid;padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid;}#help dd{margin:5px 35px;}#help .infos{padding-left:0;}#help h1,#help h2{margin-top:0;}#help>div div{width:50%;float:left;padding:0 20px 20px 17px;;}.item-info .stab{display:table;}.stab{padding:3px;margin-bottom:5px;font-size:90%;font-weight:normal;}.stab p{display:inline;}.stab .emoji{font-size:1.2em;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.module-item .stab,.import-item .stab{border-radius:3px;display:inline-block;font-size:80%;line-height:1.2;margin-bottom:0;margin-left:.3em;padding:2px;vertical-align:text-bottom;}.module-item.unstable,.import-item.unstable{opacity:0.65;}.since{font-weight:normal;font-size:initial;}.impl-items .since,.impl .since,.methods .since{padding-left:12px;padding-right:2px;position:initial;}.impl-items .srclink,.impl .srclink,.methods .srclink{font-size:17px;font-weight:normal;}.rightside{float:right;}.has-srclink{font-size:16px;margin-bottom:12px;justify-content:space-between;}.variants_table{width:100%;}.variants_table tbody tr td:first-child{width:1%;}td.summary-column{width:100%;}.summary{padding-right:0px;}pre.rust .question-mark{font-weight:bold;}a.test-arrow{display:inline-block;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:130%;top:5px;right:5px;z-index:1;}a.test-arrow:hover{text-decoration:none;}.section-header:hover a:before{position:absolute;left:-25px;padding-right:10px;content:'\2002\00a7\2002';}.section-header:hover a{text-decoration:none;}.code-attribute{font-weight:300;}.since+.srclink{padding-left:10px;}.item-spacer{width:100%;height:12px;}.out-of-band>span.since{position:initial;font-size:20px;margin-right:5px;}h3.variant{font-weight:600;font-size:1.1em;margin-bottom:10px;border-bottom:none;}.sub-variant h4{font-size:1em;font-weight:400;border-bottom:none;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}.toggle-label{display:inline-block;margin-left:4px;margin-top:3px;}.top-doc .docblock>.section-header:first-child{margin-left:15px;}.top-doc .docblock>.section-header:first-child:hover>a:before{left:-10px;}.docblock>.section-header:first-child{margin-top:0;}:target>code,:target>.code-header{opacity:1;}:target{padding-right:3px;}.information{position:absolute;left:-25px;margin-top:7px;z-index:1;}.tooltip{position:relative;display:inline-block;cursor:pointer;}.tooltip::after{display:none;text-align:center;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;font-size:16px;}.tooltip.ignore::after{content:"This example is not tested";}.tooltip.compile_fail::after{content:"This example deliberately fails to compile";}.tooltip.should_panic::after{content:"This example panics";}.tooltip.edition::after{content:"This code runs with edition " attr(data-edition);}.tooltip::before{content:" ";position:absolute;top:50%;left:16px;margin-top:-5px;border-width:5px;border-style:solid;display:none;}.tooltip:hover::before,.tooltip:hover::after{display:inline;}.tooltip.compile_fail,.tooltip.should_panic,.tooltip.ignore{font-weight:bold;font-size:20px;}.notable-traits-tooltip{display:inline-block;cursor:pointer;}.notable-traits:hover .notable-traits-tooltiptext,.notable-traits .notable-traits-tooltiptext.force-tooltip{display:inline-block;}.notable-traits .notable-traits-tooltiptext{display:none;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;z-index:10;font-size:16px;cursor:default;position:absolute;border:1px solid;}.notable-traits-tooltip::after{content:"\00a0\00a0\00a0";}.notable-traits .notable,.notable-traits .docblock{margin:0;}.notable-traits .notable{margin:0;margin-bottom:13px;font-size:19px;font-weight:600;}.notable-traits .docblock code.content{margin:0;padding:0;font-size:20px;}pre.rust.rust-example-rendered{position:relative;}pre.rust{tab-size:4;-moz-tab-size:4;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#titles{height:35px;}#titles>button{float:left;width:33.3%;text-align:center;font-size:18px;cursor:pointer;border:0;border-top:2px solid;}#titles>button:not(:last-child){margin-right:1px;width:calc(33.3% - 1px);}#titles>button>div.count{display:inline-block;font-size:16px;}.notable-traits{cursor:pointer;z-index:2;margin-left:5px;}#all-types{text-align:center;border:1px solid;margin:0 10px;margin-bottom:10px;display:block;border-radius:7px;}#all-types>p{margin:5px 0;}#sidebar-toggle{position:sticky;top:0;left:0;cursor:pointer;font-weight:bold;font-size:1.2em;border-bottom:1px solid;display:flex;height:40px;justify-content:center;align-items:center;z-index:10;}#source-sidebar{width:100%;z-index:1;overflow:auto;}#source-sidebar>.title{font-size:1.5em;text-align:center;border-bottom:1px solid;margin-bottom:6px;}.theme-picker{position:absolute;left:-34px;top:9px;}.theme-picker button{outline:none;}#settings-menu,#help-button{position:absolute;top:10px;}#settings-menu{right:0;outline:none;}#theme-picker,#settings-menu,#help-button,#copy-path{padding:4px;width:27px;height:29px;border:1px solid;border-radius:3px;cursor:pointer;}#help-button{right:30px;font-family:"Fira Sans",Arial,sans-serif;text-align:center;font-size:17px;padding-top:2px;}#copy-path{background:initial;margin-left:10px;padding:0;padding-left:2px;border:0;}#theme-choices{display:none;position:absolute;left:0;top:28px;border:1px solid;border-radius:3px;z-index:1;cursor:pointer;}#theme-choices>button{border:none;width:100%;padding:4px 8px;text-align:center;background:rgba(0,0,0,0);}#theme-choices>button:not(:first-child){border-top:1px solid;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px;border-radius:3px;box-shadow:inset 0 -1px 0;cursor:default;}.hidden-by-impl-hider,.hidden-by-usual-hider{display:none !important;}#implementations-list>h3>span.in-band{width:100%;}.table-display{width:100%;border:0;border-collapse:collapse;border-spacing:0;font-size:16px;}.table-display tr td:first-child{padding-right:0;}.table-display tr td:last-child{float:right;}.table-display .out-of-band{position:relative;font-size:19px;display:block;}#implementors-list>.impl-items .table-display .out-of-band{font-size:17px;}.table-display td:hover .anchor{display:block;top:2px;left:-5px;}#main-content>ul{padding-left:10px;}#main-content>ul>li{list-style:none;}.non-exhaustive{margin-bottom:1em;}div.children{padding-left:27px;display:none;}div.name{cursor:pointer;position:relative;margin-left:16px;}div.files>a{display:block;padding:0 3px;}div.files>a:hover,div.name:hover{background-color:#a14b4b;}div.name.expand+.children{display:block;}div.name::before{content:"\25B6";padding-left:4px;font-size:0.7em;position:absolute;left:-16px;top:4px;}div.name.expand::before{transform:rotate(90deg);left:-15px;top:2px;}details.rustdoc-toggle>summary.hideme{cursor:pointer;}details.rustdoc-toggle>summary{list-style:none;}details.rustdoc-toggle>summary::-webkit-details-marker,details.rustdoc-toggle>summary::marker{display:none;}details.rustdoc-toggle>summary.hideme>span{margin-left:9px;}details.rustdoc-toggle>summary::before{content:"";cursor:pointer;width:17px;height:max(17px,1.1em);background-repeat:no-repeat;background-position:top left;display:inline-block;vertical-align:middle;opacity:.5;}details.rustdoc-toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.rustdoc-toggle>summary.hideme::after{content:"";}details.rustdoc-toggle>summary:focus::before,details.rustdoc-toggle>summary:hover::before{opacity:1;}details.rustdoc-toggle.top-doc>summary,details.rustdoc-toggle.top-doc>summary::before,details.rustdoc-toggle.non-exhaustive>summary,details.rustdoc-toggle.non-exhaustive>summary::before{font-family:'Fira Sans';font-size:16px;}details.non-exhaustive{margin-bottom:8px;}details.rustdoc-toggle>summary.hideme::before{position:relative;}details.rustdoc-toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:3px;}.impl-items>details.rustdoc-toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}details.rustdoc-toggle[open] >summary.hideme{position:absolute;}details.rustdoc-toggle{position:relative;}details.rustdoc-toggle[open] >summary.hideme>span{display:none;}details.undocumented[open] >summary::before,details.rustdoc-toggle[open] >summary::before,details.rustdoc-toggle[open] >summary.hideme::before{background-image:url("toggle-minus.svg");}details.undocumented>summary::before,details.rustdoc-toggle>summary::before{background-image:url("toggle-plus.svg");}details.rustdoc-toggle[open] >summary::before,details.rustdoc-toggle[open] >summary.hideme::before{width:17px;height:max(17px,1.1em);background-repeat:no-repeat;background-position:top left;display:inline-block;content:"";}details.rustdoc-toggle[open] >summary::after,details.rustdoc-toggle[open] >summary.hideme::after{content:"Collapse";}@media (min-width:701px){.docblock>.information:first-child>.tooltip{margin-top:16px;}.sidebar.expanded+main .width-limiter .sub-logo-container.rust-logo{display:none;}.rustdoc.source .sidebar{transition:width .5s;}.source .sidebar.expanded{width:300px;}}@media (max-width:700px){body{padding-top:0px;}main{padding-left:15px;padding-top:0px;}.rustdoc{flex-direction:column;}.rustdoc:not(.source)>.sidebar{width:100%;height:45px;min-height:40px;max-height:45px;margin:0;padding:0 15px;position:static;z-index:11;overflow-y:hidden;}.rustdoc.source>.sidebar{position:fixed;top:0;left:0;margin:0;z-index:11;width:0;}.sidebar.mobile{position:sticky !important;top:0;left:0;width:100%;margin-left:0;background-color:rgba(0,0,0,0);}.sidebar>.location{float:right;margin:0px;margin-top:2px;padding:3px 10px 1px 10px;min-height:39px;background:inherit;text-align:left;font-size:24px;}.sidebar .location:empty{padding:0;}.rustdoc:not(.source) .sidebar .logo-container{width:35px;height:35px;margin-top:5px;margin-bottom:5px;float:left;margin-left:50px;}.sidebar .logo-container>img{max-width:35px;max-height:35px;}.sidebar-menu{position:fixed;z-index:10;font-size:2rem;cursor:pointer;width:45px;left:0;top:0;text-align:center;display:block;border-bottom:1px solid;border-right:1px solid;height:45px;}.rustdoc.source>.sidebar>.sidebar-menu{display:none;}.sidebar-elems{position:fixed;z-index:1;top:45px;bottom:0;width:246px;left:-246px;overflow-y:auto;border-right:1px solid;}.sidebar>.block.version{overflow:hidden;border-bottom:none;margin-bottom:0;height:100%;padding-left:12px;}.sidebar>.block.version>div.narrow-helper{float:left;width:1px;height:100%;}.sidebar>.block.version>p{margin:0;min-width:55px;display:flex;align-items:center;height:100%;}nav.sub{width:calc(100% - 32px);margin-left:32px;margin-bottom:10px;}.source nav:not(.sidebar).sub{margin-left:32px;}.content{margin-left:0px;}.source .content{margin-top:10px;}#search{margin-left:0;padding:0;}.anchor{display:none !important;}.theme-picker{z-index:1;}.notable-traits{position:absolute;left:-22px;top:24px;}#titles>button>div.count{float:left;width:100%;}#titles{height:50px;}.show-it,.sidebar-elems:focus-within{z-index:2;left:0;}.show-it>.block.items{margin:8px 0;}.show-it>.block.items>ul{margin:0;}.show-it>.block.items>ul>li{text-align:center;margin:2px 0;}.show-it>.block.items>ul>li>a{font-size:21px;}#sidebar-filler{position:fixed;left:45px;width:calc(100% - 45px);top:0;height:45px;z-index:-1;border-bottom:1px solid;}#main-content>details.rustdoc-toggle>summary::before,#main-content>div>details.rustdoc-toggle>summary::before{left:-11px;}#all-types{margin:10px;}.sidebar.expanded #sidebar-toggle{font-size:1.5rem;}.sidebar:not(.expanded) #sidebar-toggle{position:fixed;left:1px;top:100px;width:30px;font-size:1.5rem;text-align:center;padding:0;z-index:10;border-top-right-radius:3px;border-bottom-right-radius:3px;cursor:pointer;font-weight:bold;border:1px solid;border-left:0;}#source-sidebar{z-index:11;}#main-content>.line-numbers{margin-top:0;}.notable-traits .notable-traits-tooltiptext{left:0;top:100%;}#help-button{display:none;}.item-table{display:block;}.item-row{display:flex;flex-flow:column wrap;}.item-left,.item-right{width:100%;}.search-container>div{width:calc(100% - 32px);}.search-results>a{border-bottom:1px solid #aaa9;padding:5px 0px;}.search-results .result-name,.search-results div.desc,.search-results .result-description{width:100%;}.search-results div.desc,.search-results .result-description,.item-right{padding-left:2em;}.source .sidebar.expanded{max-width:100vw;width:100vw;}}@media print{nav.sub,.content .out-of-band{display:none;}}@media (max-width:464px){#titles,#titles>button{height:73px;}#main-content>table:not(.table-display) td{word-break:break-word;width:50%;}.search-container>div{display:block;width:calc(100% - 37px);}#crate-search{width:100%;border-radius:4px;border:0;}#crate-search+.search-input{width:calc(100% + 71px);margin-left:-36px;}#theme-picker,#settings-menu{padding:5px;width:31px;height:31px;}#theme-picker{margin-top:-2px;}#settings-menu{top:7px;}.docblock{margin-left:12px;}.docblock code{overflow-wrap:anywhere;}.sub-container{flex-direction:column;}.sub-logo-container{align-self:center;}.source .sub-logo-container>img{height:35px;width:35px;}.sidebar:not(.expanded) #sidebar-toggle{top:10px;}}.scraped-example-title{font-family:'Fira Sans';}.scraped-example:not(.expanded) .code-wrapper pre.line-numbers{overflow:hidden;max-height:240px;}.scraped-example:not(.expanded) .code-wrapper .example-wrap pre.rust{overflow-y:hidden;max-height:240px;padding-bottom:0;}.scraped-example .code-wrapper .prev{position:absolute;top:0.25em;right:2.25em;z-index:100;cursor:pointer;}.scraped-example .code-wrapper .next{position:absolute;top:0.25em;right:1.25em;z-index:100;cursor:pointer;}.scraped-example .code-wrapper .expand{position:absolute;top:0.25em;right:0.25em;z-index:100;cursor:pointer;}.scraped-example .code-wrapper{position:relative;display:flex;flex-direction:row;flex-wrap:wrap;width:100%;}.scraped-example:not(.expanded) .code-wrapper:before{content:" ";width:100%;height:5px;position:absolute;z-index:100;top:0;background:linear-gradient(to bottom,rgba(255,255,255,1),rgba(255,255,255,0));}.scraped-example:not(.expanded) .code-wrapper:after{content:" ";width:100%;height:5px;position:absolute;z-index:100;bottom:0;background:linear-gradient(to top,rgba(255,255,255,1),rgba(255,255,255,0));}.scraped-example:not(.expanded) .code-wrapper{overflow:hidden;max-height:240px;}.scraped-example .code-wrapper .line-numbers{margin:0;padding:14px 0;}.scraped-example .code-wrapper .line-numbers span{padding:0 14px;}.scraped-example .code-wrapper .example-wrap{flex:1;overflow-x:auto;overflow-y:hidden;margin-bottom:0;}.scraped-example .code-wrapper .example-wrap pre.rust{overflow-x:inherit;width:inherit;overflow-y:hidden;}.scraped-example .example-wrap .rust span.highlight{background:#fcffd6;}.scraped-example .example-wrap .rust span.highlight.focus{background:#f6fdb0;}.more-examples-toggle{margin-top:10px;}.more-examples-toggle summary{color:#999;font-family:'Fira Sans';}.more-scraped-examples{margin-left:25px;display:flex;flex-direction:row;width:calc(100% - 25px);}.more-scraped-examples-inner{width:calc(100% - 20px);}.toggle-line{align-self:stretch;margin-right:10px;margin-top:5px;padding:0 4px;cursor:pointer;}.toggle-line:hover .toggle-line-inner{background:#aaa;}.toggle-line-inner{min-width:2px;background:#ddd;height:100%;}.more-scraped-examples .scraped-example{margin-bottom:20px;}.more-scraped-examples .scraped-example:last-child{margin-bottom:0;}.example-links a{margin-top:20px;font-family:'Fira Sans';}.example-links ul{margin-bottom:0;} \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js index 48240e03f9..7695cd5af8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js @@ -1,4 +1,4 @@ var searchIndex = JSON.parse('{\ -"bdk":{"doc":"A modern, lightweight, descriptor-based wallet library …","t":[13,13,13,13,13,13,3,13,13,13,4,13,13,3,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,4,13,3,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,3,13,13,4,8,3,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0,11,11,11,11,11,11,11,11,12,11,12,12,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,11,12,10,12,5,11,11,11,11,11,11,11,11,0,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,8,4,16,8,3,13,13,3,3,8,6,0,11,11,11,11,11,11,10,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,0,11,0,10,11,11,11,11,10,10,11,10,10,11,11,11,11,11,11,11,5,5,5,10,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,4,4,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,3,3,3,4,13,13,13,13,13,13,13,13,3,13,13,13,3,13,13,13,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,13,3,3,4,3,13,13,13,13,13,13,13,13,13,13,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,16,8,8,16,8,8,3,0,10,11,11,11,10,11,10,11,12,10,11,10,11,10,11,10,11,10,11,10,11,11,11,11,10,11,11,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,11,11,10,11,10,11,10,11,10,11,0,11,12,10,11,10,11,10,11,10,11,10,11,11,11,11,11,4,4,4,13,13,13,13,13,13,3,13,13,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,6,3,4,6,8,6,8,6,4,3,13,8,4,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,5,13,13,13,4,13,13,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,4,13,3,6,6,13,13,13,13,13,13,13,13,13,13,13,3,3,4,13,13,13,13,4,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,3,8,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,4,4,4,3,3,16,16,8,4,8,8,3,8,13,13,13,4,6,13,13,13,16,13,3,13,8,4,13,13,13,3,6,13,13,5,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,5,11,10,11,11,5,11,11,11,11,12,12,11,11,11,11,11,11,12,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,4,3,4,6,3,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,3,8,13,13,13,13,3,11,11,12,0,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,5,11,11,12,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,0,11,0,11,11,11,11,11,11,11,0,11,11,11,11,11,11,12,12,8,4,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,12,3,8,3,6,3,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,13,13,13,13,13,13,13,13,13,13,13,13,3,8,4,4,3,3,13,11,12,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,5,13,3,13,13,4,3,13,13,3,8,4,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["AddressValidator","Bip32","BnBNoExactMatch","BnBTotalTriesExceeded","ChecksumMismatch","CompactFilters","ConfirmationTime","Descriptor","Electrum","Encode","Error","Esplora","External","FeeRate","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","Foreign","Generic","Hex","InsufficientFunds","Internal","InvalidNetwork","InvalidOutpoint","InvalidPolicyPathError","InvalidProgressValue","InvalidU32Bytes","IrreplaceableTransaction","Json","Key","KeychainKind","Local","LocalUtxo","Miniscript","MissingKeyOrigin","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","ProgressUpdateError","Psbt","PsbtParse","Rusqlite","ScriptDoesntHaveAddressForm","Secp256k1","Signer","Sled","SpendingPolicyRequired","TransactionConfirmed","TransactionDetails","TransactionNotFound","UnknownUtxo","Utxo","Vbytes","WeightedUtxo","as_byte","as_fail","as_ref","as_sat_vb","base32_len","blockchain","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_base32","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","confirmation_time","database","default","default","default","default_min_relay_fee","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","descriptor","descriptor","deserialize","deserialize","deserialize","deserialize","drop","drop","drop","drop","drop","drop","drop","drop","eq","eq","eq","eq","eq","eq","eq","fee","fee_vb","fee_wu","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_btc_per_kvb","from_sat_per_vb","from_vb","from_wu","get_hash","get_hash","hash","hash","height","init","init","init","init","init","init","init","init","into","into","into","into","into","into","into","into","into_descriptor_key","into_extended_key","into_wallet_descriptor","into_wallet_descriptor","keychain","keys","ne","ne","ne","ne","ne","ne","new","outpoint","outpoint","partial_cmp","received","satisfaction_weight","sent","serialize","serialize","serialize","serialize","sub","timestamp","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","transaction","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","txid","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","utxo","vbytes","verified","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet","write_base32","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","available","found","needed","requested","required","required","0","outpoint","psbt_input","AccurateFees","Blockchain","Capability","Config","ConfigurableBlockchain","EsploraBlockchain","FullHistory","GetAnyTx","LogProgress","NoopProgress","Progress","ProgressData","any","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","broadcast","clone","clone","clone","clone_into","clone_into","clone_into","compact_filters","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","electrum","eq","esplora","estimate_fee","fmt","from","from","from","from_config","get_capabilities","get_hash","get_height","get_tx","hash","init","init","init","into","into","into","log_progress","noop_progress","progress","setup","sync","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","update","update","vzip","vzip","vzip","AnyBlockchain","AnyBlockchainConfig","CompactFilters","CompactFilters","Electrum","Electrum","Esplora","Esplora","borrow","borrow","borrow_mut","borrow_mut","broadcast","clone","clone_into","deref","deref","deref_mut","deref_mut","deserialize","drop","drop","eq","estimate_fee","fmt","from","from","from","from","from","from","from","from","from_config","get_capabilities","get_height","get_tx","init","init","into","into","ne","serialize","setup","sync","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","0","0","0","0","0","0","Bip158","BitcoinPeerConfig","CompactFiltersBlockchain","CompactFiltersBlockchainConfig","CompactFiltersError","DataCorruption","Db","Global","InvalidFilter","InvalidFilterHeader","InvalidHeaders","InvalidResponse","Io","Mempool","MissingBlock","NoPeers","NotConnected","Peer","PeerBloomDisabled","Time","Timeout","add_tx","address","as_fail","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broadcast","clone","clone","clone_into","clone_into","connect","connect_proxy","default","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","drop","drop","drop","drop","drop","drop","eq","eq","estimate_fee","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_config","get_capabilities","get_height","get_mempool","get_network","get_tx","get_tx","get_version","has_tx","init","init","init","init","init","init","into","into","into","into","into","into","is_connected","iter_txs","ne","ne","network","new","new","peers","recv","send","serialize","serialize","setup","skip_blocks","socks5","socks5_credentials","storage_dir","to_owned","to_owned","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","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","0","0","ElectrumBlockchain","ElectrumBlockchainConfig","borrow","borrow","borrow_mut","borrow_mut","broadcast","clone","clone_into","deref","deref","deref_mut","deref_mut","deserialize","drop","drop","eq","estimate_fee","fmt","from","from","from","from_config","get_capabilities","get_height","get_tx","init","init","into","into","ne","retry","serialize","setup","socks5","stop_gap","timeout","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","url","vzip","vzip","BitcoinEncoding","EsploraBlockchain","EsploraBlockchainConfig","EsploraError","EsploraGetHistory","HeaderHashNotFound","HeaderHeightNotFound","Hex","HttpResponse","Io","NoHeader","Parsing","TransactionNotFound","Ureq","UreqTransport","as_fail","base_url","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broadcast","clone","clone_into","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","drop","drop","drop","drop","eq","estimate_fee","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from_config","get_capabilities","get_height","get_tx","init","init","init","init","into","into","into","into","ne","new","proxy","serialize","setup","stop_gap","timeout_read","timeout_write","to_owned","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","with_agent","0","0","0","0","0","0","0","0","0","0","Batch","BatchDatabase","BatchOperations","Config","ConfigurableDatabase","Database","SqliteDatabase","any","begin_batch","begin_batch","borrow","borrow_mut","check_descriptor_checksum","check_descriptor_checksum","commit_batch","commit_batch","connection","del_last_index","del_last_index","del_path_from_script_pubkey","del_path_from_script_pubkey","del_raw_tx","del_raw_tx","del_script_pubkey_from_path","del_script_pubkey_from_path","del_tx","del_tx","del_utxo","del_utxo","deref","deref_mut","drop","flush","flush","fmt","from","from_config","from_config","get_last_index","get_last_index","get_path_from_script_pubkey","get_path_from_script_pubkey","get_raw_tx","get_raw_tx","get_script_pubkey_from_path","get_script_pubkey_from_path","get_tx","get_tx","get_utxo","get_utxo","increment_last_index","increment_last_index","init","into","iter_raw_txs","iter_raw_txs","iter_script_pubkeys","iter_script_pubkeys","iter_txs","iter_txs","iter_utxos","iter_utxos","memory","new","path","set_last_index","set_last_index","set_raw_tx","set_raw_tx","set_script_pubkey","set_script_pubkey","set_tx","set_tx","set_utxo","set_utxo","try_from","try_into","type_id","vzip","AnyBatch","AnyDatabase","AnyDatabaseConfig","Memory","Memory","Memory","Sled","Sled","Sled","SledDbConfiguration","Sqlite","Sqlite","Sqlite","SqliteDbConfiguration","begin_batch","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_descriptor_checksum","commit_batch","del_last_index","del_last_index","del_path_from_script_pubkey","del_path_from_script_pubkey","del_raw_tx","del_raw_tx","del_script_pubkey_from_path","del_script_pubkey_from_path","del_tx","del_tx","del_utxo","del_utxo","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","drop","drop","drop","drop","drop","flush","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_config","get_last_index","get_path_from_script_pubkey","get_raw_tx","get_script_pubkey_from_path","get_tx","get_utxo","increment_last_index","init","init","init","init","init","into","into","into","into","into","iter_raw_txs","iter_script_pubkeys","iter_txs","iter_utxos","path","path","serialize","serialize","serialize","set_last_index","set_last_index","set_raw_tx","set_raw_tx","set_script_pubkey","set_script_pubkey","set_tx","set_tx","set_utxo","set_utxo","tree_name","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","0","0","0","0","0","0","0","0","0","MemoryDatabase","begin_batch","borrow","borrow_mut","check_descriptor_checksum","commit_batch","default","del_last_index","del_path_from_script_pubkey","del_raw_tx","del_script_pubkey_from_path","del_tx","del_utxo","deref","deref_mut","drop","flush","fmt","from","from_config","get_last_index","get_path_from_script_pubkey","get_raw_tx","get_script_pubkey_from_path","get_tx","get_utxo","increment_last_index","init","into","iter_raw_txs","iter_script_pubkeys","iter_txs","iter_utxos","new","set_last_index","set_raw_tx","set_script_pubkey","set_tx","set_utxo","try_from","try_into","type_id","vzip","Bare","DerivedDescriptor","DerivedDescriptorKey","Descriptor","ExtendedDescriptor","ExtractPolicy","HdKeyPaths","IntoWalletDescriptor","KeyMap","Legacy","Miniscript","Pkh","ScriptContext","Segwitv0","Sh","Wpkh","Wsh","address","as_enum","as_enum","as_inner","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","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_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","derive","desc_type","deserialize","deserialize","drop","drop","drop","drop","drop","encode","eq","eq","eq","eq","eq","error","explicit_script","ext","extract_policy","extract_policy","extract_policy","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from_ast","from_str","from_str","from_str_insane","from_tree","from_tree","get_hash","get_hash","get_hash","get_hash","get_hash","get_leaf_pk","get_leaf_pk_pkh","get_leaf_pkh","get_nth_child","get_nth_pk","get_nth_pk_pkh","get_nth_pkh","get_satisfaction","has_mixed_timelocks","has_repeated_keys","hash","hash","hash","hash","hash","hash_to_hash160","init","init","init","init","init","into","into","into","into","into","into_inner","into_wallet_descriptor","is_deriveable","is_non_malleable","is_uncompressed","iter","iter_pk","iter_pk_pkh","iter_pkh","lift","lift","lift_check","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","ne","new","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_wpkh","new_wsh","new_wsh_sortedmulti","node","other_top_level_checks","parse","parse_descriptor","parse_insane","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","serialized_len","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_pubkeyhash","to_public_key","to_string","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_from","try_into","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","vzip","within_resource_limits","0","0","0","0","0","get_checksum","Base58","Bip32","DuplicatedKeys","Error","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","Pk","Policy","as_fail","borrow","borrow_mut","deref","deref_mut","drop","fmt","fmt","from","from","from","from","from","from","from","from","init","into","to_string","try_from","try_into","type_id","vzip","0","0","0","0","0","0","0","0","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","Sha256Preimage","Signature","SignatureKey","Thresh","as_fail","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","contribution","csv","default","default","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","drop","drop","drop","drop","drop","drop","drop","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","get_hash","hash","id","id","init","init","init","init","init","init","init","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","ne","ne","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","0","current_height","input_max_height","psbt","0","0","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","0","0","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","0","0","0","0","0","0","0","0","0","1","1","1","1","1","1","2","2","2","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2Wpkh","P2Wpkh_P2Sh","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","build","build","build","build","build","build","build","build","build","build","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","drop","drop","drop","drop","drop","drop","drop","drop","drop","from","from","from","from","from","from","from","from","from","init","init","init","init","init","init","init","init","init","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","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","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","DescriptorSinglePriv","DescriptorSinglePub","Entropy","Error","ExtScriptContext","ExtendedKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","KeyError","KeyMap","Legacy","Message","Miniscript","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","SinglePriv","SinglePub","SortedMultiVec","ValidNetworks","XPrv","XPub","any_network","as_enum","as_fail","as_public","bip39","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","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_local_validity","check_terminal_non_malleable","check_witness","check_witness","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","compressed","default","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","derive","derive_public_key","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","encode","eq","eq","eq","eq","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_public","from_secret","from_str","from_str","from_tree","full_derivation_path","generate","generate_default","generate_with_entropy","generate_with_entropy_default","get_hash","get_hash","get_hash","has_secret","hash","hash","hash","init","init","init","init","init","init","init","init","init","init","init","into","into","into","into","into","into","into","into","into","into","into","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_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_segwit_v0","is_segwit_v0","is_uncompressed","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","ne","ne","ne","new","origin","origin","other_top_level_checks","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","pks","sanity_check","satisfy","script_size","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_pubkeyhash","to_string","to_string","to_string","to_string","top_level_checks","top_level_checks","top_level_type_check","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_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","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","0","0","0","0","0","0","ChineseSimplified","ChineseTraditional","English","French","Italian","Japanese","Korean","Language","Mnemonic","MnemonicType","MnemonicWithPassphrase","Seed","Spanish","Words12","Words15","Words18","Words21","Words24","as_bytes","as_ref","as_ref","base32_len","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_base32","checksum_bits","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","default","default","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","drop","drop","drop","drop","entropy","entropy_bits","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_key_size","for_phrase","for_word_count","from","from","from","from","from_entropy","from_language_code","from_phrase","generate_with_entropy","init","init","init","init","into","into","into","into","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_phrase","language","new","new","phrase","to_hex","to_hex","to_owned","to_owned","to_owned","to_owned","to_string","to_string","total_bits","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","validate","vzip","vzip","vzip","vzip","word_count","wordlist","wordmap","write_base32","AddressIndex","AddressInfo","IsDust","LastUnused","New","Peek","Reset","Wallet","add_address_validator","add_signer","address","address_validator","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","broadcast","build_fee_bump","build_tx","client","coin_selection","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","eq","export","finalize_psbt","fmt","fmt","fmt","fmt","from","from","from","get_address","get_balance","get_descriptor_for_keychain","get_funded_wallet","get_psbt_input","get_utxo","index","init","init","init","into","into","into","is_dust","is_mine","list_transactions","list_unspent","ne","network","new","new_offline","policies","public_descriptor","secp_ctx","sign","signer","sync","time","to_string","try_from","try_from","try_from","try_into","try_into","try_into","tx_builder","type_id","type_id","type_id","vzip","vzip","vzip","0","0","AddressValidator","AddressValidatorError","ConnectionError","InvalidScript","Message","TimeoutError","UserRejected","as_fail","borrow","borrow_mut","clone","clone_into","deref","deref_mut","drop","eq","fmt","fmt","from","init","into","ne","to_owned","to_string","try_from","try_into","type_id","validate","vzip","0","BranchAndBoundCoinSelection","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","LargestFirstCoinSelection","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","coin_select","coin_select","coin_select","default","default","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","fee_amount","fmt","fmt","fmt","from","from","from","init","init","init","into","into","into","local_selected_amount","new","selected","selected_amount","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","WalletExport","blockheight","borrow","borrow_mut","change_descriptor","deref","deref_mut","descriptor","deserialize","drop","export_wallet","fmt","from","from_str","init","into","label","serialize","to_string","try_from","try_into","type_id","vzip","0","Dummy","Fingerprint","InputIndexOutOfRange","InvalidKey","InvalidNonWitnessUtxo","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","PkHash","SignOptions","Signer","SignerError","SignerId","SignerOrdering","SignersContainer","UserCanceled","add_external","allow_all_sighashes","as_fail","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","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","default","default","default","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","descriptor_secret_key","drop","drop","drop","drop","drop","eq","eq","eq","find","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","get_hash","hash","id","ids","init","init","init","init","init","into","into","into","into","into","ne","ne","new","partial_cmp","partial_cmp","remove","sign","sign_whole_tx","signers","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","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","0","0","0","get_timestamp","Bip69Lexicographic","BumpFee","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","CreateTx","OnlyChange","Shuffle","TxBuilder","TxBuilderContext","TxOrdering","Untouched","add_foreign_utxo","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_shrinking","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","coin_selection","default","default","default","default","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","do_not_spend_change","drain_to","drain_wallet","drop","drop","drop","drop","drop","enable_rbf","enable_rbf_with_sequence","eq","eq","fee_absolute","fee_rate","finish","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","get_hash","get_hash","hash","hash","include_output_redeem_witness_script","init","init","init","init","init","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","partial_cmp","policy_path","set_recipients","sighash","sort_tx","to_owned","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","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip"],"q":["bdk","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Utxo","","","bdk::blockchain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::any","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::any::AnyBlockchain","","","bdk::blockchain::any::AnyBlockchainConfig","","","bdk::blockchain::compact_filters","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::compact_filters::CompactFiltersError","","","","","bdk::blockchain::electrum","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::esplora","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::esplora::EsploraError","","","","","","","","","","bdk::database","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::database::any","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::database::any::AnyBatch","","","bdk::database::any::AnyDatabase","","","bdk::database::any::AnyDatabaseConfig","","","bdk::database::memory","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::Descriptor","","","","","bdk::descriptor::checksum","bdk::descriptor::error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::error::Error","","","","","","","","bdk::descriptor::policy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy::BuildSatisfaction","","","","bdk::descriptor::policy::PolicyError","","bdk::descriptor::policy::Satisfaction","","","","","","","","","","","bdk::descriptor::policy::SatisfiableItem","","","","","","","","","","","","bdk::descriptor::template","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys::DescriptorPublicKey","","bdk::keys::DescriptorSecretKey","","bdk::keys::ExtendedKey","","bdk::keys::KeyError","","","bdk::keys::bip39","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::AddressIndex","","bdk::wallet::address_validator","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::address_validator::AddressValidatorError","bdk::wallet::coin_selection","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::export","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer::SignerId","","","bdk::wallet::time","bdk::wallet::tx_builder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Error that can be returned to fail the validation of an …","BIP32 error","Branch and bound coin selection tries to avoid needing a …","Branch and bound coin selection possible attempts with …","Descriptor checksum mismatch","Compact filters client error)","Block height and timestamp of the block containing the …","Error related to the parsing and usage of descriptors","Electrum client error","Encoding error","Errors that can be thrown by the Wallet","Esplora client error","External","Fee rate","When bumping a tx the fee rate requested is lower than …","Node doesn’t have data to estimate a fee rate","When bumping a tx the absolute fee requested is lower than …","A UTXO owned by another wallet.","Generic error","Hex decoding error","Wallet’s UTXO set is not enough to cover recipient’s …","Internal, usually used for change outputs","Invalid network","Requested outpoint doesn’t exist in the tx (vout greater …","Error while extracting and manipulating policies","Progress value must be between 0.0 (included) and 100.0 …","Wrong number of bytes found when trying to convert to u32","Trying to replace a tx that has a sequence >= 0xFFFFFFFE","Error serializing or deserializing JSON data","Error while working with keys","Types of keychains","A UTXO owned by the local wallet.","An unspent output owned by a Wallet.","Miniscript error","In order to use the TxBuilder::add_global_xpubs option …","Cannot build a tx without recipients","manually_selected_only option is selected but no utxo has …","Output created is under the dust limit, 546 satoshis","Progress update error (maybe the channel has been closed)","Partially signed bitcoin transaction error","Partially signed bitcoin transaction parseerror","Rusqlite client error","This error is thrown when trying to convert Bare and …","An ECDSA error","Signing error","Sled database error","Spending policy is not compatible with this KeychainKind","Happens when trying to bump a transaction that is already …","A wallet transaction","Thrown when a tx is not found in the internal database","Happens when trying to spend an UTXO that is not in the …","An unspent transaction output (UTXO).","Trait implemented by types that can be used to measure …","A Utxo with its satisfaction_weight.","Return KeychainKind as a byte","","","Return the value as satoshi/vbyte","","Blockchain backends","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","If the transaction is confirmed, contains height and …","Database types","","","","Create a new FeeRate with the default min relay fee value","","","","","","","","","","","","","","","","","Descriptors","Macro to write full descriptors with code","","","","","","","","","","","","","","","","","","","","Fee value (sats) if available. The availability of the fee …","Calculate absolute fee in Satoshis using size in virtual …","Calculate absolute fee in Satoshis using size in weight …","","","","","","","","","","Macro to write descriptor fragments with code","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Calculate fee rate from fee and vbytes.","Calculate fee rate from fee and weight units (wu).","","","","","confirmation block height","","","","","","","","","","","","","","","","","","","","","Type of keychain","Key formats","","","","","","","Returns Some ConfirmationTime if both height and timestamp …","Get the location of the UTXO","Reference to a transaction output","","Received value (sats)","The weight of the witness data and scriptSig expressed in …","Sent value (sats)","","","","","","confirmation block timestamp","","","","","","","","","Optional transaction","","","","","","","","","","","","","","","","","Transaction id","Get the TxOut of the UTXO","Transaction output","","","","","","","","","The UTXO","Convert weight units to virtual bytes.","Whether the tx has been verified against the consensus …","Get the version of BDK at runtime","","","","","","","","","Wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","Sats available for spending","found network, for example the network of the bitcoin node","Sats needed for some transaction","requested network, for example what is given as bdk-cli …","Required fee rate (satoshi/vbyte)","Required fee absolute value (satoshi)","","The location of the output.","The information about the input we require to add it to a …","Can compute accurate fees for the transactions found …","Trait that defines the actions that must be supported by a …","Capabilities that can be supported by a Blockchain backend","Type that contains the configuration","Trait for Blockchain types that can be created given a …","Structure that implements the logic to sync with Esplora","Can recover the full history of a wallet and not only the …","Can fetch any historical transaction given its txid","Type that implements Progress and logs at level INFO every …","Type that implements Progress and drops every update …","Trait for types that can receive and process progress …","Data sent with a progress update over a channel","Runtime-checked blockchain types","","","","","","","Broadcast a transaction","","","","","","","Compact Filters","","","","","","","","","","Electrum","","Esplora","Estimate the fee rate required to confirm a transaction in …","","","","","Create a new instance given a configuration","Return the set of Capability supported by this backend","","Return the current height","Fetch a transaction from the blockchain given its txid","","","","","","","","Create a new instance of LogProgress","Create a new instance of NoopProgress","Shortcut to create a channel (pair of Sender and Receiver) …","Setup the backend and populate the internal database for …","Populate the internal database with transactions and UTXOs","","","","","","","","","","","","","Send a new progress update","","","","","","Type that can contain any of the Blockchain types defined …","Type that can contain any of the blockchain configurations …","Compact filters client","Compact filters client","Electrum client","Electrum client","Esplora client","Esplora client","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Invalid BIP158 filter","Data to connect to a Bitcoin P2P peer","Structure implementing the required blockchain traits","Configuration for a CompactFiltersBlockchain","An error that can occur during sync with a …","The data stored in the block filters storage are corrupted","Internal database error","Wrapper for crate::error::Error","The compact filter returned is invalid","The compact filter headers returned are invalid","The headers returned are invalid","A peer sent an invalid or unexpected response","Internal I/O error","Container for unconfirmed, but valid Bitcoin transactions","The peer is missing a block in the valid chain","No peers have been specified","A peer is not connected","A Bitcoin peer","The peer doesn’t advertise the BLOOM service flag","Internal system time error","A peer took too long to reply to one of our messages","Add a transaction to the mempool","Peer address such as 127.0.0.1:18333","","","","","","","","","","","","","","","","","","","Connect to a peer over a plaintext TCP connection","Connect to a peer through a SOCKS5 proxy, optionally by …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the mempool used by this peer","Return the Bitcoin Network in use","Look-up a transaction in the mempool given an Inventory …","","Return the VersionMessage sent by the peer","Return whether or not the mempool contains a transaction …","","","","","","","","","","","","","Return whether or not the peer is still connected","Return the list of transactions contained in the mempool","","","Network used","Create a new empty mempool","Construct a new instance given a list of peers, a path to …","List of peers to try to connect to for asking headers and …","Waits for a specific incoming Bitcoin message, optionally …","Send a raw Bitcoin message to the peer","","","","Optionally skip initial skip_blocks blocks (default: 0)","Optional socks5 proxy","Optional socks5 proxy credentials","Storage dir to save partially downloaded headers and full …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Wrapper over an Electrum Client that implements the …","Configuration for an ElectrumBlockchain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Request retry count","","","URL of the socks5 proxy server or a Tor service","Stop searching addresses for transactions after finding an …","Request timeout (seconds)","","","","","","","","URL of the Electrum server (such as ElectrumX, Esplora, …","","","Invalid Bitcoin data returned","Structure that implements the logic to sync with Esplora","Configuration for an EsploraBlockchain","Errors that can happen during a sync with EsploraBlockchain","Data type used when fetching transaction history from …","Header hash not found","Header height not found","Invalid Hex data returned","HTTP response error","IO error during ureq response read","No header found in ureq response","Invalid number returned","Transaction not found","Error during ureq HTTP request","Transport error during the ureq HTTP call","","Base URL of the esplora service eg. …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new instance of the client from a base URL and …","Optional URL of the proxy to use to make requests to the …","","","Stop searching addresses for transactions after finding an …","Socket read timeout.","Socket write timeout.","","","","","","","","","","","","","","","","","","","Set the inner ureq agent.","","","","","","","","","","","Container for the operations","Trait for a database that supports batch operations","Trait for operations that can be batched","Type that contains the configuration","Trait for Database types that can be created given a …","Trait for reading data from a database","Sqlite database stored on filesystem","Runtime-checked database types","Create a new batch container","","","","Read and checks the descriptor checksum for a given …","","Consume and apply a batch of operations","","A rusqlite connection object to the sqlite database","Delete the last derivation index for a keychain.","","Delete the data related to a specific script_pubkey, …","","Delete a raw transaction given its Txid","","Delete a script_pubkey given the keychain and its child …","","Delete the metadata of a transaction and optionally the …","","Delete a LocalUtxo given its OutPoint","","","","","Force changes to be written to disk","","","","Create a new instance given a configuration","","Return the last defivation index for a keychain.","","Fetch the keychain and child number of a given …","","Fetch a raw transaction given its Txid","","Fetch a script_pubkey given the child number of a keychain.","","Fetch the transaction metadata and optionally also the raw …","","Fetch a LocalUtxo given its OutPoint","","Increment the last derivation index for a keychain and …","","","","Return the list of raw transactions","","Return the list of script_pubkeys","","Return the list of transactions metadata","","Return the list of LocalUtxos","","In-memory ephemeral database","Instantiate a new SqliteDatabase instance by creating a …","Path on the local filesystem to store the sqlite file","Store the last derivation index for a given keychain.","","Store a raw transaction","","Store a script_pubkey along with its keychain and child …","","Store the metadata of a transaction","","Store a LocalUtxo","","","","","","Type that contains any of the BatchDatabase::Batch types …","Type that can contain any of the Database types defined by …","Type that can contain any of the database configurations …","In-memory ephemeral database","In-memory ephemeral database","Memory database has no config","Simple key-value embedded database based on sled","Simple key-value embedded database based on sled","Simple key-value embedded database based on sled","Configuration type for a sled::Tree database","Sqlite embedded database using rusqlite","Sqlite embedded database using rusqlite","Sqlite embedded database using rusqlite","Configuration type for a sqlite::SqliteDatabase database","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Main directory of the db","Main directory of the db","","","","","","","","","","","","","","Name of the database tree, a separated namespace for the …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","In-memory ephemeral database","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new empty database","","","","","","","","","","A raw scriptpubkey (including pay-to-pubkey) under Legacy …","Alias for a Descriptor that contains extended derived keys","Extended DescriptorPublicKey that has been derived","Script descriptor","Alias for a Descriptor that can contain extended keys …","Trait implemented on Descriptors to add a method to …","Alias for the type of maps that represent derivation paths …","Trait for types which can be converted into an …","Alias type for a map of public key to secret key","Legacy ScriptContext To be used as P2SH scripts For …","Top-level script AST type","Pay-to-PubKey-Hash","The ScriptContext for Miniscript. Additional type …","Segwitv0 ScriptContext","Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)","Pay-to-Witness-PubKey-Hash","Pay-to-Witness-ScriptHash with Segwitv0 context","Computes the Bitcoin address of the descriptor, if one …","","","Get a reference to the inner AstElem representing the root …","","","","","","","","","","","Enumerates all child nodes of the current AST node (self) …","Depending on script Context, some of the Terminals might …","","","Depending on script Context, some of the script resource …","","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","","","Policy rules at the Miniscript satisfaction time. It is …","","","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","","","Check whether the given satisfaction is valid under the …","","","Descriptor checksum","","","","","","","","","","","","","","","","","","","","","","","","","","","Derives all wildcard keys in the descriptor using the …","Get the DescriptorType of Descriptor","","","","","","","","Encode as a Bitcoin script","","","","","","Descriptor errors","Computes the “witness script” of the descriptor, i.e. …","Additional information helpful for extra analysis.","Extract the spending policy","","","","","","","","","","","","","","","","","","Add type information(Type and Extdata) to Miniscript based …","","","Attempt to parse an insane(scripts don’t clear sanity …","Parse an expression tree into a descriptor","Parse an expression tree into a Miniscript. As a general …","","","","","","Returns Vec with cloned version of all public keys from …","Returns Vec of PkPkh entries, representing either public …","Returns Vec with hashes of all public keys from the …","Returns child node with given index, if any","Returns Option::Some with cloned n’th public key from …","Returns Option::Some with hash of n’th public key or …","Returns Option::Some with hash of n’th public key from …","Returns satisfying witness and scriptSig to spend an …","Whether the miniscript contains a combination of timelocks","Whether the miniscript has repeated Pk or Pkh","","","","","","","","","","","","","","","","","Extracts the AstElem representing the root of the …","Convert to wallet descriptor","Whether or not the descriptor has any wildcards","Whether the miniscript is malleable","","Creates a new Iter iterator that will iterate over all …","Creates a new PkIter iterator that will iterate over all …","Creates a new PkPkhIter iterator that will iterate over …","Creates a new PkhIter iterator that will iterate over all …","","","Lifting corresponds conversion of miniscript into Policy […","Depending on script context, the size of a satifaction …","","","Maximum size, in bytes, of a satisfying witness. For …","Computes an upper bound on the weight of a satisfying …","Maximum number of witness elements used to satisfy the …","","Construct a new derived key","Create a new bare descriptor from witness script Errors …","Create a new pk descriptor","Create a new PkH descriptor","Create a new sh for a given redeem script Errors when …","Create a new sh sortedmulti descriptor with threshold k …","Create a new sh wrapped wpkh from Pk. Errors when …","Create a new sh wrapped wsh descriptor with witness script …","Create a new sh wrapped wsh sortedmulti descriptor from …","Create a new Wpkh descriptor Will return Err if …","Create a new wsh descriptor from witness script Errors …","Create a new wsh sorted multi descriptor Errors when …","A node in the Abstract Syntax Tree(","Other top level checks that are context specific","Attempt to parse a Script into Miniscript representation. …","Parse a descriptor that may contain secret keys","Attempt to parse an insane(scripts don’t clear sanity …","","","","","","Descriptor policy","Whether all spend paths of miniscript require a signature","Whether the descriptor is safe Checks whether all the …","Check whether the underlying Miniscript is safe under the …","Attempt to produce non-malleable satisfying witness for the","Attempt to produce a malleable satisfying witness for the …","Get the scriptCode of a transaction output.","Computes the scriptpubkey of the descriptor","Size, in bytes of the script-pubkey. If this Miniscript is …","","","","Descriptor templates","","","","","","","","","","","Serialize a descriptor to string with its secret keys","Check top level consensus rules.","Check whether the top-level is type B","Convert a descriptor using abstract keys to one using …","This will panic if translatefpk returns an uncompressed …","","","","","","","","","","","The correctness and malleability type information for the …","","","","","","Computes the scriptSig that will be in place for an …","","","","","","Whether the miniscript can exceed the resource …","","","","","","Compute the checksum of a descriptor","Error during base58 decoding","BIP32 error","The descriptor contains multiple keys with the same BIP32 …","Errors related to the parsing and usage of descriptors","The descriptor contains hardened derivation steps on …","Hex decoding error","Invalid character found in the descriptor checksum","The provided descriptor doesn’t match its checksum","Invalid HD Key path, such as having a wildcard but a …","Error thrown while working with keys","Miniscript error","Key-related error","Error while extracting and manipulating policies","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Absolute timeclock timestamp","Can not add to an item that is Satisfaction::None or …","Can not add to an item that is …","Options to build the satisfaction field in the policy","Can satisfy the policy item","An extra condition that must be satisfied but that is out …","Type for a map of sets of Condition items keyed by each set…","Type for a map of folded sets of Condition items keyed by …","SHA256 then RIPEMD160 preimage hash","Double SHA256 preimage hash","Incompatible conditions (not currently used)","Index out of range for an item to satisfy a …","Can not merge CSV or timelock values unless both are less …","Multi-signature public keys with threshold count","Cannot satisfy or contribute to the policy item","Don’t generate satisfaction field","Not enough items are selected to satisfy a …","Only a partial satisfaction of some kind of threshold …","Can reach the threshold of some kind of threshold policy","Raw public key or extended key fingerprint","Descriptor spending policy","Errors that can happen while extracting and manipulating …","Analyze the given PSBT to check for existing signatures","Like Psbt variant and also check for expired timelocks","Relative timelock locktime","RIPEMD160 preimage hash","Represent if and how much a policy item is satisfied by …","An item that needs to be satisfied","SHA256 preimage hash","Signature for a raw public key","Signature for an extended key fingerprint","Threshold items with threshold count","","","","","","","","","","","","","","","","","","","","","","","","","","","","","How the wallet’s descriptor can satisfy this policy node","Optional CheckSequenceVerify condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the conditions that are set by the spending policy …","","","Returns a unique id for the SatisfiableItem","Identifier for this policy node","","","","","","","","","","","","","","","Returns whether the SatisfiableItem is a leaf item","Returns whether the Satisfaction is a leaf item","Returns true if there are no extra conditions to verify","Type of this policy node","","","","Return whether or not a specific path in the policy tree …","How much a given PSBT already satisfies this policy node …","","","","","","Optional timelock condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Current blockchain height","The highest confirmation height between the inputs CSV …","Given PSBT","","","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","The items that can be satisfied by the descriptor or are …","The items that can be satisfied by the descriptor","Threshold","Threshold","Total number of items","Total number of items","Whether the items are sorted in lexicographic order (used …","Whether the items are sorted in lexicographic order (used …","","","The digest value","The digest value","The digest value","The digest value","The policy items","The raw public key or extended key fingerprint","The required threshold count","The required threshold count","The timestamp value","The locktime value","","","","","","","","","","","","","","","","","","","BIP44 template. Expands to pkh(key/44'/0'/0'/{0,1}/*)","BIP44 public template. Expands to pkh(key/{0,1}/*)","BIP49 template. Expands to sh(wpkh(key/49'/0'/0'/{0,1}/*))","BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))","BIP84 template. Expands to wpkh(key/84'/0'/0'/{0,1}/*)","BIP84 public template. Expands to wpkh(key/{0,1}/*)","Trait for descriptor templates that can be built into a …","Type alias for the return type of DescriptorTemplate, …","P2PKH template. Expands to a descriptor pkh(key)","P2WPKH template. Expands to a descriptor wpkh(key)","P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))","","","","","","","","","","","","","","","","","","","Build the complete descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BIP32 error","Trait for keys that can be derived.","Container for public or secret keys","The MiniscriptKey corresponding to Descriptors. This can …","A Secret Key that can be either a single key or an Xprv","A Single Descriptor Secret Key with optional origin …","A Single Descriptor Key with optional origin information","Type specifying the amount of entropy required e.g. [u8;32]","Returned error in case of failure","Trait that adds extra useful methods to ScriptContexts","Enum for extended keys that can be either xprv or xpub","Trait that allows generating a key with the default options","Trait for keys that can be generated","Output of a GeneratableKey key generation","Trait for objects that can be turned into a public or …","The key has an invalid checksum","The key is not valid for the given network","The key cannot exist in the given script context","Errors thrown while working with keys","Alias type for a map of public key to secret key","Legacy scripts","Custom error message","Miniscript error","Extra options required by the generate_with_entropy","A private extended key, aka an xprv","Options for generating a PrivateKey","A public extended key, aka an xpub","The ScriptContext for Miniscript. Additional type …","Enum representation of the known valid ScriptContexts","Segwitv0 scripts","Single Secret Key","Single Public Key","Contents of a “sortedmulti” descriptor","Set of valid networks for a key","Xprv","Xpub","Create a set containing mainnet, testnet and regtest","Returns the ScriptContext as a ScriptContextEnum","","Return the public version of this key, by applying either …","BIP-0039","","","","","","","","","","","","","","","","","","","","","","","Depending on script Context, some of the Terminals might …","Depending on script Context, some of the Terminals might …","Depending on script Context, some of the script resource …","Depending on script Context, some of the script resource …","Check the consensus + policy(if not disabled) rules that …","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","Consensus rules at the Miniscript satisfaction time. It is …","Policy rules at the Miniscript satisfaction time. It is …","Policy rules at the Miniscript satisfaction time. It is …","Check the consensus + policy(if not disabled) rules …","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","Check whether the given satisfaction is valid under the …","Check whether the given satisfaction is valid under the …","","","","","","","","","","","","","","Whether the generated key should be “compressed” or not","","","","","","","","","","","","","","","","","","","","","","","","","If this public key has a wildcard, replace it by the given …","Computes the public key corresponding to this descriptor …","","","","","","","","","","","","Encode as a Bitcoin script","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create an instance given a public key and a set of valid …","Create an instance given a secret key and a set of valid …","","","Parse an expression tree into a SortedMultiVec","Full path, from the master key","Generate a key given the options with a random entropy","Generate a key with the default options and a random …","Generate a key given the extra options and the entropy","Generate a key with the default options and a given entropy","","","","Return whether or not the key contains the private data","","","","","","","","","","","","","","","","","","","","","","","","","","Turn the key into a DescriptorKey within the requested …","Consume self and turn it into a DescriptorKey by adding …","","","","","","Consume self and turn it into an ExtendedKey","","","Consumes self and returns the key","Transform the ExtendedKey into an ExtendedPrivKey for the …","Transform the ExtendedKey into an ExtendedPubKey for the …","Whether or not the key has a wildcards","Returns whether the script context is Legacy","Returns whether the script context is …","Returns whether the script context is Segwitv0","Returns whether the script context is …","","signatures required","The key","The key","","Create a set only containing mainnet","The fingerprint of the master key associated with this key","Depending on script context, the size of a satifaction …","Maximum size, in bytes, of a satisfying witness. In …","Maximum number of witness elements used to satisfy the …","Compute the intersection of two sets","","","","Create a new instance of SortedMultiVec given a list of …","Origin information","Origin information","Other top level checks that are context specific","Other top level checks that are context specific","Override the computed set of valid networks","","","","public keys inside sorted Multi","utility function to sanity a sorted multi vec","Attempt to produce a satisfying witness for the witness …","Size, in bytes of the script-pubkey. If this Miniscript is …","Create Terminal::Multi containing sorted pubkeys","Create a set containing testnet and regtest","","","","","","","","","","","Check top level consensus rules.","Check top level consensus rules.","Check whether the top-level is type B","Check whether the top-level is type B","This will panic if translatefpk returns an uncompressed …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The language determines which words will be used in a …","The primary type in this crate, most tasks require …","Determines the number of words that will be present in a …","Type for a BIP39 mnemonic with an optional passphrase","The secret value used to derive HD wallet addresses from a …","","","","","","","Get the seed value as a byte slice","","","","","","","","","","","","","Return the number of checksum bits","","","","","","","","","","","","","","","","","","","","","","","Get the original entropy value of the mnemonic phrase as a …","Return the number of entropy bits","","","","","","","","","","","","Get a MnemonicType for a mnemonic phrase representing the …","Get a MnemonicType for an existing mnemonic phrase","Get a MnemonicType for a mnemonic phrase with a specific …","","","","","Create a Mnemonic from pre-generated entropy","Construct a word list from its language code. Returns None …","Create a Mnemonic from an existing mnemonic phrase","","","","","","","","","","","","","","Consume the Mnemonic and return the phrase as a String.","Get the Language","Generates a new Mnemonic","Generates the seed from the Mnemonic and the password.","Get the mnemonic phrase as a string reference.","Outputs the hash in hexadecimal form","Outputs the hash in hexadecimal form","","","","","","","Return the number of entropy+checksum bits","","","","","","","","","","","","","Validate a mnemonic phrase","","","","","Return the number of words","Get the word list for this language","Get a WordMap that allows word -> index lookups in the …","","The address index selection strategy to use to derived an …","A derived address and the index it was found at For …","Trait to check if a value is below the dust limit","Return the address for the current descriptor index if it …","Return a new address after incrementing the current …","Return the address for a specific descriptor index. Does …","Return the address for a specific descriptor index and …","A Bitcoin wallet","Add an address validator","Add an external signer","Address","Address validation callbacks","","","","","","","Broadcast a transaction to the network","Bump the fee of a transaction previously created with this …","Start building a transaction.","Return a reference to the internal blockchain client","Coin selection","","","","","","","","","","","","Wallet export","Try to finalize a PSBT","","","","","","","","Return a derived address using the external descriptor, …","Return the balance, meaning the sum of this wallet’s …","Returns the descriptor used to create adddresses for a …","Return a fake wallet that appears to be funded for testing.","get the corresponding PSBT Input for a LocalUtxo","Returns the UTXO owned by this wallet corresponding to …","Child index of this address","","","","","","","Check whether or not a value is below dust limit","Return whether or not a script is part of this wallet …","Return the list of transactions made and received by the …","Return the list of unspent outputs of this wallet","","Get the Bitcoin network the wallet is using.","Create a new “online” wallet","Create a new “offline” wallet","Return the spending policies for the wallet’s descriptor","Return the “public” version of the wallet’s …","Return the secp256k1 context used for all signing …","Sign a transaction with all the wallet’s signers, in the …","Generalized signers","Sync the internal database with the blockchain","Cross-platform time","","","","","","","","Transaction builder","","","","","","","","","Trait to build address validators","Errors that can be returned to fail the validation of an …","Network connection error","Invalid script","A custom error message","Network request timeout error","User rejected the address","","","","","","","","","","","","","","","","","","","","","Validate or inspect an address","","","Branch and bound coin selection","Trait for generalized coin selection algorithms","Result of a successful coin selection","Default coin selection algorithm used by TxBuilder if not …","Simple and dumb coin selection","","","","","","","","","Perform the coin selection","","","","","","","","","","","","","","Total fee amount in satoshi","","","","","","","","","","","","","The total value of the inputs selected from the local …","Create new instance with target size for change output","List of outputs selected for use as inputs","The total value of the inputs selected.","","","","","","","","","","","","","","Structure that contains the export of a wallet","Earliest block to rescan when looking for the wallet’s …","","","Return the internal descriptor, if present","","","Return the external descriptor","","","Export a wallet","","","","","","Arbitrary label for the wallet","","","","","","","","Dummy identifier","The fingerprint of a BIP32 extended key","Input index is out of range","The private key in use has the right fingerprint but …","The non_witness_utxo specified is invalid","The fingerprint and derivation path are missing from the …","The private key is missing for the required public key","The non_witness_utxo field of the transaction is required …","The witness_script field of the transaction is requied to …","The witness_utxo field of the transaction is required to …","The psbt contains a non-SIGHASH_ALL sighash in one of its …","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA …","Options for a software signer","Trait for signers","Signing error","Identifier of a signer in the SignersContainers. Used as a …","Defines the order in which signers are called","Container for multiple signers","The user canceled the operation","Adds an external signer to the container for the specified …","Whether the signer should use the sighash_type set in the …","","Create a map of public keys to secret keys","Whether the wallet should assume a specific height has …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the secret key for the signer","","","","","","","","","Finds the signer with lowest ordering for a given id in …","","","","","","","","","","","","","","","","","Return the SignerId for this signer","Returns the list of identifiers of all the signers in the …","","","","","","","","","","","","","Default constructor","","","Removes a signer from the container and returns it","Sign a PSBT","Return whether or not the signer signs the whole …","Returns the list of signers in the container, sorted by …","","","","","","","Whether the signer should trust the witness_utxo, if the …","","","","","","","","","","","","","","","","","","","","","","","","Return the current timestamp in seconds","BIP69 / Lexicographic","Marker type to indicate the TxBuilder is being used to …","Use both change and non-change outputs (default)","Only use non-change outputs (see …","Policy regarding the use of change outputs when creating a …","Marker type to indicate the TxBuilder is being used to …","Only use change outputs (see TxBuilder::only_spend_change)","Randomized (default)","A transaction builder","Context in which the TxBuilder is valid","Ordering of the transaction’s inputs and outputs","Unchanged","Add a foreign UTXO i.e. a UTXO not owned by this wallet.","Fill-in the PSBT_GLOBAL_XPUB field with the extended keys …","Add a recipient to the internal list","Add a utxo to the internal list of unspendable utxos","Add a utxo to the internal list of utxos that must be spent","Add the list of outpoints to the internal list of UTXOs …","Explicitly tells the wallet that it is allowed to reduce …","","","","","","","","","","","Set a specific ChangeSpendPolicy. See …","","","","","","","","","","","","","Choose the coin selection algorithm","","","","","","","","","","","","","","","Do not spend change outputs","Sets the address to drain excess coins to.","Spend all the available inputs. This respects filters like …","","","","","","Enable signaling RBF","Enable signaling RBF with a specific nSequence value","","","Set an absolute fee","Set a custom fee rate","Finish the building the transaction.","","","","","","","","","","","","","","","Fill-in the psbt::Output::redeem_script and …","","","","","","","","","","","Only spend utxos added by add_utxo.","Use a specific nLockTime while creating the transaction","Only spend change outputs","Only Fill-in the psbt::Input::witness_utxo field when …","Choose the ordering for inputs and outputs of the …","","","Set the policy path to use while creating the transaction …","Replace the recipients already added with a new list","Sign with a specific sig hash","Sort transaction inputs and outputs by TxOrdering variant","","","","","","","","","","","","","","","","","","","","","Replace the internal list of unspendable utxos with a new …","Build a transaction with a specific version","","","","",""],"i":[1,1,1,1,1,1,0,1,1,1,0,1,2,0,1,1,1,3,1,1,1,2,1,1,1,1,1,1,1,1,0,3,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,2,1,2,4,2,0,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,2,2,4,5,6,3,7,8,2,4,5,6,3,7,8,7,0,4,7,8,4,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,0,0,2,5,7,8,1,2,4,5,6,3,7,8,2,4,5,6,3,7,8,7,4,4,1,1,2,4,5,6,3,7,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,4,5,6,3,7,8,4,4,4,4,2,5,2,5,8,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,9,9,10,11,5,0,4,5,6,3,7,8,8,3,5,4,7,6,7,2,5,7,8,4,8,2,4,5,6,3,7,8,1,7,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,7,3,5,1,2,4,5,6,3,7,8,6,12,7,0,1,2,4,5,6,3,7,8,0,2,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,38,39,40,41,42,43,43,44,0,0,45,0,0,44,44,0,0,0,0,0,44,46,47,44,46,47,48,44,46,47,44,46,47,0,44,46,47,44,46,47,44,46,47,0,44,0,48,44,44,46,47,45,48,44,48,48,44,44,46,47,44,46,47,0,0,0,48,48,44,46,47,44,46,47,44,46,47,44,46,47,49,46,47,44,46,47,0,0,50,51,50,51,50,51,50,51,50,51,50,51,51,50,51,50,51,51,50,51,51,50,51,50,50,50,50,51,51,51,51,50,50,50,50,50,51,50,51,51,51,50,50,51,50,51,50,51,50,51,50,51,52,53,54,55,56,57,58,0,0,0,0,58,58,58,58,58,58,58,58,0,58,58,58,0,58,58,58,59,60,58,59,61,62,60,63,58,59,61,62,60,63,58,62,60,63,60,63,61,61,59,59,61,62,60,63,58,59,61,62,60,63,58,60,63,59,61,62,60,63,58,60,63,62,59,61,62,60,63,58,58,59,61,62,60,63,58,58,58,58,58,58,62,62,62,61,61,59,62,61,59,59,61,62,60,63,58,59,61,62,60,63,58,61,59,60,63,63,59,62,63,61,61,60,63,62,63,60,60,63,60,63,58,59,61,62,60,63,58,59,61,62,60,63,58,59,61,62,60,63,58,59,61,62,60,63,58,64,65,66,67,68,0,0,69,70,69,70,69,70,70,69,70,69,70,70,69,70,70,69,70,69,69,70,69,69,69,69,69,70,69,70,70,70,70,69,70,70,70,70,69,70,69,70,69,70,70,69,70,71,0,0,0,0,71,71,71,71,71,71,71,71,71,71,71,72,73,72,74,71,73,72,74,71,73,72,72,73,72,74,71,73,72,74,71,72,74,73,72,74,71,72,73,73,72,71,71,73,72,74,71,71,71,71,71,71,71,73,73,73,73,73,72,74,71,73,72,74,71,72,73,72,72,73,72,72,72,72,71,73,72,74,71,73,72,74,71,73,72,74,71,73,72,74,71,73,75,76,77,78,79,80,81,82,83,84,85,0,0,86,0,0,0,0,85,87,87,87,88,87,85,87,87,89,87,89,87,89,87,89,87,89,87,89,87,87,87,87,88,87,87,87,86,87,88,87,88,87,88,87,88,87,88,87,88,87,88,87,87,87,88,87,88,87,88,87,88,87,0,87,87,89,87,89,87,89,87,89,87,89,87,87,87,87,87,0,0,0,90,91,92,90,91,92,0,90,91,92,0,91,90,91,93,94,92,90,91,93,94,92,91,91,90,91,90,91,90,91,90,91,90,91,90,91,90,91,93,94,92,90,91,93,94,92,93,94,92,90,91,93,94,92,91,91,93,94,92,90,90,90,90,91,91,91,91,93,94,92,92,92,92,91,91,91,91,91,91,91,91,90,91,93,94,92,90,91,93,94,92,91,91,91,91,93,94,93,94,92,90,91,90,91,90,91,90,91,90,91,93,90,91,93,94,92,90,91,93,94,92,90,91,93,94,92,90,91,93,94,92,95,96,97,98,99,100,101,102,103,0,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,105,0,0,0,0,0,0,0,0,0,0,105,0,0,105,105,105,105,106,107,108,109,105,106,107,108,109,105,106,107,108,108,110,106,107,110,107,110,110,106,107,110,106,107,110,110,106,107,110,106,107,0,109,105,106,107,108,109,105,106,107,108,109,105,106,107,108,109,109,105,106,107,108,109,105,106,107,108,105,105,105,108,109,105,106,107,108,108,109,105,106,107,108,0,105,108,111,105,108,109,109,105,105,106,107,108,108,105,108,109,105,106,107,108,108,105,108,108,105,108,109,105,106,107,108,108,108,108,108,108,108,108,105,108,108,109,105,106,107,108,109,109,105,106,107,108,109,105,106,107,108,108,112,105,108,109,108,108,108,108,105,108,108,110,106,107,108,105,108,105,109,105,105,105,105,105,105,105,105,105,105,105,108,110,108,105,108,109,105,106,107,108,0,108,105,108,108,108,105,105,108,105,108,109,0,109,105,106,107,108,109,109,109,105,108,105,110,110,105,108,109,105,106,107,108,109,105,106,107,108,108,109,105,106,107,108,105,109,105,106,107,108,108,113,114,115,116,117,0,118,118,118,0,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,119,120,121,122,123,124,125,126,127,128,128,0,129,0,0,0,127,127,128,128,128,127,129,130,128,129,129,0,0,0,130,130,127,127,0,0,127,127,127,127,128,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,130,131,127,129,132,133,130,133,132,133,131,133,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,128,130,133,128,131,127,129,132,133,128,128,130,131,127,129,129,132,132,133,128,130,132,133,133,127,132,131,127,129,132,133,128,130,131,127,129,132,133,128,130,127,129,133,132,133,128,133,132,132,131,127,129,132,133,133,131,127,129,132,133,130,128,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,128,130,134,135,135,135,136,137,138,139,140,139,140,139,140,139,140,139,140,141,142,143,144,145,146,147,148,148,147,149,150,151,152,153,154,155,156,157,158,159,154,155,156,157,158,159,155,157,159,0,0,0,0,0,0,0,0,0,0,0,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,160,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,161,0,0,0,0,0,0,162,162,0,0,0,0,0,0,161,161,161,0,0,163,161,161,162,164,0,164,0,0,163,165,166,0,0,165,166,0,167,161,165,0,164,168,169,163,170,161,171,166,172,173,165,164,168,169,163,170,161,171,166,172,173,165,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,163,170,171,166,172,163,170,171,166,172,171,166,172,170,170,164,168,168,169,163,170,161,171,166,172,173,165,164,168,169,163,170,161,171,166,172,173,165,166,166,164,168,169,163,170,161,171,166,172,173,165,171,163,171,166,172,169,163,170,161,161,171,171,166,166,172,173,165,165,171,164,164,164,168,169,163,170,161,161,161,171,166,172,173,165,169,169,166,165,171,166,162,174,162,174,171,166,172,164,171,166,172,164,168,169,163,170,161,171,166,172,173,165,164,168,169,163,170,161,171,166,172,173,165,175,176,168,168,169,166,165,176,164,168,168,164,164,166,167,163,167,163,166,171,172,173,171,0,166,110,171,171,0,171,166,172,171,172,173,110,110,169,171,166,172,171,171,171,171,171,0,163,170,171,166,172,166,161,171,166,165,110,110,110,110,171,164,168,169,163,170,161,171,166,172,173,165,164,168,169,163,170,161,171,166,172,173,165,164,168,169,163,170,161,171,166,172,173,165,164,168,169,163,170,161,171,166,172,173,165,177,178,179,180,181,182,183,184,185,186,186,186,186,186,186,186,0,0,0,0,0,186,187,187,187,187,187,188,189,188,188,186,189,187,188,186,189,187,188,188,187,186,189,187,188,186,189,187,188,186,187,186,189,187,188,186,189,187,188,186,189,187,188,189,187,186,186,189,189,189,189,187,187,188,188,188,187,187,187,186,189,187,188,189,186,189,189,186,189,187,188,186,189,187,188,189,188,189,188,189,189,189,188,189,189,188,186,189,187,188,189,187,187,186,189,187,188,186,189,187,188,186,189,187,188,189,186,189,187,188,187,186,186,188,0,0,0,190,190,190,190,0,191,191,192,0,191,190,192,191,190,192,191,191,191,191,0,191,190,192,192,191,190,192,191,190,192,192,0,191,191,190,192,192,191,190,192,191,191,191,0,191,191,192,191,190,192,191,190,192,193,191,191,191,192,191,191,191,191,191,191,191,0,191,0,192,191,190,192,191,190,192,0,191,190,192,191,190,192,194,195,0,0,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,197,196,198,0,0,0,0,0,199,200,201,199,200,201,200,200,202,200,201,200,201,199,200,201,199,200,201,199,200,201,199,199,200,201,199,200,201,199,200,201,199,200,201,199,201,199,199,200,199,200,201,199,200,201,199,200,201,199,200,201,0,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,204,205,205,206,206,206,206,206,206,206,206,206,205,0,0,0,0,0,0,206,207,208,206,207,208,205,206,204,207,208,205,206,204,207,208,205,206,204,207,208,205,206,204,207,208,205,204,204,207,208,205,206,204,207,208,205,206,204,207,208,209,205,206,204,207,208,205,206,204,207,205,206,206,204,207,208,205,205,205,206,204,207,207,208,205,205,209,207,205,206,204,207,208,205,206,204,207,208,205,204,207,205,204,207,209,209,207,205,206,204,207,208,206,208,205,206,204,207,208,205,206,204,207,208,205,206,204,207,208,205,206,204,207,208,210,211,212,0,213,0,214,214,0,0,214,213,0,0,0,213,215,215,215,215,215,215,215,216,217,215,213,214,216,217,215,213,214,215,216,217,215,213,214,216,217,215,213,214,213,214,215,216,217,213,214,216,217,215,213,214,216,217,215,213,214,215,215,215,216,217,215,213,214,215,215,213,214,215,215,215,216,217,215,213,214,216,217,215,213,214,213,214,213,214,215,216,217,215,213,214,216,217,215,213,214,215,215,215,215,215,213,214,215,215,215,213,216,217,215,213,214,216,217,215,213,214,216,217,215,213,214,216,217,215,213,214,215,215,216,217,215,213,214],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["u8",15]],[[],["fail",8]],[[]],[[],["f32",15]],[[],["usize",15]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["result",4,["vec"]],["vec",3,["u5","global"]]]],[[],["keychainkind",4]],[[],["feerate",3]],[[],["localutxo",3]],[[],["weightedutxo",3]],[[],["utxo",4]],[[],["transactiondetails",3]],[[],["confirmationtime",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[]],[[],["transactiondetails",3]],[[],["confirmationtime",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["keychainkind",4]],["bool",15]],[[["feerate",3]],["bool",15]],[[["localutxo",3]],["bool",15]],[[["weightedutxo",3]],["bool",15]],[[["utxo",4]],["bool",15]],[[["transactiondetails",3]],["bool",15]],[[["confirmationtime",3]],["bool",15]],null,[[["usize",15]],["u64",15]],[[["usize",15]],["u64",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],null,[[]],[[["error",3]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["psbtparseerror",4]]],[[["error",4]]],[[["error",4]]],[[["esploraerror",4]]],[[["compactfilterserror",4]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["keyerror",4]],["error",4]],[[["signererror",4]]],[[["error",4]]],[[["addressvalidatorerror",4]]],[[["policyerror",4]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["f32",15]]],[[["f32",15]]],[[["u64",15],["usize",15]],["feerate",3]],[[["u64",15],["usize",15]],["feerate",3]],[[],["u64",15]],[[],["u64",15]],[[]],[[]],null,[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["keysource",6],["option",4,["keysource"]],["derivationpath",3]],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["extendedkey","keyerror"]],["extendedkey",4]]],[[["network",4],["secp256k1",3]],[["descriptorerror",4],["result",4,["descriptorerror"]]]],[[["network",4],["secp256k1",3]],[["descriptorerror",4],["result",4,["descriptorerror"]]]],null,null,[[["feerate",3]],["bool",15]],[[["localutxo",3]],["bool",15]],[[["weightedutxo",3]],["bool",15]],[[["utxo",4]],["bool",15]],[[["transactiondetails",3]],["bool",15]],[[["confirmationtime",3]],["bool",15]],[[["u64",15],["u32",15],["option",4,["u64"]],["option",4,["u32"]]],["option",4]],[[],["outpoint",3]],null,[[["feerate",3]],[["ordering",4],["option",4,["ordering"]]]],null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["feerate",3]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[],["txout",3]],null,[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,[[],["usize",15]],null,[[],["str",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[],["result",4]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[],["capability",4]],[[],["noopprogress",3]],[[],["logprogress",3]],[[]],[[]],[[]],null,[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],null,[[["capability",4]],["bool",15]],null,[[["usize",15]],[["feerate",3],["error",4],["result",4,["feerate","error"]]]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[],[["result",4,["error"]],["error",4]]],[[],[["hashset",3,["capability"]],["capability",4]]],[[],["u64",15]],[[],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[],["logprogress",3]],[[],["noopprogress",3]],[[]],[[["progress",8]],[["result",4,["error"]],["error",4]]],[[["progress",8]],[["result",4,["error"]],["error",4]]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[["f32",15],["option",4,["string"]],["string",3]],[["result",4,["error"]],["error",4]]],[[["f32",15],["option",4,["string"]],["string",3]],[["result",4,["error"]],["error",4]]],[[["f32",15],["option",4,["string"]],["string",3]],[["result",4,["error"]],["error",4]]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[],["anyblockchainconfig",4]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["anyblockchainconfig",4]],["bool",15]],[[["usize",15]],[["feerate",3],["error",4],["result",4,["feerate","error"]]]],[[["formatter",3]],["result",6]],[[["compactfiltersblockchain",3]]],[[]],[[["electrumblockchain",3]]],[[["esplorablockchain",3]]],[[]],[[["compactfiltersblockchainconfig",3]]],[[["esplorablockchainconfig",3]]],[[["electrumblockchainconfig",3]]],[[],[["result",4,["error"]],["error",4]]],[[],[["hashset",3,["capability"]],["capability",4]]],[[],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[["anyblockchainconfig",4]],["bool",15]],[[],["result",4]],[[["progress",8]],[["result",4,["error"]],["error",4]]],[[["progress",8]],[["result",4,["error"]],["error",4]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["transaction",3]]],null,[[],["fail",8]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[],["bitcoinpeerconfig",3]],[[],["compactfiltersblockchainconfig",3]],[[]],[[]],[[["network",4],["tosocketaddrs",8],["arc",3,["mempool"]],["mempool",3]],[["result",4,["compactfilterserror"]],["compactfilterserror",4]]],[[["totargetaddr",8],["tosocketaddrs",8],["arc",3,["mempool"]],["mempool",3],["network",4],["option",4]],[["result",4,["compactfilterserror"]],["compactfilterserror",4]]],[[],["mempool",3]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["bitcoinpeerconfig",3]],["bool",15]],[[["compactfiltersblockchainconfig",3]],["bool",15]],[[["usize",15]],[["feerate",3],["error",4],["result",4,["feerate","error"]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[["error",4]]],[[["error",3]]],[[]],[[["error",4]]],[[["error",3]]],[[["systemtimeerror",3]]],[[],[["result",4,["error"]],["error",4]]],[[],[["hashset",3,["capability"]],["capability",4]]],[[],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[],[["arc",3,["mempool"]],["mempool",3]]],[[],["network",4]],[[["inventory",4]],[["option",4,["transaction"]],["transaction",3]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[],["versionmessage",3]],[[["txid",3]],["bool",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["bool",15]],[[],[["transaction",3],["vec",3,["transaction"]]]],[[["bitcoinpeerconfig",3]],["bool",15]],[[["compactfiltersblockchainconfig",3]],["bool",15]],null,[[]],[[["peer",3],["vec",3,["peer"]],["option",4,["usize"]],["usize",15],["path",3],["asref",8,["path"]]],[["result",4,["compactfilterserror"]],["compactfilterserror",4]]],null,[[["duration",3],["option",4,["duration"]],["str",15]],[["compactfilterserror",4],["result",4,["option","compactfilterserror"]],["option",4,["networkmessage"]]]],[[["networkmessage",4]],[["result",4,["compactfilterserror"]],["compactfilterserror",4]]],[[],["result",4]],[[],["result",4]],[[["progress",8]],[["result",4,["error"]],["error",4]]],null,null,null,null,[[]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[],["electrumblockchainconfig",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["electrumblockchainconfig",3]],["bool",15]],[[["usize",15]],[["feerate",3],["error",4],["result",4,["feerate","error"]]]],[[["formatter",3]],["result",6]],[[["client",3]]],[[]],[[]],[[],[["result",4,["error"]],["error",4]]],[[],[["hashset",3,["capability"]],["capability",4]]],[[],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[["electrumblockchainconfig",3]],["bool",15]],null,[[],["result",4]],[[["progress",8]],[["result",4,["error"]],["error",4]]],null,null,null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],null,[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["fail",8]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[],["esplorablockchainconfig",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["esplorablockchainconfig",3]],["bool",15]],[[["usize",15]],[["feerate",3],["error",4],["result",4,["feerate","error"]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[["parseinterror",3]]],[[["transport",3]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[]],[[["error",3]]],[[],[["result",4,["error"]],["error",4]]],[[],[["hashset",3,["capability"]],["capability",4]]],[[],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[["esplorablockchainconfig",3]],["bool",15]],[[["usize",15],["str",15]]],null,[[],["result",4]],[[["progress",8]],[["result",4,["error"]],["error",4]]],null,null,null,[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[["agent",3]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[["keychainkind",4],["asref",8]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["asref",8]],[["result",4,["error"]],["error",4]]],[[],[["result",4,["error"]],["error",4]]],[[],[["result",4,["error"]],["error",4]]],null,[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],[["result",4,["error"]],["error",4]]],[[],[["result",4,["error"]],["error",4]]],[[["formatter",3]],["result",6]],[[]],[[],[["result",4,["error"]],["error",4]]],[[],[["result",4,["error"]],["error",4]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["keychainkind",4]],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[["keychainkind",4]],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[],["usize",15]],[[]],[[],[["vec",3,["transaction"]],["error",4],["result",4,["vec","error"]]]],[[],[["vec",3,["transaction"]],["error",4],["result",4,["vec","error"]]]],[[["keychainkind",4],["option",4,["keychainkind"]]],[["error",4],["result",4,["vec","error"]],["vec",3,["script"]]]],[[["keychainkind",4],["option",4,["keychainkind"]]],[["error",4],["result",4,["vec","error"]],["vec",3,["script"]]]],[[["bool",15]],[["vec",3,["transactiondetails"]],["error",4],["result",4,["vec","error"]]]],[[["bool",15]],[["vec",3,["transactiondetails"]],["error",4],["result",4,["vec","error"]]]],[[],[["vec",3,["localutxo"]],["error",4],["result",4,["vec","error"]]]],[[],[["vec",3,["localutxo"]],["error",4],["result",4,["vec","error"]]]],null,[[["string",3]]],null,[[["keychainkind",4],["u32",15]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["u32",15]],[["result",4,["error"]],["error",4]]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["script",3],["u32",15]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["script",3],["u32",15]],[["result",4,["error"]],["error",4]]],[[["transactiondetails",3]],[["result",4,["error"]],["error",4]]],[[["transactiondetails",3]],[["result",4,["error"]],["error",4]]],[[["localutxo",3]],[["result",4,["error"]],["error",4]]],[[["localutxo",3]],[["result",4,["error"]],["error",4]]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["keychainkind",4],["asref",8]],[["result",4,["error"]],["error",4]]],[[],[["result",4,["error"]],["error",4]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],[["result",4,["error"]],["error",4]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["sqlitedatabase",3]]],[[["tree",3]]],[[["memorydatabase",3]]],[[]],[[]],[[]],[[["sleddbconfiguration",3]]],[[]],[[["sqlitedbconfiguration",3]]],[[]],[[],[["result",4,["error"]],["error",4]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["keychainkind",4]],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[],[["vec",3,["transaction"]],["error",4],["result",4,["vec","error"]]]],[[["keychainkind",4],["option",4,["keychainkind"]]],[["error",4],["result",4,["vec","error"]],["vec",3,["script"]]]],[[["bool",15]],[["vec",3,["transactiondetails"]],["error",4],["result",4,["vec","error"]]]],[[],[["vec",3,["localutxo"]],["error",4],["result",4,["vec","error"]]]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["keychainkind",4],["u32",15]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["u32",15]],[["result",4,["error"]],["error",4]]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["script",3],["u32",15]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["script",3],["u32",15]],[["result",4,["error"]],["error",4]]],[[["transactiondetails",3]],[["result",4,["error"]],["error",4]]],[[["transactiondetails",3]],[["result",4,["error"]],["error",4]]],[[["localutxo",3]],[["result",4,["error"]],["error",4]]],[[["localutxo",3]],[["result",4,["error"]],["error",4]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[["keychainkind",4],["asref",8]],[["result",4,["error"]],["error",4]]],[[],[["result",4,["error"]],["error",4]]],[[],["memorydatabase",3]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],[["result",4,["error"]],["error",4]]],[[["formatter",3]],["result",6]],[[]],[[],[["result",4,["error"]],["error",4]]],[[["keychainkind",4]],[["option",4,["u32"]],["error",4],["result",4,["option","error"]]]],[[["script",3]],[["option",4],["result",4,["option","error"]],["error",4]]],[[["txid",3]],[["error",4],["result",4,["option","error"]],["option",4,["transaction"]]]],[[["keychainkind",4],["u32",15]],[["result",4,["option","error"]],["option",4,["script"]],["error",4]]],[[["bool",15],["txid",3]],[["result",4,["option","error"]],["option",4,["transactiondetails"]],["error",4]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],[[["keychainkind",4]],[["result",4,["u32","error"]],["error",4],["u32",15]]],[[],["usize",15]],[[]],[[],[["vec",3,["transaction"]],["error",4],["result",4,["vec","error"]]]],[[["keychainkind",4],["option",4,["keychainkind"]]],[["error",4],["result",4,["vec","error"]],["vec",3,["script"]]]],[[["bool",15]],[["vec",3,["transactiondetails"]],["error",4],["result",4,["vec","error"]]]],[[],[["vec",3,["localutxo"]],["error",4],["result",4,["vec","error"]]]],[[]],[[["keychainkind",4],["u32",15]],[["result",4,["error"]],["error",4]]],[[["transaction",3]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4],["script",3],["u32",15]],[["result",4,["error"]],["error",4]]],[[["transactiondetails",3]],[["result",4,["error"]],["error",4]]],[[["localutxo",3]],[["result",4,["error"]],["error",4]]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["network",4]],[["result",4,["address","error"]],["address",3],["error",4]]],[[],["scriptcontextenum",4]],[[],["scriptcontextenum",4]],[[],["terminal",4]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["global",3],["miniscript",3],["vec",3,["miniscript","global"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["terminal",4]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["terminal",4]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["terminal",4]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],null,[[],["deriveddescriptorkey",3]],[[],["descriptor",4]],[[],["legacy",4]],[[],["segwitv0",4]],[[],["miniscript",3]],[[]],[[]],[[]],[[]],[[]],[[],["ordering",4]],[[["descriptor",4]],["ordering",4]],[[["legacy",4]],["ordering",4]],[[["segwitv0",4]],["ordering",4]],[[["miniscript",3]],["ordering",4]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["u32",15]],[["descriptorpublickey",4],["descriptor",4,["descriptorpublickey"]]]],[[],["descriptortype",4]],[[],[["result",4,["descriptor"]],["descriptor",4]]],[[],[["result",4,["miniscript"]],["miniscript",3]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["script",3]],[[],["bool",15]],[[["descriptor",4]],["bool",15]],[[["legacy",4]],["bool",15]],[[["segwitv0",4]],["bool",15]],[[["miniscript",3]],["bool",15]],null,[[],["script",3]],null,[[["secp256k1",3],["buildsatisfaction",4],["signerscontainer",3]],[["option",4,["policy"]],["descriptorerror",4],["result",4,["option","descriptorerror"]]]],[[["secp256k1",3],["buildsatisfaction",4],["signerscontainer",3]],[["result",4,["option","error"]],["option",4,["policy"]],["error",4]]],[[["secp256k1",3],["buildsatisfaction",4],["signerscontainer",3]],[["result",4,["option","error"]],["option",4,["policy"]],["error",4]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[],["bool",15]],[[],["bool",15]],[[]],[[]],[[]],[[]],[[]],[[["terminal",4]],[["result",4,["miniscript","error"]],["miniscript",3],["error",4]]],[[["str",15]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["str",15]],[["result",4,["miniscript","error"]],["miniscript",3],["error",4]]],[[["str",15]],[["result",4,["miniscript","error"]],["miniscript",3],["error",4]]],[[["tree",3]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["tree",3]],[["result",4,["miniscript","error"]],["miniscript",3],["error",4]]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],[["global",3],["vec",3,["global"]]]],[[],[["vec",3,["pkpkh","global"]],["pkpkh",4],["global",3]]],[[],[["vec",3,["global"]],["global",3]]],[[["usize",15]],[["option",4,["miniscript"]],["miniscript",3]]],[[["usize",15]],["option",4]],[[["usize",15]],[["option",4,["pkpkh"]],["pkpkh",4]]],[[["usize",15]],["option",4]],[[],[["result",4,["error"]],["error",4]]],[[],["bool",15]],[[],["bool",15]],[[]],[[]],[[]],[[]],[[]],[[],["hash",3]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[],["terminal",4]],[[["network",4],["secp256k1",3]],[["descriptorerror",4],["result",4,["descriptorerror"]]]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["iter",3]],[[],["pkiter",3]],[[],["pkpkhiter",3]],[[],["pkhiter",3]],[[],[["error",4],["result",4,["policy","error"]],["policy",4]]],[[],[["error",4],["result",4,["policy","error"]],["policy",4]]],[[],[["result",4,["lifterror"]],["lifterror",4]]],[[["miniscript",3]],[["option",4,["usize"]],["usize",15]]],[[["miniscript",3]],[["option",4,["usize"]],["usize",15]]],[[["miniscript",3]],[["option",4,["usize"]],["usize",15]]],[[],[["usize",15],["result",4,["usize","error"]],["error",4]]],[[],[["usize",15],["result",4,["usize","error"]],["error",4]]],[[],[["usize",15],["result",4,["usize","error"]],["error",4]]],[[["descriptor",4]],["bool",15]],[[["descriptorpublickey",4],["secp256k1",3]],["deriveddescriptorkey",3]],[[["barectx",4],["miniscript",3,["barectx"]]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[],["descriptor",4]],[[],["descriptor",4]],[[["miniscript",3,["legacy"]],["legacy",4]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["usize",15],["vec",3,["global"]],["global",3]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["miniscript",3,["segwitv0"]],["segwitv0",4]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["usize",15],["vec",3,["global"]],["global",3]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["miniscript",3,["segwitv0"]],["segwitv0",4]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],[[["usize",15],["vec",3,["global"]],["global",3]],[["descriptor",4],["error",4],["result",4,["descriptor","error"]]]],null,[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["script",3]],[["miniscript",3,["publickey"]],["result",4,["miniscript","error"]],["error",4]]],[[["secp256k1",3],["str",15]],[["error",4],["result",4,["error"]]]],[[["script",3]],[["miniscript",3,["publickey"]],["result",4,["miniscript","error"]],["error",4]]],[[],[["option",4,["ordering"]],["ordering",4]]],[[["descriptor",4]],[["option",4,["ordering"]],["ordering",4]]],[[["legacy",4]],[["option",4,["ordering"]],["ordering",4]]],[[["segwitv0",4]],[["option",4,["ordering"]],["ordering",4]]],[[["miniscript",3]],[["option",4,["ordering"]],["ordering",4]]],null,[[],["bool",15]],[[],[["error",4],["result",4,["error"]]]],[[],[["analysiserror",4],["result",4,["analysiserror"]]]],[[],[["error",4],["vec",3,["vec","global"]],["result",4,["vec","error"]]]],[[],[["error",4],["vec",3,["vec","global"]],["result",4,["vec","error"]]]],[[],["script",3]],[[],["script",3]],[[],["usize",15]],[[],["result",4]],[[],["result",4]],[[],["usize",15]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["publickey",3]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[["hashmap",3]],["string",3]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[],[["result",4,["descriptor"]],["descriptor",4]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["script",3]],[[]],[[]],[[]],[[]],[[]],[[],["bool",15]],null,null,null,null,null,[[["str",15]],[["descriptorerror",4],["string",3],["result",4,["string","descriptorerror"]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["fail",8]],[[]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["keyerror",4]],["error",4]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["policyerror",4]]],[[]],[[],["usize",15]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["fail",8]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["pkorf",3]],[[],["satisfiableitem",4]],[[],["satisfaction",4]],[[],["policy",3]],[[],["condition",3]],[[],["buildsatisfaction",4]],[[]],[[]],[[]],[[]],[[]],[[]],[[["condition",3]],["ordering",4]],null,null,[[],["pkorf",3]],[[],["condition",3]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["condition",3]],["bool",15]],[[["policyerror",4]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[["bool",15]]],[[]],[[["satisfiableitem",4]]],[[]],[[]],[[]],[[]],[[["btreemap",3]],[["policyerror",4],["condition",3],["result",4,["condition","policyerror"]]]],[[],["u64",15]],[[]],[[],["string",3]],null,[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],null,[[["condition",3]],["bool",15]],[[["policyerror",4]],["bool",15]],[[["condition",3]],[["ordering",4],["option",4,["ordering"]]]],[[],["bool",15]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[],[["descriptortemplateout",6],["result",4,["descriptortemplateout","descriptorerror"]],["descriptorerror",4]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[["network",4],["secp256k1",3]],[["error",4],["result",4,["error"]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["validnetworks",6]],[[],["scriptcontextenum",4]],[[],["fail",8]],[[["secp256k1",3]],[["descriptorpublickey",4],["descriptorkeyparseerror",3],["result",4,["descriptorpublickey","descriptorkeyparseerror"]]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["miniscript",3]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[["terminal",4]],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[],[["scriptcontexterror",4],["result",4,["scriptcontexterror"]]]],[[],["scriptcontextenum",4]],[[],["privatekeygenerateoptions",3]],[[],["sortedmultivec",3]],[[],["descriptorpublickey",4]],[[],["descriptorsinglepub",3]],[[]],[[]],[[]],[[]],[[]],[[["sortedmultivec",3]],["ordering",4]],[[["descriptorpublickey",4]],["ordering",4]],[[["descriptorsinglepub",3]],["ordering",4]],null,[[]],[[["usize",15]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["u32",15]],["descriptorpublickey",4]],[[["secp256k1",3]],[["publickey",3],["result",4,["publickey","conversionerror"]],["conversionerror",4]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["script",3]],[[["scriptcontextenum",4]],["bool",15]],[[["sortedmultivec",3]],["bool",15]],[[["descriptorpublickey",4]],["bool",15]],[[["descriptorsinglepub",3]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[],["bool",15]],[[["extendedpubkey",3]]],[[["extendedprivkey",3]]],[[]],[[]],[[]],[[]],[[]],[[["error",4]]],[[]],[[["error",4]]],[[]],[[]],[[]],[[]],[[]],[[["descriptorpublickey",4],["validnetworks",6]]],[[["validnetworks",6],["descriptorsecretkey",4]]],[[["str",15]],[["descriptorpublickey",4],["result",4,["descriptorpublickey"]]]],[[["str",15]],[["result",4,["descriptorsecretkey"]],["descriptorsecretkey",4]]],[[["tree",3]],[["sortedmultivec",3],["result",4,["sortedmultivec","error"]],["error",4]]],[[],["derivationpath",3]],[[],[["generatedkey",3],["result",4,["generatedkey"]]]],[[],[["generatedkey",3],["result",4,["generatedkey"]]]],[[],[["generatedkey",3],["result",4,["generatedkey"]]]],[[],[["generatedkey",3],["result",4,["generatedkey"]]]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["bool",15]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[["keysource",6],["option",4,["keysource"]],["derivationpath",3]],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[["keysource",6],["option",4,["keysource"]],["derivationpath",3]],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["extendedkey","keyerror"]],["extendedkey",4]]],[[],[["keyerror",4],["result",4,["extendedkey","keyerror"]],["extendedkey",4]]],[[],[["keyerror",4],["result",4,["extendedkey","keyerror"]],["extendedkey",4]]],[[]],[[["network",4]],[["option",4,["extendedprivkey"]],["extendedprivkey",3]]],[[["network",4],["secp256k1",3]],["extendedpubkey",3]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],null,null,null,[[],[["error",4],["result",4,["policy","error"]],["policy",4]]],[[],["validnetworks",6]],[[],["fingerprint",3]],[[["miniscript",3]],[["option",4,["usize"]],["usize",15]]],[[],["usize",15]],[[],["usize",15]],[[["validnetworks",6]],["validnetworks",6]],[[["sortedmultivec",3]],["bool",15]],[[["descriptorpublickey",4]],["bool",15]],[[["descriptorsinglepub",3]],["bool",15]],[[["usize",15],["vec",3,["global"]],["global",3]],[["sortedmultivec",3],["result",4,["sortedmultivec","error"]],["error",4]]],null,null,[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["validnetworks",6]]],[[["sortedmultivec",3]],[["option",4,["ordering"]],["ordering",4]]],[[["descriptorpublickey",4]],[["option",4,["ordering"]],["ordering",4]]],[[["descriptorsinglepub",3]],[["option",4,["ordering"]],["ordering",4]]],null,[[],[["error",4],["result",4,["error"]]]],[[],[["error",4],["vec",3,["vec","global"]],["result",4,["vec","error"]]]],[[],["usize",15]],[[],["terminal",4]],[[],["validnetworks",6]],[[]],[[]],[[]],[[]],[[]],[[],["descriptorpublickey",4]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[["miniscript",3]],[["error",4],["result",4,["error"]]]],[[],[["result",4,["sortedmultivec"]],["sortedmultivec",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[],["str",15]],[[]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["result",4,["vec"]],["vec",3,["u5","global"]]]],[[],["u8",15]],[[],["language",4]],[[],["mnemonic",3]],[[],["mnemonictype",4]],[[],["seed",3]],[[]],[[]],[[]],[[]],[[],["language",4]],[[],["mnemonictype",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[],["usize",15]],[[["language",4]],["bool",15]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["formatter",3]],[["error",3],["result",4,["error"]]]],[[["usize",15]],[["error",3],["result",4,["mnemonictype","error"]],["mnemonictype",4]]],[[["str",15]],[["error",3],["result",4,["mnemonictype","error"]],["mnemonictype",4]]],[[["usize",15]],[["error",3],["result",4,["mnemonictype","error"]],["mnemonictype",4]]],[[]],[[]],[[]],[[]],[[["language",4]],[["result",4,["mnemonic","error"]],["error",3],["mnemonic",3]]],[[["str",15]],[["option",4,["language"]],["language",4]]],[[["str",15],["language",4]],[["result",4,["mnemonic","error"]],["error",3],["mnemonic",3]]],[[],[["generatedkey",3],["result",4,["generatedkey"]]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[["keysource",6],["option",4,["keysource"]],["derivationpath",3]],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[["keysource",6],["option",4,["keysource"]],["derivationpath",3]],[["keyerror",4],["result",4,["descriptorkey","keyerror"]],["descriptorkey",4]]],[[],[["keyerror",4],["result",4,["extendedkey","keyerror"]],["extendedkey",4]]],[[],[["keyerror",4],["result",4,["extendedkey","keyerror"]],["extendedkey",4]]],[[],["string",3]],[[],["language",4]],[[["language",4],["mnemonictype",4]],["mnemonic",3]],[[["str",15],["mnemonic",3]],["seed",3]],[[],["str",15]],[[],["string",3]],[[],["string",3]],[[]],[[]],[[]],[[]],[[],["string",3]],[[],["string",3]],[[],["usize",15]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[["str",15],["language",4]],[["error",3],["result",4,["error"]]]],[[]],[[]],[[]],[[]],[[],["usize",15]],[[],["wordlist",3]],[[],["wordmap",3]],[[],["result",4]],null,null,null,null,null,null,null,null,[[["addressvalidator",8],["arc",3,["addressvalidator"]]]],[[["arc",3,["signer"]],["signer",8],["keychainkind",4],["signerordering",3]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],[["result",4,["txid","error"]],["txid",3],["error",4]]],[[["txid",3]],[["result",4,["txbuilder","error"]],["txbuilder",3,["defaultcoinselectionalgorithm","bumpfee"]],["error",4]]],[[],[["defaultcoinselectionalgorithm",6],["txbuilder",3,["defaultcoinselectionalgorithm","createtx"]],["createtx",3]]],[[]],null,[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["addressinfo",3]],["bool",15]],null,[[["psbt",3],["signoptions",3]],[["error",4],["result",4,["bool","error"]],["bool",15]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[["addressindex",4]],[["result",4,["addressinfo","error"]],["addressinfo",3],["error",4]]],[[],[["u64",15],["error",4],["result",4,["u64","error"]]]],[[["keychainkind",4]],["extendeddescriptor",6]],[[["str",15]]],[[["sighashtype",4],["bool",15],["option",4,["sighashtype"]],["localutxo",3]],[["input",3],["error",4],["result",4,["input","error"]]]],[[["outpoint",3]],[["error",4],["result",4,["option","error"]],["option",4,["localutxo"]]]],null,[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[],["bool",15]],[[["script",3]],[["error",4],["result",4,["bool","error"]],["bool",15]]],[[["bool",15]],[["vec",3,["transactiondetails"]],["error",4],["result",4,["vec","error"]]]],[[],[["vec",3,["localutxo"]],["error",4],["result",4,["vec","error"]]]],[[["addressinfo",3]],["bool",15]],[[],["network",4]],[[["option",4],["intowalletdescriptor",8],["network",4]],[["result",4,["error"]],["error",4]]],[[["option",4],["intowalletdescriptor",8],["network",4]],[["result",4,["error"]],["error",4]]],[[["keychainkind",4]],[["result",4,["option","error"]],["option",4,["policy"]],["error",4]]],[[["keychainkind",4]],[["option",4,["extendeddescriptor"]],["result",4,["option","error"]],["error",4]]],[[],["secp256k1",3]],[[["psbt",3],["signoptions",3]],[["error",4],["result",4,["bool","error"]],["bool",15]]],null,[[["progress",8],["option",4,["u32"]],["u32",15]],[["result",4,["error"]],["error",4]]],null,[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,[[],["fail",8]],[[]],[[]],[[],["addressvalidatorerror",4]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["addressvalidatorerror",4]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[],["usize",15]],[[]],[[["addressvalidatorerror",4]],["bool",15]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[["keychainkind",4],["hdkeypaths",6],["script",3]],[["result",4,["addressvalidatorerror"]],["addressvalidatorerror",4]]],[[]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["largestfirstcoinselection",3]],[[]],[[["u64",15],["feerate",3],["weightedutxo",3],["vec",3,["weightedutxo"]]],[["result",4,["coinselectionresult","error"]],["error",4],["coinselectionresult",3]]],[[["u64",15],["feerate",3],["weightedutxo",3],["vec",3,["weightedutxo"]]],[["result",4,["coinselectionresult","error"]],["error",4],["coinselectionresult",3]]],[[["u64",15],["feerate",3],["weightedutxo",3],["vec",3,["weightedutxo"]]],[["result",4,["coinselectionresult","error"]],["error",4],["coinselectionresult",3]]],[[],["largestfirstcoinselection",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],null,[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[],["u64",15]],[[["u64",15]]],null,[[],["u64",15]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,[[]],[[]],[[],[["option",4,["string"]],["string",3]]],[[["usize",15]]],[[["usize",15]]],[[],["string",3]],[[],["result",4]],[[["usize",15]]],[[["bool",15],["str",15],["wallet",3]],[["result",4,["str"]],["str",15]]],[[["formatter",3]],["result",6]],[[]],[[["str",15]],["result",4]],[[],["usize",15]],[[]],null,[[],["result",4]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["signerid",4],["arc",3,["signer"]],["signer",8],["signerordering",3]],[["arc",3,["signer"]],["option",4,["arc"]]]],null,[[],["fail",8]],[[["secp256k1",3]],["keymap",6]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["signerid",4]],[[],["signererror",4]],[[],["signerordering",3]],[[],["signerscontainer",3]],[[],["signoptions",3]],[[]],[[]],[[]],[[]],[[]],[[["signerid",4]],["ordering",4]],[[["signerordering",3]],["ordering",4]],[[]],[[],["signerscontainer",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],[["descriptorsecretkey",4],["option",4,["descriptorsecretkey"]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["signerid",4]],["bool",15]],[[["signererror",4]],["bool",15]],[[["signerordering",3]],["bool",15]],[[["signerid",4]],[["option",4,["arc"]],["arc",3]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["hash",3]],["signerid",4]],[[["fingerprint",3]],["signerid",4]],[[]],[[]],[[]],[[]],[[["keymap",6]],["signerscontainer",3]],[[]],[[],["u64",15]],[[]],[[["secp256k1",3]],["signerid",4]],[[],[["signerid",4],["vec",3,["signerid"]]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[["signerid",4]],["bool",15]],[[["signerordering",3]],["bool",15]],[[]],[[["signerid",4]],[["ordering",4],["option",4,["ordering"]]]],[[["signerordering",3]],[["ordering",4],["option",4,["ordering"]]]],[[["signerordering",3],["signerid",4]],[["arc",3,["signer"]],["option",4,["arc"]]]],[[["option",4,["usize"]],["usize",15],["partiallysignedtransaction",3],["secp256k1",3]],[["result",4,["signererror"]],["signererror",4]]],[[],["bool",15]],[[],[["arc",3],["vec",3,["arc"]]]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[],["u64",15]],null,null,null,null,null,null,null,null,null,null,null,null,[[["usize",15],["outpoint",3],["input",3]],[["error",4],["result",4,["error"]]]],[[]],[[["u64",15],["script",3]]],[[["outpoint",3]]],[[["outpoint",3]],[["error",4],["result",4,["error"]]]],[[],[["error",4],["result",4,["error"]]]],[[["script",3]],[["error",4],["result",4,["error"]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["changespendpolicy",4]]],[[],["createtx",3]],[[],["bumpfee",3]],[[]],[[],["txordering",4]],[[],["changespendpolicy",4]],[[]],[[]],[[]],[[]],[[]],[[["txordering",4]],["ordering",4]],[[["changespendpolicy",4]],["ordering",4]],[[["coinselectionalgorithm",8]],[["txbuilder",3],["coinselectionalgorithm",8]]],[[],["createtx",3]],[[],["bumpfee",3]],[[]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[["script",3]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[["u32",15]]],[[["txordering",4]],["bool",15]],[[["changespendpolicy",4]],["bool",15]],[[["u64",15]]],[[["feerate",3]]],[[],[["error",4],["result",4,["error"]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[],["u64",15]],[[],["u64",15]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[["u32",15]]],[[]],[[]],[[["txordering",4]]],[[["txordering",4]],[["ordering",4],["option",4,["ordering"]]]],[[["changespendpolicy",4]],[["ordering",4],["option",4,["ordering"]]]],[[["vec",3,["usize"]],["string",3],["keychainkind",4],["btreemap",3,["string","vec"]]]],[[["vec",3]]],[[["sighashtype",4]]],[[["transaction",3]]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[["vec",3,["outpoint"]],["outpoint",3]]],[[["i32",15]]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"Error"],[4,"KeychainKind"],[4,"Utxo"],[3,"FeeRate"],[3,"LocalUtxo"],[3,"WeightedUtxo"],[3,"TransactionDetails"],[3,"ConfirmationTime"],[6,"MnemonicWithPassphrase"],[6,"DescriptorTemplateOut"],[6,"ExtendedDescriptor"],[8,"Vbytes"],[13,"InvalidU32Bytes"],[13,"Generic"],[13,"OutputBelowDustLimit"],[13,"MissingKeyOrigin"],[13,"Key"],[13,"SpendingPolicyRequired"],[13,"InvalidPolicyPathError"],[13,"Signer"],[13,"InvalidProgressValue"],[13,"InvalidOutpoint"],[13,"Descriptor"],[13,"AddressValidator"],[13,"Encode"],[13,"Miniscript"],[13,"Bip32"],[13,"Secp256k1"],[13,"Json"],[13,"Hex"],[13,"Psbt"],[13,"PsbtParse"],[13,"Electrum"],[13,"Esplora"],[13,"CompactFilters"],[13,"Sled"],[13,"Rusqlite"],[13,"InsufficientFunds"],[13,"InvalidNetwork"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[13,"Local"],[13,"Foreign"],[4,"Capability"],[8,"ConfigurableBlockchain"],[3,"NoopProgress"],[3,"LogProgress"],[8,"Blockchain"],[8,"Progress"],[4,"AnyBlockchain"],[4,"AnyBlockchainConfig"],[13,"Electrum"],[13,"Esplora"],[13,"CompactFilters"],[13,"Electrum"],[13,"Esplora"],[13,"CompactFilters"],[4,"CompactFiltersError"],[3,"Mempool"],[3,"BitcoinPeerConfig"],[3,"Peer"],[3,"CompactFiltersBlockchain"],[3,"CompactFiltersBlockchainConfig"],[13,"Db"],[13,"Io"],[13,"Bip158"],[13,"Time"],[13,"Global"],[3,"ElectrumBlockchain"],[3,"ElectrumBlockchainConfig"],[4,"EsploraError"],[3,"EsploraBlockchainConfig"],[3,"EsploraBlockchain"],[3,"EsploraGetHistory"],[13,"Ureq"],[13,"UreqTransport"],[13,"HttpResponse"],[13,"Io"],[13,"Parsing"],[13,"BitcoinEncoding"],[13,"Hex"],[13,"TransactionNotFound"],[13,"HeaderHeightNotFound"],[13,"HeaderHashNotFound"],[8,"BatchDatabase"],[8,"ConfigurableDatabase"],[3,"SqliteDatabase"],[8,"Database"],[8,"BatchOperations"],[4,"AnyBatch"],[4,"AnyDatabase"],[4,"AnyDatabaseConfig"],[3,"SledDbConfiguration"],[3,"SqliteDbConfiguration"],[13,"Memory"],[13,"Sled"],[13,"Sqlite"],[13,"Memory"],[13,"Sled"],[13,"Sqlite"],[13,"Memory"],[13,"Sled"],[13,"Sqlite"],[3,"MemoryDatabase"],[4,"Descriptor"],[4,"Legacy"],[4,"Segwitv0"],[3,"Miniscript"],[3,"DerivedDescriptorKey"],[8,"ScriptContext"],[8,"ExtractPolicy"],[8,"IntoWalletDescriptor"],[13,"Bare"],[13,"Pkh"],[13,"Wpkh"],[13,"Sh"],[13,"Wsh"],[4,"Error"],[13,"Key"],[13,"Policy"],[13,"InvalidDescriptorCharacter"],[13,"Bip32"],[13,"Base58"],[13,"Pk"],[13,"Miniscript"],[13,"Hex"],[4,"SatisfiableItem"],[4,"PolicyError"],[4,"Satisfaction"],[4,"BuildSatisfaction"],[3,"PkOrF"],[3,"Policy"],[3,"Condition"],[13,"Psbt"],[13,"PsbtTimelocks"],[13,"NotEnoughItemsSelected"],[13,"IndexOutOfRange"],[13,"Complete"],[13,"Partial"],[13,"PartialComplete"],[13,"Signature"],[13,"SignatureKey"],[13,"Sha256Preimage"],[13,"Hash256Preimage"],[13,"Ripemd160Preimage"],[13,"Hash160Preimage"],[13,"Thresh"],[13,"Multisig"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[3,"P2Pkh"],[3,"P2Wpkh_P2Sh"],[3,"P2Wpkh"],[3,"Bip44"],[3,"Bip44Public"],[3,"Bip49"],[3,"Bip49Public"],[3,"Bip84"],[3,"Bip84Public"],[8,"DescriptorTemplate"],[4,"KeyError"],[8,"GeneratableKey"],[4,"ScriptContextEnum"],[4,"ExtendedKey"],[4,"DescriptorSecretKey"],[4,"DescriptorPublicKey"],[8,"ExtScriptContext"],[3,"GeneratedKey"],[4,"DescriptorKey"],[3,"PrivateKeyGenerateOptions"],[3,"SortedMultiVec"],[3,"DescriptorSinglePub"],[3,"DescriptorSinglePriv"],[8,"GeneratableDefaultOptions"],[8,"IntoDescriptorKey"],[8,"DerivableKey"],[13,"SinglePub"],[13,"XPub"],[13,"SinglePriv"],[13,"XPrv"],[13,"Private"],[13,"Public"],[13,"Message"],[13,"Bip32"],[13,"Miniscript"],[4,"Language"],[4,"MnemonicType"],[3,"Seed"],[3,"Mnemonic"],[4,"AddressIndex"],[3,"Wallet"],[3,"AddressInfo"],[8,"IsDust"],[13,"Peek"],[13,"Reset"],[4,"AddressValidatorError"],[8,"AddressValidator"],[13,"Message"],[3,"CoinSelectionResult"],[3,"LargestFirstCoinSelection"],[3,"BranchAndBoundCoinSelection"],[8,"CoinSelectionAlgorithm"],[3,"WalletExport"],[3,"SignerOrdering"],[4,"SignerId"],[4,"SignerError"],[3,"SignersContainer"],[3,"SignOptions"],[8,"Signer"],[13,"PkHash"],[13,"Fingerprint"],[13,"Dummy"],[4,"TxOrdering"],[4,"ChangeSpendPolicy"],[3,"TxBuilder"],[3,"CreateTx"],[3,"BumpFee"]]}\ +"bdk":{"doc":"A modern, lightweight, descriptor-based wallet library …","t":[13,13,3,13,13,13,13,6,13,13,13,4,13,13,3,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,4,13,3,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,3,13,13,4,8,3,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0,11,11,11,11,11,11,11,11,12,11,12,12,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,11,12,10,12,5,11,11,11,11,11,11,11,11,0,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,8,4,16,8,3,13,13,3,3,8,6,0,11,11,11,11,11,11,10,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,0,11,0,10,11,11,11,11,10,10,11,10,10,11,11,11,11,11,11,11,5,5,5,10,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,4,4,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,3,3,3,4,13,13,13,13,13,13,13,13,3,13,13,13,3,13,13,13,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,13,3,3,4,13,13,13,13,13,13,13,13,13,13,12,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,16,8,8,16,8,8,3,3,0,10,11,12,11,11,11,11,10,11,11,11,10,11,12,10,11,10,11,10,11,10,11,10,11,10,11,10,11,11,11,11,11,11,11,11,10,11,11,11,11,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,11,11,11,11,10,11,10,11,10,11,10,11,0,11,12,11,10,11,10,11,10,11,10,11,10,11,10,11,11,11,11,11,11,11,11,11,11,4,4,4,13,13,13,13,13,13,3,13,13,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,6,3,4,6,8,6,8,6,4,3,13,8,4,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,5,13,13,13,4,13,13,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,4,13,3,6,6,13,13,13,13,13,13,13,13,13,13,13,3,3,4,13,13,13,13,4,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,3,8,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,4,4,4,3,3,16,16,8,4,8,8,3,8,13,13,13,4,6,13,13,13,16,13,3,13,8,4,13,13,13,3,6,13,13,5,10,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,5,11,10,11,11,5,11,11,11,11,12,12,11,11,11,11,11,11,12,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,13,4,3,6,4,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,3,8,13,13,13,13,3,11,11,12,0,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,12,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,0,11,0,11,11,11,11,11,11,11,0,11,11,11,11,11,11,5,12,12,8,4,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,12,3,8,3,6,3,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,13,13,13,13,13,13,13,13,13,13,13,13,3,8,4,4,3,3,13,11,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,5,13,3,13,13,4,3,13,13,3,8,4,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["AddressValidator","Bip32","BlockTime","BnBNoExactMatch","BnBTotalTriesExceeded","ChecksumMismatch","CompactFilters","ConfirmationTime","Descriptor","Electrum","Encode","Error","Esplora","External","FeeRate","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","Foreign","Generic","Hex","InsufficientFunds","Internal","InvalidNetwork","InvalidOutpoint","InvalidPolicyPathError","InvalidProgressValue","InvalidU32Bytes","IrreplaceableTransaction","Json","Key","KeychainKind","Local","LocalUtxo","Miniscript","MissingKeyOrigin","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","ProgressUpdateError","Psbt","PsbtParse","Rusqlite","ScriptDoesntHaveAddressForm","Secp256k1","Signer","Sled","SpendingPolicyRequired","TransactionConfirmed","TransactionDetails","TransactionNotFound","UnknownUtxo","Utxo","Vbytes","WeightedUtxo","as_byte","as_ref","as_sat_vb","base32_len","blockchain","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_base32","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","confirmation_time","database","default","default","default","default_min_relay_fee","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","descriptor","descriptor","deserialize","deserialize","deserialize","deserialize","drop","drop","drop","drop","drop","drop","drop","drop","eq","eq","eq","eq","eq","eq","eq","fee","fee_vb","fee_wu","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_btc_per_kvb","from_sat_per_vb","from_vb","from_wu","get_hash","get_hash","hash","hash","height","init","init","init","init","init","init","init","init","into","into","into","into","into","into","into","into","into_descriptor_key","into_extended_key","into_wallet_descriptor","into_wallet_descriptor","keychain","keys","ne","ne","ne","ne","ne","ne","new","outpoint","outpoint","partial_cmp","received","satisfaction_weight","sent","serialize","serialize","serialize","serialize","sub","timestamp","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","transaction","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","txid","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","utxo","vbytes","verified","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet","write_base32","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","available","found","needed","requested","required","required","0","outpoint","psbt_input","AccurateFees","Blockchain","Capability","Config","ConfigurableBlockchain","EsploraBlockchain","FullHistory","GetAnyTx","LogProgress","NoopProgress","Progress","ProgressData","any","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","broadcast","clone","clone","clone","clone_into","clone_into","clone_into","compact_filters","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","electrum","eq","esplora","estimate_fee","fmt","from","from","from","from_config","get_capabilities","get_hash","get_height","get_tx","hash","init","init","init","into","into","into","log_progress","noop_progress","progress","setup","sync","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","update","update","vzip","vzip","vzip","AnyBlockchain","AnyBlockchainConfig","CompactFilters","CompactFilters","Electrum","Electrum","Esplora","Esplora","borrow","borrow","borrow_mut","borrow_mut","broadcast","clone","clone_into","deref","deref","deref_mut","deref_mut","deserialize","drop","drop","eq","estimate_fee","fmt","from","from","from","from","from","from","from","from","from_config","get_capabilities","get_height","get_tx","init","init","into","into","ne","serialize","setup","sync","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","0","0","0","0","0","0","Bip158","BitcoinPeerConfig","CompactFiltersBlockchain","CompactFiltersBlockchainConfig","CompactFiltersError","DataCorruption","Db","Global","InvalidFilter","InvalidFilterHeader","InvalidHeaders","InvalidResponse","Io","Mempool","MissingBlock","NoPeers","NotConnected","Peer","PeerBloomDisabled","Time","Timeout","add_tx","address","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broadcast","clone","clone","clone_into","clone_into","connect","connect_proxy","default","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","drop","drop","drop","drop","drop","drop","eq","eq","estimate_fee","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_config","get_capabilities","get_height","get_mempool","get_network","get_tx","get_tx","get_version","has_tx","init","init","init","init","init","init","into","into","into","into","into","into","is_connected","iter_txs","ne","ne","network","new","new","peers","recv","send","serialize","serialize","setup","skip_blocks","socks5","socks5_credentials","storage_dir","to_owned","to_owned","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","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","0","0","ElectrumBlockchain","ElectrumBlockchainConfig","borrow","borrow","borrow_mut","borrow_mut","broadcast","clone","clone_into","deref","deref","deref_mut","deref_mut","deserialize","drop","drop","eq","estimate_fee","fmt","from","from","from","from_config","get_capabilities","get_height","get_tx","init","init","into","into","ne","retry","serialize","setup","socks5","stop_gap","timeout","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","url","vzip","vzip","BitcoinEncoding","EsploraBlockchain","EsploraBlockchainConfig","EsploraError","HeaderHashNotFound","HeaderHeightNotFound","Hex","HttpResponse","Io","NoHeader","Parsing","TransactionNotFound","Ureq","UreqTransport","base_url","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","broadcast","clone","clone_into","concurrency","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","drop","drop","drop","eq","estimate_fee","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from_config","get_capabilities","get_height","get_tx","init","init","init","into","into","into","ne","new","new","proxy","serialize","setup","stop_gap","timeout","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_agent","with_concurrency","0","0","0","0","0","0","0","0","0","0","Batch","BatchDatabase","BatchOperations","Config","ConfigurableDatabase","Database","SqliteDatabase","SyncTime","any","begin_batch","begin_batch","block_time","borrow","borrow","borrow_mut","borrow_mut","check_descriptor_checksum","check_descriptor_checksum","clone","clone_into","commit_batch","commit_batch","connection","del_last_index","del_last_index","del_path_from_script_pubkey","del_path_from_script_pubkey","del_raw_tx","del_raw_tx","del_script_pubkey_from_path","del_script_pubkey_from_path","del_sync_time","del_sync_time","del_tx","del_tx","del_utxo","del_utxo","deref","deref","deref_mut","deref_mut","deserialize","drop","drop","flush","flush","fmt","fmt","from","from","from_config","from_config","get_last_index","get_last_index","get_path_from_script_pubkey","get_path_from_script_pubkey","get_raw_tx","get_raw_tx","get_script_pubkey_from_path","get_script_pubkey_from_path","get_sync_time","get_sync_time","get_tx","get_tx","get_utxo","get_utxo","increment_last_index","increment_last_index","init","init","into","into","iter_raw_txs","iter_raw_txs","iter_script_pubkeys","iter_script_pubkeys","iter_txs","iter_txs","iter_utxos","iter_utxos","memory","new","path","serialize","set_last_index","set_last_index","set_raw_tx","set_raw_tx","set_script_pubkey","set_script_pubkey","set_sync_time","set_sync_time","set_tx","set_tx","set_utxo","set_utxo","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","AnyBatch","AnyDatabase","AnyDatabaseConfig","Memory","Memory","Memory","Sled","Sled","Sled","SledDbConfiguration","Sqlite","Sqlite","Sqlite","SqliteDbConfiguration","begin_batch","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_descriptor_checksum","commit_batch","del_last_index","del_last_index","del_path_from_script_pubkey","del_path_from_script_pubkey","del_raw_tx","del_raw_tx","del_script_pubkey_from_path","del_script_pubkey_from_path","del_sync_time","del_sync_time","del_tx","del_tx","del_utxo","del_utxo","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","drop","drop","drop","drop","drop","flush","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_config","get_last_index","get_path_from_script_pubkey","get_raw_tx","get_script_pubkey_from_path","get_sync_time","get_tx","get_utxo","increment_last_index","init","init","init","init","init","into","into","into","into","into","iter_raw_txs","iter_script_pubkeys","iter_txs","iter_utxos","path","path","serialize","serialize","serialize","set_last_index","set_last_index","set_raw_tx","set_raw_tx","set_script_pubkey","set_script_pubkey","set_sync_time","set_sync_time","set_tx","set_tx","set_utxo","set_utxo","tree_name","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","0","0","0","0","0","0","0","0","0","MemoryDatabase","begin_batch","borrow","borrow_mut","check_descriptor_checksum","commit_batch","default","del_last_index","del_path_from_script_pubkey","del_raw_tx","del_script_pubkey_from_path","del_sync_time","del_tx","del_utxo","deref","deref_mut","drop","flush","fmt","from","from_config","get_last_index","get_path_from_script_pubkey","get_raw_tx","get_script_pubkey_from_path","get_sync_time","get_tx","get_utxo","increment_last_index","init","into","iter_raw_txs","iter_script_pubkeys","iter_txs","iter_utxos","new","set_last_index","set_raw_tx","set_script_pubkey","set_sync_time","set_tx","set_utxo","try_from","try_into","type_id","vzip","Bare","DerivedDescriptor","DerivedDescriptorKey","Descriptor","ExtendedDescriptor","ExtractPolicy","HdKeyPaths","IntoWalletDescriptor","KeyMap","Legacy","Miniscript","Pkh","ScriptContext","Segwitv0","Sh","Wpkh","Wsh","address","as_enum","as_enum","as_inner","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","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_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","derive","desc_type","deserialize","deserialize","drop","drop","drop","drop","drop","encode","eq","eq","eq","eq","eq","error","explicit_script","ext","extract_policy","extract_policy","extract_policy","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from_ast","from_str","from_str","from_str_insane","from_tree","from_tree","get_hash","get_hash","get_hash","get_hash","get_hash","get_leaf_pk","get_leaf_pk_pkh","get_leaf_pkh","get_nth_child","get_nth_pk","get_nth_pk_pkh","get_nth_pkh","get_satisfaction","has_mixed_timelocks","has_repeated_keys","hash","hash","hash","hash","hash","hash_to_hash160","init","init","init","init","init","into","into","into","into","into","into_inner","into_wallet_descriptor","is_deriveable","is_non_malleable","is_uncompressed","iter","iter_pk","iter_pk_pkh","iter_pkh","lift","lift","lift_check","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","ne","new","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_wpkh","new_wsh","new_wsh_sortedmulti","node","other_top_level_checks","parse","parse_descriptor","parse_insane","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","serialized_len","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_pubkeyhash","to_public_key","to_string","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_from","try_into","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","vzip","within_resource_limits","0","0","0","0","0","get_checksum","Base58","Bip32","DuplicatedKeys","Error","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","Pk","Policy","borrow","borrow_mut","deref","deref_mut","drop","fmt","fmt","from","from","from","from","from","from","from","from","init","into","to_string","try_from","try_into","type_id","vzip","0","0","0","0","0","0","0","0","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","Sha256Preimage","Signature","SignatureKey","Thresh","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","contribution","csv","default","default","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","drop","drop","drop","drop","drop","drop","drop","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","get_hash","hash","id","id","init","init","init","init","init","init","init","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","ne","ne","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","0","current_height","input_max_height","psbt","0","0","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","0","0","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","0","0","0","0","0","0","0","0","0","1","1","1","1","1","1","2","2","2","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2Wpkh","P2Wpkh_P2Sh","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","build","build","build","build","build","build","build","build","build","build","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","drop","drop","drop","drop","drop","drop","drop","drop","drop","from","from","from","from","from","from","from","from","from","init","init","init","init","init","init","init","init","init","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","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","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","DescriptorSinglePriv","DescriptorSinglePub","Entropy","Error","ExtScriptContext","ExtendedKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","KeyError","KeyMap","Legacy","Message","Miniscript","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","SinglePriv","SinglePub","SortedMultiVec","ValidNetworks","XPrv","XPub","any_network","as_enum","as_public","bip39","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","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_local_validity","check_terminal_non_malleable","check_witness","check_witness","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","compressed","default","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","derive","derive_public_key","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","encode","eq","eq","eq","eq","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_public","from_secret","from_str","from_str","from_tree","full_derivation_path","generate","generate_default","generate_with_entropy","generate_with_entropy_default","get_hash","get_hash","get_hash","has_secret","hash","hash","hash","init","init","init","init","init","init","init","init","init","init","init","into","into","into","into","into","into","into","into","into","into","into","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_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_segwit_v0","is_segwit_v0","is_uncompressed","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","ne","ne","ne","new","origin","origin","other_top_level_checks","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","pks","sanity_check","satisfy","script_size","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_pubkeyhash","to_string","to_string","to_string","to_string","top_level_checks","top_level_checks","top_level_type_check","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_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","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","0","0","0","0","0","0","English","Language","Mnemonic","MnemonicWithPassphrase","WordCount","Words12","Words15","Words18","Words21","Words24","all","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","cmp","deref","deref","deref","deref_mut","deref_mut","deref_mut","deserialize","drop","drop","drop","eq","eq","fmt","fmt","fmt","fmt","from","from","from","from_entropy","from_entropy_in","from_str","generate_in_with","generate_with_entropy","get_hash","get_hash","hash","hash","init","init","init","into","into","into","into_descriptor_key","into_extended_key","language","language_of","ne","parse","parse_in","parse_in_normalized","parse_normalized","partial_cmp","partial_cmp","serialize","to_entropy","to_entropy_array","to_owned","to_owned","to_seed","to_seed_normalized","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","word_count","word_iter","words_by_prefix","AddressIndex","AddressInfo","IsDust","LastUnused","New","Peek","Reset","Wallet","add_address_validator","add_signer","address","address_validator","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","broadcast","build_fee_bump","build_tx","client","coin_selection","database","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","eq","export","finalize_psbt","fmt","fmt","fmt","fmt","from","from","from","get_address","get_balance","get_descriptor_for_keychain","get_funded_wallet","get_psbt_input","get_tx","get_utxo","index","init","init","init","into","into","into","is_dust","is_mine","list_transactions","list_unspent","ne","network","new","new_offline","policies","public_descriptor","secp_ctx","sign","signer","sync","time","to_string","try_from","try_from","try_from","try_into","try_into","try_into","tx_builder","type_id","type_id","type_id","vzip","vzip","vzip","wallet_name_from_descriptor","0","0","AddressValidator","AddressValidatorError","ConnectionError","InvalidScript","Message","TimeoutError","UserRejected","borrow","borrow_mut","clone","clone_into","deref","deref_mut","drop","eq","fmt","fmt","from","init","into","ne","to_owned","to_string","try_from","try_into","type_id","validate","vzip","0","BranchAndBoundCoinSelection","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","LargestFirstCoinSelection","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","coin_select","coin_select","coin_select","default","default","deref","deref","deref","deref_mut","deref_mut","deref_mut","drop","drop","drop","fee_amount","fmt","fmt","fmt","from","from","from","init","init","init","into","into","into","local_selected_amount","new","selected","selected_amount","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","WalletExport","blockheight","borrow","borrow_mut","change_descriptor","deref","deref_mut","descriptor","deserialize","drop","export_wallet","fmt","from","from_str","init","into","label","serialize","to_string","try_from","try_into","type_id","vzip","0","Dummy","Fingerprint","InputIndexOutOfRange","InvalidKey","InvalidNonWitnessUtxo","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","PkHash","SignOptions","Signer","SignerError","SignerId","SignerOrdering","SignersContainer","UserCanceled","add_external","allow_all_sighashes","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","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","default","default","default","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","descriptor_secret_key","drop","drop","drop","drop","drop","eq","eq","eq","find","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","get_hash","hash","id","ids","init","init","init","init","init","into","into","into","into","into","ne","ne","new","partial_cmp","partial_cmp","remove","sign","sign_whole_tx","signers","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","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","0","0","0","get_timestamp","Bip69Lexicographic","BumpFee","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","CreateTx","OnlyChange","Shuffle","TxBuilder","TxBuilderContext","TxOrdering","Untouched","add_data","add_foreign_utxo","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_shrinking","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","coin_selection","default","default","default","default","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","do_not_spend_change","drain_to","drain_wallet","drop","drop","drop","drop","drop","enable_rbf","enable_rbf_with_sequence","eq","eq","fee_absolute","fee_rate","finish","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","get_hash","get_hash","hash","hash","include_output_redeem_witness_script","init","init","init","init","init","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","partial_cmp","policy_path","set_recipients","sighash","sort_tx","to_owned","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","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip"],"q":["bdk","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Utxo","","","bdk::blockchain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::any","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::any::AnyBlockchain","","","bdk::blockchain::any::AnyBlockchainConfig","","","bdk::blockchain::compact_filters","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::compact_filters::CompactFiltersError","","","","","bdk::blockchain::electrum","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::esplora","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::blockchain::esplora::EsploraError","","","","","","","","","","bdk::database","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::database::any","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::database::any::AnyBatch","","","bdk::database::any::AnyDatabase","","","bdk::database::any::AnyDatabaseConfig","","","bdk::database::memory","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::Descriptor","","","","","bdk::descriptor::checksum","bdk::descriptor::error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::error::Error","","","","","","","","bdk::descriptor::policy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy::BuildSatisfaction","","","","bdk::descriptor::policy::PolicyError","","bdk::descriptor::policy::Satisfaction","","","","","","","","","","","bdk::descriptor::policy::SatisfiableItem","","","","","","","","","","","","bdk::descriptor::template","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys::DescriptorPublicKey","","bdk::keys::DescriptorSecretKey","","bdk::keys::ExtendedKey","","bdk::keys::KeyError","","","bdk::keys::bip39","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::AddressIndex","","bdk::wallet::address_validator","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::address_validator::AddressValidatorError","bdk::wallet::coin_selection","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::export","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer::SignerId","","","bdk::wallet::time","bdk::wallet::tx_builder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Error that can be returned to fail the validation of an …","BIP32 error","Block height and timestamp of a block","Branch and bound coin selection tries to avoid needing a …","Branch and bound coin selection possible attempts with …","Descriptor checksum mismatch","Compact filters client error)","DEPRECATED: Confirmation time of a transaction","Error related to the parsing and usage of descriptors","Electrum client error","Encoding error","Errors that can be thrown by the Wallet","Esplora client error","External","Fee rate","When bumping a tx the fee rate requested is lower than …","Node doesn’t have data to estimate a fee rate","When bumping a tx the absolute fee requested is lower than …","A UTXO owned by another wallet.","Generic error","Hex decoding error","Wallet’s UTXO set is not enough to cover recipient’s …","Internal, usually used for change outputs","Invalid network","Requested outpoint doesn’t exist in the tx (vout greater …","Error while extracting and manipulating policies","Progress value must be between 0.0 (included) and 100.0 …","Wrong number of bytes found when trying to convert to u32","Trying to replace a tx that has a sequence >= 0xFFFFFFFE","Error serializing or deserializing JSON data","Error while working with keys","Types of keychains","A UTXO owned by the local wallet.","An unspent output owned by a Wallet.","Miniscript error","In order to use the TxBuilder::add_global_xpubs option …","Cannot build a tx without recipients","manually_selected_only option is selected but no utxo has …","Output created is under the dust limit, 546 satoshis","Progress update error (maybe the channel has been closed)","Partially signed bitcoin transaction error","Partially signed bitcoin transaction parse error","Rusqlite client error","This error is thrown when trying to convert Bare and …","An ECDSA error","Signing error","Sled database error","Spending policy is not compatible with this KeychainKind","Happens when trying to bump a transaction that is already …","A wallet transaction","Thrown when a tx is not found in the internal database","Happens when trying to spend an UTXO that is not in the …","An unspent transaction output (UTXO).","Trait implemented by types that can be used to measure …","A Utxo with its satisfaction_weight.","Return KeychainKind as a byte","","Return the value as satoshi/vbyte","","Blockchain backends","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","If the transaction is confirmed, contains height and …","Database types","","","","Create a new FeeRate with the default min relay fee value","","","","","","","","","","","","","","","","","Descriptors","Macro to write full descriptors with code","","","","","","","","","","","","","","","","","","","","Fee value (sats) if available. The availability of the fee …","Calculate absolute fee in Satoshis using size in virtual …","Calculate absolute fee in Satoshis using size in weight …","","","","","","","","","","Macro to write descriptor fragments with code","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Calculate fee rate from fee and vbytes.","Calculate fee rate from fee and weight units (wu).","","","","","confirmation block height","","","","","","","","","","","","","","","","","","","","","Type of keychain","Key formats","","","","","","","Returns Some BlockTime if both height and timestamp are …","Get the location of the UTXO","Reference to a transaction output","","Received value (sats)","The weight of the witness data and scriptSig expressed in …","Sent value (sats)","","","","","","confirmation block timestamp","","","","","","","","","Optional transaction","","","","","","","","","","","","","","","","","Transaction id","Get the TxOut of the UTXO","Transaction output","","","","","","","","","The UTXO","Convert weight units to virtual bytes.","Whether the tx has been verified against the consensus …","Get the version of BDK at runtime","","","","","","","","","Wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","Sats available for spending","found network, for example the network of the bitcoin node","Sats needed for some transaction","requested network, for example what is given as bdk-cli …","Required fee rate (satoshi/vbyte)","Required fee absolute value (satoshi)","","The location of the output.","The information about the input we require to add it to a …","Can compute accurate fees for the transactions found …","Trait that defines the actions that must be supported by a …","Capabilities that can be supported by a Blockchain backend","Type that contains the configuration","Trait for Blockchain types that can be created given a …","Structure that implements the logic to sync with Esplora","Can recover the full history of a wallet and not only the …","Can fetch any historical transaction given its txid","Type that implements Progress and logs at level INFO every …","Type that implements Progress and drops every update …","Trait for types that can receive and process progress …","Data sent with a progress update over a channel","Runtime-checked blockchain types","","","","","","","Broadcast a transaction","","","","","","","Compact Filters","","","","","","","","","","Electrum","","Esplora","Estimate the fee rate required to confirm a transaction in …","","","","","Create a new instance given a configuration","Return the set of Capability supported by this backend","","Return the current height","Fetch a transaction from the blockchain given its txid","","","","","","","","Create a new instance of LogProgress","Create a new instance of NoopProgress","Shortcut to create a channel (pair of Sender and Receiver) …","Setup the backend and populate the internal database for …","Populate the internal database with transactions and UTXOs","","","","","","","","","","","","","Send a new progress update","","","","","","Type that can contain any of the Blockchain types defined …","Type that can contain any of the blockchain configurations …","Compact filters client","Compact filters client","Electrum client","Electrum client","Esplora client","Esplora client","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Invalid BIP158 filter","Data to connect to a Bitcoin P2P peer","Structure implementing the required blockchain traits","Configuration for a CompactFiltersBlockchain","An error that can occur during sync with a …","The data stored in the block filters storage are corrupted","Internal database error","Wrapper for crate::error::Error","The compact filter returned is invalid","The compact filter headers returned are invalid","The headers returned are invalid","A peer sent an invalid or unexpected response","Internal I/O error","Container for unconfirmed, but valid Bitcoin transactions","The peer is missing a block in the valid chain","No peers have been specified","A peer is not connected","A Bitcoin peer","The peer doesn’t advertise the BLOOM service flag","Internal system time error","A peer took too long to reply to one of our messages","Add a transaction to the mempool","Peer address such as 127.0.0.1:18333","","","","","","","","","","","","","","","","","","Connect to a peer over a plaintext TCP connection","Connect to a peer through a SOCKS5 proxy, optionally by …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the mempool used by this peer","Return the Bitcoin Network in use","Look-up a transaction in the mempool given an Inventory …","","Return the VersionMessage sent by the peer","Return whether or not the mempool contains a transaction …","","","","","","","","","","","","","Return whether or not the peer is still connected","Return the list of transactions contained in the mempool","","","Network used","Create a new empty mempool","Construct a new instance given a list of peers, a path to …","List of peers to try to connect to for asking headers and …","Waits for a specific incoming Bitcoin message, optionally …","Send a raw Bitcoin message to the peer","","","","Optionally skip initial skip_blocks blocks (default: 0)","Optional socks5 proxy","Optional socks5 proxy credentials","Storage dir to save partially downloaded headers and full …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Wrapper over an Electrum Client that implements the …","Configuration for an ElectrumBlockchain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Request retry count","","","URL of the socks5 proxy server or a Tor service","Stop searching addresses for transactions after finding an …","Request timeout (seconds)","","","","","","","","URL of the Electrum server (such as ElectrumX, Esplora, …","","","Invalid Bitcoin data returned","Structure that implements the logic to sync with Esplora","Configuration for an EsploraBlockchain","Errors that can happen during a sync with EsploraBlockchain","Header hash not found","Header height not found","Invalid Hex data returned","HTTP response error","IO error during ureq response read","No header found in ureq response","Invalid number returned","Transaction not found","Error during ureq HTTP request","Transport error during the ureq HTTP call","Base URL of the esplora service","","","","","","","","","","Number of parallel requests sent to the esplora service …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new instance of the client from a base URL and …","create a config with default values given the base url and …","Optional URL of the proxy to use to make requests to the …","","","Stop searching addresses for transactions after finding an …","Socket timeout.","","","","","","","","","","","","","","","Set the inner ureq agent.","Set the number of parallel requests the client can make.","","","","","","","","","","","Container for the operations","Trait for a database that supports batch operations","Trait for operations that can be batched","Type that contains the configuration","Trait for Database types that can be created given a …","Trait for reading data from a database","Sqlite database stored on filesystem","Blockchain state at the time of syncing","Runtime-checked database types","Create a new batch container","","Block timestamp and height at the time of sync","","","","","Read and checks the descriptor checksum for a given …","","","","Consume and apply a batch of operations","","A rusqlite connection object to the sqlite database","Delete the last derivation index for a keychain.","","Delete the data related to a specific script_pubkey, …","","Delete a raw transaction given its Txid","","Delete a script_pubkey given the keychain and its child …","","Reset the sync time to None","","Delete the metadata of a transaction and optionally the …","","Delete a LocalUtxo given its OutPoint","","","","","","","","","Force changes to be written to disk","","","","","","Create a new instance given a configuration","","Return the last derivation index for a keychain.","","Fetch the keychain and child number of a given …","","Fetch a raw transaction given its Txid","","Fetch a script_pubkey given the child number of a keychain.","","Return the sync time, if present","","Fetch the transaction metadata and optionally also the raw …","","Fetch a LocalUtxo given its OutPoint","","Increment the last derivation index for a keychain and …","","","","","","Return the list of raw transactions","","Return the list of script_pubkeys","","Return the list of transactions metadata","","Return the list of LocalUtxos","","In-memory ephemeral database","Instantiate a new SqliteDatabase instance by creating a …","Path on the local filesystem to store the sqlite file","","Store the last derivation index for a given keychain.","","Store a raw transaction","","Store a script_pubkey along with its keychain and child …","","Store the sync time","","Store the metadata of a transaction","","Store a LocalUtxo","","","","","","","","","","","Type that contains any of the BatchDatabase::Batch types …","Type that can contain any of the Database types defined by …","Type that can contain any of the database configurations …","In-memory ephemeral database","In-memory ephemeral database","Memory database has no config","Simple key-value embedded database based on sled","Simple key-value embedded database based on sled","Simple key-value embedded database based on sled","Configuration type for a sled::Tree database","Sqlite embedded database using rusqlite","Sqlite embedded database using rusqlite","Sqlite embedded database using rusqlite","Configuration type for a sqlite::SqliteDatabase database","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Main directory of the db","Main directory of the db","","","","","","","","","","","","","","","","Name of the database tree, a separated namespace for the …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","In-memory ephemeral database","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new empty database","","","","","","","","","","","A raw scriptpubkey (including pay-to-pubkey) under Legacy …","Alias for a Descriptor that contains extended derived keys","Extended DescriptorPublicKey that has been derived","Script descriptor","Alias for a Descriptor that can contain extended keys …","Trait implemented on Descriptors to add a method to …","Alias for the type of maps that represent derivation paths …","Trait for types which can be converted into an …","Alias type for a map of public key to secret key","Legacy ScriptContext To be used as P2SH scripts For …","Top-level script AST type","Pay-to-PubKey-Hash","The ScriptContext for Miniscript. Additional type …","Segwitv0 ScriptContext","Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)","Pay-to-Witness-PubKey-Hash","Pay-to-Witness-ScriptHash with Segwitv0 context","Computes the Bitcoin address of the descriptor, if one …","","","Get a reference to the inner AstElem representing the root …","","","","","","","","","","","Enumerates all child nodes of the current AST node (self) …","Depending on script Context, some of the Terminals might …","","","Depending on script Context, some of the script resource …","","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","","","Policy rules at the Miniscript satisfaction time. It is …","","","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","","","Check whether the given satisfaction is valid under the …","","","Descriptor checksum","","","","","","","","","","","","","","","","","","","","","","","","","","","Derives all wildcard keys in the descriptor using the …","Get the DescriptorType of Descriptor","","","","","","","","Encode as a Bitcoin script","","","","","","Descriptor errors","Computes the “witness script” of the descriptor, i.e. …","Additional information helpful for extra analysis.","Extract the spending policy","","","","","","","","","","","","","","","","","","Add type information(Type and Extdata) to Miniscript based …","","","Attempt to parse an insane(scripts don’t clear sanity …","Parse an expression tree into a descriptor","Parse an expression tree into a Miniscript. As a general …","","","","","","Returns Vec with cloned version of all public keys from …","Returns Vec of PkPkh entries, representing either public …","Returns Vec with hashes of all public keys from the …","Returns child node with given index, if any","Returns Option::Some with cloned n’th public key from …","Returns Option::Some with hash of n’th public key or …","Returns Option::Some with hash of n’th public key from …","Returns satisfying witness and scriptSig to spend an …","Whether the miniscript contains a combination of timelocks","Whether the miniscript has repeated Pk or Pkh","","","","","","","","","","","","","","","","","Extracts the AstElem representing the root of the …","Convert to wallet descriptor","Whether or not the descriptor has any wildcards","Whether the miniscript is malleable","","Creates a new Iter iterator that will iterate over all …","Creates a new PkIter iterator that will iterate over all …","Creates a new PkPkhIter iterator that will iterate over …","Creates a new PkhIter iterator that will iterate over all …","","","Lifting corresponds conversion of miniscript into Policy […","Depending on script context, the size of a satifaction …","","","Maximum size, in bytes, of a satisfying witness. For …","Computes an upper bound on the weight of a satisfying …","Maximum number of witness elements used to satisfy the …","","Construct a new derived key","Create a new bare descriptor from witness script Errors …","Create a new pk descriptor","Create a new PkH descriptor","Create a new sh for a given redeem script Errors when …","Create a new sh sortedmulti descriptor with threshold k …","Create a new sh wrapped wpkh from Pk. Errors when …","Create a new sh wrapped wsh descriptor with witness script …","Create a new sh wrapped wsh sortedmulti descriptor from …","Create a new Wpkh descriptor Will return Err if …","Create a new wsh descriptor from witness script Errors …","Create a new wsh sorted multi descriptor Errors when …","A node in the Abstract Syntax Tree(","Other top level checks that are context specific","Attempt to parse a Script into Miniscript representation. …","Parse a descriptor that may contain secret keys","Attempt to parse an insane(scripts don’t clear sanity …","","","","","","Descriptor policy","Whether all spend paths of miniscript require a signature","Whether the descriptor is safe Checks whether all the …","Check whether the underlying Miniscript is safe under the …","Attempt to produce non-malleable satisfying witness for the","Attempt to produce a malleable satisfying witness for the …","Get the scriptCode of a transaction output.","Computes the scriptpubkey of the descriptor","Size, in bytes of the script-pubkey. If this Miniscript is …","","","","Descriptor templates","","","","","","","","","","","Serialize a descriptor to string with its secret keys","Check top level consensus rules.","Check whether the top-level is type B","Convert a descriptor using abstract keys to one using …","This will panic if translatefpk returns an uncompressed …","","","","","","","","","","","The correctness and malleability type information for the …","","","","","","Computes the scriptSig that will be in place for an …","","","","","","Whether the miniscript can exceed the resource …","","","","","","Compute the checksum of a descriptor","Error during base58 decoding","BIP32 error","The descriptor contains multiple keys with the same BIP32 …","Errors related to the parsing and usage of descriptors","The descriptor contains hardened derivation steps on …","Hex decoding error","Invalid character found in the descriptor checksum","The provided descriptor doesn’t match its checksum","Invalid HD Key path, such as having a wildcard but a …","Error thrown while working with keys","Miniscript error","Key-related error","Error while extracting and manipulating policies","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Absolute timeclock timestamp","Can not add to an item that is Satisfaction::None or …","Can not add to an item that is …","Options to build the satisfaction field in the policy","Can satisfy the policy item","An extra condition that must be satisfied but that is out …","Type for a map of sets of Condition items keyed by each set…","Type for a map of folded sets of Condition items keyed by …","SHA256 then RIPEMD160 preimage hash","Double SHA256 preimage hash","Incompatible conditions (not currently used)","Index out of range for an item to satisfy a …","Can not merge CSV or timelock values unless both are less …","Multi-signature public keys with threshold count","Cannot satisfy or contribute to the policy item","Don’t generate satisfaction field","Not enough items are selected to satisfy a …","Only a partial satisfaction of some kind of threshold …","Can reach the threshold of some kind of threshold policy","Raw public key or extended key fingerprint","Descriptor spending policy","Errors that can happen while extracting and manipulating …","Analyze the given PSBT to check for existing signatures","Like Psbt variant and also check for expired timelocks","Relative timelock locktime","RIPEMD160 preimage hash","Represent if and how much a policy item is satisfied by …","An item that needs to be satisfied","SHA256 preimage hash","Signature for a raw public key","Signature for an extended key fingerprint","Threshold items with threshold count","","","","","","","","","","","","","","","","","","","","","","","","","","","","How the wallet’s descriptor can satisfy this policy node","Optional CheckSequenceVerify condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the conditions that are set by the spending policy …","","","Returns a unique id for the SatisfiableItem","Identifier for this policy node","","","","","","","","","","","","","","","Returns whether the SatisfiableItem is a leaf item","Returns whether the Satisfaction is a leaf item","Returns true if there are no extra conditions to verify","Type of this policy node","","","","Return whether or not a specific path in the policy tree …","How much a given PSBT already satisfies this policy node …","","","","","","Optional timelock condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Current blockchain height","The highest confirmation height between the inputs CSV …","Given PSBT","","","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","The items that can be satisfied by the descriptor or are …","The items that can be satisfied by the descriptor","Threshold","Threshold","Total number of items","Total number of items","Whether the items are sorted in lexicographic order (used …","Whether the items are sorted in lexicographic order (used …","","","The digest value","The digest value","The digest value","The digest value","The policy items","The raw public key or extended key fingerprint","The required threshold count","The required threshold count","The timestamp value","The locktime value","","","","","","","","","","","","","","","","","","","BIP44 template. Expands to pkh(key/44'/0'/0'/{0,1}/*)","BIP44 public template. Expands to pkh(key/{0,1}/*)","BIP49 template. Expands to sh(wpkh(key/49'/0'/0'/{0,1}/*))","BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))","BIP84 template. Expands to wpkh(key/84'/0'/0'/{0,1}/*)","BIP84 public template. Expands to wpkh(key/{0,1}/*)","Trait for descriptor templates that can be built into a …","Type alias for the return type of DescriptorTemplate, …","P2PKH template. Expands to a descriptor pkh(key)","P2WPKH template. Expands to a descriptor wpkh(key)","P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))","","","","","","","","","","","","","","","","","","","Build the complete descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BIP32 error","Trait for keys that can be derived.","Container for public or secret keys","The MiniscriptKey corresponding to Descriptors. This can …","A Secret Key that can be either a single key or an Xprv","A Single Descriptor Secret Key with optional origin …","A Single Descriptor Key with optional origin information","Type specifying the amount of entropy required e.g. [u8;32]","Returned error in case of failure","Trait that adds extra useful methods to ScriptContexts","Enum for extended keys that can be either xprv or xpub","Trait that allows generating a key with the default options","Trait for keys that can be generated","Output of a GeneratableKey key generation","Trait for objects that can be turned into a public or …","The key has an invalid checksum","The key is not valid for the given network","The key cannot exist in the given script context","Errors thrown while working with keys","Alias type for a map of public key to secret key","Legacy scripts","Custom error message","Miniscript error","Extra options required by the generate_with_entropy","A private extended key, aka an xprv","Options for generating a PrivateKey","A public extended key, aka an xpub","The ScriptContext for Miniscript. Additional type …","Enum representation of the known valid ScriptContexts","Segwitv0 scripts","Single Secret Key","Single Public Key","Contents of a “sortedmulti” descriptor","Set of valid networks for a key","Xprv","Xpub","Create a set containing mainnet, testnet and regtest","Returns the ScriptContext as a ScriptContextEnum","Return the public version of this key, by applying either …","BIP-0039","","","","","","","","","","","","","","","","","","","","","","","Depending on script Context, some of the Terminals might …","Depending on script Context, some of the Terminals might …","Depending on script Context, some of the script resource …","Depending on script Context, some of the script resource …","Check the consensus + policy(if not disabled) rules that …","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","Consensus rules at the Miniscript satisfaction time. It is …","Policy rules at the Miniscript satisfaction time. It is …","Policy rules at the Miniscript satisfaction time. It is …","Check the consensus + policy(if not disabled) rules …","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","Check whether the given satisfaction is valid under the …","Check whether the given satisfaction is valid under the …","","","","","","","","","","","","","","Whether the generated key should be “compressed” or not","","","","","","","","","","","","","","","","","","","","","","","","","If this public key has a wildcard, replace it by the given …","Computes the public key corresponding to this descriptor …","","","","","","","","","","","","Encode as a Bitcoin script","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create an instance given a public key and a set of valid …","Create an instance given a secret key and a set of valid …","","","Parse an expression tree into a SortedMultiVec","Full path, from the master key","Generate a key given the options with a random entropy","Generate a key with the default options and a random …","Generate a key given the extra options and the entropy","Generate a key with the default options and a given entropy","","","","Return whether or not the key contains the private data","","","","","","","","","","","","","","","","","","","","","","","","","","Turn the key into a DescriptorKey within the requested …","Consume self and turn it into a DescriptorKey by adding …","","","","","","Consume self and turn it into an ExtendedKey","","","Consumes self and returns the key","Transform the ExtendedKey into an ExtendedPrivKey for the …","Transform the ExtendedKey into an ExtendedPubKey for the …","Whether or not the key has a wildcards","Returns whether the script context is Legacy","Returns whether the script context is …","Returns whether the script context is Segwitv0","Returns whether the script context is …","","signatures required","The key","The key","","Create a set only containing mainnet","The fingerprint of the master key associated with this key","Depending on script context, the size of a satifaction …","Maximum size, in bytes, of a satisfying witness. In …","Maximum number of witness elements used to satisfy the …","Compute the intersection of two sets","","","","Create a new instance of SortedMultiVec given a list of …","Origin information","Origin information","Other top level checks that are context specific","Other top level checks that are context specific","Override the computed set of valid networks","","","","public keys inside sorted Multi","utility function to sanity a sorted multi vec","Attempt to produce a satisfying witness for the witness …","Size, in bytes of the script-pubkey. If this Miniscript is …","Create Terminal::Multi containing sorted pubkeys","Create a set containing testnet and regtest","","","","","","","","","","","Check top level consensus rules.","Check top level consensus rules.","Check whether the top-level is type B","Check whether the top-level is type B","This will panic if translatefpk returns an uncompressed …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The English language.","Language to be used for the mnemonic phrase.","A mnemonic code.","Type for a BIP39 mnemonic with an optional passphrase","Type describing entropy length (aka word count) in the …","12 words mnemonic (128 bits entropy)","15 words mnemonic (160 bits entropy)","18 words mnemonic (192 bits entropy)","21 words mnemonic (224 bits entropy)","24 words mnemonic (256 bits entropy)","The list of supported languages. Language support is …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Create a new English Mnemonic from the given entropy. …","Create a new Mnemonic in the specified language from the …","","Generate a new Mnemonic in the given language with the …","","","","","","","","","","","","","","Get the language of the Mnemonic.","Determine the language of the mnemonic.","","Parse a mnemonic and detect the language from the enabled …","Parse a mnemonic in the given language.","Parse a mnemonic in normalized UTF8 in the given language.","Parse a mnemonic in normalized UTF8.","","","","Convert the mnemonic back to the entropy used to generate …","Convert the mnemonic back to the entropy used to generate …","","","Convert to seed bytes.","Convert to seed bytes with a passphrase in normalized UTF8.","","","","","","","","","","","","","","","Get the number of words in the mnemonic.","Get an iterator over the words.","Get words from the word list that start with the given …","The address index selection strategy to use to derived an …","A derived address and the index it was found at For …","Trait to check if a value is below the dust limit","Return the address for the current descriptor index if it …","Return a new address after incrementing the current …","Return the address for a specific descriptor index. Does …","Return the address for a specific descriptor index and …","A Bitcoin wallet","Add an address validator","Add an external signer","Address","Address validation callbacks","","","","","","","Broadcast a transaction to the network","Bump the fee of a transaction previously created with this …","Start building a transaction.","Return a reference to the internal blockchain client","Coin selection","Return an immutable reference to the internal database","","","","","","","","","","","","Wallet export","Try to finalize a PSBT","","","","","","","","Return a derived address using the external descriptor, …","Return the balance, meaning the sum of this wallet’s …","Returns the descriptor used to create addresses for a …","Return a fake wallet that appears to be funded for testing.","get the corresponding PSBT Input for a LocalUtxo","Return a single transactions made and received by the …","Returns the UTXO owned by this wallet corresponding to …","Child index of this address","","","","","","","Check whether or not a value is below dust limit","Return whether or not a script is part of this wallet …","Return the list of transactions made and received by the …","Return the list of unspent outputs of this wallet","","Get the Bitcoin network the wallet is using.","Create a new “online” wallet","Create a new “offline” wallet","Return the spending policies for the wallet’s descriptor","Return the “public” version of the wallet’s …","Return the secp256k1 context used for all signing …","Sign a transaction with all the wallet’s signers, in the …","Generalized signers","Sync the internal database with the blockchain","Cross-platform time","","","","","","","","Transaction builder","","","","","","","Deterministically generate a unique name given the …","","","Trait to build address validators","Errors that can be returned to fail the validation of an …","Network connection error","Invalid script","A custom error message","Network request timeout error","User rejected the address","","","","","","","","","","","","","","","","","","","","Validate or inspect an address","","","Branch and bound coin selection","Trait for generalized coin selection algorithms","Result of a successful coin selection","Default coin selection algorithm used by TxBuilder if not …","Simple and dumb coin selection","","","","","","","","","Perform the coin selection","","","","","","","","","","","","","","Total fee amount in satoshi","","","","","","","","","","","","","The total value of the inputs selected from the local …","Create new instance with target size for change output","List of outputs selected for use as inputs","The total value of the inputs selected.","","","","","","","","","","","","","","Structure that contains the export of a wallet","Earliest block to rescan when looking for the wallet’s …","","","Return the internal descriptor, if present","","","Return the external descriptor","","","Export a wallet","","","","","","Arbitrary label for the wallet","","","","","","","","Dummy identifier","The fingerprint of a BIP32 extended key","Input index is out of range","The private key in use has the right fingerprint but …","The non_witness_utxo specified is invalid","The fingerprint and derivation path are missing from the …","The private key is missing for the required public key","The non_witness_utxo field of the transaction is required …","The witness_script field of the transaction is required to …","The witness_utxo field of the transaction is required to …","The psbt contains a non-SIGHASH_ALL sighash in one of its …","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA …","Options for a software signer","Trait for signers","Signing error","Identifier of a signer in the SignersContainers. Used as a …","Defines the order in which signers are called","Container for multiple signers","The user canceled the operation","Adds an external signer to the container for the specified …","Whether the signer should use the sighash_type set in the …","Create a map of public keys to secret keys","Whether the wallet should assume a specific height has …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the secret key for the signer","","","","","","","","","Finds the signer with lowest ordering for a given id in …","","","","","","","","","","","","","","","","","Return the SignerId for this signer","Returns the list of identifiers of all the signers in the …","","","","","","","","","","","","","Default constructor","","","Removes a signer from the container and returns it","Sign a PSBT","Return whether or not the signer signs the whole …","Returns the list of signers in the container, sorted by …","","","","","","","Whether the signer should trust the witness_utxo, if the …","","","","","","","","","","","","","","","","","","","","","","","","Return the current timestamp in seconds","BIP69 / Lexicographic","Marker type to indicate the TxBuilder is being used to …","Use both change and non-change outputs (default)","Only use non-change outputs (see …","Policy regarding the use of change outputs when creating a …","Marker type to indicate the TxBuilder is being used to …","Only use change outputs (see TxBuilder::only_spend_change)","Randomized (default)","A transaction builder","Context in which the TxBuilder is valid","Ordering of the transaction’s inputs and outputs","Unchanged","Add data as an output, using OP_RETURN","Add a foreign UTXO i.e. a UTXO not owned by this wallet.","Fill-in the PSBT_GLOBAL_XPUB field with the extended keys …","Add a recipient to the internal list","Add a utxo to the internal list of unspendable utxos","Add a utxo to the internal list of utxos that must be spent","Add the list of outpoints to the internal list of UTXOs …","Explicitly tells the wallet that it is allowed to reduce …","","","","","","","","","","","Set a specific ChangeSpendPolicy. See …","","","","","","","","","","","","","Choose the coin selection algorithm","","","","","","","","","","","","","","","Do not spend change outputs","Sets the address to drain excess coins to.","Spend all the available inputs. This respects filters like …","","","","","","Enable signaling RBF","Enable signaling RBF with a specific nSequence value","","","Set an absolute fee","Set a custom fee rate","Finish the building the transaction.","","","","","","","","","","","","","","","Fill-in the psbt::Output::redeem_script and …","","","","","","","","","","","Only spend utxos added by add_utxo.","Use a specific nLockTime while creating the transaction","Only spend change outputs","Only Fill-in the psbt::Input::witness_utxo field when …","Choose the ordering for inputs and outputs of the …","","","Set the policy path to use while creating the transaction …","Replace the recipients already added with a new list","Sign with a specific sig hash","Sort transaction inputs and outputs by TxOrdering variant","","","","","","","","","","","","","","","","","","","","","Replace the internal list of unspendable utxos with a new …","Build a transaction with a specific version","","","","",""],"i":[1,1,0,1,1,1,1,0,1,1,1,0,1,2,0,1,1,1,3,1,1,1,2,1,1,1,1,1,1,1,1,0,3,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,2,2,4,2,0,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,2,2,4,5,6,3,7,8,2,4,5,6,3,7,8,7,0,4,7,8,4,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,0,0,2,5,7,8,1,2,4,5,6,3,7,8,2,4,5,6,3,7,8,7,4,4,1,1,2,4,5,6,3,7,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,4,5,6,3,7,8,4,4,4,4,2,5,2,5,8,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,9,9,10,11,5,0,4,5,6,3,7,8,8,3,5,4,7,6,7,2,5,7,8,4,8,2,4,5,6,3,7,8,1,7,1,2,4,5,6,3,7,8,1,2,4,5,6,3,7,8,7,3,5,1,2,4,5,6,3,7,8,6,12,7,0,1,2,4,5,6,3,7,8,0,2,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,38,39,40,41,42,43,43,44,0,0,45,0,0,44,44,0,0,0,0,0,44,46,47,44,46,47,48,44,46,47,44,46,47,0,44,46,47,44,46,47,44,46,47,0,44,0,48,44,44,46,47,45,48,44,48,48,44,44,46,47,44,46,47,0,0,0,48,48,44,46,47,44,46,47,44,46,47,44,46,47,49,46,47,44,46,47,0,0,50,51,50,51,50,51,50,51,50,51,50,51,51,50,51,50,51,51,50,51,51,50,51,50,50,50,50,51,51,51,51,50,50,50,50,50,51,50,51,51,51,50,50,51,50,51,50,51,50,51,50,51,52,53,54,55,56,57,58,0,0,0,0,58,58,58,58,58,58,58,58,0,58,58,58,0,58,58,58,59,60,59,61,62,60,63,58,59,61,62,60,63,58,62,60,63,60,63,61,61,59,59,61,62,60,63,58,59,61,62,60,63,58,60,63,59,61,62,60,63,58,60,63,62,59,61,62,60,63,58,58,59,61,62,60,63,58,58,58,58,58,58,62,62,62,61,61,59,62,61,59,59,61,62,60,63,58,59,61,62,60,63,58,61,59,60,63,63,59,62,63,61,61,60,63,62,63,60,60,63,60,63,58,59,61,62,60,63,58,59,61,62,60,63,58,59,61,62,60,63,58,59,61,62,60,63,58,64,65,66,67,68,0,0,69,70,69,70,69,70,70,69,70,69,70,70,69,70,70,69,70,69,69,70,69,69,69,69,69,70,69,70,70,70,70,69,70,70,70,70,69,70,69,70,69,70,70,69,70,71,0,0,0,71,71,71,71,71,71,71,71,71,71,72,73,71,72,73,71,72,73,72,72,72,73,71,72,73,71,72,72,73,71,72,72,73,73,71,71,72,73,71,71,71,71,71,71,71,72,73,73,73,73,73,71,72,73,71,72,72,73,72,72,72,73,72,72,72,71,73,71,72,73,71,72,73,71,72,73,71,72,73,73,74,75,76,77,78,79,80,81,82,83,84,0,0,85,0,0,0,0,0,84,86,87,86,87,86,87,88,86,87,87,84,86,86,89,86,89,86,89,86,89,86,89,86,89,86,89,86,86,87,86,87,87,86,87,88,86,86,87,86,87,85,86,88,86,88,86,88,86,88,86,88,86,88,86,88,86,88,86,86,87,86,87,88,86,88,86,88,86,88,86,0,86,86,87,89,86,89,86,89,86,89,86,89,86,89,86,87,86,87,86,87,86,87,86,87,0,0,0,90,91,92,90,91,92,0,90,91,92,0,91,90,91,93,94,92,90,91,93,94,92,91,91,90,91,90,91,90,91,90,91,90,91,90,91,90,91,90,91,93,94,92,90,91,93,94,92,93,94,92,90,91,93,94,92,91,91,93,94,92,90,90,90,90,91,91,91,91,93,94,92,92,92,92,91,91,91,91,91,91,91,91,91,90,91,93,94,92,90,91,93,94,92,91,91,91,91,93,94,93,94,92,90,91,90,91,90,91,90,91,90,91,90,91,93,90,91,93,94,92,90,91,93,94,92,90,91,93,94,92,90,91,93,94,92,95,96,97,98,99,100,101,102,103,0,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,105,0,0,0,0,0,0,0,0,0,0,105,0,0,105,105,105,105,106,107,108,105,106,107,109,108,105,106,107,109,108,108,110,106,107,110,107,110,110,106,107,110,106,107,110,110,106,107,110,106,107,0,105,106,107,109,108,105,106,107,109,108,105,106,107,109,108,105,106,107,109,109,108,105,106,107,109,108,105,105,105,108,105,106,107,109,108,108,105,106,107,109,108,0,105,108,111,105,108,105,105,106,107,109,109,108,108,105,108,105,106,107,109,108,108,105,108,108,105,108,105,106,107,109,108,108,108,108,108,108,108,108,105,108,108,105,106,107,109,108,109,105,106,107,109,108,105,106,107,109,108,108,112,105,108,109,108,108,108,108,105,108,108,110,106,107,108,105,108,105,109,105,105,105,105,105,105,105,105,105,105,105,108,110,108,105,108,105,106,107,109,108,0,108,105,108,108,108,105,105,108,105,108,109,0,105,106,107,109,108,109,109,105,109,108,105,110,110,105,108,105,106,107,109,108,105,106,107,109,108,108,105,106,107,109,108,105,105,106,107,109,108,108,113,114,115,116,117,0,118,118,118,0,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,119,120,121,122,123,124,125,126,127,128,128,0,129,0,0,0,127,127,128,128,128,127,129,130,128,129,129,0,0,0,130,130,127,127,0,0,127,127,127,127,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,130,131,127,129,132,133,130,133,132,133,131,133,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,128,130,133,128,131,127,129,132,133,128,128,130,131,127,129,129,132,132,133,128,130,132,133,133,127,132,131,127,129,132,133,128,130,131,127,129,132,133,128,130,127,129,133,132,133,128,133,132,132,131,127,129,132,133,133,131,127,129,132,133,130,128,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,128,130,131,127,129,132,133,128,130,134,135,135,135,136,137,138,139,140,139,140,139,140,139,140,139,140,141,142,143,144,145,146,147,148,148,147,149,150,151,152,153,154,155,156,157,158,159,154,155,156,157,158,159,155,157,159,0,0,0,0,0,0,0,0,0,0,0,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,160,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,151,152,153,154,155,156,157,158,159,161,0,0,0,0,0,0,162,162,0,0,0,0,0,0,161,161,161,0,0,163,161,161,162,164,0,164,0,0,163,165,166,0,0,165,166,0,167,165,0,164,168,169,166,170,171,165,172,163,173,161,164,168,169,166,170,171,165,172,163,173,161,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,169,166,170,163,173,169,166,170,163,173,169,166,170,173,173,164,168,168,169,166,170,171,165,172,163,173,161,164,168,169,166,170,171,165,172,163,173,161,166,166,164,168,169,166,170,171,165,172,163,173,161,169,169,166,170,163,169,169,166,166,170,171,165,165,172,163,173,161,161,169,164,164,164,168,169,166,170,171,165,172,163,173,161,161,161,172,172,166,165,169,166,162,174,162,174,169,166,170,164,169,166,170,164,168,169,166,170,171,165,172,163,173,161,164,168,169,166,170,171,165,172,163,173,161,175,176,168,168,166,165,172,176,164,168,168,164,164,166,167,163,167,163,166,169,170,171,169,0,166,110,169,169,0,169,166,170,169,170,171,110,110,172,169,166,170,169,169,169,169,169,0,169,166,170,163,173,166,169,166,165,161,110,110,110,110,169,164,168,169,166,170,171,165,172,163,173,161,164,168,169,166,170,171,165,172,163,173,161,164,168,169,166,170,171,165,172,163,173,161,164,168,169,166,170,171,165,172,163,173,161,177,178,179,180,181,182,183,184,185,186,0,0,0,0,187,187,187,187,187,186,186,188,187,186,188,187,186,188,186,188,186,188,186,188,187,186,188,187,188,186,188,187,186,188,186,186,188,188,186,188,187,188,188,188,188,188,186,188,186,188,186,188,187,186,188,187,188,188,188,188,188,188,188,188,188,186,188,188,188,188,186,188,188,188,186,188,186,188,187,186,188,187,186,188,187,186,188,187,188,188,186,0,0,0,189,189,189,189,0,190,190,191,0,190,189,191,190,189,191,190,190,190,190,0,190,190,189,191,191,190,189,191,190,189,191,191,0,190,190,189,191,191,190,189,191,190,190,190,0,190,190,190,191,190,189,191,190,189,191,192,190,190,190,191,190,190,190,190,190,190,190,0,190,0,191,190,189,191,190,189,191,0,190,189,191,190,189,191,0,193,194,0,0,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,196,195,197,0,0,0,0,0,198,199,200,198,199,200,199,199,201,199,200,199,200,198,199,200,198,199,200,198,199,200,198,198,199,200,198,199,200,198,199,200,198,199,200,198,200,198,198,199,198,199,200,198,199,200,198,199,200,198,199,200,0,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,203,204,204,205,205,205,205,205,205,205,205,205,204,0,0,0,0,0,0,205,206,207,206,207,204,205,203,206,207,204,205,203,206,207,204,205,203,206,207,204,205,203,206,207,204,203,203,206,207,204,205,203,206,207,204,205,203,206,207,208,204,205,203,206,207,204,205,203,206,204,205,205,203,206,207,204,204,204,205,203,206,206,207,204,204,208,206,204,205,203,206,207,204,205,203,206,207,204,203,206,204,203,206,208,208,206,204,205,203,206,207,205,207,204,205,203,206,207,204,205,203,206,207,204,205,203,206,207,204,205,203,206,207,209,210,211,0,212,0,213,213,0,0,213,212,0,0,0,212,214,214,214,214,214,214,214,214,215,216,214,212,213,215,216,214,212,213,214,215,216,214,212,213,215,216,214,212,213,212,213,214,215,216,212,213,215,216,214,212,213,215,216,214,212,213,214,214,214,215,216,214,212,213,214,214,212,213,214,214,214,215,216,214,212,213,215,216,214,212,213,212,213,212,213,214,215,216,214,212,213,215,216,214,212,213,214,214,214,214,214,212,213,214,214,214,212,215,216,214,212,213,215,216,214,212,213,215,216,214,212,213,215,216,214,212,213,214,214,215,216,214,212,213],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["u8",15]],[[]],[[],["f32",15]],[[],["usize",15]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4,[["vec",3,[["u5",3],["global",3]]]]]],[[],["keychainkind",4]],[[],["feerate",3]],[[],["localutxo",3]],[[],["weightedutxo",3]],[[],["utxo",4]],[[],["transactiondetails",3]],[[],["blocktime",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[]],[[],["transactiondetails",3]],[[],["blocktime",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["keychainkind",4]],["bool",15]],[[["feerate",3]],["bool",15]],[[["localutxo",3]],["bool",15]],[[["weightedutxo",3]],["bool",15]],[[["utxo",4]],["bool",15]],[[["transactiondetails",3]],["bool",15]],[[["blocktime",3]],["bool",15]],null,[[["usize",15]],["u64",15]],[[["usize",15]],["u64",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],null,[[["error",4]]],[[["esploraerror",4]]],[[["error",4]]],[[["compactfilterserror",4]]],[[["error",4]]],[[["error",4]]],[[]],[[["keyerror",4]],["error",4]],[[["error",3]]],[[["error",4]]],[[["addressvalidatorerror",4]]],[[["error",4]]],[[["error",4]]],[[["psbtparseerror",4]]],[[["policyerror",4]]],[[["error",4]]],[[["signererror",4]]],[[["error",4]]],[[["error",4]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["f32",15]]],[[["f32",15]]],[[["u64",15],["usize",15]],["feerate",3]],[[["u64",15],["usize",15]],["feerate",3]],[[],["u64",15]],[[],["u64",15]],[[]],[[]],null,[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["option",4,[["keysource",6]]],["derivationpath",3]],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["extendedkey",4],["keyerror",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["descriptorerror",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["descriptorerror",4]]]],null,null,[[["feerate",3]],["bool",15]],[[["localutxo",3]],["bool",15]],[[["weightedutxo",3]],["bool",15]],[[["utxo",4]],["bool",15]],[[["transactiondetails",3]],["bool",15]],[[["blocktime",3]],["bool",15]],[[["option",4,[["u32",15]]],["option",4,[["u64",15]]]],["option",4]],[[],["outpoint",3]],null,[[["feerate",3]],["option",4,[["ordering",4]]]],null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["feerate",3]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[],["txout",3]],null,[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,[[],["usize",15]],null,[[],["str",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[],["result",4]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],["result",4,[["error",4]]]],[[],["capability",4]],[[],["noopprogress",3]],[[],["logprogress",3]],[[]],[[]],[[]],null,[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],null,[[["capability",4]],["bool",15]],null,[[["usize",15]],["result",4,[["feerate",3],["error",4]]]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[],["result",4,[["error",4]]]],[[],["hashset",3,[["capability",4]]]],[[],["u64",15]],[[],["result",4,[["u32",15],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[],["logprogress",3]],[[],["noopprogress",3]],[[]],[[["progress",8]],["result",4,[["error",4]]]],[[["progress",8]],["result",4,[["error",4]]]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[["f32",15],["option",4,[["string",3]]]],["result",4,[["error",4]]]],[[["f32",15],["option",4,[["string",3]]]],["result",4,[["error",4]]]],[[["f32",15],["option",4,[["string",3]]]],["result",4,[["error",4]]]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[["transaction",3]],["result",4,[["error",4]]]],[[],["anyblockchainconfig",4]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["anyblockchainconfig",4]],["bool",15]],[[["usize",15]],["result",4,[["feerate",3],["error",4]]]],[[["formatter",3]],["result",6]],[[["esplorablockchain",3]]],[[["compactfiltersblockchain",3]]],[[]],[[["electrumblockchain",3]]],[[["electrumblockchainconfig",3]]],[[]],[[["esplorablockchainconfig",3]]],[[["compactfiltersblockchainconfig",3]]],[[],["result",4,[["error",4]]]],[[],["hashset",3,[["capability",4]]]],[[],["result",4,[["u32",15],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[["anyblockchainconfig",4]],["bool",15]],[[],["result",4]],[[["progress",8]],["result",4,[["error",4]]]],[[["progress",8]],["result",4,[["error",4]]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["transaction",3]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],["result",4,[["error",4]]]],[[],["bitcoinpeerconfig",3]],[[],["compactfiltersblockchainconfig",3]],[[]],[[]],[[["tosocketaddrs",8],["arc",3,[["mempool",3]]],["network",4]],["result",4,[["compactfilterserror",4]]]],[[["totargetaddr",8],["tosocketaddrs",8],["option",4],["arc",3,[["mempool",3]]],["network",4]],["result",4,[["compactfilterserror",4]]]],[[],["mempool",3]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["bitcoinpeerconfig",3]],["bool",15]],[[["compactfiltersblockchainconfig",3]],["bool",15]],[[["usize",15]],["result",4,[["feerate",3],["error",4]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[["error",4]]],[[["systemtimeerror",3]]],[[["error",4]]],[[["error",3]]],[[]],[[["error",3]]],[[],["result",4,[["error",4]]]],[[],["hashset",3,[["capability",4]]]],[[],["result",4,[["u32",15],["error",4]]]],[[],["arc",3,[["mempool",3]]]],[[],["network",4]],[[["inventory",4]],["option",4,[["transaction",3]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[],["versionmessage",3]],[[["txid",3]],["bool",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["bool",15]],[[],["vec",3,[["transaction",3]]]],[[["bitcoinpeerconfig",3]],["bool",15]],[[["compactfiltersblockchainconfig",3]],["bool",15]],null,[[]],[[["vec",3,[["peer",3]]],["asref",8,[["path",3]]],["option",4,[["usize",15]]]],["result",4,[["compactfilterserror",4]]]],null,[[["str",15],["option",4,[["duration",3]]]],["result",4,[["option",4,[["networkmessage",4]]],["compactfilterserror",4]]]],[[["networkmessage",4]],["result",4,[["compactfilterserror",4]]]],[[],["result",4]],[[],["result",4]],[[["progress",8]],["result",4,[["error",4]]]],null,null,null,null,[[]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[["transaction",3]],["result",4,[["error",4]]]],[[],["electrumblockchainconfig",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["electrumblockchainconfig",3]],["bool",15]],[[["usize",15]],["result",4,[["feerate",3],["error",4]]]],[[["formatter",3]],["result",6]],[[["client",3]]],[[]],[[]],[[],["result",4,[["error",4]]]],[[],["hashset",3,[["capability",4]]]],[[],["result",4,[["u32",15],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[["electrumblockchainconfig",3]],["bool",15]],null,[[],["result",4]],[[["progress",8]],["result",4,[["error",4]]]],null,null,null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],null,[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],["result",4,[["error",4]]]],[[],["esplorablockchainconfig",3]],[[]],null,[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["esplorablockchainconfig",3]],["bool",15]],[[["usize",15]],["result",4,[["feerate",3],["error",4]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[["error",3]]],[[["error",4]]],[[["parseinterror",3]]],[[["error",4]]],[[["error",4]]],[[]],[[["transport",3]]],[[]],[[],["result",4,[["error",4]]]],[[],["hashset",3,[["capability",4]]]],[[],["result",4,[["u32",15],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[["esplorablockchainconfig",3]],["bool",15]],[[["str",15],["usize",15]]],[[["string",3],["usize",15]]],null,[[],["result",4]],[[["progress",8]],["result",4,[["error",4]]]],null,null,[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[["agent",3]]],[[["u8",15]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],null,[[]],[[]],[[]],[[]],[[["keychainkind",4],["asref",8]],["result",4,[["error",4]]]],[[["keychainkind",4],["asref",8]],["result",4,[["error",4]]]],[[],["synctime",3]],[[]],[[],["result",4,[["error",4]]]],[[],["result",4,[["error",4]]]],null,[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[],["result",4,[["error",4]]]],[[],["result",4,[["error",4]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[],["result",4,[["error",4]]]],[[],["result",4,[["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["u32",15],["error",4]]]],[[["keychainkind",4]],["result",4,[["u32",15],["error",4]]]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[],["result",4,[["vec",3,[["transaction",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["transaction",3]]],["error",4]]]],[[["option",4,[["keychainkind",4]]]],["result",4,[["vec",3,[["script",3]]],["error",4]]]],[[["option",4,[["keychainkind",4]]]],["result",4,[["vec",3,[["script",3]]],["error",4]]]],[[["bool",15]],["result",4,[["vec",3,[["transactiondetails",3]]],["error",4]]]],[[["bool",15]],["result",4,[["vec",3,[["transactiondetails",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["localutxo",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["localutxo",3]]],["error",4]]]],null,[[["string",3]]],null,[[],["result",4]],[[["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["transaction",3]],["result",4,[["error",4]]]],[[["transaction",3]],["result",4,[["error",4]]]],[[["script",3],["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["script",3],["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["synctime",3]],["result",4,[["error",4]]]],[[["synctime",3]],["result",4,[["error",4]]]],[[["transactiondetails",3]],["result",4,[["error",4]]]],[[["transactiondetails",3]],["result",4,[["error",4]]]],[[["localutxo",3]],["result",4,[["error",4]]]],[[["localutxo",3]],["result",4,[["error",4]]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["keychainkind",4],["asref",8]],["result",4,[["error",4]]]],[[],["result",4,[["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4,[["error",4]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["memorydatabase",3]]],[[["sqlitedatabase",3]]],[[]],[[["tree",3]]],[[]],[[]],[[]],[[["sleddbconfiguration",3]]],[[["sqlitedbconfiguration",3]]],[[]],[[],["result",4,[["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["u32",15],["error",4]]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[],["result",4,[["vec",3,[["transaction",3]]],["error",4]]]],[[["option",4,[["keychainkind",4]]]],["result",4,[["vec",3,[["script",3]]],["error",4]]]],[[["bool",15]],["result",4,[["vec",3,[["transactiondetails",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["localutxo",3]]],["error",4]]]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["transaction",3]],["result",4,[["error",4]]]],[[["transaction",3]],["result",4,[["error",4]]]],[[["script",3],["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["script",3],["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["synctime",3]],["result",4,[["error",4]]]],[[["synctime",3]],["result",4,[["error",4]]]],[[["transactiondetails",3]],["result",4,[["error",4]]]],[[["transactiondetails",3]],["result",4,[["error",4]]]],[[["localutxo",3]],["result",4,[["error",4]]]],[[["localutxo",3]],["result",4,[["error",4]]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[["keychainkind",4],["asref",8]],["result",4,[["error",4]]]],[[],["result",4,[["error",4]]]],[[],["memorydatabase",3]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4,[["error",4]]]],[[["formatter",3]],["result",6]],[[]],[[],["result",4,[["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["u32",15]]],["error",4]]]],[[["script",3]],["result",4,[["option",4],["error",4]]]],[[["txid",3]],["result",4,[["option",4,[["transaction",3]]],["error",4]]]],[[["keychainkind",4],["u32",15]],["result",4,[["option",4,[["script",3]]],["error",4]]]],[[],["result",4,[["option",4,[["synctime",3]]],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["u32",15],["error",4]]]],[[],["usize",15]],[[]],[[],["result",4,[["vec",3,[["transaction",3]]],["error",4]]]],[[["option",4,[["keychainkind",4]]]],["result",4,[["vec",3,[["script",3]]],["error",4]]]],[[["bool",15]],["result",4,[["vec",3,[["transactiondetails",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["localutxo",3]]],["error",4]]]],[[]],[[["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["transaction",3]],["result",4,[["error",4]]]],[[["script",3],["keychainkind",4],["u32",15]],["result",4,[["error",4]]]],[[["synctime",3]],["result",4,[["error",4]]]],[[["transactiondetails",3]],["result",4,[["error",4]]]],[[["localutxo",3]],["result",4,[["error",4]]]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["network",4]],["result",4,[["address",3],["error",4]]]],[[],["scriptcontextenum",4]],[[],["scriptcontextenum",4]],[[],["terminal",4]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["vec",3,[["miniscript",3],["global",3]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["terminal",4]],["result",4,[["scriptcontexterror",4]]]],[[["terminal",4]],["result",4,[["scriptcontexterror",4]]]],[[["terminal",4]],["result",4,[["scriptcontexterror",4]]]],[[],["result",4,[["scriptcontexterror",4]]]],[[],["result",4,[["scriptcontexterror",4]]]],[[],["result",4,[["scriptcontexterror",4]]]],null,[[],["descriptor",4]],[[],["legacy",4]],[[],["segwitv0",4]],[[],["deriveddescriptorkey",3]],[[],["miniscript",3]],[[]],[[]],[[]],[[]],[[]],[[["descriptor",4]],["ordering",4]],[[["legacy",4]],["ordering",4]],[[["segwitv0",4]],["ordering",4]],[[],["ordering",4]],[[["miniscript",3]],["ordering",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["u32",15]],["descriptor",4,[["descriptorpublickey",4]]]],[[],["descriptortype",4]],[[],["result",4,[["descriptor",4]]]],[[],["result",4,[["miniscript",3]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["script",3]],[[["descriptor",4]],["bool",15]],[[["legacy",4]],["bool",15]],[[["segwitv0",4]],["bool",15]],[[],["bool",15]],[[["miniscript",3]],["bool",15]],null,[[],["script",3]],null,[[["signerscontainer",3],["buildsatisfaction",4],["secp256k1",3]],["result",4,[["option",4,[["policy",3]]],["descriptorerror",4]]]],[[["signerscontainer",3],["buildsatisfaction",4],["secp256k1",3]],["result",4,[["option",4,[["policy",3]]],["error",4]]]],[[["signerscontainer",3],["buildsatisfaction",4],["secp256k1",3]],["result",4,[["option",4,[["policy",3]]],["error",4]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[],["bool",15]],[[],["bool",15]],[[]],[[]],[[]],[[]],[[]],[[["terminal",4]],["result",4,[["miniscript",3],["error",4]]]],[[["str",15]],["result",4,[["descriptor",4],["error",4]]]],[[["str",15]],["result",4,[["miniscript",3],["error",4]]]],[[["str",15]],["result",4,[["miniscript",3],["error",4]]]],[[["tree",3]],["result",4,[["descriptor",4],["error",4]]]],[[["tree",3]],["result",4,[["miniscript",3],["error",4]]]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["vec",3,[["global",3]]]],[[],["vec",3,[["pkpkh",4],["global",3]]]],[[],["vec",3,[["global",3]]]],[[["usize",15]],["option",4,[["miniscript",3]]]],[[["usize",15]],["option",4]],[[["usize",15]],["option",4,[["pkpkh",4]]]],[[["usize",15]],["option",4]],[[],["result",4,[["error",4]]]],[[],["bool",15]],[[],["bool",15]],[[]],[[]],[[]],[[]],[[]],[[],["hash",3]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[],["terminal",4]],[[["secp256k1",3],["network",4]],["result",4,[["descriptorerror",4]]]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["iter",3]],[[],["pkiter",3]],[[],["pkpkhiter",3]],[[],["pkhiter",3]],[[],["result",4,[["policy",4],["error",4]]]],[[],["result",4,[["policy",4],["error",4]]]],[[],["result",4,[["lifterror",4]]]],[[["miniscript",3]],["option",4,[["usize",15]]]],[[["miniscript",3]],["option",4,[["usize",15]]]],[[["miniscript",3]],["option",4,[["usize",15]]]],[[],["result",4,[["usize",15],["error",4]]]],[[],["result",4,[["usize",15],["error",4]]]],[[],["result",4,[["usize",15],["error",4]]]],[[["descriptor",4]],["bool",15]],[[["descriptorpublickey",4],["secp256k1",3]],["deriveddescriptorkey",3]],[[["miniscript",3,[["barectx",4]]]],["result",4,[["descriptor",4],["error",4]]]],[[],["descriptor",4]],[[],["descriptor",4]],[[["miniscript",3,[["legacy",4]]]],["result",4,[["descriptor",4],["error",4]]]],[[["usize",15],["vec",3,[["global",3]]]],["result",4,[["descriptor",4],["error",4]]]],[[],["result",4,[["descriptor",4],["error",4]]]],[[["miniscript",3,[["segwitv0",4]]]],["result",4,[["descriptor",4],["error",4]]]],[[["usize",15],["vec",3,[["global",3]]]],["result",4,[["descriptor",4],["error",4]]]],[[],["result",4,[["descriptor",4],["error",4]]]],[[["miniscript",3,[["segwitv0",4]]]],["result",4,[["descriptor",4],["error",4]]]],[[["usize",15],["vec",3,[["global",3]]]],["result",4,[["descriptor",4],["error",4]]]],null,[[["miniscript",3]],["result",4,[["error",4]]]],[[["script",3]],["result",4,[["miniscript",3,[["publickey",3]]],["error",4]]]],[[["secp256k1",3],["str",15]],["result",4,[["error",4]]]],[[["script",3]],["result",4,[["miniscript",3,[["publickey",3]]],["error",4]]]],[[["descriptor",4]],["option",4,[["ordering",4]]]],[[["legacy",4]],["option",4,[["ordering",4]]]],[[["segwitv0",4]],["option",4,[["ordering",4]]]],[[],["option",4,[["ordering",4]]]],[[["miniscript",3]],["option",4,[["ordering",4]]]],null,[[],["bool",15]],[[],["result",4,[["error",4]]]],[[],["result",4,[["analysiserror",4]]]],[[],["result",4,[["vec",3,[["vec",3,[["u8",15],["global",3]]],["global",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["vec",3,[["u8",15],["global",3]]],["global",3]]],["error",4]]]],[[],["script",3]],[[],["script",3]],[[],["usize",15]],[[],["result",4]],[[],["result",4]],[[],["usize",15]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["publickey",3]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[["hashmap",3]],["string",3]],[[["miniscript",3]],["result",4,[["error",4]]]],[[["miniscript",3]],["result",4,[["error",4]]]],[[],["result",4,[["descriptor",4]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["script",3]],[[]],[[]],[[]],[[]],[[]],[[],["bool",15]],null,null,null,null,null,[[["str",15]],["result",4,[["string",3],["descriptorerror",4]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["error",4]]],[[["policyerror",4]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["error",4]]],[[["keyerror",4]],["error",4]],[[]],[[],["usize",15]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["pkorf",3]],[[],["satisfiableitem",4]],[[],["satisfaction",4]],[[],["policy",3]],[[],["condition",3]],[[],["buildsatisfaction",4]],[[]],[[]],[[]],[[]],[[]],[[]],[[["condition",3]],["ordering",4]],null,null,[[],["pkorf",3]],[[],["condition",3]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["condition",3]],["bool",15]],[[["policyerror",4]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[["bool",15]]],[[["satisfiableitem",4]]],[[]],[[]],[[]],[[]],[[["btreemap",3]],["result",4,[["condition",3],["policyerror",4]]]],[[],["u64",15]],[[]],[[],["string",3]],null,[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],null,[[["condition",3]],["bool",15]],[[["policyerror",4]],["bool",15]],[[["condition",3]],["option",4,[["ordering",4]]]],[[],["bool",15]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[],["result",4,[["descriptortemplateout",6],["descriptorerror",4]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[["secp256k1",3],["network",4]],["result",4,[["error",4]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["validnetworks",6]],[[],["scriptcontextenum",4]],[[["secp256k1",3]],["result",4,[["descriptorpublickey",4],["descriptorkeyparseerror",3]]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["miniscript",3]],["result",4,[["scriptcontexterror",4]]]],[[["terminal",4]],["result",4,[["scriptcontexterror",4]]]],[[],["result",4,[["scriptcontexterror",4]]]],[[],["result",4,[["scriptcontexterror",4]]]],[[],["sortedmultivec",3]],[[],["descriptorpublickey",4]],[[],["descriptorsinglepub",3]],[[],["scriptcontextenum",4]],[[],["privatekeygenerateoptions",3]],[[]],[[]],[[]],[[]],[[]],[[["sortedmultivec",3]],["ordering",4]],[[["descriptorpublickey",4]],["ordering",4]],[[["descriptorsinglepub",3]],["ordering",4]],null,[[]],[[["usize",15]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["u32",15]],["descriptorpublickey",4]],[[["secp256k1",3]],["result",4,[["publickey",3],["conversionerror",4]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["script",3]],[[["sortedmultivec",3]],["bool",15]],[[["descriptorpublickey",4]],["bool",15]],[[["descriptorsinglepub",3]],["bool",15]],[[["scriptcontextenum",4]],["bool",15]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[],["bool",15]],[[["extendedpubkey",3]]],[[]],[[["extendedprivkey",3]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["error",4]]],[[]],[[["error",4]]],[[["descriptorpublickey",4],["validnetworks",6]]],[[["descriptorsecretkey",4],["validnetworks",6]]],[[["str",15]],["result",4,[["descriptorpublickey",4]]]],[[["str",15]],["result",4,[["descriptorsecretkey",4]]]],[[["tree",3]],["result",4,[["sortedmultivec",3],["error",4]]]],[[],["derivationpath",3]],[[],["result",4,[["generatedkey",3]]]],[[],["result",4,[["generatedkey",3]]]],[[],["result",4,[["generatedkey",3]]]],[[],["result",4,[["generatedkey",3]]]],[[],["u64",15]],[[],["u64",15]],[[],["u64",15]],[[],["bool",15]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[["option",4,[["keysource",6]]],["derivationpath",3]],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[["option",4,[["keysource",6]]],["derivationpath",3]],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["extendedkey",4],["keyerror",4]]]],[[],["result",4,[["extendedkey",4],["keyerror",4]]]],[[],["result",4,[["extendedkey",4],["keyerror",4]]]],[[]],[[["network",4]],["option",4,[["extendedprivkey",3]]]],[[["network",4],["secp256k1",3]],["extendedpubkey",3]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],null,null,null,[[],["result",4,[["policy",4],["error",4]]]],[[],["validnetworks",6]],[[],["fingerprint",3]],[[["miniscript",3]],["option",4,[["usize",15]]]],[[],["usize",15]],[[],["usize",15]],[[["validnetworks",6],["validnetworks",6]],["validnetworks",6]],[[["sortedmultivec",3]],["bool",15]],[[["descriptorpublickey",4]],["bool",15]],[[["descriptorsinglepub",3]],["bool",15]],[[["usize",15],["vec",3,[["global",3]]]],["result",4,[["sortedmultivec",3],["error",4]]]],null,null,[[["miniscript",3]],["result",4,[["error",4]]]],[[["miniscript",3]],["result",4,[["error",4]]]],[[["validnetworks",6]]],[[["sortedmultivec",3]],["option",4,[["ordering",4]]]],[[["descriptorpublickey",4]],["option",4,[["ordering",4]]]],[[["descriptorsinglepub",3]],["option",4,[["ordering",4]]]],null,[[],["result",4,[["error",4]]]],[[],["result",4,[["vec",3,[["vec",3,[["u8",15],["global",3]]],["global",3]]],["error",4]]]],[[],["usize",15]],[[],["terminal",4]],[[],["validnetworks",6]],[[]],[[]],[[]],[[]],[[]],[[],["descriptorpublickey",4]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[["miniscript",3]],["result",4,[["error",4]]]],[[["miniscript",3]],["result",4,[["error",4]]]],[[["miniscript",3]],["result",4,[["error",4]]]],[[["miniscript",3]],["result",4,[["error",4]]]],[[],["result",4,[["sortedmultivec",3]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["language",4]],[[],["mnemonic",3]],[[]],[[]],[[["language",4]],["ordering",4]],[[["mnemonic",3]],["ordering",4]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["result",4,[["mnemonic",3]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["language",4]],["bool",15]],[[["mnemonic",3]],["bool",15]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[["formatter",3]],["result",4,[["error",3]]]],[[]],[[]],[[]],[[],["result",4,[["mnemonic",3],["error",4]]]],[[["language",4]],["result",4,[["mnemonic",3],["error",4]]]],[[["str",15]],["result",4,[["mnemonic",3],["error",4]]]],[[["language",4],["usize",15]],["result",4,[["mnemonic",3],["error",4]]]],[[],["result",4,[["generatedkey",3]]]],[[],["u64",15]],[[],["u64",15]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[["option",4,[["keysource",6]]],["derivationpath",3]],["result",4,[["descriptorkey",4],["keyerror",4]]]],[[],["result",4,[["extendedkey",4],["keyerror",4]]]],[[],["language",4]],[[],["result",4,[["language",4],["error",4]]]],[[["mnemonic",3]],["bool",15]],[[],["result",4,[["mnemonic",3],["error",4]]]],[[["language",4]],["result",4,[["mnemonic",3],["error",4]]]],[[["language",4],["str",15]],["result",4,[["mnemonic",3],["error",4]]]],[[["str",15]],["result",4,[["mnemonic",3],["error",4]]]],[[["language",4]],["option",4,[["ordering",4]]]],[[["mnemonic",3]],["option",4,[["ordering",4]]]],[[],["result",4]],[[],["vec",3,[["u8",15],["global",3]]]],[[]],[[]],[[]],[[]],[[["str",15]]],[[],["string",3]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[],["usize",15]],[[]],[[["str",15]]],null,null,null,null,null,null,null,null,[[["arc",3,[["addressvalidator",8]]]]],[[["keychainkind",4],["signerordering",3],["arc",3,[["signer",8]]]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[["transaction",3]],["result",4,[["txid",3],["error",4]]]],[[["txid",3]],["result",4,[["txbuilder",3,[["defaultcoinselectionalgorithm",6],["bumpfee",3]]],["error",4]]]],[[],["txbuilder",3,[["defaultcoinselectionalgorithm",6],["createtx",3]]]],[[]],null,[[]],[[["usize",15]]],[[["usize",15]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["addressinfo",3]],["bool",15]],null,[[["psbt",3],["signoptions",3]],["result",4,[["bool",15],["error",4]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[["addressindex",4]],["result",4,[["addressinfo",3],["error",4]]]],[[],["result",4,[["u64",15],["error",4]]]],[[["keychainkind",4]],["extendeddescriptor",6]],[[["str",15]]],[[["localutxo",3],["option",4,[["sighashtype",4]]],["bool",15]],["result",4,[["input",3],["error",4]]]],[[["txid",3],["bool",15]],["result",4,[["option",4,[["transactiondetails",3]]],["error",4]]]],[[["outpoint",3]],["result",4,[["option",4,[["localutxo",3]]],["error",4]]]],null,[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[],["bool",15]],[[["script",3]],["result",4,[["bool",15],["error",4]]]],[[["bool",15]],["result",4,[["vec",3,[["transactiondetails",3]]],["error",4]]]],[[],["result",4,[["vec",3,[["localutxo",3]]],["error",4]]]],[[["addressinfo",3]],["bool",15]],[[],["network",4]],[[["intowalletdescriptor",8],["option",4,[["intowalletdescriptor",8]]],["network",4]],["result",4,[["error",4]]]],[[["intowalletdescriptor",8],["option",4,[["intowalletdescriptor",8]]],["network",4]],["result",4,[["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["policy",3]]],["error",4]]]],[[["keychainkind",4]],["result",4,[["option",4,[["extendeddescriptor",6]]],["error",4]]]],[[],["secp256k1",3]],[[["psbt",3],["signoptions",3]],["result",4,[["bool",15],["error",4]]]],null,[[["progress",8],["option",4,[["u32",15]]]],["result",4,[["error",4]]]],null,[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[["option",4],["network",4],["secp256k1",3]],["result",4,[["string",3],["error",4]]]],null,null,null,null,null,null,null,null,null,[[]],[[]],[[],["addressvalidatorerror",4]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["addressvalidatorerror",4]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[],["usize",15]],[[]],[[["addressvalidatorerror",4]],["bool",15]],[[]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[["keychainkind",4],["hdkeypaths",6],["script",3]],["result",4,[["addressvalidatorerror",4]]]],[[]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["largestfirstcoinselection",3]],[[]],[[["vec",3,[["weightedutxo",3]]],["vec",3,[["weightedutxo",3]]],["feerate",3],["u64",15],["u64",15]],["result",4,[["coinselectionresult",3],["error",4]]]],[[["vec",3,[["weightedutxo",3]]],["vec",3,[["weightedutxo",3]]],["feerate",3],["u64",15],["u64",15]],["result",4,[["coinselectionresult",3],["error",4]]]],[[["vec",3,[["weightedutxo",3]]],["vec",3,[["weightedutxo",3]]],["feerate",3],["u64",15],["u64",15]],["result",4,[["coinselectionresult",3],["error",4]]]],[[],["largestfirstcoinselection",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],null,[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[],["u64",15]],[[["u64",15]]],null,[[],["u64",15]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,[[]],[[]],[[],["option",4,[["string",3]]]],[[["usize",15]]],[[["usize",15]]],[[],["string",3]],[[],["result",4]],[[["usize",15]]],[[["wallet",3],["str",15],["bool",15]],["result",4,[["str",15]]]],[[["formatter",3]],["result",6]],[[]],[[["str",15]],["result",4]],[[],["usize",15]],[[]],null,[[],["result",4]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["signerid",4],["signerordering",3],["arc",3,[["signer",8]]]],["option",4,[["arc",3,[["signer",8]]]]]],null,[[["secp256k1",3]],["keymap",6]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["signerid",4]],[[],["signererror",4]],[[],["signerordering",3]],[[],["signerscontainer",3]],[[],["signoptions",3]],[[]],[[]],[[]],[[]],[[]],[[["signerid",4]],["ordering",4]],[[["signerordering",3]],["ordering",4]],[[]],[[],["signerscontainer",3]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[],["option",4,[["descriptorsecretkey",4]]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["signerid",4]],["bool",15]],[[["signererror",4]],["bool",15]],[[["signerordering",3]],["bool",15]],[[["signerid",4]],["option",4,[["arc",3]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["fingerprint",3]],["signerid",4]],[[]],[[["hash",3]],["signerid",4]],[[]],[[]],[[]],[[["keymap",6]],["signerscontainer",3]],[[]],[[],["u64",15]],[[]],[[["secp256k1",3]],["signerid",4]],[[],["vec",3,[["signerid",4]]]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[["signerid",4]],["bool",15]],[[["signerordering",3]],["bool",15]],[[]],[[["signerid",4]],["option",4,[["ordering",4]]]],[[["signerordering",3]],["option",4,[["ordering",4]]]],[[["signerid",4],["signerordering",3]],["option",4,[["arc",3,[["signer",8]]]]]],[[["partiallysignedtransaction",3],["option",4,[["usize",15]]],["secp256k1",3]],["result",4,[["signererror",4]]]],[[],["bool",15]],[[],["vec",3,[["arc",3]]]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[],["u64",15]],null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[["outpoint",3],["input",3],["usize",15]],["result",4,[["error",4]]]],[[]],[[["script",3],["u64",15]]],[[["outpoint",3]]],[[["outpoint",3]],["result",4,[["error",4]]]],[[],["result",4,[["error",4]]]],[[["script",3]],["result",4,[["error",4]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["changespendpolicy",4]]],[[],["createtx",3]],[[],["bumpfee",3]],[[]],[[],["txordering",4]],[[],["changespendpolicy",4]],[[]],[[]],[[]],[[]],[[]],[[["txordering",4]],["ordering",4]],[[["changespendpolicy",4]],["ordering",4]],[[["coinselectionalgorithm",8]],["txbuilder",3,[["coinselectionalgorithm",8]]]],[[],["createtx",3]],[[],["bumpfee",3]],[[]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[["script",3]]],[[]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[["usize",15]]],[[]],[[["u32",15]]],[[["txordering",4]],["bool",15]],[[["changespendpolicy",4]],["bool",15]],[[["u64",15]]],[[["feerate",3]]],[[],["result",4,[["error",4]]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[],["u64",15]],[[],["u64",15]],[[]],[[]],[[]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[],["usize",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[["u32",15]]],[[]],[[]],[[["txordering",4]]],[[["txordering",4]],["option",4,[["ordering",4]]]],[[["changespendpolicy",4]],["option",4,[["ordering",4]]]],[[["btreemap",3,[["string",3],["vec",3,[["usize",15]]]]],["keychainkind",4]]],[[["vec",3]]],[[["sighashtype",4]]],[[["transaction",3]]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[["vec",3,[["outpoint",3]]]]],[[["i32",15]]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"Error"],[4,"KeychainKind"],[4,"Utxo"],[3,"FeeRate"],[3,"LocalUtxo"],[3,"WeightedUtxo"],[3,"TransactionDetails"],[3,"BlockTime"],[6,"MnemonicWithPassphrase"],[6,"DescriptorTemplateOut"],[6,"ExtendedDescriptor"],[8,"Vbytes"],[13,"InvalidU32Bytes"],[13,"Generic"],[13,"OutputBelowDustLimit"],[13,"MissingKeyOrigin"],[13,"Key"],[13,"SpendingPolicyRequired"],[13,"InvalidPolicyPathError"],[13,"Signer"],[13,"InvalidProgressValue"],[13,"InvalidOutpoint"],[13,"Descriptor"],[13,"AddressValidator"],[13,"Encode"],[13,"Miniscript"],[13,"Bip32"],[13,"Secp256k1"],[13,"Json"],[13,"Hex"],[13,"Psbt"],[13,"PsbtParse"],[13,"Electrum"],[13,"Esplora"],[13,"CompactFilters"],[13,"Sled"],[13,"Rusqlite"],[13,"InsufficientFunds"],[13,"InvalidNetwork"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[13,"Local"],[13,"Foreign"],[4,"Capability"],[8,"ConfigurableBlockchain"],[3,"NoopProgress"],[3,"LogProgress"],[8,"Blockchain"],[8,"Progress"],[4,"AnyBlockchain"],[4,"AnyBlockchainConfig"],[13,"Electrum"],[13,"Esplora"],[13,"CompactFilters"],[13,"Electrum"],[13,"Esplora"],[13,"CompactFilters"],[4,"CompactFiltersError"],[3,"Mempool"],[3,"BitcoinPeerConfig"],[3,"Peer"],[3,"CompactFiltersBlockchain"],[3,"CompactFiltersBlockchainConfig"],[13,"Db"],[13,"Io"],[13,"Bip158"],[13,"Time"],[13,"Global"],[3,"ElectrumBlockchain"],[3,"ElectrumBlockchainConfig"],[4,"EsploraError"],[3,"EsploraBlockchainConfig"],[3,"EsploraBlockchain"],[13,"Ureq"],[13,"UreqTransport"],[13,"HttpResponse"],[13,"Io"],[13,"Parsing"],[13,"BitcoinEncoding"],[13,"Hex"],[13,"TransactionNotFound"],[13,"HeaderHeightNotFound"],[13,"HeaderHashNotFound"],[8,"BatchDatabase"],[8,"ConfigurableDatabase"],[3,"SqliteDatabase"],[3,"SyncTime"],[8,"Database"],[8,"BatchOperations"],[4,"AnyBatch"],[4,"AnyDatabase"],[4,"AnyDatabaseConfig"],[3,"SledDbConfiguration"],[3,"SqliteDbConfiguration"],[13,"Memory"],[13,"Sled"],[13,"Sqlite"],[13,"Memory"],[13,"Sled"],[13,"Sqlite"],[13,"Memory"],[13,"Sled"],[13,"Sqlite"],[3,"MemoryDatabase"],[4,"Descriptor"],[4,"Legacy"],[4,"Segwitv0"],[3,"Miniscript"],[3,"DerivedDescriptorKey"],[8,"ScriptContext"],[8,"ExtractPolicy"],[8,"IntoWalletDescriptor"],[13,"Bare"],[13,"Pkh"],[13,"Wpkh"],[13,"Sh"],[13,"Wsh"],[4,"Error"],[13,"Key"],[13,"Policy"],[13,"InvalidDescriptorCharacter"],[13,"Bip32"],[13,"Base58"],[13,"Pk"],[13,"Miniscript"],[13,"Hex"],[4,"SatisfiableItem"],[4,"PolicyError"],[4,"Satisfaction"],[4,"BuildSatisfaction"],[3,"PkOrF"],[3,"Policy"],[3,"Condition"],[13,"Psbt"],[13,"PsbtTimelocks"],[13,"NotEnoughItemsSelected"],[13,"IndexOutOfRange"],[13,"Complete"],[13,"Partial"],[13,"PartialComplete"],[13,"Signature"],[13,"SignatureKey"],[13,"Sha256Preimage"],[13,"Hash256Preimage"],[13,"Ripemd160Preimage"],[13,"Hash160Preimage"],[13,"Thresh"],[13,"Multisig"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[3,"P2Pkh"],[3,"P2Wpkh_P2Sh"],[3,"P2Wpkh"],[3,"Bip44"],[3,"Bip44Public"],[3,"Bip49"],[3,"Bip49Public"],[3,"Bip84"],[3,"Bip84Public"],[8,"DescriptorTemplate"],[4,"KeyError"],[8,"GeneratableKey"],[4,"ScriptContextEnum"],[4,"ExtendedKey"],[4,"DescriptorSecretKey"],[4,"DescriptorPublicKey"],[8,"ExtScriptContext"],[3,"GeneratedKey"],[3,"SortedMultiVec"],[3,"DescriptorSinglePub"],[3,"DescriptorSinglePriv"],[4,"DescriptorKey"],[3,"PrivateKeyGenerateOptions"],[8,"GeneratableDefaultOptions"],[8,"IntoDescriptorKey"],[8,"DerivableKey"],[13,"SinglePub"],[13,"XPub"],[13,"SinglePriv"],[13,"XPrv"],[13,"Private"],[13,"Public"],[13,"Message"],[13,"Bip32"],[13,"Miniscript"],[4,"Language"],[4,"WordCount"],[3,"Mnemonic"],[4,"AddressIndex"],[3,"Wallet"],[3,"AddressInfo"],[8,"IsDust"],[13,"Peek"],[13,"Reset"],[4,"AddressValidatorError"],[8,"AddressValidator"],[13,"Message"],[3,"CoinSelectionResult"],[3,"LargestFirstCoinSelection"],[3,"BranchAndBoundCoinSelection"],[8,"CoinSelectionAlgorithm"],[3,"WalletExport"],[3,"SignerOrdering"],[4,"SignerId"],[4,"SignerError"],[3,"SignersContainer"],[3,"SignOptions"],[8,"Signer"],[13,"PkHash"],[13,"Fingerprint"],[13,"Dummy"],[4,"TxOrdering"],[4,"ChangeSpendPolicy"],[3,"TxBuilder"],[3,"CreateTx"],[3,"BumpFee"]]}\ }'); if (window.initSearch) {window.initSearch(searchIndex)}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.js index 91de2a155a..eb6d6f7b9e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.js @@ -1 +1 @@ -(function(){var itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive","traitalias"];var TY_PRIMITIVE=itemTypes.indexOf("primitive");var TY_KEYWORD=itemTypes.indexOf("keyword");function printTab(nb){if(nb===0||nb===1||nb===2){searchState.currentTab=nb}var nb_copy=nb;onEachLazy(document.getElementById("titles").childNodes,function(elem){if(nb_copy===0){addClass(elem,"selected")}else{removeClass(elem,"selected")}nb_copy-=1});onEachLazy(document.getElementById("results").childNodes,function(elem){if(nb===0){addClass(elem,"active")}else{removeClass(elem,"active")}nb-=1})}function removeEmptyStringsFromArray(x){for(var i=0,len=x.length;i-1){var obj=searchIndex[results[i].id];obj.lev=results[i].lev;var res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}function sortResults(results,isType){var ar=[];for(var entry in results){if(hasOwnPropertyRustdoc(results,entry)){ar.push(results[entry])}}results=ar;var i,len,result;for(i=0,len=results.length;ib?+1:-1)}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});for(i=0,len=results.length;i"));return{name:val.substring(0,val.indexOf("<")),generics:values.split(/\s*,\s*/),}}return{name:val,generics:[],}}function checkGenerics(obj,val){var tmp_lev,elem_name;if(val.generics.length>0){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=Object.create(null);var elength=obj[GENERICS_DATA].length;for(var x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length>0){var elems=Object.create(null);len=obj[GENERICS_DATA].length;for(x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length!==0){var tmp_lev=checkGenerics(obj,val);if(tmp_lev<=MAX_LEV_DISTANCE){return tmp_lev}}}}else if(literalSearch){if((!val.generics||val.generics.length===0)&&obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){return obj[GENERICS_DATA].some(function(name){return name===val.name})}return false}lev_distance=Math.min(levenshtein(obj[NAME],val.name),lev_distance);if(lev_distance<=MAX_LEV_DISTANCE){lev_distance=Math.ceil((checkGenerics(obj,val)+lev_distance)/2)}else if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){var olength=obj[GENERICS_DATA].length;for(x=0;x0){var length=obj.type[INPUTS_DATA].length;for(var i=0;iOUTPUT_DATA){var ret=obj.type[OUTPUT_DATA];if(typeof ret[0]==="string"){ret=[ret]}for(var x=0,len=ret.length;xlength){return MAX_LEV_DISTANCE+1}for(var i=0;ilength){break}var lev_total=0;var aborted=false;for(var x=0;xMAX_LEV_DISTANCE){aborted=true;break}lev_total+=lev}if(!aborted){ret_lev=Math.min(ret_lev,Math.round(lev_total/clength))}}return ret_lev}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER)return true;if(filter===type)return true;var name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,}}function handleAliases(ret,query,filterCrates){var aliases=[];var crateAliases=[];if(filterCrates!==undefined){if(ALIASES[filterCrates]&&ALIASES[filterCrates][query.search]){var query_aliases=ALIASES[filterCrates][query.search];var len=query_aliases.length;for(var i=0;iMAX_RESULTS){ret.others.pop()}};onEach(aliases,pushFunc);onEach(crateAliases,pushFunc)}var nSearchWords=searchWords.length;var i,it;var ty;var fullId;var returned;var in_args;var len;if((val.charAt(0)==="\""||val.charAt(0)==="'")&&val.charAt(val.length-1)===val.charAt(0)){val=extractGenerics(val.substr(1,val.length-2));for(i=0;i")>-1){var trimmer=function(s){return s.trim()};var parts=val.split("->").map(trimmer);var input=parts[0];var inputs=input.split(",").map(trimmer).sort();for(i=0,len=inputs.length;i1?paths.length-1:1);var lev,j;for(j=0;j1){lev=checkPath(contains,paths[paths.length-1],ty);if(lev>MAX_LEV_DISTANCE){continue}else if(lev>0){lev_add=lev/10}}returned=MAX_LEV_DISTANCE+1;in_args=MAX_LEV_DISTANCE+1;var index=-1;lev=MAX_LEV_DISTANCE+1;fullId=ty.id;if(searchWords[j].indexOf(split[i])>-1||searchWords[j].indexOf(val)>-1||ty.normalizedName.indexOf(val)>-1){if(typePassesFilter(typeFilter,ty.ty)&&results[fullId]===undefined){index=ty.normalizedName.indexOf(val)}}if((lev=levenshtein(searchWords[j],val))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)){lev+=1}else{lev=MAX_LEV_DISTANCE+1}}in_args=findArg(ty,valGenerics,false,typeFilter);returned=checkReturned(ty,valGenerics,false,typeFilter);lev+=lev_add;if(lev>0&&val.length>3&&searchWords[j].indexOf(val)>-1){if(val.length<6){lev-=1}else{lev=0}}if(in_args<=MAX_LEV_DISTANCE){if(results_in_args[fullId]===undefined){results_in_args[fullId]={id:j,index:index,lev:in_args,}}results_in_args[fullId].lev=Math.min(results_in_args[fullId].lev,in_args)}if(returned<=MAX_LEV_DISTANCE){if(results_returned[fullId]===undefined){results_returned[fullId]={id:j,index:index,lev:returned,}}results_returned[fullId].lev=Math.min(results_returned[fullId].lev,returned)}if(typePassesFilter(typeFilter,ty.ty)&&(index!==-1||lev<=MAX_LEV_DISTANCE)){if(index!==-1&&paths.length<2){lev=0}if(results[fullId]===undefined){results[fullId]={id:j,index:index,lev:lev,}}results[fullId].lev=Math.min(results[fullId].lev,lev)}}}var ret={"in_args":sortResults(results_in_args,true),"returned":sortResults(results_returned,true),"others":sortResults(results,false),};handleAliases(ret,query,filterCrates);return ret}function validateResult(name,path,keys,parent){for(var i=0,len=keys.length;i-1||path.indexOf(keys[i])>-1||(parent!==undefined&&parent.name!==undefined&&parent.name.toLowerCase().indexOf(keys[i])>-1)||levenshtein(name,keys[i])<=MAX_LEV_DISTANCE)){return false}}return true}function getQuery(raw){var matches,type,query;query=raw;matches=query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);if(matches){type=matches[1].replace(/^const$/,"constant");query=query.substring(matches[0].length)}return{raw:raw,query:query,type:type,id:query+type}}function nextTab(direction){var next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){var target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#titles > button").item(searchState.currentTab);if(target){target.focus()}}function buildHrefAndPath(item){var displayPath;var href;var type=itemTypes[item.ty];var name=item.name;var path=item.path;if(type==="mod"){displayPath=path+"::";href=window.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="primitive"||type==="keyword"){displayPath="";href=window.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=window.rootPath+name+"/index.html"}else if(item.parent!==undefined){var myparent=item.parent;var anchor="#"+type+"."+name;var parentType=itemTypes[myparent.ty];var pageType=parentType;var pageName=myparent.name;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){var enumNameIdx=item.path.lastIndexOf("::");var enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="#variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}href=window.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html"+anchor}else{displayPath=item.path+"::";href=window.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href]}function escape(content){var h1=document.createElement("h1");h1.textContent=content;return h1.innerHTML}function pathSplitter(path){var tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){var extraClass="";if(display===true){extraClass=" active"}var output=document.createElement("div");var duplicates={};var length=0;if(array.length>0){output.className="search-results "+extraClass;array.forEach(function(item){if(item.is_alias!==true){if(duplicates[item.fullPath]){return}duplicates[item.fullPath]=true}var name=item.name;var type=itemTypes[item.ty];length+=1;var extra="";if(type==="primitive"){extra=" (primitive type)"}else if(type==="keyword"){extra=" (keyword)"}var link=document.createElement("a");link.className="result-"+type;link.href=item.href;var wrapper=document.createElement("div");var resultName=document.createElement("div");resultName.className="result-name";if(item.is_alias){var alias=document.createElement("span");alias.className="alias";var bold=document.createElement("b");bold.innerText=item.alias;alias.appendChild(bold);alias.insertAdjacentHTML("beforeend"," - see ");resultName.appendChild(alias)}resultName.insertAdjacentHTML("beforeend",item.displayPath+""+name+extra+"");wrapper.appendChild(resultName);var description=document.createElement("div");description.className="desc";var spanDesc=document.createElement("span");spanDesc.insertAdjacentHTML("beforeend",item.desc);description.appendChild(spanDesc);wrapper.appendChild(description);link.appendChild(wrapper);output.appendChild(link)})}else{output.className="search-failed"+extraClass;output.innerHTML="No results :(
    "+"Try on DuckDuckGo?

    "+"Or try looking in one of these:"}return[output,length]}function makeTabHeader(tabNb,text,nbElems){if(searchState.currentTab===tabNb){return""}return""}function showResults(results,go_to_first){var search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true"&&(!search.firstChild||search.firstChild.innerText!==searchState.loadingText))){var elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}var query=getQuery(searchState.input.value);currentResults=query.id;var ret_others=addTab(results.others,query);var ret_in_args=addTab(results.in_args,query,false);var ret_returned=addTab(results.returned,query,false);var currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}var output="

    Results for "+escape(query.query)+(query.type?" (type: "+escape(query.type)+")":"")+"

    "+"
    "+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
    ";var resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;search.appendChild(resultsElem);searchState.focusedByTab=[null,null,null];searchState.showResults(search);var elems=document.getElementById("titles").childNodes;elems[0].onclick=function(){printTab(0)};elems[1].onclick=function(){printTab(1)};elems[2].onclick=function(){printTab(2)};printTab(currentTab)}function execSearch(query,searchWords,filterCrates){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0,len=positions.length;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev}}return start}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0,arrays_len=arrays.length;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1}}}return ret}function tokenizeQuery(raw){var i,matched;var l=raw.length;var depth=0;var nextAngle=/(<|>)/g;var ret=[];var start=0;for(i=0;i'){depth+=1}break;case">":if(depth>0){depth-=1}break;case",":if(depth===0){ret.push(raw.substring(start,i));start=i+1}break}}if(start!==i){ret.push(raw.substring(start,i))}return ret}var queries=tokenizeQuery(query.raw);var results={"in_args":[],"returned":[],"others":[],};for(var i=0,len=queries.length;i1){return{"in_args":mergeArrays(results.in_args),"returned":mergeArrays(results.returned),"others":mergeArrays(results.others),}}return{"in_args":results.in_args[0],"returned":results.returned[0],"others":results.others[0],}}function getFilterCrates(){var elem=document.getElementById("crate-search");if(elem&&elem.value!=="All crates"&&hasOwnPropertyRustdoc(rawSearchIndex,elem.value)){return elem.value}return undefined}function search(e,forced){var params=searchState.getQueryStringParams();var query=getQuery(searchState.input.value.trim());if(e){e.preventDefault()}if(query.query.length===0){return}if(!forced&&query.id===currentResults){if(query.query.length>0){searchState.putBackSearch(searchState.input)}return}searchState.title="Results for "+query.query+" - Rust";if(searchState.browserSupportsHistoryApi()){var newURL=getNakedUrl()+"?search="+encodeURIComponent(query.raw)+window.location.hash;if(!history.state&&!params.search){history.pushState(query,"",newURL)}else{history.replaceState(query,"",newURL)}}var filterCrates=getFilterCrates();showResults(execSearch(query,index,filterCrates),params.go_to_first)}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];var i,word;var currentIndex=0;var id=0;for(var crate in rawSearchIndex){if(!hasOwnPropertyRustdoc(rawSearchIndex,crate)){continue}var crateSize=0;searchWords.push(crate);var crateRow={crate:crate,ty:1,name:crate,path:"",desc:rawSearchIndex[crate].doc,parent:undefined,type:null,id:id,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),};id+=1;searchIndex.push(crateRow);currentIndex+=1;var itemTypes=rawSearchIndex[crate].t;var itemNames=rawSearchIndex[crate].n;var itemPaths=rawSearchIndex[crate].q;var itemDescs=rawSearchIndex[crate].d;var itemParentIdxs=rawSearchIndex[crate].i;var itemFunctionSearchTypes=rawSearchIndex[crate].f;var paths=rawSearchIndex[crate].p;var aliases=rawSearchIndex[crate].a;var len=paths.length;for(i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type:itemFunctionSearchTypes[i],id:id,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),};id+=1;searchIndex.push(row);lastPath=row.path;crateSize+=1}if(aliases){ALIASES[crate]={};var j,local_aliases;for(var alias_name in aliases){if(!hasOwnPropertyRustdoc(aliases,alias_name)){continue}if(!hasOwnPropertyRustdoc(ALIASES[crate],alias_name)){ALIASES[crate][alias_name]=[]}local_aliases=aliases[alias_name];for(j=0,len=local_aliases.length;j0){searchState.input.value=params.search;search(e)}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=function(){var qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}index=buildIndex(rawSearchIndex);registerSearchEvents();if(searchState.getQueryStringParams().search){search()}};if(window.searchIndex!==undefined){initSearch(window.searchIndex)}})() \ No newline at end of file +(function(){var itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive","traitalias",];var TY_PRIMITIVE=itemTypes.indexOf("primitive");var TY_KEYWORD=itemTypes.indexOf("keyword");function printTab(nb){if(nb===0||nb===1||nb===2){searchState.currentTab=nb}var nb_copy=nb;onEachLazy(document.getElementById("titles").childNodes,function(elem){if(nb_copy===0){addClass(elem,"selected")}else{removeClass(elem,"selected")}nb_copy-=1});onEachLazy(document.getElementById("results").childNodes,function(elem){if(nb===0){addClass(elem,"active")}else{removeClass(elem,"active")}nb-=1})}function removeEmptyStringsFromArray(x){for(var i=0,len=x.length;i-1){var obj=searchIndex[result.id];obj.lev=result.lev;var res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;if(duplicates[obj.fullPath]){continue}duplicates[obj.fullPath]=true;obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}function sortResults(results,isType){var ar=[];for(var entry in results){if(hasOwnPropertyRustdoc(results,entry)){var result=results[entry];result.word=searchWords[result.id];result.item=searchIndex[result.id]||{};ar.push(result)}}results=ar;if(results.length===0){return[]}results.sort(function(aaa,bbb){var a,b;a=(aaa.word!==val);b=(bbb.word!==val);if(a!==b){return a-b}a=(aaa.lev);b=(bbb.lev);if(a!==b){return a-b}a=(aaa.item.crate!==window.currentCrate);b=(bbb.item.crate!==window.currentCrate);if(a!==b){return a-b}a=aaa.word.length;b=bbb.word.length;if(a!==b){return a-b}a=aaa.word;b=bbb.word;if(a!==b){return(a>b?+1:-1)}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});for(var i=0,len=results.length;i"));return{name:val.substring(0,val.indexOf("<")),generics:values.split(/\s*,\s*/),}}return{name:val,generics:[],}}function checkGenerics(obj,val){var tmp_lev,elem_name;if(val.generics.length>0){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=Object.create(null);var elength=obj[GENERICS_DATA].length;for(var x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length>0){var elems=Object.create(null);len=obj[GENERICS_DATA].length;for(x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length!==0){tmp_lev=checkGenerics(obj,val);if(tmp_lev<=MAX_LEV_DISTANCE){return tmp_lev}}}}else if(literalSearch){var found=false;if((!val.generics||val.generics.length===0)&&obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){found=obj[GENERICS_DATA].some(function(gen){return gen[NAME]===val.name})}return found?0:MAX_LEV_DISTANCE+1}lev_distance=Math.min(levenshtein(obj[NAME],val.name),lev_distance);if(lev_distance<=MAX_LEV_DISTANCE){lev_distance=Math.ceil((checkGenerics(obj,val)+lev_distance)/2)}if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){var olength=obj[GENERICS_DATA].length;for(x=0;x0){var length=obj.type[INPUTS_DATA].length;for(var i=0;iOUTPUT_DATA){var ret=obj.type[OUTPUT_DATA];if(typeof ret[0]==="string"){ret=[ret]}for(var x=0,len=ret.length;xlength){return MAX_LEV_DISTANCE+1}for(var i=0;ilength){break}var lev_total=0;var aborted=false;for(var x=0;xMAX_LEV_DISTANCE){aborted=true;break}lev_total+=lev}if(!aborted){ret_lev=Math.min(ret_lev,Math.round(lev_total/clength))}}return ret_lev}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER)return true;if(filter===type)return true;var name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,}}function handleAliases(ret,query,filterCrates){var aliases=[];var crateAliases=[];if(filterCrates!==undefined){if(ALIASES[filterCrates]&&ALIASES[filterCrates][query.search]){var query_aliases=ALIASES[filterCrates][query.search];var len=query_aliases.length;for(var i=0;iMAX_RESULTS){ret.others.pop()}};onEach(aliases,pushFunc);onEach(crateAliases,pushFunc)}function addIntoResults(isExact,res,fullId,id,index,lev){if(lev===0||(!isExact&&lev<=MAX_LEV_DISTANCE)){if(res[fullId]!==undefined){var result=res[fullId];if(result.dontValidate||result.lev<=lev){return}}res[fullId]={id:id,index:index,dontValidate:isExact,lev:lev,}}}var nSearchWords=searchWords.length;var i,it;var ty;var fullId;var returned;var in_args;var len;if((val.charAt(0)==="\""||val.charAt(0)==="'")&&val.charAt(val.length-1)===val.charAt(0)){val=extractGenerics(val.substr(1,val.length-2));for(i=0;i")>-1){var trimmer=function(s){return s.trim()};var parts=val.split("->").map(trimmer);var input=parts[0];var inputs=input.split(",").map(trimmer).sort();for(i=0,len=inputs.length;i0){firstNonZeroDistance=distance;break}}in_args=firstNonZeroDistance}addIntoResults(true,results_in_args,fullId,i,-1,in_args);addIntoResults(true,results_returned,fullId,i,-1,returned);if(is_module){addIntoResults(true,results,fullId,i,-1,0)}}}query.inputs=inputs.map(function(input){return input.name});query.output=output.name}else{query.inputs=[val];query.output=val;query.search=val;val=val.replace(/_/g,"");var valGenerics=extractGenerics(val);var paths=valLower.split("::");removeEmptyStringsFromArray(paths);val=paths[paths.length-1];var contains=paths.slice(0,paths.length>1?paths.length-1:1);var lev,j;for(j=0;j1){lev=checkPath(contains,paths[paths.length-1],ty);if(lev>MAX_LEV_DISTANCE){continue}else if(lev>0){lev_add=lev/10}}returned=MAX_LEV_DISTANCE+1;in_args=MAX_LEV_DISTANCE+1;var index=-1;lev=MAX_LEV_DISTANCE+1;fullId=ty.id;if(searchWords[j].indexOf(split[i])>-1||searchWords[j].indexOf(val)>-1||ty.normalizedName.indexOf(val)>-1){if(typePassesFilter(typeFilter,ty.ty)&&results[fullId]===undefined){index=ty.normalizedName.indexOf(val)}}if((lev=levenshtein(searchWords[j],val))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)){lev+=1}else{lev=MAX_LEV_DISTANCE+1}}in_args=findArg(ty,valGenerics,false,typeFilter);returned=checkReturned(ty,valGenerics,false,typeFilter);lev+=lev_add;if(lev>0&&val.length>3&&searchWords[j].indexOf(val)>-1){if(val.length<6){lev-=1}else{lev=0}}addIntoResults(false,results_in_args,fullId,j,index,in_args);addIntoResults(false,results_returned,fullId,j,index,returned);if(typePassesFilter(typeFilter,ty.ty)&&(index!==-1||lev<=MAX_LEV_DISTANCE)){if(index!==-1&&paths.length<2){lev=0}addIntoResults(false,results,fullId,j,index,lev)}}}var ret={"in_args":sortResults(results_in_args,true),"returned":sortResults(results_returned,true),"others":sortResults(results,false),};handleAliases(ret,query,filterCrates);return ret}function validateResult(name,path,keys,parent){for(var i=0,len=keys.length;i-1||path.indexOf(keys[i])>-1||(parent!==undefined&&parent.name!==undefined&&parent.name.toLowerCase().indexOf(keys[i])>-1)||levenshtein(name,keys[i])<=MAX_LEV_DISTANCE)){return false}}return true}function getQuery(raw){var matches,type="",query;query=raw;matches=query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);if(matches){type=matches[1].replace(/^const$/,"constant");query=query.substring(matches[0].length)}return{raw:raw,query:query,type:type,id:query+type}}function nextTab(direction){var next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){var target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#titles > button").item(searchState.currentTab);if(target){target.focus()}}function buildHrefAndPath(item){var displayPath;var href;var type=itemTypes[item.ty];var name=item.name;var path=item.path;if(type==="mod"){displayPath=path+"::";href=window.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="primitive"||type==="keyword"){displayPath="";href=window.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=window.rootPath+name+"/index.html"}else if(item.parent!==undefined){var myparent=item.parent;var anchor="#"+type+"."+name;var parentType=itemTypes[myparent.ty];var pageType=parentType;var pageName=myparent.name;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){var enumNameIdx=item.path.lastIndexOf("::");var enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="#variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}href=window.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html"+anchor}else{displayPath=item.path+"::";href=window.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href]}function escape(content){var h1=document.createElement("h1");h1.textContent=content;return h1.innerHTML}function pathSplitter(path){var tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){var extraClass="";if(display===true){extraClass=" active"}var output=document.createElement("div");var length=0;if(array.length>0){output.className="search-results "+extraClass;array.forEach(function(item){var name=item.name;var type=itemTypes[item.ty];length+=1;var extra="";if(type==="primitive"){extra=" (primitive type)"}else if(type==="keyword"){extra=" (keyword)"}var link=document.createElement("a");link.className="result-"+type;link.href=item.href;var wrapper=document.createElement("div");var resultName=document.createElement("div");resultName.className="result-name";if(item.is_alias){var alias=document.createElement("span");alias.className="alias";var bold=document.createElement("b");bold.innerText=item.alias;alias.appendChild(bold);alias.insertAdjacentHTML("beforeend"," - see ");resultName.appendChild(alias)}resultName.insertAdjacentHTML("beforeend",item.displayPath+""+name+extra+"");wrapper.appendChild(resultName);var description=document.createElement("div");description.className="desc";var spanDesc=document.createElement("span");spanDesc.insertAdjacentHTML("beforeend",item.desc);description.appendChild(spanDesc);wrapper.appendChild(description);link.appendChild(wrapper);output.appendChild(link)})}else{output.className="search-failed"+extraClass;output.innerHTML="No results :(
    "+"Try on DuckDuckGo?

    "+"Or try looking in one of these:"}return[output,length]}function makeTabHeader(tabNb,text,nbElems){if(searchState.currentTab===tabNb){return""}return""}function showResults(results,go_to_first){var search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true"&&(!search.firstChild||search.firstChild.innerText!==searchState.loadingText))){var elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}var query=getQuery(searchState.input.value);currentResults=query.id;var ret_others=addTab(results.others,query,true);var ret_in_args=addTab(results.in_args,query,false);var ret_returned=addTab(results.returned,query,false);var currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}var output="

    Results for "+escape(query.query)+(query.type?" (type: "+escape(query.type)+")":"")+"

    "+"
    "+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
    ";var resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;search.appendChild(resultsElem);searchState.focusedByTab=[null,null,null];searchState.showResults(search);var elems=document.getElementById("titles").childNodes;elems[0].onclick=function(){printTab(0)};elems[1].onclick=function(){printTab(1)};elems[2].onclick=function(){printTab(2)};printTab(currentTab)}function execSearch(query,searchWords,filterCrates){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0,len=positions.length;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev}}return start}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0,arrays_len=arrays.length;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1}}}return ret}function tokenizeQuery(raw){var i,matched;var l=raw.length;var depth=0;var nextAngle=/(<|>)/g;var ret=[];var start=0;for(i=0;i'){depth+=1}break;case">":if(depth>0){depth-=1}break;case",":if(depth===0){ret.push(raw.substring(start,i));start=i+1}break}}if(start!==i){ret.push(raw.substring(start,i))}return ret}var queries=tokenizeQuery(query.raw);var results={"in_args":[],"returned":[],"others":[],};for(var i=0,len=queries.length;i1){return{"in_args":mergeArrays(results.in_args),"returned":mergeArrays(results.returned),"others":mergeArrays(results.others),}}return{"in_args":results.in_args[0],"returned":results.returned[0],"others":results.others[0],}}function getFilterCrates(){var elem=document.getElementById("crate-search");if(elem&&elem.value!=="All crates"&&hasOwnPropertyRustdoc(rawSearchIndex,elem.value)){return elem.value}return undefined}function search(e,forced){var params=searchState.getQueryStringParams();var query=getQuery(searchState.input.value.trim());if(e){e.preventDefault()}if(query.query.length===0){return}if(!forced&&query.id===currentResults){if(query.query.length>0){searchState.putBackSearch(searchState.input)}return}searchState.title="Results for "+query.query+" - Rust";if(searchState.browserSupportsHistoryApi()){var newURL=getNakedUrl()+"?search="+encodeURIComponent(query.raw)+window.location.hash;if(!history.state&&!params.search){history.pushState(query,"",newURL)}else{history.replaceState(query,"",newURL)}}var filterCrates=getFilterCrates();showResults(execSearch(query,searchWords,filterCrates),params["go_to_first"])}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];var i,word;var currentIndex=0;var id=0;for(var crate in rawSearchIndex){if(!hasOwnPropertyRustdoc(rawSearchIndex,crate)){continue}var crateSize=0;var crateCorpus=rawSearchIndex[crate];searchWords.push(crate);var crateRow={crate:crate,ty:1,name:crate,path:"",desc:crateCorpus.doc,parent:undefined,type:null,id:id,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),};id+=1;searchIndex.push(crateRow);currentIndex+=1;var itemTypes=crateCorpus.t;var itemNames=crateCorpus.n;var itemPaths=crateCorpus.q;var itemDescs=crateCorpus.d;var itemParentIdxs=crateCorpus.i;var itemFunctionSearchTypes=crateCorpus.f;var paths=crateCorpus.p;var aliases=crateCorpus.a;var len=paths.length;for(i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type:itemFunctionSearchTypes[i],id:id,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),};id+=1;searchIndex.push(row);lastPath=row.path;crateSize+=1}if(aliases){ALIASES[crate]={};var j,local_aliases;for(var alias_name in aliases){if(!hasOwnPropertyRustdoc(aliases,alias_name)){continue}if(!hasOwnPropertyRustdoc(ALIASES[crate],alias_name)){ALIASES[crate][alias_name]=[]}local_aliases=aliases[alias_name];for(j=0,len=local_aliases.length;j0){searchState.input.value=params.search;search(e)}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=function(){var qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}searchWords=buildIndex(rawSearchIndex);registerSearchEvents();if(searchState.getQueryStringParams().search){search()}};if(window.searchIndex!==undefined){initSearch(window.searchIndex)}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/settings.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/settings.html index e04d80ec2e..894666d940 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/settings.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/settings.html @@ -1,4 +1,5 @@ -Rustdoc settings

    Rustdoc settings

    Theme preferences
    Use system theme
    Preferred dark theme
    Preferred light theme
    -
    Auto-hide item contents for large items.
    Auto-hide item methods' documentation
    Auto-hide trait implementation documentation
    Directly go to item in search if there is only one result
    Show line numbers on code examples
    Disable keyboard shortcuts
    - +Rustdoc settings +
    logo

    Rustdoc settings

    Theme preferences
    Use system theme
    Preferred dark theme
    Preferred light theme
    +
    Auto-hide item contents for large items.
    Auto-hide item methods' documentation
    Auto-hide trait implementation documentation
    Directly go to item in search if there is only one result
    Show line numbers on code examples
    Disable keyboard shortcuts
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js index 34aad7c3a4..0b663f217c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js @@ -1,3 +1,3 @@ var N = null;var sourcesIndex = {}; -sourcesIndex["bdk"] = {"name":"","dirs":[{"name":"blockchain","dirs":[{"name":"compact_filters","files":["mod.rs","peer.rs","store.rs","sync.rs"]},{"name":"esplora","files":["mod.rs","ureq.rs"]}],"files":["any.rs","electrum.rs","mod.rs","utils.rs"]},{"name":"database","files":["any.rs","keyvalue.rs","memory.rs","mod.rs","sqlite.rs"]},{"name":"descriptor","files":["checksum.rs","derived.rs","dsl.rs","error.rs","mod.rs","policy.rs","template.rs"]},{"name":"keys","files":["bip39.rs","mod.rs"]},{"name":"psbt","files":["mod.rs"]},{"name":"testutils","files":["mod.rs"]},{"name":"wallet","files":["address_validator.rs","coin_selection.rs","export.rs","mod.rs","signer.rs","time.rs","tx_builder.rs","utils.rs"]}],"files":["error.rs","lib.rs","types.rs"]}; +sourcesIndex["bdk"] = {"name":"","dirs":[{"name":"blockchain","dirs":[{"name":"compact_filters","files":["mod.rs","peer.rs","store.rs","sync.rs"]},{"name":"esplora","files":["api.rs","mod.rs","ureq.rs"]}],"files":["any.rs","electrum.rs","mod.rs","script_sync.rs"]},{"name":"database","files":["any.rs","keyvalue.rs","memory.rs","mod.rs","sqlite.rs"]},{"name":"descriptor","files":["checksum.rs","derived.rs","dsl.rs","error.rs","mod.rs","policy.rs","template.rs"]},{"name":"keys","files":["bip39.rs","mod.rs"]},{"name":"psbt","files":["mod.rs"]},{"name":"testutils","files":["mod.rs"]},{"name":"wallet","files":["address_validator.rs","coin_selection.rs","export.rs","mod.rs","signer.rs","time.rs","tx_builder.rs","utils.rs"]}],"files":["error.rs","lib.rs","types.rs"]}; createSourceSidebar(); diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-script.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-script.js index 5dc8fee0f2..09515e07cf 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-script.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-script.js @@ -1 +1 @@ -(function(){function getCurrentFilePath(){var parts=window.location.pathname.split("/");var rootPathParts=window.rootPath.split("/");for(var i=0,len=rootPathParts.length;i"){sidebar.style.left="";this.style.left="";child.innerText="<";updateLocalStorage("rustdoc-source-sidebar-show","true")}else{sidebar.style.left="-300px";this.style.left="0";child.innerText=">";updateLocalStorage("rustdoc-source-sidebar-show","false")}}function createSidebarToggle(){var sidebarToggle=document.createElement("div");sidebarToggle.id="sidebar-toggle";sidebarToggle.onclick=toggleSidebar;var inner1=document.createElement("div");inner1.style.position="relative";var inner2=document.createElement("div");inner2.style.paddingTop="3px";if(getCurrentValue("rustdoc-source-sidebar-show")==="true"){inner2.innerText="<"}else{inner2.innerText=">";sidebarToggle.style.left="0"}inner1.appendChild(inner2);sidebarToggle.appendChild(inner1);return sidebarToggle}function createSourceSidebar(){if(!window.rootPath.endsWith("/")){window.rootPath+="/"}var main=document.getElementById("main");var sidebarToggle=createSidebarToggle();main.insertBefore(sidebarToggle,main.firstChild);var sidebar=document.createElement("div");sidebar.id="source-sidebar";if(getCurrentValue("rustdoc-source-sidebar-show")!=="true"){sidebar.style.left="-300px"}var currentFile=getCurrentFilePath();var hasFoundFile=false;var title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(function(key){sourcesIndex[key].name=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",currentFile,hasFoundFile)});main.insertBefore(sidebar,main.firstChild);var selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}var lineNumbersRegex=/^#?(\d+)(?:-(\d+))?$/;function highlightSourceLines(scrollTo,match){if(typeof match==="undefined"){match=window.location.hash.match(lineNumbersRegex)}if(!match){return}var from=parseInt(match[1],10);var to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(tocur_line_id){var tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",function(){var match=window.location.hash.match(lineNumbersRegex);if(match){return highlightSourceLines(false,match)}});onEachLazy(document.getElementsByClassName("line-numbers"),function(el){el.addEventListener("click",handleSourceHighlight)});highlightSourceLines(true);window.createSourceSidebar=createSourceSidebar})() \ No newline at end of file +(function(){function getCurrentFilePath(){var parts=window.location.pathname.split("/");var rootPathParts=window.rootPath.split("/");for(var i=0,len=rootPathParts.length;i"){sidebar.classList.add("expanded");child.innerText="<";updateLocalStorage("rustdoc-source-sidebar-show","true")}else{sidebar.classList.remove("expanded");child.innerText=">";updateLocalStorage("rustdoc-source-sidebar-show","false")}}function createSidebarToggle(){var sidebarToggle=document.createElement("div");sidebarToggle.id="sidebar-toggle";sidebarToggle.onclick=toggleSidebar;var inner=document.createElement("div");if(getCurrentValue("rustdoc-source-sidebar-show")==="true"){inner.innerText="<"}else{inner.innerText=">"}sidebarToggle.appendChild(inner);return sidebarToggle}function createSourceSidebar(){if(!window.rootPath.endsWith("/")){window.rootPath+="/"}var container=document.querySelector("nav.sidebar");var sidebarToggle=createSidebarToggle();container.insertBefore(sidebarToggle,container.firstChild);var sidebar=document.createElement("div");sidebar.id="source-sidebar";if(getCurrentValue("rustdoc-source-sidebar-show")!=="true"){container.classList.remove("expanded")}else{container.classList.add("expanded")}var currentFile=getCurrentFilePath();var hasFoundFile=false;var title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(function(key){sourcesIndex[key].name=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",currentFile,hasFoundFile)});container.insertBefore(sidebar,document.querySelector(".sidebar-logo").nextSibling);var selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}var lineNumbersRegex=/^#?(\d+)(?:-(\d+))?$/;function highlightSourceLines(scrollTo,match){if(typeof match==="undefined"){match=window.location.hash.match(lineNumbersRegex)}if(!match){return}var from=parseInt(match[1],10);var to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(tocur_line_id){var tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",function(){var match=window.location.hash.match(lineNumbersRegex);if(match){return highlightSourceLines(false,match)}});onEachLazy(document.getElementsByClassName("line-numbers"),function(el){el.addEventListener("click",handleSourceHighlight)});highlightSourceLines(true);window.createSourceSidebar=createSourceSidebar})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/any.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/any.rs.html index 977b1afcca..e0bdb2908a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/any.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/any.rs.html @@ -1,4 +1,6 @@ -any.rs - source
      1
    +any.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -331,10 +333,10 @@
     use super::*;
     
     macro_rules! impl_from {
    -    ( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
    +    ( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
             $( $cfg )*
             impl From<$from> for $to {
    -            fn from(inner: $from) -> Self {
    +            fn from(inner: $from) -> Self {
                     <$to>::$variant(inner)
                 }
             }
    @@ -342,16 +344,16 @@
     }
     
     macro_rules! impl_inner_method {
    -    ( $self:expr, $name:ident $(, $args:expr)* ) => {
    +    ( $self:expr, $name:ident $(, $args:expr)* ) => {
             match $self {
                 #[cfg(feature = "electrum")]
    -            AnyBlockchain::Electrum(inner) => inner.$name( $($args, )* ),
    +            AnyBlockchain::Electrum(inner) => inner.$name( $($args, )* ),
                 #[cfg(feature = "esplora")]
    -            AnyBlockchain::Esplora(inner) => inner.$name( $($args, )* ),
    +            AnyBlockchain::Esplora(inner) => inner.$name( $($args, )* ),
                 #[cfg(feature = "compact_filters")]
    -            AnyBlockchain::CompactFilters(inner) => inner.$name( $($args, )* ),
    +            AnyBlockchain::CompactFilters(inner) => inner.$name( $($args, )* ),
                 #[cfg(feature = "rpc")]
    -            AnyBlockchain::Rpc(inner) => inner.$name( $($args, )* ),
    +            AnyBlockchain::Rpc(inner) => inner.$name( $($args, )* ),
             }
         }
     }
    @@ -382,36 +384,36 @@
     
     #[maybe_async]
     impl Blockchain for AnyBlockchain {
    -    fn get_capabilities(&self) -> HashSet<Capability> {
    +    fn get_capabilities(&self) -> HashSet<Capability> {
             maybe_await!(impl_inner_method!(self, get_capabilities))
         }
     
         fn setup<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             maybe_await!(impl_inner_method!(self, setup, database, progress_update))
         }
         fn sync<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             maybe_await!(impl_inner_method!(self, sync, database, progress_update))
         }
     
    -    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             maybe_await!(impl_inner_method!(self, get_tx, txid))
         }
    -    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
    +    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
             maybe_await!(impl_inner_method!(self, broadcast, tx))
         }
     
    -    fn get_height(&self) -> Result<u32, Error> {
    +    fn get_height(&self) -> Result<u32, Error> {
             maybe_await!(impl_inner_method!(self, get_height))
         }
    -    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
    +    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
             maybe_await!(impl_inner_method!(self, estimate_fee, target))
         }
     }
    @@ -478,22 +480,22 @@
     impl ConfigurableBlockchain for AnyBlockchain {
         type Config = AnyBlockchainConfig;
     
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
             Ok(match config {
                 #[cfg(feature = "electrum")]
    -            AnyBlockchainConfig::Electrum(inner) => {
    +            AnyBlockchainConfig::Electrum(inner) => {
                     AnyBlockchain::Electrum(electrum::ElectrumBlockchain::from_config(inner)?)
                 }
                 #[cfg(feature = "esplora")]
    -            AnyBlockchainConfig::Esplora(inner) => {
    +            AnyBlockchainConfig::Esplora(inner) => {
                     AnyBlockchain::Esplora(esplora::EsploraBlockchain::from_config(inner)?)
                 }
                 #[cfg(feature = "compact_filters")]
    -            AnyBlockchainConfig::CompactFilters(inner) => AnyBlockchain::CompactFilters(
    +            AnyBlockchainConfig::CompactFilters(inner) => AnyBlockchain::CompactFilters(
                     compact_filters::CompactFiltersBlockchain::from_config(inner)?,
                 ),
                 #[cfg(feature = "rpc")]
    -            AnyBlockchainConfig::Rpc(inner) => {
    +            AnyBlockchainConfig::Rpc(inner) => {
                     AnyBlockchain::Rpc(rpc::RpcBlockchain::from_config(inner)?)
                 }
             })
    @@ -505,6 +507,5 @@
     impl_from!(compact_filters::CompactFiltersBlockchainConfig, AnyBlockchainConfig, CompactFilters, #[cfg(feature = "compact_filters")]);
     impl_from!(rpc::RpcConfig, AnyBlockchainConfig, Rpc, #[cfg(feature = "rpc")]);
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/mod.rs.html index 4927399c69..b1db763392 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -639,7 +641,7 @@
     use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils};
     use crate::error::Error;
     use crate::types::{KeychainKind, LocalUtxo, TransactionDetails};
    -use crate::{ConfirmationTime, FeeRate};
    +use crate::{BlockTime, FeeRate};
     
     use peer::*;
     use store::*;
    @@ -675,7 +677,7 @@
             peers: Vec<Peer>,
             storage_dir: P,
             skip_blocks: Option<usize>,
    -    ) -> Result<Self, CompactFiltersError> {
    +    ) -> Result<Self, CompactFiltersError> {
             if peers.is_empty() {
                 return Err(CompactFiltersError::NoPeers);
             }
    @@ -711,13 +713,13 @@
         /// outputs that send funds to a know script_pubkey.
         fn process_tx<D: BatchDatabase>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             tx: &Transaction,
             height: Option<u32>,
             timestamp: Option<u64>,
    -        internal_max_deriv: &mut Option<u32>,
    -        external_max_deriv: &mut Option<u32>,
    -    ) -> Result<(), Error> {
    +        internal_max_deriv: &mut Option<u32>,
    +        external_max_deriv: &mut Option<u32>,
    +    ) -> Result<(), Error> {
             let mut updates = database.begin_batch();
     
             let mut incoming: u64 = 0;
    @@ -756,11 +758,11 @@
                     })?;
                     incoming += output.value;
     
    -                if keychain == KeychainKind::Internal
    +                if keychain == KeychainKind::Internal
                         && (internal_max_deriv.is_none() || child > internal_max_deriv.unwrap_or(0))
                     {
                         *internal_max_deriv = Some(child);
    -                } else if keychain == KeychainKind::External
    +                } else if keychain == KeychainKind::External
                         && (external_max_deriv.is_none() || child > external_max_deriv.unwrap_or(0))
                     {
                         *external_max_deriv = Some(child);
    @@ -774,7 +776,7 @@
                     transaction: Some(tx.clone()),
                     received: incoming,
                     sent: outgoing,
    -                confirmation_time: ConfirmationTime::new(height, timestamp),
    +                confirmation_time: BlockTime::new(height, timestamp),
                     verified: height.is_some(),
                     fee: Some(inputs_sum.saturating_sub(outputs_sum)),
                 };
    @@ -790,16 +792,16 @@
     }
     
     impl Blockchain for CompactFiltersBlockchain {
    -    fn get_capabilities(&self) -> HashSet<Capability> {
    +    fn get_capabilities(&self) -> HashSet<Capability> {
             vec![Capability::FullHistory].into_iter().collect()
         }
     
         #[allow(clippy::mutex_atomic)] // Mutex is easier to understand than a CAS loop.
         fn setup<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let first_peer = &self.peers[0];
     
             let skip_blocks = self.skip_blocks.unwrap_or(0);
    @@ -822,7 +824,7 @@
             let total_cost = headers_cost + filters_cost + PROCESS_BLOCKS_COST;
     
             if let Some(snapshot) = sync::sync_headers(
    -            Arc::clone(&first_peer),
    +            Arc::clone(first_peer),
                 Arc::clone(&self.headers),
                 |new_height| {
                     let local_headers_cost =
    @@ -843,7 +845,7 @@
             let buried_height = synced_height.saturating_sub(sync::BURIED_CONFIRMATIONS);
             info!("Synced headers to height: {}", synced_height);
     
    -        cf_sync.prepare_sync(Arc::clone(&first_peer))?;
    +        cf_sync.prepare_sync(Arc::clone(first_peer))?;
     
             let all_scripts = Arc::new(
                 database
    @@ -862,7 +864,7 @@
             let mut threads = Vec::with_capacity(self.peers.len());
             for peer in &self.peers {
                 let cf_sync = Arc::clone(&cf_sync);
    -            let peer = Arc::clone(&peer);
    +            let peer = Arc::clone(peer);
                 let headers = Arc::clone(&self.headers);
                 let all_scripts = Arc::clone(&all_scripts);
                 let last_synced_block = Arc::clone(&last_synced_block);
    @@ -874,13 +876,13 @@
                         peer,
                         |block_hash, filter| {
                             if !filter
    -                            .match_any(block_hash, &mut all_scripts.iter().map(AsRef::as_ref))?
    +                            .match_any(block_hash, &mut all_scripts.iter().map(AsRef::as_ref))?
                             {
                                 return Ok(false);
                             }
     
                             let block_height = headers.get_height_for(block_hash)?.unwrap_or(0);
    -                        let saved_correct_block = matches!(headers.get_full_block(block_height)?, Some(block) if &block.block_hash() == block_hash);
    +                        let saved_correct_block = matches!(headers.get_full_block(block_height)?, Some(block) if &block.block_hash() == block_hash);
     
                             if saved_correct_block {
                                 Ok(false)
    @@ -932,17 +934,17 @@
             let mut updates = database.begin_batch();
             for details in database.iter_txs(false)? {
                 match details.confirmation_time {
    -                Some(c) if (c.height as usize) < last_synced_block => continue,
    -                _ => updates.del_tx(&details.txid, false)?,
    +                Some(c) if (c.height as usize) < last_synced_block => continue,
    +                _ => updates.del_tx(&details.txid, false)?,
                 };
             }
             database.commit_batch(updates)?;
     
             match first_peer.ask_for_mempool() {
    -            Err(CompactFiltersError::PeerBloomDisabled) => {
    +            Err(CompactFiltersError::PeerBloomDisabled) => {
                     log::warn!("Peer has BLOOM disabled, we can't ask for the mempool")
                 }
    -            e => e?,
    +            e => e?,
             };
     
             let mut internal_max_deriv = None;
    @@ -955,8 +957,8 @@
                         tx,
                         Some(height as u32),
                         None,
    -                    &mut internal_max_deriv,
    -                    &mut external_max_deriv,
    +                    &mut internal_max_deriv,
    +                    &mut external_max_deriv,
                     )?;
                 }
             }
    @@ -966,8 +968,8 @@
                     tx,
                     None,
                     None,
    -                &mut internal_max_deriv,
    -                &mut external_max_deriv,
    +                &mut internal_max_deriv,
    +                &mut external_max_deriv,
                 )?;
             }
     
    @@ -1000,23 +1002,23 @@
             Ok(())
         }
     
    -    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             Ok(self.peers[0]
                 .get_mempool()
                 .get_tx(&Inventory::Transaction(*txid)))
         }
     
    -    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
    +    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
             self.peers[0].broadcast_tx(tx.clone())?;
     
             Ok(())
         }
     
    -    fn get_height(&self) -> Result<u32, Error> {
    +    fn get_height(&self) -> Result<u32, Error> {
             Ok(self.headers.get_height()? as u32)
         }
     
    -    fn estimate_fee(&self, _target: usize) -> Result<FeeRate, Error> {
    +    fn estimate_fee(&self, _target: usize) -> Result<FeeRate, Error> {
             // TODO
             Ok(FeeRate::default())
         }
    @@ -1040,7 +1042,7 @@
         pub peers: Vec<BitcoinPeerConfig>,
         /// Network used
         pub network: Network,
    -    /// Storage dir to save partially downloaded headers and full blocks
    +    /// Storage dir to save partially downloaded headers and full blocks. Should be a separate directory per descriptor. Consider using [crate::wallet::wallet_name_from_descriptor] for this.
         pub storage_dir: String,
         /// Optionally skip initial `skip_blocks` blocks (default: 0)
         pub skip_blocks: Option<usize>,
    @@ -1049,14 +1051,14 @@
     impl ConfigurableBlockchain for CompactFiltersBlockchain {
         type Config = CompactFiltersBlockchainConfig;
     
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
             let mempool = Arc::new(Mempool::default());
             let peers = config
                 .peers
                 .iter()
                 .map(|peer_conf| match &peer_conf.socks5 {
    -                None => Peer::connect(&peer_conf.address, Arc::clone(&mempool), config.network),
    -                Some(proxy) => Peer::connect_proxy(
    +                None => Peer::connect(&peer_conf.address, Arc::clone(&mempool), config.network),
    +                Some(proxy) => Peer::connect_proxy(
                         peer_conf.address.as_str(),
                         proxy,
                         peer_conf
    @@ -1117,7 +1119,7 @@
     }
     
     impl fmt::Display for CompactFiltersError {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -1130,11 +1132,10 @@
     impl_error!(std::time::SystemTimeError, Time, CompactFiltersError);
     
     impl From<crate::error::Error> for CompactFiltersError {
    -    fn from(err: crate::error::Error) -> Self {
    +    fn from(err: crate::error::Error) -> Self {
             CompactFiltersError::Global(Box::new(err))
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/peer.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/peer.rs.html index c9f3b00e9c..4c221b9644 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/peer.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/peer.rs.html @@ -1,4 +1,6 @@ -peer.rs - source
      1
    +peer.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -629,7 +631,7 @@
     
     impl Mempool {
         /// Create a new empty mempool
    -    pub fn new() -> Self {
    +    pub fn new() -> Self {
             Self::default()
         }
     
    @@ -645,13 +647,13 @@
         }
     
         /// Look-up a transaction in the mempool given an [`Inventory`] request
    -    pub fn get_tx(&self, inventory: &Inventory) -> Option<Transaction> {
    +    pub fn get_tx(&self, inventory: &Inventory) -> Option<Transaction> {
             let identifer = match inventory {
    -            Inventory::Error | Inventory::Block(_) | Inventory::WitnessBlock(_) => return None,
    -            Inventory::Transaction(txid) => TxIdentifier::Txid(*txid),
    -            Inventory::WitnessTransaction(txid) => TxIdentifier::Txid(*txid),
    -            Inventory::WTx(wtxid) => TxIdentifier::Wtxid(*wtxid),
    -            Inventory::Unknown { inv_type, hash } => {
    +            Inventory::Error | Inventory::Block(_) | Inventory::WitnessBlock(_) => return None,
    +            Inventory::Transaction(txid) => TxIdentifier::Txid(*txid),
    +            Inventory::WitnessTransaction(txid) => TxIdentifier::Txid(*txid),
    +            Inventory::WTx(wtxid) => TxIdentifier::Wtxid(*wtxid),
    +            Inventory::Unknown { inv_type, hash } => {
                     log::warn!(
                         "Unknown inventory request type `{}`, hash `{:?}`",
                         inv_type,
    @@ -662,8 +664,8 @@
             };
     
             let txid = match identifer {
    -            TxIdentifier::Txid(txid) => Some(txid),
    -            TxIdentifier::Wtxid(wtxid) => self.0.read().unwrap().wtxids.get(&wtxid).cloned(),
    +            TxIdentifier::Txid(txid) => Some(txid),
    +            TxIdentifier::Wtxid(wtxid) => self.0.read().unwrap().wtxids.get(&wtxid).cloned(),
             };
     
             txid.map(|txid| self.0.read().unwrap().txs.get(&txid).cloned())
    @@ -671,12 +673,12 @@
         }
     
         /// Return whether or not the mempool contains a transaction with a given txid
    -    pub fn has_tx(&self, txid: &Txid) -> bool {
    +    pub fn has_tx(&self, txid: &Txid) -> bool {
             self.0.read().unwrap().txs.contains_key(txid)
         }
     
         /// Return the list of transactions contained in the mempool
    -    pub fn iter_txs(&self) -> Vec<Transaction> {
    +    pub fn iter_txs(&self) -> Vec<Transaction> {
             self.0.read().unwrap().txs.values().cloned().collect()
         }
     }
    @@ -705,7 +707,7 @@
             address: A,
             mempool: Arc<Mempool>,
             network: Network,
    -    ) -> Result<Self, CompactFiltersError> {
    +    ) -> Result<Self, CompactFiltersError> {
             let stream = TcpStream::connect(address)?;
     
             Peer::from_stream(stream, mempool, network)
    @@ -722,7 +724,7 @@
             credentials: Option<(&str, &str)>,
             mempool: Arc<Mempool>,
             network: Network,
    -    ) -> Result<Self, CompactFiltersError> {
    +    ) -> Result<Self, CompactFiltersError> {
             let socks_stream = if let Some((username, password)) = credentials {
                 Socks5Stream::connect_with_password(proxy, target, username, password)?
             } else {
    @@ -737,7 +739,7 @@
             stream: TcpStream,
             mempool: Arc<Mempool>,
             network: Network,
    -    ) -> Result<Self, CompactFiltersError> {
    +    ) -> Result<Self, CompactFiltersError> {
             let writer = Arc::new(Mutex::new(stream.try_clone()?));
             let responses: Arc<RwLock<ResponsesMap>> = Arc::new(RwLock::new(HashMap::new()));
             let connected = Arc::new(RwLock::new(true));
    @@ -769,7 +771,7 @@
             };
     
             Self::_send(
    -            &mut locked_writer,
    +            &mut locked_writer,
                 network.magic(),
                 NetworkMessage::Version(VersionMessage::new(
                     ServiceFlags::WITNESS,
    @@ -790,7 +792,7 @@
             };
     
             if let NetworkMessage::Verack = Self::_recv(&responses, "verack", None).unwrap() {
    -            Self::_send(&mut locked_writer, network.magic(), NetworkMessage::Verack)?;
    +            Self::_send(&mut locked_writer, network.magic(), NetworkMessage::Verack)?;
             } else {
                 return Err(CompactFiltersError::InvalidResponse);
             }
    @@ -810,10 +812,10 @@
     
         /// Send a Bitcoin network message
         fn _send(
    -        writer: &mut TcpStream,
    +        writer: &mut TcpStream,
             magic: u32,
             payload: NetworkMessage,
    -    ) -> Result<(), CompactFiltersError> {
    +    ) -> Result<(), CompactFiltersError> {
             log::trace!("==> {:?}", payload);
     
             let raw_message = RawNetworkMessage { magic, payload };
    @@ -830,11 +832,11 @@
             responses: &Arc<RwLock<ResponsesMap>>,
             wait_for: &'static str,
             timeout: Option<Duration>,
    -    ) -> Option<NetworkMessage> {
    +    ) -> Option<NetworkMessage> {
             let message_resp = {
                 let mut lock = responses.write().unwrap();
                 let message_resp = lock.entry(wait_for).or_default();
    -            Arc::clone(&message_resp)
    +            Arc::clone(message_resp)
             };
     
             let (lock, cvar) = &*message_resp;
    @@ -842,8 +844,8 @@
             let mut messages = lock.lock().unwrap();
             while messages.is_empty() {
                 match timeout {
    -                None => messages = cvar.wait(messages).unwrap(),
    -                Some(t) => {
    +                None => messages = cvar.wait(messages).unwrap(),
    +                Some(t) => {
                         let result = cvar.wait_timeout(messages, t).unwrap();
                         if result.1.timed_out() {
                             return None;
    @@ -857,22 +859,22 @@
         }
     
         /// Return the [`VersionMessage`] sent by the peer
    -    pub fn get_version(&self) -> &VersionMessage {
    +    pub fn get_version(&self) -> &VersionMessage {
             &self.version
         }
     
         /// Return the Bitcoin [`Network`] in use
    -    pub fn get_network(&self) -> Network {
    +    pub fn get_network(&self) -> Network {
             self.network
         }
     
         /// Return the mempool used by this peer
    -    pub fn get_mempool(&self) -> Arc<Mempool> {
    +    pub fn get_mempool(&self) -> Arc<Mempool> {
             Arc::clone(&self.mempool)
         }
     
         /// Return whether or not the peer is still connected
    -    pub fn is_connected(&self) -> bool {
    +    pub fn is_connected(&self) -> bool {
             *self.connected.read().unwrap()
         }
     
    @@ -886,10 +888,10 @@
             reader_thread_connected: Arc<RwLock<bool>>,
         ) {
             macro_rules! check_disconnect {
    -            ($call:expr) => {
    +            ($call:expr) => {
                     match $call {
    -                    Ok(good) => good,
    -                    Err(e) => {
    +                    Ok(good) => good,
    +                    Err(e) => {
                             log::debug!("Error {:?}", e);
                             *reader_thread_connected.write().unwrap() = false;
     
    @@ -912,24 +914,24 @@
                 log::trace!("<== {:?}", in_message);
     
                 match in_message {
    -                NetworkMessage::Ping(nonce) => {
    +                NetworkMessage::Ping(nonce) => {
                         check_disconnect!(Self::_send(
    -                        &mut reader_thread_writer.lock().unwrap(),
    +                        &mut reader_thread_writer.lock().unwrap(),
                             network.magic(),
                             NetworkMessage::Pong(nonce),
                         ));
     
                         continue;
                     }
    -                NetworkMessage::Alert(_) => continue,
    -                NetworkMessage::GetData(ref inv) => {
    +                NetworkMessage::Alert(_) => continue,
    +                NetworkMessage::GetData(ref inv) => {
                         let (found, not_found): (Vec<_>, Vec<_>) = inv
                             .iter()
                             .map(|item| (*item, reader_thread_mempool.get_tx(item)))
                             .partition(|(_, d)| d.is_some());
                         for (_, found_tx) in found {
                             check_disconnect!(Self::_send(
    -                            &mut reader_thread_writer.lock().unwrap(),
    +                            &mut reader_thread_writer.lock().unwrap(),
                                 network.magic(),
                                 NetworkMessage::Tx(found_tx.unwrap()),
                             ));
    @@ -937,7 +939,7 @@
     
                         if !not_found.is_empty() {
                             check_disconnect!(Self::_send(
    -                            &mut reader_thread_writer.lock().unwrap(),
    +                            &mut reader_thread_writer.lock().unwrap(),
                                 network.magic(),
                                 NetworkMessage::NotFound(
                                     not_found.into_iter().map(|(i, _)| i).collect(),
    @@ -945,13 +947,13 @@
                             ));
                         }
                     }
    -                _ => {}
    +                _ => {}
                 }
     
                 let message_resp = {
                     let mut lock = reader_thread_responses.write().unwrap();
                     let message_resp = lock.entry(in_message.cmd()).or_default();
    -                Arc::clone(&message_resp)
    +                Arc::clone(message_resp)
                 };
     
                 let (lock, cvar) = &*message_resp;
    @@ -962,9 +964,9 @@
         }
     
         /// Send a raw Bitcoin message to the peer
    -    pub fn send(&self, payload: NetworkMessage) -> Result<(), CompactFiltersError> {
    +    pub fn send(&self, payload: NetworkMessage) -> Result<(), CompactFiltersError> {
             let mut writer = self.writer.lock().unwrap();
    -        Self::_send(&mut writer, self.network.magic(), payload)
    +        Self::_send(&mut writer, self.network.magic(), payload)
         }
     
         /// Waits for a specific incoming Bitcoin message, optionally with a timeout
    @@ -972,7 +974,7 @@
             &self,
             wait_for: &'static str,
             timeout: Option<Duration>,
    -    ) -> Result<Option<NetworkMessage>, CompactFiltersError> {
    +    ) -> Result<Option<NetworkMessage>, CompactFiltersError> {
             Ok(Self::_recv(&self.responses, wait_for, timeout))
         }
     }
    @@ -982,20 +984,20 @@
             &self,
             filter_type: u8,
             stop_hash: BlockHash,
    -    ) -> Result<CFCheckpt, CompactFiltersError>;
    +    ) -> Result<CFCheckpt, CompactFiltersError>;
         fn get_cf_headers(
             &self,
             filter_type: u8,
             start_height: u32,
             stop_hash: BlockHash,
    -    ) -> Result<CFHeaders, CompactFiltersError>;
    +    ) -> Result<CFHeaders, CompactFiltersError>;
         fn get_cf_filters(
             &self,
             filter_type: u8,
             start_height: u32,
             stop_hash: BlockHash,
    -    ) -> Result<(), CompactFiltersError>;
    -    fn pop_cf_filter_resp(&self) -> Result<CFilter, CompactFiltersError>;
    +    ) -> Result<(), CompactFiltersError>;
    +    fn pop_cf_filter_resp(&self) -> Result<CFilter, CompactFiltersError>;
     }
     
     impl CompactFiltersPeer for Peer {
    @@ -1003,7 +1005,7 @@
             &self,
             filter_type: u8,
             stop_hash: BlockHash,
    -    ) -> Result<CFCheckpt, CompactFiltersError> {
    +    ) -> Result<CFCheckpt, CompactFiltersError> {
             self.send(NetworkMessage::GetCFCheckpt(GetCFCheckpt {
                 filter_type,
                 stop_hash,
    @@ -1013,8 +1015,8 @@
                 .recv("cfcheckpt", Some(Duration::from_secs(TIMEOUT_SECS)))?
                 .ok_or(CompactFiltersError::Timeout)?;
             let response = match response {
    -            NetworkMessage::CFCheckpt(response) => response,
    -            _ => return Err(CompactFiltersError::InvalidResponse),
    +            NetworkMessage::CFCheckpt(response) => response,
    +            _ => return Err(CompactFiltersError::InvalidResponse),
             };
     
             if response.filter_type != filter_type {
    @@ -1029,7 +1031,7 @@
             filter_type: u8,
             start_height: u32,
             stop_hash: BlockHash,
    -    ) -> Result<CFHeaders, CompactFiltersError> {
    +    ) -> Result<CFHeaders, CompactFiltersError> {
             self.send(NetworkMessage::GetCFHeaders(GetCFHeaders {
                 filter_type,
                 start_height,
    @@ -1040,8 +1042,8 @@
                 .recv("cfheaders", Some(Duration::from_secs(TIMEOUT_SECS)))?
                 .ok_or(CompactFiltersError::Timeout)?;
             let response = match response {
    -            NetworkMessage::CFHeaders(response) => response,
    -            _ => return Err(CompactFiltersError::InvalidResponse),
    +            NetworkMessage::CFHeaders(response) => response,
    +            _ => return Err(CompactFiltersError::InvalidResponse),
             };
     
             if response.filter_type != filter_type {
    @@ -1051,13 +1053,13 @@
             Ok(response)
         }
     
    -    fn pop_cf_filter_resp(&self) -> Result<CFilter, CompactFiltersError> {
    +    fn pop_cf_filter_resp(&self) -> Result<CFilter, CompactFiltersError> {
             let response = self
                 .recv("cfilter", Some(Duration::from_secs(TIMEOUT_SECS)))?
                 .ok_or(CompactFiltersError::Timeout)?;
             let response = match response {
    -            NetworkMessage::CFilter(response) => response,
    -            _ => return Err(CompactFiltersError::InvalidResponse),
    +            NetworkMessage::CFilter(response) => response,
    +            _ => return Err(CompactFiltersError::InvalidResponse),
             };
     
             Ok(response)
    @@ -1068,7 +1070,7 @@
             filter_type: u8,
             start_height: u32,
             stop_hash: BlockHash,
    -    ) -> Result<(), CompactFiltersError> {
    +    ) -> Result<(), CompactFiltersError> {
             self.send(NetworkMessage::GetCFilters(GetCFilters {
                 filter_type,
                 start_height,
    @@ -1080,34 +1082,34 @@
     }
     
     pub trait InvPeer {
    -    fn get_block(&self, block_hash: BlockHash) -> Result<Option<Block>, CompactFiltersError>;
    -    fn ask_for_mempool(&self) -> Result<(), CompactFiltersError>;
    -    fn broadcast_tx(&self, tx: Transaction) -> Result<(), CompactFiltersError>;
    +    fn get_block(&self, block_hash: BlockHash) -> Result<Option<Block>, CompactFiltersError>;
    +    fn ask_for_mempool(&self) -> Result<(), CompactFiltersError>;
    +    fn broadcast_tx(&self, tx: Transaction) -> Result<(), CompactFiltersError>;
     }
     
     impl InvPeer for Peer {
    -    fn get_block(&self, block_hash: BlockHash) -> Result<Option<Block>, CompactFiltersError> {
    +    fn get_block(&self, block_hash: BlockHash) -> Result<Option<Block>, CompactFiltersError> {
             self.send(NetworkMessage::GetData(vec![Inventory::WitnessBlock(
                 block_hash,
             )]))?;
     
             match self.recv("block", Some(Duration::from_secs(TIMEOUT_SECS)))? {
    -            None => Ok(None),
    -            Some(NetworkMessage::Block(response)) => Ok(Some(response)),
    -            _ => Err(CompactFiltersError::InvalidResponse),
    +            None => Ok(None),
    +            Some(NetworkMessage::Block(response)) => Ok(Some(response)),
    +            _ => Err(CompactFiltersError::InvalidResponse),
             }
         }
     
    -    fn ask_for_mempool(&self) -> Result<(), CompactFiltersError> {
    +    fn ask_for_mempool(&self) -> Result<(), CompactFiltersError> {
             if !self.version.services.has(ServiceFlags::BLOOM) {
                 return Err(CompactFiltersError::PeerBloomDisabled);
             }
     
             self.send(NetworkMessage::MemPool)?;
             let inv = match self.recv("inv", Some(Duration::from_secs(5)))? {
    -            None => return Ok(()), // empty mempool
    -            Some(NetworkMessage::Inv(inv)) => inv,
    -            _ => return Err(CompactFiltersError::InvalidResponse),
    +            None => return Ok(()), // empty mempool
    +            Some(NetworkMessage::Inv(inv)) => inv,
    +            _ => return Err(CompactFiltersError::InvalidResponse),
             };
     
             let getdata = inv
    @@ -1125,8 +1127,8 @@
                     .recv("tx", Some(Duration::from_secs(TIMEOUT_SECS)))?
                     .ok_or(CompactFiltersError::Timeout)?;
                 let tx = match tx {
    -                NetworkMessage::Tx(tx) => tx,
    -                _ => return Err(CompactFiltersError::InvalidResponse),
    +                NetworkMessage::Tx(tx) => tx,
    +                _ => return Err(CompactFiltersError::InvalidResponse),
                 };
     
                 self.mempool.add_tx(tx);
    @@ -1135,7 +1137,7 @@
             Ok(())
         }
     
    -    fn broadcast_tx(&self, tx: Transaction) -> Result<(), CompactFiltersError> {
    +    fn broadcast_tx(&self, tx: Transaction) -> Result<(), CompactFiltersError> {
             self.mempool.add_tx(tx.clone());
             self.send(NetworkMessage::Tx(tx))?;
     
    @@ -1143,6 +1145,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/store.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/store.rs.html index e7ee810018..80e0956346 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/store.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/store.rs.html @@ -1,4 +1,6 @@ -store.rs - source
      1
    +store.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -911,33 +913,33 @@
     }
     
     impl StoreEntry {
    -    pub fn get_prefix(&self) -> Vec<u8> {
    +    pub fn get_prefix(&self) -> Vec<u8> {
             match self {
    -            StoreEntry::BlockHeader(_) => b"z",
    -            StoreEntry::Block(_) => b"x",
    -            StoreEntry::BlockHeaderIndex(_) => b"i",
    -            StoreEntry::CFilterTable(_) => b"t",
    +            StoreEntry::BlockHeader(_) => b"z",
    +            StoreEntry::Block(_) => b"x",
    +            StoreEntry::BlockHeaderIndex(_) => b"i",
    +            StoreEntry::CFilterTable(_) => b"t",
             }
             .to_vec()
         }
     
    -    pub fn get_key(&self) -> Vec<u8> {
    +    pub fn get_key(&self) -> Vec<u8> {
             let mut prefix = self.get_prefix();
             match self {
    -            StoreEntry::BlockHeader(Some(height)) => {
    +            StoreEntry::BlockHeader(Some(height)) => {
                     prefix.extend_from_slice(&height.to_be_bytes())
                 }
    -            StoreEntry::Block(Some(height)) => prefix.extend_from_slice(&height.to_be_bytes()),
    -            StoreEntry::BlockHeaderIndex(Some(hash)) => {
    +            StoreEntry::Block(Some(height)) => prefix.extend_from_slice(&height.to_be_bytes()),
    +            StoreEntry::BlockHeaderIndex(Some(hash)) => {
                     prefix.extend_from_slice(&hash.into_inner())
                 }
    -            StoreEntry::CFilterTable((filter_type, bundle_index)) => {
    +            StoreEntry::CFilterTable((filter_type, bundle_index)) => {
                     prefix.push(*filter_type);
                     if let Some(bundle_index) = bundle_index {
                         prefix.extend_from_slice(&bundle_index.to_be_bytes());
                     }
                 }
    -            _ => {}
    +            _ => {}
             }
     
             prefix
    @@ -945,60 +947,60 @@
     }
     
     pub trait SerializeDb: Sized {
    -    fn serialize(&self) -> Vec<u8>;
    -    fn deserialize(data: &[u8]) -> Result<Self, CompactFiltersError>;
    +    fn serialize(&self) -> Vec<u8>;
    +    fn deserialize(data: &[u8]) -> Result<Self, CompactFiltersError>;
     }
     
     impl<T> SerializeDb for T
     where
         T: Encodable + Decodable,
     {
    -    fn serialize(&self) -> Vec<u8> {
    +    fn serialize(&self) -> Vec<u8> {
             serialize(self)
         }
     
    -    fn deserialize(data: &[u8]) -> Result<Self, CompactFiltersError> {
    +    fn deserialize(data: &[u8]) -> Result<Self, CompactFiltersError> {
             deserialize(data).map_err(|_| CompactFiltersError::DataCorruption)
         }
     }
     
     impl Encodable for BundleStatus {
    -    fn consensus_encode<W: Write>(&self, mut e: W) -> Result<usize, std::io::Error> {
    +    fn consensus_encode<W: Write>(&self, mut e: W) -> Result<usize, std::io::Error> {
             let mut written = 0;
     
             match self {
    -            BundleStatus::Init => {
    -                written += 0x00u8.consensus_encode(&mut e)?;
    +            BundleStatus::Init => {
    +                written += 0x00u8.consensus_encode(&mut e)?;
                 }
    -            BundleStatus::CfHeaders { cf_headers } => {
    -                written += 0x01u8.consensus_encode(&mut e)?;
    -                written += VarInt(cf_headers.len() as u64).consensus_encode(&mut e)?;
    +            BundleStatus::CfHeaders { cf_headers } => {
    +                written += 0x01u8.consensus_encode(&mut e)?;
    +                written += VarInt(cf_headers.len() as u64).consensus_encode(&mut e)?;
                     for header in cf_headers {
    -                    written += header.consensus_encode(&mut e)?;
    +                    written += header.consensus_encode(&mut e)?;
                     }
                 }
    -            BundleStatus::CFilters { cf_filters } => {
    -                written += 0x02u8.consensus_encode(&mut e)?;
    -                written += VarInt(cf_filters.len() as u64).consensus_encode(&mut e)?;
    +            BundleStatus::CFilters { cf_filters } => {
    +                written += 0x02u8.consensus_encode(&mut e)?;
    +                written += VarInt(cf_filters.len() as u64).consensus_encode(&mut e)?;
                     for filter in cf_filters {
    -                    written += filter.consensus_encode(&mut e)?;
    +                    written += filter.consensus_encode(&mut e)?;
                     }
                 }
    -            BundleStatus::Processed { cf_filters } => {
    -                written += 0x03u8.consensus_encode(&mut e)?;
    -                written += VarInt(cf_filters.len() as u64).consensus_encode(&mut e)?;
    +            BundleStatus::Processed { cf_filters } => {
    +                written += 0x03u8.consensus_encode(&mut e)?;
    +                written += VarInt(cf_filters.len() as u64).consensus_encode(&mut e)?;
                     for filter in cf_filters {
    -                    written += filter.consensus_encode(&mut e)?;
    +                    written += filter.consensus_encode(&mut e)?;
                     }
                 }
    -            BundleStatus::Pruned => {
    -                written += 0x04u8.consensus_encode(&mut e)?;
    +            BundleStatus::Pruned => {
    +                written += 0x04u8.consensus_encode(&mut e)?;
                 }
    -            BundleStatus::Tip { cf_filters } => {
    -                written += 0x05u8.consensus_encode(&mut e)?;
    -                written += VarInt(cf_filters.len() as u64).consensus_encode(&mut e)?;
    +            BundleStatus::Tip { cf_filters } => {
    +                written += 0x05u8.consensus_encode(&mut e)?;
    +                written += VarInt(cf_filters.len() as u64).consensus_encode(&mut e)?;
                     for filter in cf_filters {
    -                    written += filter.consensus_encode(&mut e)?;
    +                    written += filter.consensus_encode(&mut e)?;
                     }
                 }
             }
    @@ -1008,56 +1010,56 @@
     }
     
     impl Decodable for BundleStatus {
    -    fn consensus_decode<D: Read>(mut d: D) -> Result<Self, bitcoin::consensus::encode::Error> {
    -        let byte_type = u8::consensus_decode(&mut d)?;
    +    fn consensus_decode<D: Read>(mut d: D) -> Result<Self, bitcoin::consensus::encode::Error> {
    +        let byte_type = u8::consensus_decode(&mut d)?;
             match byte_type {
    -            0x00 => Ok(BundleStatus::Init),
    -            0x01 => {
    -                let num = VarInt::consensus_decode(&mut d)?;
    +            0x00 => Ok(BundleStatus::Init),
    +            0x01 => {
    +                let num = VarInt::consensus_decode(&mut d)?;
                     let num = num.0 as usize;
     
                     let mut cf_headers = Vec::with_capacity(num);
                     for _ in 0..num {
    -                    cf_headers.push(FilterHeader::consensus_decode(&mut d)?);
    +                    cf_headers.push(FilterHeader::consensus_decode(&mut d)?);
                     }
     
                     Ok(BundleStatus::CfHeaders { cf_headers })
                 }
    -            0x02 => {
    -                let num = VarInt::consensus_decode(&mut d)?;
    +            0x02 => {
    +                let num = VarInt::consensus_decode(&mut d)?;
                     let num = num.0 as usize;
     
                     let mut cf_filters = Vec::with_capacity(num);
                     for _ in 0..num {
    -                    cf_filters.push(Vec::<u8>::consensus_decode(&mut d)?);
    +                    cf_filters.push(Vec::<u8>::consensus_decode(&mut d)?);
                     }
     
                     Ok(BundleStatus::CFilters { cf_filters })
                 }
    -            0x03 => {
    -                let num = VarInt::consensus_decode(&mut d)?;
    +            0x03 => {
    +                let num = VarInt::consensus_decode(&mut d)?;
                     let num = num.0 as usize;
     
                     let mut cf_filters = Vec::with_capacity(num);
                     for _ in 0..num {
    -                    cf_filters.push(Vec::<u8>::consensus_decode(&mut d)?);
    +                    cf_filters.push(Vec::<u8>::consensus_decode(&mut d)?);
                     }
     
                     Ok(BundleStatus::Processed { cf_filters })
                 }
    -            0x04 => Ok(BundleStatus::Pruned),
    -            0x05 => {
    -                let num = VarInt::consensus_decode(&mut d)?;
    +            0x04 => Ok(BundleStatus::Pruned),
    +            0x05 => {
    +                let num = VarInt::consensus_decode(&mut d)?;
                     let num = num.0 as usize;
     
                     let mut cf_filters = Vec::with_capacity(num);
                     for _ in 0..num {
    -                    cf_filters.push(Vec::<u8>::consensus_decode(&mut d)?);
    +                    cf_filters.push(Vec::<u8>::consensus_decode(&mut d)?);
                     }
     
                     Ok(BundleStatus::Tip { cf_filters })
                 }
    -            _ => Err(bitcoin::consensus::encode::Error::ParseFailed(
    +            _ => Err(bitcoin::consensus::encode::Error::ParseFailed(
                     "Invalid byte type",
                 )),
             }
    @@ -1073,12 +1075,12 @@
     }
     
     impl ChainStore<Full> {
    -    pub fn new(store: DB, network: Network) -> Result<Self, CompactFiltersError> {
    +    pub fn new(store: DB, network: Network) -> Result<Self, CompactFiltersError> {
             let genesis = match network {
    -            Network::Bitcoin => MAINNET_GENESIS.deref(),
    -            Network::Testnet => TESTNET_GENESIS.deref(),
    -            Network::Regtest => REGTEST_GENESIS.deref(),
    -            Network::Signet => SIGNET_GENESIS.deref(),
    +            Network::Bitcoin => MAINNET_GENESIS.deref(),
    +            Network::Testnet => TESTNET_GENESIS.deref(),
    +            Network::Regtest => REGTEST_GENESIS.deref(),
    +            Network::Signet => SIGNET_GENESIS.deref(),
             };
     
             let cf_name = "default".to_string();
    @@ -1110,7 +1112,7 @@
             })
         }
     
    -    pub fn get_locators(&self) -> Result<Vec<(BlockHash, usize)>, CompactFiltersError> {
    +    pub fn get_locators(&self) -> Result<Vec<(BlockHash, usize)>, CompactFiltersError> {
             let mut step = 1;
             let mut index = self.get_height()?;
             let mut answer = Vec::new();
    @@ -1140,7 +1142,7 @@
             Ok(answer)
         }
     
    -    pub fn start_snapshot(&self, from: usize) -> Result<ChainStore<Snapshot>, CompactFiltersError> {
    +    pub fn start_snapshot(&self, from: usize) -> Result<ChainStore<Snapshot>, CompactFiltersError> {
             let new_cf_name: String = thread_rng().sample_iter(&Alphanumeric).take(16).collect();
             let new_cf_name = format!("_headers:{}", new_cf_name);
     
    @@ -1180,7 +1182,7 @@
             })
         }
     
    -    pub fn recover_snapshot(&self, cf_name: &str) -> Result<(), CompactFiltersError> {
    +    pub fn recover_snapshot(&self, cf_name: &str) -> Result<(), CompactFiltersError> {
             let mut write_store = self.store.write().unwrap();
             let snapshot_cf_handle = write_store.cf_handle(cf_name).unwrap();
     
    @@ -1192,13 +1194,13 @@
                 .and_then(|(k, _)| k[1..].try_into().ok())
                 .map(usize::from_be_bytes)
             {
    -            None => {
    +            None => {
                     std::mem::drop(iterator);
                     write_store.drop_cf(cf_name).ok();
     
                     return Ok(());
                 }
    -            Some(x) => x,
    +            Some(x) => x,
             };
             std::mem::drop(iterator);
             std::mem::drop(write_store);
    @@ -1220,7 +1222,7 @@
         pub fn apply_snapshot(
             &self,
             snaphost: ChainStore<Snapshot>,
    -    ) -> Result<(), CompactFiltersError> {
    +    ) -> Result<(), CompactFiltersError> {
             let mut batch = WriteBatch::default();
     
             let read_store = self.store.read().unwrap();
    @@ -1248,7 +1250,7 @@
                 );
             }
     
    -        // Delete full blocks overriden by snapshot
    +        // Delete full blocks overridden by snapshot
             let from_key = StoreEntry::Block(Some(snaphost.min_height)).get_key();
             let to_key = StoreEntry::Block(Some(usize::MAX)).get_key();
             batch.delete_range(&from_key, &to_key);
    @@ -1269,7 +1271,7 @@
         pub fn get_height_for(
             &self,
             block_hash: &BlockHash,
    -    ) -> Result<Option<usize>, CompactFiltersError> {
    +    ) -> Result<Option<usize>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
             let cf_handle = read_store.cf_handle(&self.cf_name).unwrap();
     
    @@ -1285,7 +1287,7 @@
             .transpose()
         }
     
    -    pub fn get_block_hash(&self, height: usize) -> Result<Option<BlockHash>, CompactFiltersError> {
    +    pub fn get_block_hash(&self, height: usize) -> Result<Option<BlockHash>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
             let cf_handle = read_store.cf_handle(&self.cf_name).unwrap();
     
    @@ -1299,14 +1301,14 @@
             .transpose()
         }
     
    -    pub fn save_full_block(&self, block: &Block, height: usize) -> Result<(), CompactFiltersError> {
    +    pub fn save_full_block(&self, block: &Block, height: usize) -> Result<(), CompactFiltersError> {
             let key = StoreEntry::Block(Some(height)).get_key();
             self.store.read().unwrap().put(key, block.serialize())?;
     
             Ok(())
         }
     
    -    pub fn get_full_block(&self, height: usize) -> Result<Option<Block>, CompactFiltersError> {
    +    pub fn get_full_block(&self, height: usize) -> Result<Option<Block>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
     
             let key = StoreEntry::Block(Some(height)).get_key();
    @@ -1318,7 +1320,7 @@
                 .map_err(|_| CompactFiltersError::DataCorruption)
         }
     
    -    pub fn delete_blocks_until(&self, height: usize) -> Result<(), CompactFiltersError> {
    +    pub fn delete_blocks_until(&self, height: usize) -> Result<(), CompactFiltersError> {
             let from_key = StoreEntry::Block(Some(0)).get_key();
             let to_key = StoreEntry::Block(Some(height)).get_key();
     
    @@ -1330,7 +1332,7 @@
             Ok(())
         }
     
    -    pub fn iter_full_blocks(&self) -> Result<Vec<(usize, Block)>, CompactFiltersError> {
    +    pub fn iter_full_blocks(&self) -> Result<Vec<(usize, Block)>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
     
             let prefix = StoreEntry::Block(None).get_key();
    @@ -1355,7 +1357,7 @@
     }
     
     impl<T: StoreType> ChainStore<T> {
    -    pub fn work(&self) -> Result<Uint256, CompactFiltersError> {
    +    pub fn work(&self) -> Result<Uint256, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
             let cf_handle = read_store.cf_handle(&self.cf_name).unwrap();
     
    @@ -1364,7 +1366,7 @@
     
             Ok(iterator
                 .last()
    -            .map(|(_, v)| -> Result<_, CompactFiltersError> {
    +            .map(|(_, v)| -> Result<_, CompactFiltersError> {
                     let (_, work): (BlockHeader, Uint256) = SerializeDb::deserialize(&v)?;
     
                     Ok(work)
    @@ -1373,7 +1375,7 @@
                 .unwrap_or_default())
         }
     
    -    pub fn get_height(&self) -> Result<usize, CompactFiltersError> {
    +    pub fn get_height(&self) -> Result<usize, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
             let cf_handle = read_store.cf_handle(&self.cf_name).unwrap();
     
    @@ -1382,7 +1384,7 @@
     
             Ok(iterator
                 .last()
    -            .map(|(k, _)| -> Result<_, CompactFiltersError> {
    +            .map(|(k, _)| -> Result<_, CompactFiltersError> {
                     let height = usize::from_be_bytes(
                         k[1..]
                             .try_into()
    @@ -1395,7 +1397,7 @@
                 .unwrap_or_default())
         }
     
    -    pub fn get_tip_hash(&self) -> Result<Option<BlockHash>, CompactFiltersError> {
    +    pub fn get_tip_hash(&self) -> Result<Option<BlockHash>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
             let cf_handle = read_store.cf_handle(&self.cf_name).unwrap();
     
    @@ -1404,7 +1406,7 @@
     
             iterator
                 .last()
    -            .map(|(_, v)| -> Result<_, CompactFiltersError> {
    +            .map(|(_, v)| -> Result<_, CompactFiltersError> {
                     let (header, _): (BlockHeader, Uint256) = SerializeDb::deserialize(&v)?;
     
                     Ok(header.block_hash())
    @@ -1413,10 +1415,10 @@
         }
     
         pub fn apply(
    -        &mut self,
    +        &mut self,
             from: usize,
             headers: Vec<BlockHeader>,
    -    ) -> Result<BlockHash, CompactFiltersError> {
    +    ) -> Result<BlockHash, CompactFiltersError> {
             let mut batch = WriteBatch::default();
     
             let read_store = self.store.read().unwrap();
    @@ -1460,7 +1462,7 @@
     }
     
     impl<T: StoreType> fmt::Debug for ChainStore<T> {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             f.debug_struct(&format!("ChainStore<{:?}>", T::default()))
                 .field("cf_name", &self.cf_name)
                 .field("min_height", &self.min_height)
    @@ -1491,17 +1493,17 @@
         pub fn new(
             headers_store: &ChainStore<Full>,
             filter_type: u8,
    -    ) -> Result<Self, CompactFiltersError> {
    +    ) -> Result<Self, CompactFiltersError> {
             let cf_store = CfStore {
                 store: Arc::clone(&headers_store.store),
                 filter_type,
             };
     
             let genesis = match headers_store.network {
    -            Network::Bitcoin => MAINNET_GENESIS.deref(),
    -            Network::Testnet => TESTNET_GENESIS.deref(),
    -            Network::Regtest => REGTEST_GENESIS.deref(),
    -            Network::Signet => SIGNET_GENESIS.deref(),
    +            Network::Bitcoin => MAINNET_GENESIS.deref(),
    +            Network::Testnet => TESTNET_GENESIS.deref(),
    +            Network::Regtest => REGTEST_GENESIS.deref(),
    +            Network::Signet => SIGNET_GENESIS.deref(),
             };
     
             let filter = BlockFilter::new_script_filter(genesis, |utxo| {
    @@ -1527,11 +1529,11 @@
             Ok(cf_store)
         }
     
    -    pub fn get_filter_type(&self) -> u8 {
    +    pub fn get_filter_type(&self) -> u8 {
             self.filter_type
         }
     
    -    pub fn get_bundles(&self) -> Result<Vec<BundleEntry>, CompactFiltersError> {
    +    pub fn get_bundles(&self) -> Result<Vec<BundleEntry>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
     
             let prefix = StoreEntry::CFilterTable((self.filter_type, None)).get_key();
    @@ -1545,7 +1547,7 @@
                 .collect::<Result<_, _>>()
         }
     
    -    pub fn get_checkpoints(&self) -> Result<Vec<FilterHeader>, CompactFiltersError> {
    +    pub fn get_checkpoints(&self) -> Result<Vec<FilterHeader>, CompactFiltersError> {
             let read_store = self.store.read().unwrap();
     
             let prefix = StoreEntry::CFilterTable((self.filter_type, None)).get_key();
    @@ -1563,7 +1565,7 @@
         pub fn replace_checkpoints(
             &self,
             checkpoints: Vec<FilterHeader>,
    -    ) -> Result<(), CompactFiltersError> {
    +    ) -> Result<(), CompactFiltersError> {
             let current_checkpoints = self.get_checkpoints()?;
     
             let mut equal_bundles = 0;
    @@ -1606,11 +1608,11 @@
             bundle: usize,
             checkpoint: FilterHeader,
             filter_hashes: Vec<FilterHash>,
    -    ) -> Result<BundleStatus, CompactFiltersError> {
    +    ) -> Result<BundleStatus, CompactFiltersError> {
             let cf_headers: Vec<FilterHeader> = filter_hashes
                 .into_iter()
                 .scan(checkpoint, |prev_header, filter_hash| {
    -                let filter_header = filter_hash.filter_header(&prev_header);
    +                let filter_header = filter_hash.filter_header(prev_header);
                     *prev_header = filter_header;
     
                     Some(filter_header)
    @@ -1645,13 +1647,13 @@
             checkpoint: FilterHeader,
             headers: Vec<FilterHeader>,
             filters: Vec<(usize, Vec<u8>)>,
    -    ) -> Result<BundleStatus, CompactFiltersError> {
    +    ) -> Result<BundleStatus, CompactFiltersError> {
             let cf_filters = filters
                 .into_iter()
                 .zip(headers.into_iter())
                 .scan(checkpoint, |prev_header, ((_, filter_content), header)| {
                     let filter = BlockFilter::new(&filter_content);
    -                if header != filter.filter_header(&prev_header) {
    +                if header != filter.filter_header(prev_header) {
                         return Some(Err(CompactFiltersError::InvalidFilter));
                     }
                     *prev_header = header;
    @@ -1673,7 +1675,7 @@
             &self,
             bundle: usize,
             checkpoint: FilterHeader,
    -    ) -> Result<BundleStatus, CompactFiltersError> {
    +    ) -> Result<BundleStatus, CompactFiltersError> {
             let key = StoreEntry::CFilterTable((self.filter_type, Some(bundle))).get_key();
             let value = (BundleStatus::Pruned, checkpoint);
     
    @@ -1688,7 +1690,7 @@
             bundle: usize,
             cf_filters: Vec<Vec<u8>>,
             checkpoint: FilterHeader,
    -    ) -> Result<BundleStatus, CompactFiltersError> {
    +    ) -> Result<BundleStatus, CompactFiltersError> {
             let key = StoreEntry::CFilterTable((self.filter_type, Some(bundle))).get_key();
             let value = (BundleStatus::Tip { cf_filters }, checkpoint);
     
    @@ -1699,6 +1701,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/sync.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/sync.rs.html index 9e1601fadd..31039a028b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/sync.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/compact_filters/sync.rs.html @@ -1,4 +1,6 @@ -sync.rs - source
      1
    +sync.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -333,7 +335,7 @@
             headers_store: Arc<ChainStore<Full>>,
             skip_blocks: usize,
             filter_type: u8,
    -    ) -> Result<Self, CompactFiltersError> {
    +    ) -> Result<Self, CompactFiltersError> {
             let cf_store = Arc::new(CfStore::new(&headers_store, filter_type)?);
     
             Ok(CfSync {
    @@ -344,19 +346,19 @@
             })
         }
     
    -    pub fn pruned_bundles(&self) -> Result<usize, CompactFiltersError> {
    +    pub fn pruned_bundles(&self) -> Result<usize, CompactFiltersError> {
             Ok(self
                 .cf_store
                 .get_bundles()?
                 .into_iter()
                 .skip(self.skip_blocks / 1000)
                 .fold(0, |acc, (status, _)| match status {
    -                BundleStatus::Pruned => acc + 1,
    -                _ => acc,
    +                BundleStatus::Pruned => acc + 1,
    +                _ => acc,
                 }))
         }
     
    -    pub fn prepare_sync(&self, peer: Arc<Peer>) -> Result<(), CompactFiltersError> {
    +    pub fn prepare_sync(&self, peer: Arc<Peer>) -> Result<(), CompactFiltersError> {
             let mut bundles_lock = self.bundles.lock().unwrap();
     
             let resp = peer.get_cf_checkpt(
    @@ -378,17 +380,17 @@
             peer: Arc<Peer>,
             process: F,
             completed_bundle: Q,
    -    ) -> Result<(), CompactFiltersError>
    +    ) -> Result<(), CompactFiltersError>
         where
    -        F: Fn(&BlockHash, &BlockFilter) -> Result<bool, CompactFiltersError>,
    -        Q: Fn(usize) -> Result<(), Error>,
    +        F: Fn(&BlockHash, &BlockFilter) -> Result<bool, CompactFiltersError>,
    +        Q: Fn(usize) -> Result<(), Error>,
         {
             let current_height = self.headers_store.get_height()?; // TODO: we should update it in case headers_store is also updated
     
             loop {
                 let (mut status, checkpoint, index) = match self.bundles.lock().unwrap().pop_front() {
    -                None => break,
    -                Some(x) => x,
    +                None => break,
    +                Some(x) => x,
                 };
     
                 log::debug!(
    @@ -399,7 +401,7 @@
                 );
     
                 let process_received_filters =
    -                |expected_filters| -> Result<BTreeMap<usize, Vec<u8>>, CompactFiltersError> {
    +                |expected_filters| -> Result<BTreeMap<usize, Vec<u8>>, CompactFiltersError> {
                         let mut filters_map = BTreeMap::new();
                         for _ in 0..expected_filters {
                             let filter = peer.pop_cf_filter_resp()?;
    @@ -408,8 +410,8 @@
                             }
     
                             match self.headers_store.get_height_for(&filter.block_hash)? {
    -                            Some(height) => filters_map.insert(height, filter.filter),
    -                            None => return Err(CompactFiltersError::InvalidFilter),
    +                            Some(height) => filters_map.insert(height, filter.filter),
    +                            None => return Err(CompactFiltersError::InvalidFilter),
                             };
                         }
     
    @@ -431,7 +433,7 @@
     
                     let resp = peer.get_cf_headers(0x00, start_height as u32, stop_hash)?;
     
    -                assert!(resp.previous_filter_header == checkpoint);
    +                assert!(resp.previous_filter_header == checkpoint);
                     status =
                         self.cf_store
                             .advance_to_cf_headers(index, checkpoint, resp.filter_hashes)?;
    @@ -447,8 +449,8 @@
                         checkpoint,
                         headers_resp.filter_hashes,
                     )? {
    -                    BundleStatus::CfHeaders { cf_headers } => cf_headers,
    -                    _ => return Err(CompactFiltersError::InvalidResponse),
    +                    BundleStatus::CfHeaders { cf_headers } => cf_headers,
    +                    _ => return Err(CompactFiltersError::InvalidResponse),
                     };
     
                     peer.get_cf_filters(
    @@ -501,7 +503,7 @@
                         let block_hash = self.headers_store.get_block_hash(height)?.unwrap();
     
                         // TODO: also download random blocks?
    -                    if process(&block_hash, &BlockFilter::new(&filter))? {
    +                    if process(&block_hash, &BlockFilter::new(filter))? {
                             log::debug!("Downloading block {}", block_hash);
     
                             let block = peer
    @@ -540,9 +542,9 @@
         peer: Arc<Peer>,
         store: Arc<ChainStore<Full>>,
         sync_fn: F,
    -) -> Result<Option<ChainStore<Snapshot>>, CompactFiltersError>
    +) -> Result<Option<ChainStore<Snapshot>>, CompactFiltersError>
     where
    -    F: Fn(usize) -> Result<(), Error>,
    +    F: Fn(usize) -> Result<(), Error>,
     {
         let locators = store.get_locators()?;
         let locators_vec = locators.iter().map(|(hash, _)| hash).cloned().collect();
    @@ -561,8 +563,8 @@
             }
     
             match locators_map.get(&headers[0].prev_blockhash) {
    -            None => return Err(CompactFiltersError::InvalidHeaders),
    -            Some(from) => (store.start_snapshot(*from)?, headers[0].prev_blockhash),
    +            None => return Err(CompactFiltersError::InvalidHeaders),
    +            Some(from) => (store.start_snapshot(*from)?, headers[0].prev_blockhash),
             }
         } else {
             return Err(CompactFiltersError::InvalidResponse);
    @@ -591,6 +593,5 @@
         Ok(Some(snapshot))
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/electrum.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/electrum.rs.html index a51f2cbb78..75ba2cb640 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/electrum.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/electrum.rs.html @@ -1,4 +1,6 @@ -electrum.rs - source
      1
    +electrum.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -183,6 +185,140 @@
     183
     184
     185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -209,20 +345,20 @@
     //! # Ok::<(), bdk::Error>(())
     //! ```
     
    -use std::collections::HashSet;
    +use std::collections::{HashMap, HashSet};
     
     #[allow(unused_imports)]
     use log::{debug, error, info, trace};
     
    -use bitcoin::{BlockHeader, Script, Transaction, Txid};
    +use bitcoin::{Transaction, Txid};
     
     use electrum_client::{Client, ConfigBuilder, ElectrumApi, Socks5Config};
     
    -use self::utils::{ElectrumLikeSync, ElsGetHistoryRes};
    +use super::script_sync::Request;
     use super::*;
    -use crate::database::BatchDatabase;
    +use crate::database::{BatchDatabase, Database};
     use crate::error::Error;
    -use crate::FeeRate;
    +use crate::{BlockTime, FeeRate};
     
     /// Wrapper over an Electrum Client that implements the required blockchain traits
     ///
    @@ -234,7 +370,7 @@
     }
     
     impl std::convert::From<Client> for ElectrumBlockchain {
    -    fn from(client: Client) -> Self {
    +    fn from(client: Client) -> Self {
             ElectrumBlockchain {
                 client,
                 stop_gap: 20,
    @@ -243,7 +379,7 @@
     }
     
     impl Blockchain for ElectrumBlockchain {
    -    fn get_capabilities(&self) -> HashSet<Capability> {
    +    fn get_capabilities(&self) -> HashSet<Capability> {
             vec![
                 Capability::FullHistory,
                 Capability::GetAnyTx,
    @@ -255,22 +391,151 @@
     
         fn setup<D: BatchDatabase, P: Progress>(
             &self,
    -        database: &mut D,
    -        progress_update: P,
    -    ) -> Result<(), Error> {
    -        self.client
    -            .electrum_like_setup(self.stop_gap, database, progress_update)
    +        database: &mut D,
    +        _progress_update: P,
    +    ) -> Result<(), Error> {
    +        let mut request = script_sync::start(database, self.stop_gap)?;
    +        let mut block_times = HashMap::<u32, u32>::new();
    +        let mut txid_to_height = HashMap::<Txid, u32>::new();
    +        let mut tx_cache = TxCache::new(database, &self.client);
    +        let chunk_size = self.stop_gap;
    +        // The electrum server has been inconsistent somehow in its responses during sync. For
    +        // example, we do a batch request of transactions and the response contains less
    +        // tranascations than in the request. This should never happen but we don't want to panic.
    +        let electrum_goof = || Error::Generic("electrum server misbehaving".to_string());
    +
    +        let batch_update = loop {
    +            request = match request {
    +                Request::Script(script_req) => {
    +                    let scripts = script_req.request().take(chunk_size);
    +                    let txids_per_script: Vec<Vec<_>> = self
    +                        .client
    +                        .batch_script_get_history(scripts)
    +                        .map_err(Error::Electrum)?
    +                        .into_iter()
    +                        .map(|txs| {
    +                            txs.into_iter()
    +                                .map(|tx| {
    +                                    let tx_height = match tx.height {
    +                                        none if none <= 0 => None,
    +                                        height => {
    +                                            txid_to_height.insert(tx.tx_hash, height as u32);
    +                                            Some(height as u32)
    +                                        }
    +                                    };
    +                                    (tx.tx_hash, tx_height)
    +                                })
    +                                .collect()
    +                        })
    +                        .collect();
    +
    +                    script_req.satisfy(txids_per_script)?
    +                }
    +
    +                Request::Conftime(conftime_req) => {
    +                    // collect up to chunk_size heights to fetch from electrum
    +                    let needs_block_height = {
    +                        let mut needs_block_height_iter = conftime_req
    +                            .request()
    +                            .filter_map(|txid| txid_to_height.get(txid).cloned())
    +                            .filter(|height| block_times.get(height).is_none());
    +                        let mut needs_block_height = HashSet::new();
    +
    +                        while needs_block_height.len() < chunk_size {
    +                            match needs_block_height_iter.next() {
    +                                Some(height) => needs_block_height.insert(height),
    +                                None => break,
    +                            };
    +                        }
    +                        needs_block_height
    +                    };
    +
    +                    let new_block_headers = self
    +                        .client
    +                        .batch_block_header(needs_block_height.iter().cloned())?;
    +
    +                    for (height, header) in needs_block_height.into_iter().zip(new_block_headers) {
    +                        block_times.insert(height, header.time);
    +                    }
    +
    +                    let conftimes = conftime_req
    +                        .request()
    +                        .take(chunk_size)
    +                        .map(|txid| {
    +                            let confirmation_time = txid_to_height
    +                                .get(txid)
    +                                .map(|height| {
    +                                    let timestamp =
    +                                        *block_times.get(height).ok_or_else(electrum_goof)?;
    +                                    Result::<_, Error>::Ok(BlockTime {
    +                                        height: *height,
    +                                        timestamp: timestamp.into(),
    +                                    })
    +                                })
    +                                .transpose()?;
    +                            Ok(confirmation_time)
    +                        })
    +                        .collect::<Result<_, Error>>()?;
    +
    +                    conftime_req.satisfy(conftimes)?
    +                }
    +                Request::Tx(tx_req) => {
    +                    let needs_full = tx_req.request().take(chunk_size);
    +                    tx_cache.save_txs(needs_full.clone())?;
    +                    let full_transactions = needs_full
    +                        .map(|txid| tx_cache.get(*txid).ok_or_else(electrum_goof))
    +                        .collect::<Result<Vec<_>, _>>()?;
    +                    let input_txs = full_transactions.iter().flat_map(|tx| {
    +                        tx.input
    +                            .iter()
    +                            .filter(|input| !input.previous_output.is_null())
    +                            .map(|input| &input.previous_output.txid)
    +                    });
    +                    tx_cache.save_txs(input_txs)?;
    +
    +                    let full_details = full_transactions
    +                        .into_iter()
    +                        .map(|tx| {
    +                            let prev_outputs = tx
    +                                .input
    +                                .iter()
    +                                .map(|input| {
    +                                    if input.previous_output.is_null() {
    +                                        return Ok(None);
    +                                    }
    +                                    let prev_tx = tx_cache
    +                                        .get(input.previous_output.txid)
    +                                        .ok_or_else(electrum_goof)?;
    +                                    let txout = prev_tx
    +                                        .output
    +                                        .get(input.previous_output.vout as usize)
    +                                        .ok_or_else(electrum_goof)?;
    +                                    Ok(Some(txout.clone()))
    +                                })
    +                                .collect::<Result<Vec<_>, Error>>()?;
    +                            Ok((prev_outputs, tx))
    +                        })
    +                        .collect::<Result<Vec<_>, Error>>()?;
    +
    +                    tx_req.satisfy(full_details)?
    +                }
    +                Request::Finish(batch_update) => break batch_update,
    +            }
    +        };
    +
    +        database.commit_batch(batch_update)?;
    +        Ok(())
         }
     
    -    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             Ok(self.client.transaction_get(txid).map(Option::Some)?)
         }
     
    -    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
    +    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
             Ok(self.client.transaction_broadcast(tx).map(|_| ())?)
         }
     
    -    fn get_height(&self) -> Result<u32, Error> {
    +    fn get_height(&self) -> Result<u32, Error> {
             // TODO: unsubscribe when added to the client, or is there a better call to use here?
     
             Ok(self
    @@ -279,50 +544,55 @@
                 .map(|data| data.height as u32)?)
         }
     
    -    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
    +    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
             Ok(FeeRate::from_btc_per_kvb(
                 self.client.estimate_fee(target)? as f32
             ))
         }
     }
     
    -impl ElectrumLikeSync for Client {
    -    fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script> + Clone>(
    -        &self,
    -        scripts: I,
    -    ) -> Result<Vec<Vec<ElsGetHistoryRes>>, Error> {
    -        self.batch_script_get_history(scripts)
    -            .map(|v| {
    -                v.into_iter()
    -                    .map(|v| {
    -                        v.into_iter()
    -                            .map(
    -                                |electrum_client::GetHistoryRes {
    -                                     height, tx_hash, ..
    -                                 }| ElsGetHistoryRes {
    -                                    height,
    -                                    tx_hash,
    -                                },
    -                            )
    -                            .collect()
    -                    })
    -                    .collect()
    -            })
    -            .map_err(Error::Electrum)
    +struct TxCache<'a, 'b, D> {
    +    db: &'a D,
    +    client: &'b Client,
    +    cache: HashMap<Txid, Transaction>,
    +}
    +
    +impl<'a, 'b, D: Database> TxCache<'a, 'b, D> {
    +    fn new(db: &'a D, client: &'b Client) -> Self {
    +        TxCache {
    +            db,
    +            client,
    +            cache: HashMap::default(),
    +        }
         }
    +    fn save_txs<'c>(&mut self, txids: impl Iterator<Item = &'c Txid>) -> Result<(), Error> {
    +        let mut need_fetch = vec![];
    +        for txid in txids {
    +            if self.cache.get(txid).is_some() {
    +                continue;
    +            } else if let Some(transaction) = self.db.get_raw_tx(txid)? {
    +                self.cache.insert(*txid, transaction);
    +            } else {
    +                need_fetch.push(txid);
    +            }
    +        }
     
    -    fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid> + Clone>(
    -        &self,
    -        txids: I,
    -    ) -> Result<Vec<Transaction>, Error> {
    -        self.batch_transaction_get(txids).map_err(Error::Electrum)
    +        if !need_fetch.is_empty() {
    +            let txs = self
    +                .client
    +                .batch_transaction_get(need_fetch.clone())
    +                .map_err(Error::Electrum)?;
    +            for (tx, _txid) in txs.into_iter().zip(need_fetch) {
    +                debug_assert_eq!(*_txid, tx.txid());
    +                self.cache.insert(tx.txid(), tx);
    +            }
    +        }
    +
    +        Ok(())
         }
     
    -    fn els_batch_block_header<I: IntoIterator<Item = u32> + Clone>(
    -        &self,
    -        heights: I,
    -    ) -> Result<Vec<BlockHeader>, Error> {
    -        self.batch_block_header(heights).map_err(Error::Electrum)
    +    fn get(&self, txid: Txid) -> Option<Transaction> {
    +        self.cache.get(&txid).map(Clone::clone)
         }
     }
     
    @@ -346,7 +616,7 @@
     impl ConfigurableBlockchain for ElectrumBlockchain {
         type Config = ElectrumBlockchainConfig;
     
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
             let socks5 = config.socks5.as_ref().map(Socks5Config::new);
             let electrum_config = ConfigBuilder::new()
                 .retry(config.retry)
    @@ -364,11 +634,10 @@
     #[cfg(test)]
     #[cfg(feature = "test-electrum")]
     crate::bdk_blockchain_tests! {
    -    fn test_instance(test_client: &TestClient) -> ElectrumBlockchain {
    +    fn test_instance(test_client: &TestClient) -> ElectrumBlockchain {
             ElectrumBlockchain::from(Client::new(&test_client.electrsd.electrum_url).unwrap())
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/api.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/api.rs.html new file mode 100644 index 0000000000..e0431a9fcb --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/api.rs.html @@ -0,0 +1,239 @@ +api.rs - source +
    logo
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +
    //! structs from the esplora API
    +//!
    +//! see: <https://github.com/Blockstream/esplora/blob/master/API.md>
    +use crate::BlockTime;
    +use bitcoin::{OutPoint, Script, Transaction, TxIn, TxOut, Txid};
    +
    +#[derive(serde::Deserialize, Clone, Debug)]
    +pub struct PrevOut {
    +    pub value: u64,
    +    pub scriptpubkey: Script,
    +}
    +
    +#[derive(serde::Deserialize, Clone, Debug)]
    +pub struct Vin {
    +    pub txid: Txid,
    +    pub vout: u32,
    +    // None if coinbase
    +    pub prevout: Option<PrevOut>,
    +    pub scriptsig: Script,
    +    #[serde(deserialize_with = "deserialize_witness")]
    +    pub witness: Vec<Vec<u8>>,
    +    pub sequence: u32,
    +    pub is_coinbase: bool,
    +}
    +
    +#[derive(serde::Deserialize, Clone, Debug)]
    +pub struct Vout {
    +    pub value: u64,
    +    pub scriptpubkey: Script,
    +}
    +
    +#[derive(serde::Deserialize, Clone, Debug)]
    +pub struct TxStatus {
    +    pub confirmed: bool,
    +    pub block_height: Option<u32>,
    +    pub block_time: Option<u64>,
    +}
    +
    +#[derive(serde::Deserialize, Clone, Debug)]
    +pub struct Tx {
    +    pub txid: Txid,
    +    pub version: i32,
    +    pub locktime: u32,
    +    pub vin: Vec<Vin>,
    +    pub vout: Vec<Vout>,
    +    pub status: TxStatus,
    +    pub fee: u64,
    +}
    +
    +impl Tx {
    +    pub fn to_tx(&self) -> Transaction {
    +        Transaction {
    +            version: self.version,
    +            lock_time: self.locktime,
    +            input: self
    +                .vin
    +                .iter()
    +                .cloned()
    +                .map(|vin| TxIn {
    +                    previous_output: OutPoint {
    +                        txid: vin.txid,
    +                        vout: vin.vout,
    +                    },
    +                    script_sig: vin.scriptsig,
    +                    sequence: vin.sequence,
    +                    witness: vin.witness,
    +                })
    +                .collect(),
    +            output: self
    +                .vout
    +                .iter()
    +                .cloned()
    +                .map(|vout| TxOut {
    +                    value: vout.value,
    +                    script_pubkey: vout.scriptpubkey,
    +                })
    +                .collect(),
    +        }
    +    }
    +
    +    pub fn confirmation_time(&self) -> Option<BlockTime> {
    +        match self.status {
    +            TxStatus {
    +                confirmed: true,
    +                block_height: Some(height),
    +                block_time: Some(timestamp),
    +            } => Some(BlockTime { timestamp, height }),
    +            _ => None,
    +        }
    +    }
    +
    +    pub fn previous_outputs(&self) -> Vec<Option<TxOut>> {
    +        self.vin
    +            .iter()
    +            .cloned()
    +            .map(|vin| {
    +                vin.prevout.map(|po| TxOut {
    +                    script_pubkey: po.scriptpubkey,
    +                    value: po.value,
    +                })
    +            })
    +            .collect()
    +    }
    +}
    +
    +fn deserialize_witness<'de, D>(d: D) -> Result<Vec<Vec<u8>>, D::Error>
    +where
    +    D: serde::de::Deserializer<'de>,
    +{
    +    use crate::serde::Deserialize;
    +    use bitcoin::hashes::hex::FromHex;
    +    let list = Vec::<String>::deserialize(d)?;
    +    list.into_iter()
    +        .map(|hex_str| Vec::<u8>::from_hex(&hex_str))
    +        .collect::<Result<Vec<Vec<u8>>, _>>()
    +        .map_err(serde::de::Error::custom)
    +}
    +
    +
    + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/mod.rs.html index 7d87905c9b..d0dfe2c563 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -127,6 +129,89 @@
     127
     128
     129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
     
    //! Esplora
     //!
     //! This module defines a [`EsploraBlockchain`] struct that can query an Esplora
    @@ -150,8 +235,6 @@
     use std::fmt;
     use std::io;
     
    -use serde::Deserialize;
    -
     use bitcoin::consensus;
     use bitcoin::{BlockHash, Txid};
     
    @@ -170,33 +253,24 @@
     #[cfg(feature = "ureq")]
     pub use self::ureq::*;
     
    -fn into_fee_rate(target: usize, estimates: HashMap<String, f64>) -> Result<FeeRate, Error> {
    -    let fee_val = estimates
    -        .into_iter()
    -        .map(|(k, v)| Ok::<_, std::num::ParseIntError>((k.parse::<usize>()?, v)))
    -        .collect::<Result<Vec<_>, _>>()
    -        .map_err(|e| Error::Generic(e.to_string()))?
    -        .into_iter()
    -        .take_while(|(k, _)| k <= &target)
    -        .map(|(_, v)| v)
    -        .last()
    -        .unwrap_or(1.0);
    +mod api;
     
    +fn into_fee_rate(target: usize, estimates: HashMap<String, f64>) -> Result<FeeRate, Error> {
    +    let fee_val = {
    +        let mut pairs = estimates
    +            .into_iter()
    +            .filter_map(|(k, v)| Some((k.parse::<usize>().ok()?, v)))
    +            .collect::<Vec<_>>();
    +        pairs.sort_unstable_by_key(|(k, _)| std::cmp::Reverse(*k));
    +        pairs
    +            .into_iter()
    +            .find(|(k, _)| k <= &target)
    +            .map(|(_, v)| v)
    +            .unwrap_or(1.0)
    +    };
         Ok(FeeRate::from_sat_per_vb(fee_val as f32))
     }
     
    -/// Data type used when fetching transaction history from Esplora.
    -#[derive(Deserialize)]
    -pub struct EsploraGetHistory {
    -    txid: Txid,
    -    status: EsploraGetHistoryStatus,
    -}
    -
    -#[derive(Deserialize)]
    -struct EsploraGetHistoryStatus {
    -    block_height: Option<usize>,
    -}
    -
     /// Errors that can happen during a sync with [`EsploraBlockchain`]
     #[derive(Debug)]
     pub enum EsploraError {
    @@ -231,15 +305,55 @@
     }
     
     impl fmt::Display for EsploraError {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{:?}", self)
         }
     }
     
    +/// Configuration for an [`EsploraBlockchain`]
    +#[derive(Debug, serde::Deserialize, serde::Serialize, Clone, PartialEq)]
    +pub struct EsploraBlockchainConfig {
    +    /// Base URL of the esplora service
    +    ///
    +    /// eg. `https://blockstream.info/api/`
    +    pub base_url: String,
    +    /// Optional URL of the proxy to use to make requests to the Esplora server
    +    ///
    +    /// The string should be formatted as: `<protocol>://<user>:<password>@host:<port>`.
    +    ///
    +    /// Note that the format of this value and the supported protocols change slightly between the
    +    /// sync version of esplora (using `ureq`) and the async version (using `reqwest`). For more
    +    /// details check with the documentation of the two crates. Both of them are compiled with
    +    /// the `socks` feature enabled.
    +    ///
    +    /// The proxy is ignored when targeting `wasm32`.
    +    #[serde(skip_serializing_if = "Option::is_none")]
    +    pub proxy: Option<String>,
    +    /// Number of parallel requests sent to the esplora service (default: 4)
    +    #[serde(skip_serializing_if = "Option::is_none")]
    +    pub concurrency: Option<u8>,
    +    /// Stop searching addresses for transactions after finding an unused gap of this length.
    +    pub stop_gap: usize,
    +    /// Socket timeout.
    +    #[serde(skip_serializing_if = "Option::is_none")]
    +    pub timeout: Option<u64>,
    +}
    +
    +impl EsploraBlockchainConfig {
    +    /// create a config with default values given the base url and stop gap
    +    pub fn new(base_url: String, stop_gap: usize) -> Self {
    +        Self {
    +            base_url,
    +            proxy: None,
    +            timeout: None,
    +            stop_gap,
    +            concurrency: None,
    +        }
    +    }
    +}
    +
     impl std::error::Error for EsploraError {}
     
    -#[cfg(feature = "ureq")]
    -impl_error!(::ureq::Error, Ureq, EsploraError);
     #[cfg(feature = "ureq")]
     impl_error!(::ureq::Transport, UreqTransport, EsploraError);
     #[cfg(feature = "reqwest")]
    @@ -252,11 +366,64 @@
     #[cfg(test)]
     #[cfg(feature = "test-esplora")]
     crate::bdk_blockchain_tests! {
    -    fn test_instance(test_client: &TestClient) -> EsploraBlockchain {
    +    fn test_instance(test_client: &TestClient) -> EsploraBlockchain {
             EsploraBlockchain::new(&format!("http://{}",test_client.electrsd.esplora_url.as_ref().unwrap()), 20)
         }
     }
    +
    +const DEFAULT_CONCURRENT_REQUESTS: u8 = 4;
    +
    +#[cfg(test)]
    +mod test {
    +    use super::*;
    +
    +    #[test]
    +    fn feerate_parsing() {
    +        let esplora_fees = serde_json::from_str::<HashMap<String, f64>>(
    +            r#"{
    +  "25": 1.015,
    +  "5": 2.3280000000000003,
    +  "12": 2.0109999999999997,
    +  "15": 1.018,
    +  "17": 1.018,
    +  "11": 2.0109999999999997,
    +  "3": 3.01,
    +  "2": 4.9830000000000005,
    +  "6": 2.2359999999999998,
    +  "21": 1.018,
    +  "13": 1.081,
    +  "7": 2.2359999999999998,
    +  "8": 2.2359999999999998,
    +  "16": 1.018,
    +  "20": 1.018,
    +  "22": 1.017,
    +  "23": 1.017,
    +  "504": 1,
    +  "9": 2.2359999999999998,
    +  "14": 1.018,
    +  "10": 2.0109999999999997,
    +  "24": 1.017,
    +  "1008": 1,
    +  "1": 4.9830000000000005,
    +  "4": 2.3280000000000003,
    +  "19": 1.018,
    +  "144": 1,
    +  "18": 1.018
    +}
    +"#,
    +        )
    +        .unwrap();
    +        assert_eq!(
    +            into_fee_rate(6, esplora_fees.clone()).unwrap(),
    +            FeeRate::from_sat_per_vb(2.236)
    +        );
    +        assert_eq!(
    +            into_fee_rate(26, esplora_fees).unwrap(),
    +            FeeRate::from_sat_per_vb(1.015),
    +            "should inherit from value for 25"
    +        );
    +    }
    +}
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/ureq.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/ureq.rs.html index 10f92a0fea..2f7e9dc324 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/ureq.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/esplora/ureq.rs.html @@ -1,4 +1,6 @@ -ureq.rs - source
      1
    +ureq.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -369,33 +371,6 @@
     369
     370
     371
    -372
    -373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    -382
    -383
    -384
    -385
    -386
    -387
    -388
    -389
    -390
    -391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -424,14 +399,14 @@
     use bitcoin::hashes::{sha256, Hash};
     use bitcoin::{BlockHeader, Script, Transaction, Txid};
     
    -use crate::blockchain::esplora::{EsploraError, EsploraGetHistory};
    -use crate::blockchain::utils::{ElectrumLikeSync, ElsGetHistoryRes};
    +use super::api::Tx;
    +use crate::blockchain::esplora::EsploraError;
     use crate::blockchain::*;
     use crate::database::BatchDatabase;
     use crate::error::Error;
     use crate::FeeRate;
     
    -#[derive(Debug)]
    +#[derive(Debug, Clone)]
     struct UrlClient {
         url: String,
         agent: Agent,
    @@ -445,38 +420,37 @@
     pub struct EsploraBlockchain {
         url_client: UrlClient,
         stop_gap: usize,
    -}
    -
    -impl std::convert::From<UrlClient> for EsploraBlockchain {
    -    fn from(url_client: UrlClient) -> Self {
    -        EsploraBlockchain {
    -            url_client,
    -            stop_gap: 20,
    -        }
    -    }
    +    concurrency: u8,
     }
     
     impl EsploraBlockchain {
         /// Create a new instance of the client from a base URL and the `stop_gap`.
    -    pub fn new(base_url: &str, stop_gap: usize) -> Self {
    +    pub fn new(base_url: &str, stop_gap: usize) -> Self {
             EsploraBlockchain {
                 url_client: UrlClient {
                     url: base_url.to_string(),
                     agent: Agent::new(),
                 },
    +            concurrency: super::DEFAULT_CONCURRENT_REQUESTS,
                 stop_gap,
             }
         }
     
         /// Set the inner `ureq` agent.
    -    pub fn with_agent(mut self, agent: Agent) -> Self {
    +    pub fn with_agent(mut self, agent: Agent) -> Self {
             self.url_client.agent = agent;
             self
         }
    +
    +    /// Set the number of parallel requests the client can make.
    +    pub fn with_concurrency(mut self, concurrency: u8) -> Self {
    +        self.concurrency = concurrency;
    +        self
    +    }
     }
     
     impl Blockchain for EsploraBlockchain {
    -    fn get_capabilities(&self) -> HashSet<Capability> {
    +    fn get_capabilities(&self) -> HashSet<Capability> {
             vec![
                 Capability::FullHistory,
                 Capability::GetAnyTx,
    @@ -488,73 +462,153 @@
     
         fn setup<D: BatchDatabase, P: Progress>(
             &self,
    -        database: &mut D,
    -        progress_update: P,
    -    ) -> Result<(), Error> {
    -        self.url_client
    -            .electrum_like_setup(self.stop_gap, database, progress_update)
    +        database: &mut D,
    +        _progress_update: P,
    +    ) -> Result<(), Error> {
    +        use crate::blockchain::script_sync::Request;
    +        let mut request = script_sync::start(database, self.stop_gap)?;
    +        let mut tx_index: HashMap<Txid, Tx> = HashMap::new();
    +        let batch_update = loop {
    +            request = match request {
    +                Request::Script(script_req) => {
    +                    let scripts = script_req
    +                        .request()
    +                        .take(self.concurrency as usize)
    +                        .cloned();
    +
    +                    let handles = scripts.map(move |script| {
    +                        let client = self.url_client.clone();
    +                        // make each request in its own thread.
    +                        std::thread::spawn(move || {
    +                            let mut related_txs: Vec<Tx> = client._scripthash_txs(&script, None)?;
    +
    +                            let n_confirmed =
    +                                related_txs.iter().filter(|tx| tx.status.confirmed).count();
    +                            // esplora pages on 25 confirmed transactions. If there's 25 or more we
    +                            // keep requesting to see if there's more.
    +                            if n_confirmed >= 25 {
    +                                loop {
    +                                    let new_related_txs: Vec<Tx> = client._scripthash_txs(
    +                                        &script,
    +                                        Some(related_txs.last().unwrap().txid),
    +                                    )?;
    +                                    let n = new_related_txs.len();
    +                                    related_txs.extend(new_related_txs);
    +                                    // we've reached the end
    +                                    if n < 25 {
    +                                        break;
    +                                    }
    +                                }
    +                            }
    +                            Result::<_, Error>::Ok(related_txs)
    +                        })
    +                    });
    +
    +                    let txs_per_script: Vec<Vec<Tx>> = handles
    +                        .map(|handle| handle.join().unwrap())
    +                        .collect::<Result<_, _>>()?;
    +                    let mut satisfaction = vec![];
    +
    +                    for txs in txs_per_script {
    +                        satisfaction.push(
    +                            txs.iter()
    +                                .map(|tx| (tx.txid, tx.status.block_height))
    +                                .collect(),
    +                        );
    +                        for tx in txs {
    +                            tx_index.insert(tx.txid, tx);
    +                        }
    +                    }
    +
    +                    script_req.satisfy(satisfaction)?
    +                }
    +                Request::Conftime(conftime_req) => {
    +                    let conftimes = conftime_req
    +                        .request()
    +                        .map(|txid| {
    +                            tx_index
    +                                .get(txid)
    +                                .expect("must be in index")
    +                                .confirmation_time()
    +                        })
    +                        .collect();
    +                    conftime_req.satisfy(conftimes)?
    +                }
    +                Request::Tx(tx_req) => {
    +                    let full_txs = tx_req
    +                        .request()
    +                        .map(|txid| {
    +                            let tx = tx_index.get(txid).expect("must be in index");
    +                            (tx.previous_outputs(), tx.to_tx())
    +                        })
    +                        .collect();
    +                    tx_req.satisfy(full_txs)?
    +                }
    +                Request::Finish(batch_update) => break batch_update,
    +            }
    +        };
    +
    +        database.commit_batch(batch_update)?;
    +
    +        Ok(())
         }
     
    -    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             Ok(self.url_client._get_tx(txid)?)
         }
     
    -    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
    +    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
             let _txid = self.url_client._broadcast(tx)?;
             Ok(())
         }
     
    -    fn get_height(&self) -> Result<u32, Error> {
    +    fn get_height(&self) -> Result<u32, Error> {
             Ok(self.url_client._get_height()?)
         }
     
    -    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
    +    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
             let estimates = self.url_client._get_fee_estimates()?;
             super::into_fee_rate(target, estimates)
         }
     }
     
     impl UrlClient {
    -    fn script_to_scripthash(script: &Script) -> String {
    -        sha256::Hash::hash(script.as_bytes()).into_inner().to_hex()
    -    }
    -
    -    fn _get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, EsploraError> {
    +    fn _get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, EsploraError> {
             let resp = self
                 .agent
                 .get(&format!("{}/tx/{}/raw", self.url, txid))
                 .call();
     
             match resp {
    -            Ok(resp) => Ok(Some(deserialize(&into_bytes(resp)?)?)),
    -            Err(ureq::Error::Status(code, _)) => {
    +            Ok(resp) => Ok(Some(deserialize(&into_bytes(resp)?)?)),
    +            Err(ureq::Error::Status(code, _)) => {
                     if is_status_not_found(code) {
                         return Ok(None);
                     }
                     Err(EsploraError::HttpResponse(code))
                 }
    -            Err(e) => Err(EsploraError::Ureq(e)),
    +            Err(e) => Err(EsploraError::Ureq(e)),
             }
         }
     
    -    fn _get_tx_no_opt(&self, txid: &Txid) -> Result<Transaction, EsploraError> {
    +    fn _get_tx_no_opt(&self, txid: &Txid) -> Result<Transaction, EsploraError> {
             match self._get_tx(txid) {
    -            Ok(Some(tx)) => Ok(tx),
    -            Ok(None) => Err(EsploraError::TransactionNotFound(*txid)),
    -            Err(e) => Err(e),
    +            Ok(Some(tx)) => Ok(tx),
    +            Ok(None) => Err(EsploraError::TransactionNotFound(*txid)),
    +            Err(e) => Err(e),
             }
         }
     
    -    fn _get_header(&self, block_height: u32) -> Result<BlockHeader, EsploraError> {
    +    fn _get_header(&self, block_height: u32) -> Result<BlockHeader, EsploraError> {
             let resp = self
                 .agent
                 .get(&format!("{}/block-height/{}", self.url, block_height))
                 .call();
     
             let bytes = match resp {
    -            Ok(resp) => Ok(into_bytes(resp)?),
    -            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -            Err(e) => Err(EsploraError::Ureq(e)),
    +            Ok(resp) => Ok(into_bytes(resp)?),
    +            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    +            Err(e) => Err(EsploraError::Ureq(e)),
             }?;
     
             let hash = std::str::from_utf8(&bytes)
    @@ -566,143 +620,84 @@
                 .call();
     
             match resp {
    -            Ok(resp) => Ok(deserialize(&Vec::from_hex(&resp.into_string()?)?)?),
    -            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -            Err(e) => Err(EsploraError::Ureq(e)),
    +            Ok(resp) => Ok(deserialize(&Vec::from_hex(&resp.into_string()?)?)?),
    +            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    +            Err(e) => Err(EsploraError::Ureq(e)),
             }
         }
     
    -    fn _broadcast(&self, transaction: &Transaction) -> Result<(), EsploraError> {
    +    fn _broadcast(&self, transaction: &Transaction) -> Result<(), EsploraError> {
             let resp = self
                 .agent
                 .post(&format!("{}/tx", self.url))
                 .send_string(&serialize(transaction).to_hex());
     
             match resp {
    -            Ok(_) => Ok(()), // We do not return the txid?
    -            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -            Err(e) => Err(EsploraError::Ureq(e)),
    +            Ok(_) => Ok(()), // We do not return the txid?
    +            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    +            Err(e) => Err(EsploraError::Ureq(e)),
             }
         }
     
    -    fn _get_height(&self) -> Result<u32, EsploraError> {
    +    fn _get_height(&self) -> Result<u32, EsploraError> {
             let resp = self
                 .agent
                 .get(&format!("{}/blocks/tip/height", self.url))
                 .call();
     
             match resp {
    -            Ok(resp) => Ok(resp.into_string()?.parse()?),
    -            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -            Err(e) => Err(EsploraError::Ureq(e)),
    +            Ok(resp) => Ok(resp.into_string()?.parse()?),
    +            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    +            Err(e) => Err(EsploraError::Ureq(e)),
             }
         }
     
    -    fn _script_get_history(&self, script: &Script) -> Result<Vec<ElsGetHistoryRes>, EsploraError> {
    -        let mut result = Vec::new();
    -        let scripthash = Self::script_to_scripthash(script);
    -
    -        // Add the unconfirmed transactions first
    -
    -        let resp = self
    -            .agent
    -            .get(&format!(
    -                "{}/scripthash/{}/txs/mempool",
    -                self.url, scripthash
    -            ))
    -            .call();
    -
    -        let v = match resp {
    -            Ok(resp) => {
    -                let v: Vec<EsploraGetHistory> = resp.into_json()?;
    -                Ok(v)
    -            }
    -            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -            Err(e) => Err(EsploraError::Ureq(e)),
    -        }?;
    -
    -        result.extend(v.into_iter().map(|x| ElsGetHistoryRes {
    -            tx_hash: x.txid,
    -            height: x.status.block_height.unwrap_or(0) as i32,
    -        }));
    -
    -        debug!(
    -            "Found {} mempool txs for {} - {:?}",
    -            result.len(),
    -            scripthash,
    -            script
    -        );
    -
    -        // Then go through all the pages of confirmed transactions
    -        let mut last_txid = String::new();
    -        loop {
    -            let resp = self
    -                .agent
    -                .get(&format!(
    -                    "{}/scripthash/{}/txs/chain/{}",
    -                    self.url, scripthash, last_txid
    -                ))
    -                .call();
    -
    -            let v = match resp {
    -                Ok(resp) => {
    -                    let v: Vec<EsploraGetHistory> = resp.into_json()?;
    -                    Ok(v)
    -                }
    -                Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -                Err(e) => Err(EsploraError::Ureq(e)),
    -            }?;
    -
    -            let len = v.len();
    -            if let Some(elem) = v.last() {
    -                last_txid = elem.txid.to_hex();
    -            }
    -
    -            debug!("... adding {} confirmed transactions", len);
    -
    -            result.extend(v.into_iter().map(|x| ElsGetHistoryRes {
    -                tx_hash: x.txid,
    -                height: x.status.block_height.unwrap_or(0) as i32,
    -            }));
    -
    -            if len < 25 {
    -                break;
    -            }
    -        }
    -
    -        Ok(result)
    -    }
    -
    -    fn _get_fee_estimates(&self) -> Result<HashMap<String, f64>, EsploraError> {
    +    fn _get_fee_estimates(&self) -> Result<HashMap<String, f64>, EsploraError> {
             let resp = self
                 .agent
                 .get(&format!("{}/fee-estimates", self.url,))
                 .call();
     
             let map = match resp {
    -            Ok(resp) => {
    +            Ok(resp) => {
                     let map: HashMap<String, f64> = resp.into_json()?;
                     Ok(map)
                 }
    -            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    -            Err(e) => Err(EsploraError::Ureq(e)),
    +            Err(ureq::Error::Status(code, _)) => Err(EsploraError::HttpResponse(code)),
    +            Err(e) => Err(EsploraError::Ureq(e)),
             }?;
     
             Ok(map)
         }
    +
    +    fn _scripthash_txs(
    +        &self,
    +        script: &Script,
    +        last_seen: Option<Txid>,
    +    ) -> Result<Vec<Tx>, EsploraError> {
    +        let script_hash = sha256::Hash::hash(script.as_bytes()).into_inner().to_hex();
    +        let url = match last_seen {
    +            Some(last_seen) => format!(
    +                "{}/scripthash/{}/txs/chain/{}",
    +                self.url, script_hash, last_seen
    +            ),
    +            None => format!("{}/scripthash/{}/txs", self.url, script_hash),
    +        };
    +        Ok(self.agent.get(&url).call()?.into_json()?)
    +    }
     }
     
    -fn is_status_not_found(status: u16) -> bool {
    -    status == 404
    +fn is_status_not_found(status: u16) -> bool {
    +    status == 404
     }
     
    -fn into_bytes(resp: Response) -> Result<Vec<u8>, io::Error> {
    +fn into_bytes(resp: Response) -> Result<Vec<u8>, io::Error> {
         const BYTES_LIMIT: usize = 10 * 1_024 * 1_024;
     
         let mut buf: Vec<u8> = vec![];
         resp.into_reader()
             .take((BYTES_LIMIT + 1) as u64)
    -        .read_to_end(&mut buf)?;
    +        .read_to_end(&mut buf)?;
         if buf.len() > BYTES_LIMIT {
             return Err(io::Error::new(
                 io::ErrorKind::Other,
    @@ -713,88 +708,40 @@
         Ok(buf)
     }
     
    -impl ElectrumLikeSync for UrlClient {
    -    fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script>>(
    -        &self,
    -        scripts: I,
    -    ) -> Result<Vec<Vec<ElsGetHistoryRes>>, Error> {
    -        let mut results = vec![];
    -        for script in scripts.into_iter() {
    -            let v = self._script_get_history(script)?;
    -            results.push(v);
    -        }
    -        Ok(results)
    -    }
    +impl ConfigurableBlockchain for EsploraBlockchain {
    +    type Config = super::EsploraBlockchainConfig;
     
    -    fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid>>(
    -        &self,
    -        txids: I,
    -    ) -> Result<Vec<Transaction>, Error> {
    -        let mut results = vec![];
    -        for txid in txids.into_iter() {
    -            let tx = self._get_tx_no_opt(txid)?;
    -            results.push(tx);
    -        }
    -        Ok(results)
    -    }
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +        let mut agent_builder = ureq::AgentBuilder::new();
     
    -    fn els_batch_block_header<I: IntoIterator<Item = u32>>(
    -        &self,
    -        heights: I,
    -    ) -> Result<Vec<BlockHeader>, Error> {
    -        let mut results = vec![];
    -        for height in heights.into_iter() {
    -            let header = self._get_header(height)?;
    -            results.push(header);
    +        if let Some(timeout) = config.timeout {
    +            agent_builder = agent_builder.timeout(Duration::from_secs(timeout));
             }
    -        Ok(results)
    -    }
    -}
    -
    -/// Configuration for an [`EsploraBlockchain`]
    -#[derive(Debug, serde::Deserialize, serde::Serialize, Clone, PartialEq)]
    -pub struct EsploraBlockchainConfig {
    -    /// Base URL of the esplora service eg. `https://blockstream.info/api/`
    -    pub base_url: String,
    -    /// Optional URL of the proxy to use to make requests to the Esplora server
    -    ///
    -    /// The string should be formatted as: `<protocol>://<user>:<password>@host:<port>`.
    -    ///
    -    /// Note that the format of this value and the supported protocols change slightly between the
    -    /// sync version of esplora (using `ureq`) and the async version (using `reqwest`). For more
    -    /// details check with the documentation of the two crates. Both of them are compiled with
    -    /// the `socks` feature enabled.
    -    ///
    -    /// The proxy is ignored when targeting `wasm32`.
    -    pub proxy: Option<String>,
    -    /// Socket read timeout.
    -    pub timeout_read: u64,
    -    /// Socket write timeout.
    -    pub timeout_write: u64,
    -    /// Stop searching addresses for transactions after finding an unused gap of this length.
    -    pub stop_gap: usize,
    -}
    -
    -impl ConfigurableBlockchain for EsploraBlockchain {
    -    type Config = EsploraBlockchainConfig;
    -
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    -        let mut agent_builder = ureq::AgentBuilder::new()
    -            .timeout_read(Duration::from_secs(config.timeout_read))
    -            .timeout_write(Duration::from_secs(config.timeout_write));
     
             if let Some(proxy) = &config.proxy {
                 agent_builder = agent_builder
                     .proxy(Proxy::new(proxy).map_err(|e| Error::Esplora(Box::new(e.into())))?);
             }
     
    -        Ok(
    -            EsploraBlockchain::new(config.base_url.as_str(), config.stop_gap)
    -                .with_agent(agent_builder.build()),
    -        )
    +        let mut blockchain = EsploraBlockchain::new(config.base_url.as_str(), config.stop_gap)
    +            .with_agent(agent_builder.build());
    +
    +        if let Some(concurrency) = config.concurrency {
    +            blockchain = blockchain.with_concurrency(concurrency);
    +        }
    +
    +        Ok(blockchain)
    +    }
    +}
    +
    +impl From<ureq::Error> for EsploraError {
    +    fn from(e: ureq::Error) -> Self {
    +        match e {
    +            ureq::Error::Status(code, _) => EsploraError::HttpResponse(code),
    +            e => EsploraError::Ureq(e),
    +        }
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/mod.rs.html index 6bac7fc40c..8dda3c9d90 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -253,7 +255,6 @@
     253
     254
     255
    -256
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -283,9 +284,6 @@
     use crate::error::Error;
     use crate::FeeRate;
     
    -#[cfg(any(feature = "electrum", feature = "esplora"))]
    -pub(crate) mod utils;
    -
     #[cfg(any(
         feature = "electrum",
         feature = "esplora",
    @@ -293,6 +291,8 @@
         feature = "rpc"
     ))]
     pub mod any;
    +mod script_sync;
    +
     #[cfg(any(
         feature = "electrum",
         feature = "esplora",
    @@ -345,7 +345,7 @@
     #[maybe_async]
     pub trait Blockchain {
         /// Return the set of [`Capability`] supported by this backend
    -    fn get_capabilities(&self) -> HashSet<Capability>;
    +    fn get_capabilities(&self) -> HashSet<Capability>;
     
         /// Setup the backend and populate the internal database for the first time
         ///
    @@ -359,9 +359,9 @@
         /// [`Blockchain::sync`] defaults to calling this internally if not overridden.
         fn setup<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error>;
    +    ) -> Result<(), Error>;
         /// Populate the internal database with transactions and UTXOs
         ///
         /// If not overridden, it defaults to calling [`Blockchain::setup`] internally.
    @@ -383,21 +383,21 @@
         /// [`BatchOperations::del_utxo`]: crate::database::BatchOperations::del_utxo
         fn sync<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             maybe_await!(self.setup(database, progress_update))
         }
     
         /// Fetch a transaction from the blockchain given its txid
    -    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error>;
    +    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error>;
         /// Broadcast a transaction
    -    fn broadcast(&self, tx: &Transaction) -> Result<(), Error>;
    +    fn broadcast(&self, tx: &Transaction) -> Result<(), Error>;
     
         /// Return the current height
    -    fn get_height(&self) -> Result<u32, Error>;
    +    fn get_height(&self) -> Result<u32, Error>;
         /// Estimate the fee rate required to confirm a transaction in a given `target` of blocks
    -    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error>;
    +    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error>;
     }
     
     /// Trait for [`Blockchain`] types that can be created given a configuration
    @@ -406,7 +406,7 @@
         type Config: std::fmt::Debug;
     
         /// Create a new instance given a configuration
    -    fn from_config(config: &Self::Config) -> Result<Self, Error>;
    +    fn from_config(config: &Self::Config) -> Result<Self, Error>;
     }
     
     /// Data sent with a progress update over a [`channel`]
    @@ -419,16 +419,16 @@
         ///
         /// The `progress` value should be in the range 0.0 - 100.0, and the `message` value is an
         /// optional text message that can be displayed to the user.
    -    fn update(&self, progress: f32, message: Option<String>) -> Result<(), Error>;
    +    fn update(&self, progress: f32, message: Option<String>) -> Result<(), Error>;
     }
     
     /// Shortcut to create a [`channel`] (pair of [`Sender`] and [`Receiver`]) that can transport [`ProgressData`]
    -pub fn progress() -> (Sender<ProgressData>, Receiver<ProgressData>) {
    +pub fn progress() -> (Sender<ProgressData>, Receiver<ProgressData>) {
         channel()
     }
     
     impl Progress for Sender<ProgressData> {
    -    fn update(&self, progress: f32, message: Option<String>) -> Result<(), Error> {
    +    fn update(&self, progress: f32, message: Option<String>) -> Result<(), Error> {
             if !(0.0..=100.0).contains(&progress) {
                 return Err(Error::InvalidProgressValue(progress));
             }
    @@ -443,12 +443,12 @@
     pub struct NoopProgress;
     
     /// Create a new instance of [`NoopProgress`]
    -pub fn noop_progress() -> NoopProgress {
    +pub fn noop_progress() -> NoopProgress {
         NoopProgress
     }
     
     impl Progress for NoopProgress {
    -    fn update(&self, _progress: f32, _message: Option<String>) -> Result<(), Error> {
    +    fn update(&self, _progress: f32, _message: Option<String>) -> Result<(), Error> {
             Ok(())
         }
     }
    @@ -458,12 +458,12 @@
     pub struct LogProgress;
     
     /// Create a new instance of [`LogProgress`]
    -pub fn log_progress() -> LogProgress {
    +pub fn log_progress() -> LogProgress {
         LogProgress
     }
     
     impl Progress for LogProgress {
    -    fn update(&self, progress: f32, message: Option<String>) -> Result<(), Error> {
    +    fn update(&self, progress: f32, message: Option<String>) -> Result<(), Error> {
             log::info!(
                 "Sync {:.3}%: `{}`",
                 progress,
    @@ -476,41 +476,40 @@
     
     #[maybe_async]
     impl<T: Blockchain> Blockchain for Arc<T> {
    -    fn get_capabilities(&self) -> HashSet<Capability> {
    +    fn get_capabilities(&self) -> HashSet<Capability> {
             maybe_await!(self.deref().get_capabilities())
         }
     
         fn setup<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             maybe_await!(self.deref().setup(database, progress_update))
         }
     
         fn sync<D: BatchDatabase, P: 'static + Progress>(
             &self,
    -        database: &mut D,
    +        database: &mut D,
             progress_update: P,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             maybe_await!(self.deref().sync(database, progress_update))
         }
     
    -    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             maybe_await!(self.deref().get_tx(txid))
         }
    -    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
    +    fn broadcast(&self, tx: &Transaction) -> Result<(), Error> {
             maybe_await!(self.deref().broadcast(tx))
         }
     
    -    fn get_height(&self) -> Result<u32, Error> {
    +    fn get_height(&self) -> Result<u32, Error> {
             maybe_await!(self.deref().get_height())
         }
    -    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
    +    fn estimate_fee(&self, target: usize) -> Result<FeeRate, Error> {
             maybe_await!(self.deref().estimate_fee(target))
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/script_sync.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/script_sync.rs.html new file mode 100644 index 0000000000..043335eaf0 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/script_sync.rs.html @@ -0,0 +1,793 @@ +script_sync.rs - source +
    logo
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    +312
    +313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    +323
    +324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    +335
    +336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    +345
    +346
    +347
    +348
    +349
    +350
    +351
    +352
    +353
    +354
    +355
    +356
    +357
    +358
    +359
    +360
    +361
    +362
    +363
    +364
    +365
    +366
    +367
    +368
    +369
    +370
    +371
    +372
    +373
    +374
    +375
    +376
    +377
    +378
    +379
    +380
    +381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +
    /*!
    +This models a how a sync happens where you have a server that you send your script pubkeys to and it
    +returns associated transactions i.e. electrum.
    +*/
    +#![allow(dead_code)]
    +use crate::{
    +    database::{BatchDatabase, BatchOperations, DatabaseUtils},
    +    wallet::time::Instant,
    +    BlockTime, Error, KeychainKind, LocalUtxo, TransactionDetails,
    +};
    +use bitcoin::{OutPoint, Script, Transaction, TxOut, Txid};
    +use log::*;
    +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque};
    +
    +/// A request for on-chain information
    +pub enum Request<'a, D: BatchDatabase> {
    +    /// A request for transactions related to script pubkeys.
    +    Script(ScriptReq<'a, D>),
    +    /// A request for confirmation times for some transactions.
    +    Conftime(ConftimeReq<'a, D>),
    +    /// A request for full transaction details of some transactions.
    +    Tx(TxReq<'a, D>),
    +    /// Requests are finished here's a batch database update to reflect data gathered.
    +    Finish(D::Batch),
    +}
    +
    +/// starts a sync
    +pub fn start<D: BatchDatabase>(db: &D, stop_gap: usize) -> Result<Request<'_, D>, Error> {
    +    use rand::seq::SliceRandom;
    +    let mut keychains = vec![KeychainKind::Internal, KeychainKind::External];
    +    // shuffling improve privacy, the server doesn't know my first request is from my internal or external addresses
    +    keychains.shuffle(&mut rand::thread_rng());
    +    let keychain = keychains.pop().unwrap();
    +    let scripts_needed = db
    +        .iter_script_pubkeys(Some(keychain))?
    +        .into_iter()
    +        .collect();
    +    let state = State::new(db);
    +
    +    Ok(Request::Script(ScriptReq {
    +        state,
    +        scripts_needed,
    +        script_index: 0,
    +        stop_gap,
    +        keychain,
    +        next_keychains: keychains,
    +    }))
    +}
    +
    +pub struct ScriptReq<'a, D: BatchDatabase> {
    +    state: State<'a, D>,
    +    script_index: usize,
    +    scripts_needed: VecDeque<Script>,
    +    stop_gap: usize,
    +    keychain: KeychainKind,
    +    next_keychains: Vec<KeychainKind>,
    +}
    +
    +/// The sync starts by returning script pubkeys we are interested in.
    +impl<'a, D: BatchDatabase> ScriptReq<'a, D> {
    +    pub fn request(&self) -> impl Iterator<Item = &Script> + Clone {
    +        self.scripts_needed.iter()
    +    }
    +
    +    pub fn satisfy(
    +        mut self,
    +        // we want to know the txids assoiciated with the script and their height
    +        txids: Vec<Vec<(Txid, Option<u32>)>>,
    +    ) -> Result<Request<'a, D>, Error> {
    +        for (txid_list, script) in txids.iter().zip(self.scripts_needed.iter()) {
    +            debug!(
    +                "found {} transactions for script pubkey {}",
    +                txid_list.len(),
    +                script
    +            );
    +            if !txid_list.is_empty() {
    +                // the address is active
    +                self.state
    +                    .last_active_index
    +                    .insert(self.keychain, self.script_index);
    +            }
    +
    +            for (txid, height) in txid_list {
    +                // have we seen this txid already?
    +                match self.state.db.get_tx(txid, true)? {
    +                    Some(mut details) => {
    +                        let old_height = details.confirmation_time.as_ref().map(|x| x.height);
    +                        match (old_height, height) {
    +                            (None, Some(_)) => {
    +                                // It looks like the tx has confirmed since we last saw it -- we
    +                                // need to know the confirmation time.
    +                                self.state.tx_missing_conftime.insert(*txid, details);
    +                            }
    +                            (Some(old_height), Some(new_height)) if old_height != *new_height => {
    +                                // The height of the tx has changed !? -- It's a reorg get the new confirmation time.
    +                                self.state.tx_missing_conftime.insert(*txid, details);
    +                            }
    +                            (Some(_), None) => {
    +                                // A re-org where the tx is not in the chain anymore.
    +                                details.confirmation_time = None;
    +                                self.state.finished_txs.push(details);
    +                            }
    +                            _ => self.state.finished_txs.push(details),
    +                        }
    +                    }
    +                    None => {
    +                        // we've never seen it let's get the whole thing
    +                        self.state.tx_needed.insert(*txid);
    +                    }
    +                };
    +            }
    +
    +            self.script_index += 1;
    +        }
    +
    +        for _ in txids {
    +            self.scripts_needed.pop_front();
    +        }
    +
    +        let last_active_index = self
    +            .state
    +            .last_active_index
    +            .get(&self.keychain)
    +            .map(|x| x + 1)
    +            .unwrap_or(0); // so no addresses active maps to 0
    +
    +        Ok(
    +            if self.script_index > last_active_index + self.stop_gap
    +                || self.scripts_needed.is_empty()
    +            {
    +                debug!(
    +                    "finished scanning for transactions for keychain {:?} at index {}",
    +                    self.keychain, last_active_index
    +                );
    +                // we're done here -- check if we need to do the next keychain
    +                if let Some(keychain) = self.next_keychains.pop() {
    +                    self.keychain = keychain;
    +                    self.script_index = 0;
    +                    self.scripts_needed = self
    +                        .state
    +                        .db
    +                        .iter_script_pubkeys(Some(keychain))?
    +                        .into_iter()
    +                        .collect();
    +                    Request::Script(self)
    +                } else {
    +                    Request::Tx(TxReq { state: self.state })
    +                }
    +            } else {
    +                Request::Script(self)
    +            },
    +        )
    +    }
    +}
    +
    +/// Then we get full transactions
    +pub struct TxReq<'a, D> {
    +    state: State<'a, D>,
    +}
    +
    +impl<'a, D: BatchDatabase> TxReq<'a, D> {
    +    pub fn request(&self) -> impl Iterator<Item = &Txid> + Clone {
    +        self.state.tx_needed.iter()
    +    }
    +
    +    pub fn satisfy(
    +        mut self,
    +        tx_details: Vec<(Vec<Option<TxOut>>, Transaction)>,
    +    ) -> Result<Request<'a, D>, Error> {
    +        let tx_details: Vec<TransactionDetails> = tx_details
    +            .into_iter()
    +            .zip(self.state.tx_needed.iter())
    +            .map(|((vout, tx), txid)| {
    +                debug!("found tx_details for {}", txid);
    +                assert_eq!(tx.txid(), *txid);
    +                let mut sent: u64 = 0;
    +                let mut received: u64 = 0;
    +                let mut inputs_sum: u64 = 0;
    +                let mut outputs_sum: u64 = 0;
    +
    +                for (txout, input) in vout.into_iter().zip(tx.input.iter()) {
    +                    let txout = match txout {
    +                        Some(txout) => txout,
    +                        None => {
    +                            // skip coinbase inputs
    +                            debug_assert!(
    +                                input.previous_output.is_null(),
    +                                "prevout should only be missing for coinbase"
    +                            );
    +                            continue;
    +                        }
    +                    };
    +
    +                    inputs_sum += txout.value;
    +                    if self.state.db.is_mine(&txout.script_pubkey)? {
    +                        sent += txout.value;
    +                    }
    +                }
    +
    +                for out in &tx.output {
    +                    outputs_sum += out.value;
    +                    if self.state.db.is_mine(&out.script_pubkey)? {
    +                        received += out.value;
    +                    }
    +                }
    +                // we need to saturating sub since we want coinbase txs to map to 0 fee and
    +                // this subtraction will be negative for coinbase txs.
    +                let fee = inputs_sum.saturating_sub(outputs_sum);
    +                Result::<_, Error>::Ok(TransactionDetails {
    +                    txid: *txid,
    +                    transaction: Some(tx),
    +                    received,
    +                    sent,
    +                    // we're going to fill this in later
    +                    confirmation_time: None,
    +                    fee: Some(fee),
    +                    verified: false,
    +                })
    +            })
    +            .collect::<Result<Vec<_>, _>>()?;
    +
    +        for tx_detail in tx_details {
    +            self.state.tx_needed.remove(&tx_detail.txid);
    +            self.state
    +                .tx_missing_conftime
    +                .insert(tx_detail.txid, tx_detail);
    +        }
    +
    +        if !self.state.tx_needed.is_empty() {
    +            Ok(Request::Tx(self))
    +        } else {
    +            Ok(Request::Conftime(ConftimeReq { state: self.state }))
    +        }
    +    }
    +}
    +
    +/// Final step is to get confirmation times
    +pub struct ConftimeReq<'a, D> {
    +    state: State<'a, D>,
    +}
    +
    +impl<'a, D: BatchDatabase> ConftimeReq<'a, D> {
    +    pub fn request(&self) -> impl Iterator<Item = &Txid> + Clone {
    +        self.state.tx_missing_conftime.keys()
    +    }
    +
    +    pub fn satisfy(
    +        mut self,
    +        confirmation_times: Vec<Option<BlockTime>>,
    +    ) -> Result<Request<'a, D>, Error> {
    +        let conftime_needed = self
    +            .request()
    +            .cloned()
    +            .take(confirmation_times.len())
    +            .collect::<Vec<_>>();
    +        for (confirmation_time, txid) in confirmation_times.into_iter().zip(conftime_needed.iter())
    +        {
    +            debug!("confirmation time for {} was {:?}", txid, confirmation_time);
    +            if let Some(mut tx_details) = self.state.tx_missing_conftime.remove(txid) {
    +                tx_details.confirmation_time = confirmation_time;
    +                self.state.finished_txs.push(tx_details);
    +            }
    +        }
    +
    +        if self.state.tx_missing_conftime.is_empty() {
    +            Ok(Request::Finish(self.state.into_db_update()?))
    +        } else {
    +            Ok(Request::Conftime(self))
    +        }
    +    }
    +}
    +
    +struct State<'a, D> {
    +    db: &'a D,
    +    last_active_index: HashMap<KeychainKind, usize>,
    +    /// Transactions where we need to get the full details
    +    tx_needed: BTreeSet<Txid>,
    +    /// Transacitions that we know everything about
    +    finished_txs: Vec<TransactionDetails>,
    +    /// Transactions that discovered conftimes should be inserted into
    +    tx_missing_conftime: BTreeMap<Txid, TransactionDetails>,
    +    /// The start of the sync
    +    start_time: Instant,
    +}
    +
    +impl<'a, D: BatchDatabase> State<'a, D> {
    +    fn new(db: &'a D) -> Self {
    +        State {
    +            db,
    +            last_active_index: HashMap::default(),
    +            finished_txs: vec![],
    +            tx_needed: BTreeSet::default(),
    +            tx_missing_conftime: BTreeMap::default(),
    +            start_time: Instant::new(),
    +        }
    +    }
    +    fn into_db_update(self) -> Result<D::Batch, Error> {
    +        debug_assert!(self.tx_needed.is_empty() && self.tx_missing_conftime.is_empty());
    +        let existing_txs = self.db.iter_txs(false)?;
    +        let existing_txids: HashSet<Txid> = existing_txs.iter().map(|tx| tx.txid).collect();
    +        let finished_txs = make_txs_consistent(&self.finished_txs);
    +        let observed_txids: HashSet<Txid> = finished_txs.iter().map(|tx| tx.txid).collect();
    +        let txids_to_delete = existing_txids.difference(&observed_txids);
    +        let mut batch = self.db.begin_batch();
    +
    +        // Delete old txs that no longer exist
    +        for txid in txids_to_delete {
    +            if let Some(raw_tx) = self.db.get_raw_tx(txid)? {
    +                for i in 0..raw_tx.output.len() {
    +                    // Also delete any utxos from the txs that no longer exist.
    +                    let _ = batch.del_utxo(&OutPoint {
    +                        txid: *txid,
    +                        vout: i as u32,
    +                    })?;
    +                }
    +            } else {
    +                unreachable!("we should always have the raw tx");
    +            }
    +            batch.del_tx(txid, true)?;
    +        }
    +
    +        // Set every tx we observed
    +        for finished_tx in &finished_txs {
    +            let tx = finished_tx
    +                .transaction
    +                .as_ref()
    +                .expect("transaction will always be present here");
    +            for (i, output) in tx.output.iter().enumerate() {
    +                if let Some((keychain, _)) =
    +                    self.db.get_path_from_script_pubkey(&output.script_pubkey)?
    +                {
    +                    // add utxos we own from the new transactions we've seen.
    +                    batch.set_utxo(&LocalUtxo {
    +                        outpoint: OutPoint {
    +                            txid: finished_tx.txid,
    +                            vout: i as u32,
    +                        },
    +                        txout: output.clone(),
    +                        keychain,
    +                    })?;
    +                }
    +            }
    +            batch.set_tx(finished_tx)?;
    +        }
    +
    +        // we don't do this in the loop above since we may want to delete some of the utxos we
    +        // just added in case there are new tranasactions that spend form each other.
    +        for finished_tx in &finished_txs {
    +            let tx = finished_tx
    +                .transaction
    +                .as_ref()
    +                .expect("transaction will always be present here");
    +            for input in &tx.input {
    +                // Delete any spent utxos
    +                batch.del_utxo(&input.previous_output)?;
    +            }
    +        }
    +
    +        for (keychain, last_active_index) in self.last_active_index {
    +            batch.set_last_index(keychain, last_active_index as u32)?;
    +        }
    +
    +        info!(
    +            "finished setup, elapsed {:?}ms",
    +            self.start_time.elapsed().as_millis()
    +        );
    +        Ok(batch)
    +    }
    +}
    +
    +/// Remove conflicting transactions -- tie breaking them by fee.
    +fn make_txs_consistent(txs: &[TransactionDetails]) -> Vec<&TransactionDetails> {
    +    let mut utxo_index: HashMap<OutPoint, &TransactionDetails> = HashMap::default();
    +    for tx in txs {
    +        for input in &tx.transaction.as_ref().unwrap().input {
    +            utxo_index
    +                .entry(input.previous_output)
    +                .and_modify(|existing| match (tx.fee, existing.fee) {
    +                    (Some(fee), Some(existing_fee)) if fee > existing_fee => *existing = tx,
    +                    (Some(_), None) => *existing = tx,
    +                    _ => { /* leave it the same */ }
    +                })
    +                .or_insert(tx);
    +        }
    +    }
    +
    +    utxo_index
    +        .into_iter()
    +        .map(|(_, tx)| (tx.txid, tx))
    +        .collect::<HashMap<_, _>>()
    +        .into_iter()
    +        .map(|(_, tx)| tx)
    +        .collect()
    +}
    +
    +
    + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/utils.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/utils.rs.html deleted file mode 100644 index c5288d5967..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/blockchain/utils.rs.html +++ /dev/null @@ -1,780 +0,0 @@ -utils.rs - source
      1
    -  2
    -  3
    -  4
    -  5
    -  6
    -  7
    -  8
    -  9
    - 10
    - 11
    - 12
    - 13
    - 14
    - 15
    - 16
    - 17
    - 18
    - 19
    - 20
    - 21
    - 22
    - 23
    - 24
    - 25
    - 26
    - 27
    - 28
    - 29
    - 30
    - 31
    - 32
    - 33
    - 34
    - 35
    - 36
    - 37
    - 38
    - 39
    - 40
    - 41
    - 42
    - 43
    - 44
    - 45
    - 46
    - 47
    - 48
    - 49
    - 50
    - 51
    - 52
    - 53
    - 54
    - 55
    - 56
    - 57
    - 58
    - 59
    - 60
    - 61
    - 62
    - 63
    - 64
    - 65
    - 66
    - 67
    - 68
    - 69
    - 70
    - 71
    - 72
    - 73
    - 74
    - 75
    - 76
    - 77
    - 78
    - 79
    - 80
    - 81
    - 82
    - 83
    - 84
    - 85
    - 86
    - 87
    - 88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
    -162
    -163
    -164
    -165
    -166
    -167
    -168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    -192
    -193
    -194
    -195
    -196
    -197
    -198
    -199
    -200
    -201
    -202
    -203
    -204
    -205
    -206
    -207
    -208
    -209
    -210
    -211
    -212
    -213
    -214
    -215
    -216
    -217
    -218
    -219
    -220
    -221
    -222
    -223
    -224
    -225
    -226
    -227
    -228
    -229
    -230
    -231
    -232
    -233
    -234
    -235
    -236
    -237
    -238
    -239
    -240
    -241
    -242
    -243
    -244
    -245
    -246
    -247
    -248
    -249
    -250
    -251
    -252
    -253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    -264
    -265
    -266
    -267
    -268
    -269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    -296
    -297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    -313
    -314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    -329
    -330
    -331
    -332
    -333
    -334
    -335
    -336
    -337
    -338
    -339
    -340
    -341
    -342
    -343
    -344
    -345
    -346
    -347
    -348
    -349
    -350
    -351
    -352
    -353
    -354
    -355
    -356
    -357
    -358
    -359
    -360
    -361
    -362
    -363
    -364
    -365
    -366
    -367
    -368
    -369
    -370
    -371
    -372
    -373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    -382
    -383
    -384
    -385
    -386
    -387
    -388
    -
    // Bitcoin Dev Kit
    -// Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
    -//
    -// Copyright (c) 2020-2021 Bitcoin Dev Kit Developers
    -//
    -// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
    -// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
    -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
    -// You may not use this file except in accordance with one or both of these
    -// licenses.
    -
    -use std::collections::{HashMap, HashSet};
    -
    -#[allow(unused_imports)]
    -use log::{debug, error, info, trace};
    -use rand::seq::SliceRandom;
    -use rand::thread_rng;
    -
    -use bitcoin::{BlockHeader, OutPoint, Script, Transaction, Txid};
    -
    -use super::*;
    -use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils};
    -use crate::error::Error;
    -use crate::types::{ConfirmationTime, KeychainKind, LocalUtxo, TransactionDetails};
    -use crate::wallet::time::Instant;
    -use crate::wallet::utils::ChunksIterator;
    -
    -#[derive(Debug)]
    -pub struct ElsGetHistoryRes {
    -    pub height: i32,
    -    pub tx_hash: Txid,
    -}
    -
    -/// Implements the synchronization logic for an Electrum-like client.
    -#[maybe_async]
    -pub trait ElectrumLikeSync {
    -    fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script> + Clone>(
    -        &self,
    -        scripts: I,
    -    ) -> Result<Vec<Vec<ElsGetHistoryRes>>, Error>;
    -
    -    fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid> + Clone>(
    -        &self,
    -        txids: I,
    -    ) -> Result<Vec<Transaction>, Error>;
    -
    -    fn els_batch_block_header<I: IntoIterator<Item = u32> + Clone>(
    -        &self,
    -        heights: I,
    -    ) -> Result<Vec<BlockHeader>, Error>;
    -
    -    // Provided methods down here...
    -
    -    fn electrum_like_setup<D: BatchDatabase, P: Progress>(
    -        &self,
    -        stop_gap: usize,
    -        db: &mut D,
    -        _progress_update: P,
    -    ) -> Result<(), Error> {
    -        // TODO: progress
    -        let start = Instant::new();
    -        debug!("start setup");
    -
    -        let chunk_size = stop_gap;
    -
    -        let mut history_txs_id = HashSet::new();
    -        let mut txid_height = HashMap::new();
    -        let mut max_indexes = HashMap::new();
    -
    -        let mut wallet_chains = vec![KeychainKind::Internal, KeychainKind::External];
    -        // shuffling improve privacy, the server doesn't know my first request is from my internal or external addresses
    -        wallet_chains.shuffle(&mut thread_rng());
    -        // download history of our internal and external script_pubkeys
    -        for keychain in wallet_chains.iter() {
    -            let script_iter = db.iter_script_pubkeys(Some(*keychain))?.into_iter();
    -
    -            for (i, chunk) in ChunksIterator::new(script_iter, stop_gap).enumerate() {
    -                // TODO if i == last, should create another chunk of addresses in db
    -                let call_result: Vec<Vec<ElsGetHistoryRes>> =
    -                    maybe_await!(self.els_batch_script_get_history(chunk.iter()))?;
    -                let max_index = call_result
    -                    .iter()
    -                    .enumerate()
    -                    .filter_map(|(i, v)| v.first().map(|_| i as u32))
    -                    .max();
    -                if let Some(max) = max_index {
    -                    max_indexes.insert(keychain, max + (i * chunk_size) as u32);
    -                }
    -                let flattened: Vec<ElsGetHistoryRes> = call_result.into_iter().flatten().collect();
    -                debug!("#{} of {:?} results:{}", i, keychain, flattened.len());
    -                if flattened.is_empty() {
    -                    // Didn't find anything in the last `stop_gap` script_pubkeys, breaking
    -                    break;
    -                }
    -
    -                for el in flattened {
    -                    // el.height = -1 means unconfirmed with unconfirmed parents
    -                    // el.height =  0 means unconfirmed with confirmed parents
    -                    // but we treat those tx the same
    -                    if el.height <= 0 {
    -                        txid_height.insert(el.tx_hash, None);
    -                    } else {
    -                        txid_height.insert(el.tx_hash, Some(el.height as u32));
    -                    }
    -                    history_txs_id.insert(el.tx_hash);
    -                }
    -            }
    -        }
    -
    -        // saving max indexes
    -        info!("max indexes are: {:?}", max_indexes);
    -        for keychain in wallet_chains.iter() {
    -            if let Some(index) = max_indexes.get(keychain) {
    -                db.set_last_index(*keychain, *index)?;
    -            }
    -        }
    -
    -        // get db status
    -        let txs_details_in_db: HashMap<Txid, TransactionDetails> = db
    -            .iter_txs(false)?
    -            .into_iter()
    -            .map(|tx| (tx.txid, tx))
    -            .collect();
    -        let txs_raw_in_db: HashMap<Txid, Transaction> = db
    -            .iter_raw_txs()?
    -            .into_iter()
    -            .map(|tx| (tx.txid(), tx))
    -            .collect();
    -        let utxos_deps = utxos_deps(db, &txs_raw_in_db)?;
    -
    -        // download new txs and headers
    -        let new_txs = maybe_await!(self.download_and_save_needed_raw_txs(
    -            &history_txs_id,
    -            &txs_raw_in_db,
    -            chunk_size,
    -            db
    -        ))?;
    -        let new_timestamps = maybe_await!(self.download_needed_headers(
    -            &txid_height,
    -            &txs_details_in_db,
    -            chunk_size
    -        ))?;
    -
    -        let mut batch = db.begin_batch();
    -
    -        // save any tx details not in db but in history_txs_id or with different height/timestamp
    -        for txid in history_txs_id.iter() {
    -            let height = txid_height.get(txid).cloned().flatten();
    -            let timestamp = new_timestamps.get(txid).cloned();
    -            if let Some(tx_details) = txs_details_in_db.get(txid) {
    -                // check if tx height matches, otherwise updates it. timestamp is not in the if clause
    -                // because we are not asking headers for confirmed tx we know about
    -                if tx_details.confirmation_time.as_ref().map(|c| c.height) != height {
    -                    let confirmation_time = ConfirmationTime::new(height, timestamp);
    -                    let mut new_tx_details = tx_details.clone();
    -                    new_tx_details.confirmation_time = confirmation_time;
    -                    batch.set_tx(&new_tx_details)?;
    -                }
    -            } else {
    -                save_transaction_details_and_utxos(
    -                    txid,
    -                    db,
    -                    timestamp,
    -                    height,
    -                    &mut batch,
    -                    &utxos_deps,
    -                )?;
    -            }
    -        }
    -
    -        // remove any tx details in db but not in history_txs_id
    -        for txid in txs_details_in_db.keys() {
    -            if !history_txs_id.contains(txid) {
    -                batch.del_tx(txid, false)?;
    -            }
    -        }
    -
    -        // remove any spent utxo
    -        for new_tx in new_txs.iter() {
    -            for input in new_tx.input.iter() {
    -                batch.del_utxo(&input.previous_output)?;
    -            }
    -        }
    -
    -        db.commit_batch(batch)?;
    -        info!("finish setup, elapsed {:?}ms", start.elapsed().as_millis());
    -
    -        Ok(())
    -    }
    -
    -    /// download txs identified by `history_txs_id` and theirs previous outputs if not already present in db
    -    fn download_and_save_needed_raw_txs<D: BatchDatabase>(
    -        &self,
    -        history_txs_id: &HashSet<Txid>,
    -        txs_raw_in_db: &HashMap<Txid, Transaction>,
    -        chunk_size: usize,
    -        db: &mut D,
    -    ) -> Result<Vec<Transaction>, Error> {
    -        let mut txs_downloaded = vec![];
    -        let txids_raw_in_db: HashSet<Txid> = txs_raw_in_db.keys().cloned().collect();
    -        let txids_to_download: Vec<&Txid> = history_txs_id.difference(&txids_raw_in_db).collect();
    -        if !txids_to_download.is_empty() {
    -            info!("got {} txs to download", txids_to_download.len());
    -            txs_downloaded.extend(maybe_await!(self.download_and_save_in_chunks(
    -                txids_to_download,
    -                chunk_size,
    -                db,
    -            ))?);
    -            let mut prev_txids = HashSet::new();
    -            let mut txids_downloaded = HashSet::new();
    -            for tx in txs_downloaded.iter() {
    -                txids_downloaded.insert(tx.txid());
    -                // add every previous input tx, but skip coinbase
    -                for input in tx.input.iter().filter(|i| !i.previous_output.is_null()) {
    -                    prev_txids.insert(input.previous_output.txid);
    -                }
    -            }
    -            let already_present: HashSet<Txid> =
    -                txids_downloaded.union(&txids_raw_in_db).cloned().collect();
    -            let prev_txs_to_download: Vec<&Txid> =
    -                prev_txids.difference(&already_present).collect();
    -            info!("{} previous txs to download", prev_txs_to_download.len());
    -            txs_downloaded.extend(maybe_await!(self.download_and_save_in_chunks(
    -                prev_txs_to_download,
    -                chunk_size,
    -                db,
    -            ))?);
    -        }
    -
    -        Ok(txs_downloaded)
    -    }
    -
    -    /// download headers at heights in `txid_height` if tx details not already present, returns a map Txid -> timestamp
    -    fn download_needed_headers(
    -        &self,
    -        txid_height: &HashMap<Txid, Option<u32>>,
    -        txs_details_in_db: &HashMap<Txid, TransactionDetails>,
    -        chunk_size: usize,
    -    ) -> Result<HashMap<Txid, u64>, Error> {
    -        let mut txid_timestamp = HashMap::new();
    -        let txid_in_db_with_conf: HashSet<_> = txs_details_in_db
    -            .values()
    -            .filter_map(|details| details.confirmation_time.as_ref().map(|_| details.txid))
    -            .collect();
    -        let needed_txid_height: HashMap<&Txid, u32> = txid_height
    -            .iter()
    -            .filter(|(t, _)| !txid_in_db_with_conf.contains(*t))
    -            .filter_map(|(t, o)| o.map(|h| (t, h)))
    -            .collect();
    -        let needed_heights: HashSet<u32> = needed_txid_height.values().cloned().collect();
    -        if !needed_heights.is_empty() {
    -            info!("{} headers to download for timestamp", needed_heights.len());
    -            let mut height_timestamp: HashMap<u32, u64> = HashMap::new();
    -            for chunk in ChunksIterator::new(needed_heights.into_iter(), chunk_size) {
    -                let call_result: Vec<BlockHeader> =
    -                    maybe_await!(self.els_batch_block_header(chunk.clone()))?;
    -                height_timestamp.extend(
    -                    chunk
    -                        .into_iter()
    -                        .zip(call_result.iter().map(|h| h.time as u64)),
    -                );
    -            }
    -            for (txid, height) in needed_txid_height {
    -                let timestamp = height_timestamp
    -                    .get(&height)
    -                    .ok_or_else(|| Error::Generic("timestamp missing".to_string()))?;
    -                txid_timestamp.insert(*txid, *timestamp);
    -            }
    -        }
    -
    -        Ok(txid_timestamp)
    -    }
    -
    -    fn download_and_save_in_chunks<D: BatchDatabase>(
    -        &self,
    -        to_download: Vec<&Txid>,
    -        chunk_size: usize,
    -        db: &mut D,
    -    ) -> Result<Vec<Transaction>, Error> {
    -        let mut txs_downloaded = vec![];
    -        for chunk in ChunksIterator::new(to_download.into_iter(), chunk_size) {
    -            let call_result: Vec<Transaction> =
    -                maybe_await!(self.els_batch_transaction_get(chunk))?;
    -            let mut batch = db.begin_batch();
    -            for new_tx in call_result.iter() {
    -                batch.set_raw_tx(new_tx)?;
    -            }
    -            db.commit_batch(batch)?;
    -            txs_downloaded.extend(call_result);
    -        }
    -
    -        Ok(txs_downloaded)
    -    }
    -}
    -
    -fn save_transaction_details_and_utxos<D: BatchDatabase>(
    -    txid: &Txid,
    -    db: &mut D,
    -    timestamp: Option<u64>,
    -    height: Option<u32>,
    -    updates: &mut dyn BatchOperations,
    -    utxo_deps: &HashMap<OutPoint, OutPoint>,
    -) -> Result<(), Error> {
    -    let tx = db.get_raw_tx(txid)?.ok_or(Error::TransactionNotFound)?;
    -
    -    let mut incoming: u64 = 0;
    -    let mut outgoing: u64 = 0;
    -
    -    let mut inputs_sum: u64 = 0;
    -    let mut outputs_sum: u64 = 0;
    -
    -    // look for our own inputs
    -    for input in tx.input.iter() {
    -        // skip coinbase inputs
    -        if input.previous_output.is_null() {
    -            continue;
    -        }
    -
    -        // We already downloaded all previous output txs in the previous step
    -        if let Some(previous_output) = db.get_previous_output(&input.previous_output)? {
    -            inputs_sum += previous_output.value;
    -
    -            if db.is_mine(&previous_output.script_pubkey)? {
    -                outgoing += previous_output.value;
    -            }
    -        } else {
    -            // The input is not ours, but we still need to count it for the fees
    -            let tx = db
    -                .get_raw_tx(&input.previous_output.txid)?
    -                .ok_or(Error::TransactionNotFound)?;
    -            inputs_sum += tx.output[input.previous_output.vout as usize].value;
    -        }
    -
    -        // removes conflicting UTXO if any (generated from same inputs, like for example RBF)
    -        if let Some(outpoint) = utxo_deps.get(&input.previous_output) {
    -            updates.del_utxo(outpoint)?;
    -        }
    -    }
    -
    -    for (i, output) in tx.output.iter().enumerate() {
    -        // to compute the fees later
    -        outputs_sum += output.value;
    -
    -        // this output is ours, we have a path to derive it
    -        if let Some((keychain, _child)) = db.get_path_from_script_pubkey(&output.script_pubkey)? {
    -            debug!("{} output #{} is mine, adding utxo", txid, i);
    -            updates.set_utxo(&LocalUtxo {
    -                outpoint: OutPoint::new(tx.txid(), i as u32),
    -                txout: output.clone(),
    -                keychain,
    -            })?;
    -
    -            incoming += output.value;
    -        }
    -    }
    -
    -    let tx_details = TransactionDetails {
    -        txid: tx.txid(),
    -        transaction: Some(tx),
    -        received: incoming,
    -        sent: outgoing,
    -        confirmation_time: ConfirmationTime::new(height, timestamp),
    -        fee: Some(inputs_sum.saturating_sub(outputs_sum)), /* if the tx is a coinbase, fees would be negative */
    -        verified: height.is_some(),
    -    };
    -    updates.set_tx(&tx_details)?;
    -
    -    Ok(())
    -}
    -
    -/// returns utxo dependency as the inputs needed for the utxo to exist
    -/// `tx_raw_in_db` must contains utxo's generating txs or errors with [crate::Error::TransactionNotFound]
    -fn utxos_deps<D: BatchDatabase>(
    -    db: &mut D,
    -    tx_raw_in_db: &HashMap<Txid, Transaction>,
    -) -> Result<HashMap<OutPoint, OutPoint>, Error> {
    -    let utxos = db.iter_utxos()?;
    -    let mut utxos_deps = HashMap::new();
    -    for utxo in utxos {
    -        let from_tx = tx_raw_in_db
    -            .get(&utxo.outpoint.txid)
    -            .ok_or(Error::TransactionNotFound)?;
    -        for input in from_tx.input.iter() {
    -            utxos_deps.insert(input.previous_output, utxo.outpoint);
    -        }
    -    }
    -    Ok(utxos_deps)
    -}
    -
    -
    - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/any.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/any.rs.html index a259b301c3..30bb8c5dbb 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/any.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/any.rs.html @@ -1,4 +1,6 @@ -any.rs - source
      1
    +any.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -413,6 +415,21 @@
     413
     414
     415
    +416
    +417
    +418
    +419
    +420
    +421
    +422
    +423
    +424
    +425
    +426
    +427
    +428
    +429
    +430
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -464,10 +481,10 @@
     use super::*;
     
     macro_rules! impl_from {
    -    ( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
    +    ( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
             $( $cfg )*
             impl From<$from> for $to {
    -            fn from(inner: $from) -> Self {
    +            fn from(inner: $from) -> Self {
                     <$to>::$variant(inner)
                 }
             }
    @@ -475,13 +492,13 @@
     }
     
     macro_rules! impl_inner_method {
    -    ( $enum_name:ident, $self:expr, $name:ident $(, $args:expr)* ) => {
    +    ( $enum_name:ident, $self:expr, $name:ident $(, $args:expr)* ) => {
             match $self {
    -            $enum_name::Memory(inner) => inner.$name( $($args, )* ),
    +            $enum_name::Memory(inner) => inner.$name( $($args, )* ),
                 #[cfg(feature = "key-value-db")]
    -            $enum_name::Sled(inner) => inner.$name( $($args, )* ),
    +            $enum_name::Sled(inner) => inner.$name( $($args, )* ),
                 #[cfg(feature = "sqlite")]
    -            $enum_name::Sqlite(inner) => inner.$name( $($args, )* ),
    +            $enum_name::Sqlite(inner) => inner.$name( $($args, )* ),
             }
         }
     }
    @@ -533,11 +550,11 @@
     
     impl BatchOperations for AnyDatabase {
         fn set_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             impl_inner_method!(
                 AnyDatabase,
                 self,
    @@ -547,24 +564,27 @@
                 child
             )
         }
    -    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
    +    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
             impl_inner_method!(AnyDatabase, self, set_utxo, utxo)
         }
    -    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
    +    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
             impl_inner_method!(AnyDatabase, self, set_raw_tx, transaction)
         }
    -    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
    +    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
             impl_inner_method!(AnyDatabase, self, set_tx, transaction)
         }
    -    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
    +    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
             impl_inner_method!(AnyDatabase, self, set_last_index, keychain, value)
         }
    +    fn set_sync_time(&mut self, sync_time: SyncTime) -> Result<(), Error> {
    +        impl_inner_method!(AnyDatabase, self, set_sync_time, sync_time)
    +    }
     
         fn del_script_pubkey_from_path(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             impl_inner_method!(
                 AnyDatabase,
                 self,
    @@ -574,35 +594,38 @@
             )
         }
         fn del_path_from_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             impl_inner_method!(AnyDatabase, self, del_path_from_script_pubkey, script)
         }
    -    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             impl_inner_method!(AnyDatabase, self, del_utxo, outpoint)
         }
    -    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             impl_inner_method!(AnyDatabase, self, del_raw_tx, txid)
         }
         fn del_tx(
    -        &mut self,
    +        &mut self,
             txid: &Txid,
             include_raw: bool,
    -    ) -> Result<Option<TransactionDetails>, Error> {
    +    ) -> Result<Option<TransactionDetails>, Error> {
             impl_inner_method!(AnyDatabase, self, del_tx, txid, include_raw)
         }
    -    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             impl_inner_method!(AnyDatabase, self, del_last_index, keychain)
         }
    +    fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error> {
    +        impl_inner_method!(AnyDatabase, self, del_sync_time)
    +    }
     }
     
     impl Database for AnyDatabase {
         fn check_descriptor_checksum<B: AsRef<[u8]>>(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             bytes: B,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             impl_inner_method!(
                 AnyDatabase,
                 self,
    @@ -612,16 +635,16 @@
             )
         }
     
    -    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
    +    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
             impl_inner_method!(AnyDatabase, self, iter_script_pubkeys, keychain)
         }
    -    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
    +    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
             impl_inner_method!(AnyDatabase, self, iter_utxos)
         }
    -    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
    +    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
             impl_inner_method!(AnyDatabase, self, iter_raw_txs)
         }
    -    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
    +    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
             impl_inner_method!(AnyDatabase, self, iter_txs, include_raw)
         }
     
    @@ -629,7 +652,7 @@
             &self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             impl_inner_method!(
                 AnyDatabase,
                 self,
    @@ -641,112 +664,121 @@
         fn get_path_from_script_pubkey(
             &self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             impl_inner_method!(AnyDatabase, self, get_path_from_script_pubkey, script)
         }
    -    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             impl_inner_method!(AnyDatabase, self, get_utxo, outpoint)
         }
    -    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             impl_inner_method!(AnyDatabase, self, get_raw_tx, txid)
         }
    -    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
    +    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
             impl_inner_method!(AnyDatabase, self, get_tx, txid, include_raw)
         }
    -    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             impl_inner_method!(AnyDatabase, self, get_last_index, keychain)
         }
    +    fn get_sync_time(&self) -> Result<Option<SyncTime>, Error> {
    +        impl_inner_method!(AnyDatabase, self, get_sync_time)
    +    }
     
    -    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
    +    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
             impl_inner_method!(AnyDatabase, self, increment_last_index, keychain)
         }
     
    -    fn flush(&mut self) -> Result<(), Error> {
    +    fn flush(&mut self) -> Result<(), Error> {
             impl_inner_method!(AnyDatabase, self, flush)
         }
     }
     
     impl BatchOperations for AnyBatch {
         fn set_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             impl_inner_method!(AnyBatch, self, set_script_pubkey, script, keychain, child)
         }
    -    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
    +    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
             impl_inner_method!(AnyBatch, self, set_utxo, utxo)
         }
    -    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
    +    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
             impl_inner_method!(AnyBatch, self, set_raw_tx, transaction)
         }
    -    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
    +    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
             impl_inner_method!(AnyBatch, self, set_tx, transaction)
         }
    -    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
    +    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
             impl_inner_method!(AnyBatch, self, set_last_index, keychain, value)
         }
    +    fn set_sync_time(&mut self, sync_time: SyncTime) -> Result<(), Error> {
    +        impl_inner_method!(AnyBatch, self, set_sync_time, sync_time)
    +    }
     
         fn del_script_pubkey_from_path(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             impl_inner_method!(AnyBatch, self, del_script_pubkey_from_path, keychain, child)
         }
         fn del_path_from_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             impl_inner_method!(AnyBatch, self, del_path_from_script_pubkey, script)
         }
    -    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             impl_inner_method!(AnyBatch, self, del_utxo, outpoint)
         }
    -    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             impl_inner_method!(AnyBatch, self, del_raw_tx, txid)
         }
         fn del_tx(
    -        &mut self,
    +        &mut self,
             txid: &Txid,
             include_raw: bool,
    -    ) -> Result<Option<TransactionDetails>, Error> {
    +    ) -> Result<Option<TransactionDetails>, Error> {
             impl_inner_method!(AnyBatch, self, del_tx, txid, include_raw)
         }
    -    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             impl_inner_method!(AnyBatch, self, del_last_index, keychain)
         }
    +    fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error> {
    +        impl_inner_method!(AnyBatch, self, del_sync_time)
    +    }
     }
     
     impl BatchDatabase for AnyDatabase {
         type Batch = AnyBatch;
     
    -    fn begin_batch(&self) -> Self::Batch {
    +    fn begin_batch(&self) -> Self::Batch {
             match self {
    -            AnyDatabase::Memory(inner) => inner.begin_batch().into(),
    +            AnyDatabase::Memory(inner) => inner.begin_batch().into(),
                 #[cfg(feature = "key-value-db")]
    -            AnyDatabase::Sled(inner) => inner.begin_batch().into(),
    +            AnyDatabase::Sled(inner) => inner.begin_batch().into(),
                 #[cfg(feature = "sqlite")]
    -            AnyDatabase::Sqlite(inner) => inner.begin_batch().into(),
    +            AnyDatabase::Sqlite(inner) => inner.begin_batch().into(),
             }
         }
    -    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error> {
    +    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error> {
             match self {
    -            AnyDatabase::Memory(db) => match batch {
    -                AnyBatch::Memory(batch) => db.commit_batch(batch),
    +            AnyDatabase::Memory(db) => match batch {
    +                AnyBatch::Memory(batch) => db.commit_batch(batch),
                     #[cfg(any(feature = "key-value-db", feature = "sqlite"))]
    -                _ => unimplemented!("Other batch shouldn't be used with Memory db."),
    +                _ => unimplemented!("Other batch shouldn't be used with Memory db."),
                 },
                 #[cfg(feature = "key-value-db")]
    -            AnyDatabase::Sled(db) => match batch {
    -                AnyBatch::Sled(batch) => db.commit_batch(batch),
    -                _ => unimplemented!("Other batch shouldn't be used with Sled db."),
    +            AnyDatabase::Sled(db) => match batch {
    +                AnyBatch::Sled(batch) => db.commit_batch(batch),
    +                _ => unimplemented!("Other batch shouldn't be used with Sled db."),
                 },
                 #[cfg(feature = "sqlite")]
    -            AnyDatabase::Sqlite(db) => match batch {
    -                AnyBatch::Sqlite(batch) => db.commit_batch(batch),
    -                _ => unimplemented!("Other batch shouldn't be used with Sqlite db."),
    +            AnyDatabase::Sqlite(db) => match batch {
    +                AnyBatch::Sqlite(batch) => db.commit_batch(batch),
    +                _ => unimplemented!("Other batch shouldn't be used with Sqlite db."),
                 },
             }
         }
    @@ -766,7 +798,7 @@
     impl ConfigurableDatabase for sled::Tree {
         type Config = SledDbConfiguration;
     
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
             Ok(sled::open(&config.path)?.open_tree(&config.tree_name)?)
         }
     }
    @@ -783,7 +815,7 @@
     impl ConfigurableDatabase for sqlite::SqliteDatabase {
         type Config = SqliteDbConfiguration;
     
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
             Ok(sqlite::SqliteDatabase::new(config.path.clone()))
         }
     }
    @@ -810,15 +842,15 @@
     impl ConfigurableDatabase for AnyDatabase {
         type Config = AnyDatabaseConfig;
     
    -    fn from_config(config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(config: &Self::Config) -> Result<Self, Error> {
             Ok(match config {
    -            AnyDatabaseConfig::Memory(inner) => {
    +            AnyDatabaseConfig::Memory(inner) => {
                     AnyDatabase::Memory(memory::MemoryDatabase::from_config(inner)?)
                 }
                 #[cfg(feature = "key-value-db")]
    -            AnyDatabaseConfig::Sled(inner) => AnyDatabase::Sled(sled::Tree::from_config(inner)?),
    +            AnyDatabaseConfig::Sled(inner) => AnyDatabase::Sled(sled::Tree::from_config(inner)?),
                 #[cfg(feature = "sqlite")]
    -            AnyDatabaseConfig::Sqlite(inner) => {
    +            AnyDatabaseConfig::Sqlite(inner) => {
                     AnyDatabase::Sqlite(sqlite::SqliteDatabase::from_config(inner)?)
                 }
             })
    @@ -829,6 +861,5 @@
     impl_from!(SledDbConfiguration, AnyDatabaseConfig, Sled, #[cfg(feature = "key-value-db")]);
     impl_from!(SqliteDbConfiguration, AnyDatabaseConfig, Sqlite, #[cfg(feature = "sqlite")]);
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/keyvalue.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/keyvalue.rs.html index 111cc74a11..11af5db3aa 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/keyvalue.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/keyvalue.rs.html @@ -1,4 +1,6 @@ -keyvalue.rs - source
      1
    +keyvalue.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -471,6 +473,34 @@
     471
     472
     473
    +474
    +475
    +476
    +477
    +478
    +479
    +480
    +481
    +482
    +483
    +484
    +485
    +486
    +487
    +488
    +489
    +490
    +491
    +492
    +493
    +494
    +495
    +496
    +497
    +498
    +499
    +500
    +501
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -491,13 +521,13 @@
     use bitcoin::{OutPoint, Script, Transaction};
     
     use crate::database::memory::MapKey;
    -use crate::database::{BatchDatabase, BatchOperations, Database};
    +use crate::database::{BatchDatabase, BatchOperations, Database, SyncTime};
     use crate::error::Error;
     use crate::types::*;
     
     macro_rules! impl_batch_operations {
    -    ( { $($after_insert:tt)* }, $process_delete:ident ) => {
    -        fn set_script_pubkey(&mut self, script: &Script, keychain: KeychainKind, path: u32) -> Result<(), Error> {
    +    ( { $($after_insert:tt)* }, $process_delete:ident ) => {
    +        fn set_script_pubkey(&mut self, script: &Script, keychain: KeychainKind, path: u32) -> Result<(), Error> {
                 let key = MapKey::Path((Some(keychain), Some(path))).as_map_key();
                 self.insert(key, serialize(script))$($after_insert)*;
     
    @@ -511,7 +541,7 @@
                 Ok(())
             }
     
    -        fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
    +        fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
                 let key = MapKey::Utxo(Some(&utxo.outpoint)).as_map_key();
                 let value = json!({
                     "t": utxo.txout,
    @@ -522,7 +552,7 @@
                 Ok(())
             }
     
    -        fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
    +        fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
                 let key = MapKey::RawTx(Some(&transaction.txid())).as_map_key();
                 let value = serialize(transaction);
                 self.insert(key, value)$($after_insert)*;
    @@ -530,7 +560,7 @@
                 Ok(())
             }
     
    -        fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
    +        fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
                 let key = MapKey::Transaction(Some(&transaction.txid)).as_map_key();
     
                 // remove the raw tx from the serialized version
    @@ -548,14 +578,21 @@
                 Ok(())
             }
     
    -        fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
    +        fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
                 let key = MapKey::LastIndex(keychain).as_map_key();
                 self.insert(key, &value.to_be_bytes())$($after_insert)*;
     
                 Ok(())
             }
     
    -        fn del_script_pubkey_from_path(&mut self, keychain: KeychainKind, path: u32) -> Result<Option<Script>, Error> {
    +        fn set_sync_time(&mut self, data: SyncTime) -> Result<(), Error> {
    +            let key = MapKey::SyncTime.as_map_key();
    +            self.insert(key, serde_json::to_vec(&data)?)$($after_insert)*;
    +
    +            Ok(())
    +        }
    +
    +        fn del_script_pubkey_from_path(&mut self, keychain: KeychainKind, path: u32) -> Result<Option<Script>, Error> {
                 let key = MapKey::Path((Some(keychain), Some(path))).as_map_key();
                 let res = self.remove(key);
                 let res = $process_delete!(res);
    @@ -563,14 +600,14 @@
                 Ok(res.map_or(Ok(None), |x| Some(deserialize(&x)).transpose())?)
             }
     
    -        fn del_path_from_script_pubkey(&mut self, script: &Script) -> Result<Option<(KeychainKind, u32)>, Error> {
    +        fn del_path_from_script_pubkey(&mut self, script: &Script) -> Result<Option<(KeychainKind, u32)>, Error> {
                 let key = MapKey::Script(Some(script)).as_map_key();
                 let res = self.remove(key);
                 let res = $process_delete!(res);
     
                 match res {
    -                None => Ok(None),
    -                Some(b) => {
    +                None => Ok(None),
    +                Some(b) => {
                         let mut val: serde_json::Value = serde_json::from_slice(&b)?;
                         let st = serde_json::from_value(val["t"].take())?;
                         let path = serde_json::from_value(val["p"].take())?;
    @@ -580,14 +617,14 @@
                 }
             }
     
    -        fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +        fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
                 let key = MapKey::Utxo(Some(outpoint)).as_map_key();
                 let res = self.remove(key);
                 let res = $process_delete!(res);
     
                 match res {
    -                None => Ok(None),
    -                Some(b) => {
    +                None => Ok(None),
    +                Some(b) => {
                         let mut val: serde_json::Value = serde_json::from_slice(&b)?;
                         let txout = serde_json::from_value(val["t"].take())?;
                         let keychain = serde_json::from_value(val["i"].take())?;
    @@ -597,7 +634,7 @@
                 }
             }
     
    -        fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +        fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
                 let key = MapKey::RawTx(Some(txid)).as_map_key();
                 let res = self.remove(key);
                 let res = $process_delete!(res);
    @@ -605,7 +642,7 @@
                 Ok(res.map_or(Ok(None), |x| Some(deserialize(&x)).transpose())?)
             }
     
    -        fn del_tx(&mut self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
    +        fn del_tx(&mut self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
                 let raw_tx = if include_raw {
                     self.del_raw_tx(txid)?
                 } else {
    @@ -617,8 +654,8 @@
                 let res = $process_delete!(res);
     
                 match res {
    -                None => Ok(None),
    -                Some(b) => {
    +                None => Ok(None),
    +                Some(b) => {
                         let mut val: TransactionDetails = serde_json::from_slice(&b)?;
                         val.transaction = raw_tx;
     
    @@ -627,25 +664,33 @@
                 }
             }
     
    -        fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +        fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
                 let key = MapKey::LastIndex(keychain).as_map_key();
                 let res = self.remove(key);
                 let res = $process_delete!(res);
     
                 match res {
    -                None => Ok(None),
    -                Some(b) => {
    +                None => Ok(None),
    +                Some(b) => {
                         let array: [u8; 4] = b.as_ref().try_into().map_err(|_| Error::InvalidU32Bytes(b.to_vec()))?;
                         let val = u32::from_be_bytes(array);
                         Ok(Some(val))
                     }
                 }
             }
    +
    +        fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error> {
    +            let key = MapKey::SyncTime.as_map_key();
    +            let res = self.remove(key);
    +            let res = $process_delete!(res);
    +
    +            Ok(res.map(|b| serde_json::from_slice(&b)).transpose()?)
    +        }
         }
     }
     
     macro_rules! process_delete_tree {
    -    ($res:expr) => {
    +    ($res:expr) => {
             $res?
         };
     }
    @@ -654,7 +699,7 @@
     }
     
     macro_rules! process_delete_batch {
    -    ($res:expr) => {
    +    ($res:expr) => {
             None as Option<sled::IVec>
         };
     }
    @@ -665,15 +710,15 @@
     
     impl Database for Tree {
         fn check_descriptor_checksum<B: AsRef<[u8]>>(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             bytes: B,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let key = MapKey::DescriptorChecksum(keychain).as_map_key();
     
             let prev = self.get(&key)?.map(|x| x.to_vec());
             if let Some(val) = prev {
    -            if val == bytes.as_ref() {
    +            if val == bytes.as_ref() {
                     Ok(())
                 } else {
                     Err(Error::ChecksumMismatch)
    @@ -684,20 +729,20 @@
             }
         }
     
    -    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
    +    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
             let key = MapKey::Path((keychain, None)).as_map_key();
             self.scan_prefix(key)
    -            .map(|x| -> Result<_, Error> {
    +            .map(|x| -> Result<_, Error> {
                     let (_, v) = x?;
                     Ok(deserialize(&v)?)
                 })
                 .collect()
         }
     
    -    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
    +    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
             let key = MapKey::Utxo(None).as_map_key();
             self.scan_prefix(key)
    -            .map(|x| -> Result<_, Error> {
    +            .map(|x| -> Result<_, Error> {
                     let (k, v) = x?;
                     let outpoint = deserialize(&k[1..])?;
     
    @@ -714,20 +759,20 @@
                 .collect()
         }
     
    -    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
    +    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
             let key = MapKey::RawTx(None).as_map_key();
             self.scan_prefix(key)
    -            .map(|x| -> Result<_, Error> {
    +            .map(|x| -> Result<_, Error> {
                     let (_, v) = x?;
                     Ok(deserialize(&v)?)
                 })
                 .collect()
         }
     
    -    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
    +    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
             let key = MapKey::Transaction(None).as_map_key();
             self.scan_prefix(key)
    -            .map(|x| -> Result<_, Error> {
    +            .map(|x| -> Result<_, Error> {
                     let (k, v) = x?;
                     let mut txdetails: TransactionDetails = serde_json::from_slice(&v)?;
                     if include_raw {
    @@ -744,7 +789,7 @@
             &self,
             keychain: KeychainKind,
             path: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             let key = MapKey::Path((Some(keychain), Some(path))).as_map_key();
             Ok(self.get(key)?.map(|b| deserialize(&b)).transpose()?)
         }
    @@ -752,10 +797,10 @@
         fn get_path_from_script_pubkey(
             &self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             let key = MapKey::Script(Some(script)).as_map_key();
             self.get(key)?
    -            .map(|b| -> Result<_, Error> {
    +            .map(|b| -> Result<_, Error> {
                     let mut val: serde_json::Value = serde_json::from_slice(&b)?;
                     let st = serde_json::from_value(val["t"].take())?;
                     let path = serde_json::from_value(val["p"].take())?;
    @@ -765,10 +810,10 @@
                 .transpose()
         }
     
    -    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             let key = MapKey::Utxo(Some(outpoint)).as_map_key();
             self.get(key)?
    -            .map(|b| -> Result<_, Error> {
    +            .map(|b| -> Result<_, Error> {
                     let mut val: serde_json::Value = serde_json::from_slice(&b)?;
                     let txout = serde_json::from_value(val["t"].take())?;
                     let keychain = serde_json::from_value(val["i"].take())?;
    @@ -782,15 +827,15 @@
                 .transpose()
         }
     
    -    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             let key = MapKey::RawTx(Some(txid)).as_map_key();
             Ok(self.get(key)?.map(|b| deserialize(&b)).transpose()?)
         }
     
    -    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
    +    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
             let key = MapKey::Transaction(Some(txid)).as_map_key();
             self.get(key)?
    -            .map(|b| -> Result<_, Error> {
    +            .map(|b| -> Result<_, Error> {
                     let mut txdetails: TransactionDetails = serde_json::from_slice(&b)?;
                     if include_raw {
                         txdetails.transaction = self.get_raw_tx(txid)?;
    @@ -801,10 +846,10 @@
                 .transpose()
         }
     
    -    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             let key = MapKey::LastIndex(keychain).as_map_key();
             self.get(key)?
    -            .map(|b| -> Result<_, Error> {
    +            .map(|b| -> Result<_, Error> {
                     let array: [u8; 4] = b
                         .as_ref()
                         .try_into()
    @@ -815,23 +860,31 @@
                 .transpose()
         }
     
    +    fn get_sync_time(&self) -> Result<Option<SyncTime>, Error> {
    +        let key = MapKey::SyncTime.as_map_key();
    +        Ok(self
    +            .get(key)?
    +            .map(|b| serde_json::from_slice(&b))
    +            .transpose()?)
    +    }
    +
         // inserts 0 if not present
    -    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
    +    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
             let key = MapKey::LastIndex(keychain).as_map_key();
             self.update_and_fetch(key, |prev| {
                 let new = match prev {
    -                Some(b) => {
    +                Some(b) => {
                         let array: [u8; 4] = b.try_into().unwrap_or([0; 4]);
                         let val = u32::from_be_bytes(array);
     
                         val + 1
                     }
    -                None => 0,
    +                None => 0,
                 };
     
                 Some(new.to_be_bytes().to_vec())
             })?
    -        .map_or(Ok(0), |b| -> Result<_, Error> {
    +        .map_or(Ok(0), |b| -> Result<_, Error> {
                 let array: [u8; 4] = b
                     .as_ref()
                     .try_into()
    @@ -841,7 +894,7 @@
             })
         }
     
    -    fn flush(&mut self) -> Result<(), Error> {
    +    fn flush(&mut self) -> Result<(), Error> {
             Ok(Tree::flush(self).map(|_| ())?)
         }
     }
    @@ -849,11 +902,11 @@
     impl BatchDatabase for Tree {
         type Batch = sled::Batch;
     
    -    fn begin_batch(&self) -> Self::Batch {
    +    fn begin_batch(&self) -> Self::Batch {
             sled::Batch::default()
         }
     
    -    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error> {
    +    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error> {
             Ok(self.apply_batch(batch)?)
         }
     }
    @@ -874,7 +927,7 @@
             static ref INIT: Once = Once::new();
         }
     
    -    fn get_tree() -> Tree {
    +    fn get_tree() -> Tree {
             unsafe {
                 let cloned = DB.clone();
                 let (mutex, cvar) = &*cloned;
    @@ -943,8 +996,12 @@
         fn test_last_index() {
             crate::database::test::test_last_index(get_tree());
         }
    +
    +    #[test]
    +    fn test_sync_time() {
    +        crate::database::test::test_sync_time(get_tree());
    +    }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/memory.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/memory.rs.html index 5c0d43db48..f060681106 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/memory.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/memory.rs.html @@ -1,4 +1,6 @@ -memory.rs - source
      1
    +memory.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -590,6 +592,34 @@
     590
     591
     592
    +593
    +594
    +595
    +596
    +597
    +598
    +599
    +600
    +601
    +602
    +603
    +604
    +605
    +606
    +607
    +608
    +609
    +610
    +611
    +612
    +613
    +614
    +615
    +616
    +617
    +618
    +619
    +620
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -606,6 +636,7 @@
     //! This module defines an in-memory database type called [`MemoryDatabase`] that is based on a
     //! [`BTreeMap`].
     
    +use std::any::Any;
     use std::collections::BTreeMap;
     use std::ops::Bound::{Excluded, Included};
     
    @@ -613,7 +644,7 @@
     use bitcoin::hash_types::Txid;
     use bitcoin::{OutPoint, Script, Transaction};
     
    -use crate::database::{BatchDatabase, BatchOperations, ConfigurableDatabase, Database};
    +use crate::database::{BatchDatabase, BatchOperations, ConfigurableDatabase, Database, SyncTime};
     use crate::error::Error;
     use crate::types::*;
     
    @@ -624,6 +655,7 @@
     // transactions         t<txid> -> tx details
     // deriv indexes        c{i,e} -> u32
     // descriptor checksum  d{i,e} -> vec<u8>
    +// last sync time       l -> { height, timestamp }
     
     pub(crate) enum MapKey<'a> {
         Path((Option<KeychainKind>, Option<u32>)),
    @@ -632,40 +664,42 @@
         RawTx(Option<&'a Txid>),
         Transaction(Option<&'a Txid>),
         LastIndex(KeychainKind),
    +    SyncTime,
         DescriptorChecksum(KeychainKind),
     }
     
     impl MapKey<'_> {
    -    fn as_prefix(&self) -> Vec<u8> {
    +    fn as_prefix(&self) -> Vec<u8> {
             match self {
    -            MapKey::Path((st, _)) => {
    +            MapKey::Path((st, _)) => {
                     let mut v = b"p".to_vec();
                     if let Some(st) = st {
                         v.push(st.as_byte());
                     }
                     v
                 }
    -            MapKey::Script(_) => b"s".to_vec(),
    -            MapKey::Utxo(_) => b"u".to_vec(),
    -            MapKey::RawTx(_) => b"r".to_vec(),
    -            MapKey::Transaction(_) => b"t".to_vec(),
    -            MapKey::LastIndex(st) => [b"c", st.as_ref()].concat(),
    -            MapKey::DescriptorChecksum(st) => [b"d", st.as_ref()].concat(),
    +            MapKey::Script(_) => b"s".to_vec(),
    +            MapKey::Utxo(_) => b"u".to_vec(),
    +            MapKey::RawTx(_) => b"r".to_vec(),
    +            MapKey::Transaction(_) => b"t".to_vec(),
    +            MapKey::LastIndex(st) => [b"c", st.as_ref()].concat(),
    +            MapKey::SyncTime => b"l".to_vec(),
    +            MapKey::DescriptorChecksum(st) => [b"d", st.as_ref()].concat(),
             }
         }
     
    -    fn serialize_content(&self) -> Vec<u8> {
    +    fn serialize_content(&self) -> Vec<u8> {
             match self {
    -            MapKey::Path((_, Some(child))) => child.to_be_bytes().to_vec(),
    -            MapKey::Script(Some(s)) => serialize(*s),
    -            MapKey::Utxo(Some(s)) => serialize(*s),
    -            MapKey::RawTx(Some(s)) => serialize(*s),
    -            MapKey::Transaction(Some(s)) => serialize(*s),
    -            _ => vec![],
    +            MapKey::Path((_, Some(child))) => child.to_be_bytes().to_vec(),
    +            MapKey::Script(Some(s)) => serialize(*s),
    +            MapKey::Utxo(Some(s)) => serialize(*s),
    +            MapKey::RawTx(Some(s)) => serialize(*s),
    +            MapKey::Transaction(Some(s)) => serialize(*s),
    +            _ => vec![],
             }
         }
     
    -    pub fn as_map_key(&self) -> Vec<u8> {
    +    pub fn as_map_key(&self) -> Vec<u8> {
             let mut v = self.as_prefix();
             v.extend_from_slice(&self.serialize_content());
     
    @@ -673,11 +707,11 @@
         }
     }
     
    -fn after(key: &[u8]) -> Vec<u8> {
    +fn after(key: &[u8]) -> Vec<u8> {
         let mut key = key.to_owned();
         let mut idx = key.len();
         while idx > 0 {
    -        if key[idx - 1] == 0xFF {
    +        if key[idx - 1] == 0xFF {
                 idx -= 1;
                 continue;
             } else {
    @@ -697,18 +731,18 @@
     /// Once it's dropped its content will be lost.
     ///
     /// If you are looking for a permanent storage solution, you can try with the default key-value
    -/// database called [`sled`]. See the [`database`] module documentation for more defailts.
    +/// database called [`sled`]. See the [`database`] module documentation for more details.
     ///
     /// [`database`]: crate::database
     #[derive(Debug, Default)]
     pub struct MemoryDatabase {
    -    map: BTreeMap<Vec<u8>, Box<dyn std::any::Any>>,
    +    map: BTreeMap<Vec<u8>, Box<dyn Any + Send + Sync>>,
         deleted_keys: Vec<Vec<u8>>,
     }
     
     impl MemoryDatabase {
         /// Create a new empty database
    -    pub fn new() -> Self {
    +    pub fn new() -> Self {
             MemoryDatabase {
                 map: BTreeMap::new(),
                 deleted_keys: Vec::new(),
    @@ -718,11 +752,11 @@
     
     impl BatchOperations for MemoryDatabase {
         fn set_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
             keychain: KeychainKind,
             path: u32,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let key = MapKey::Path((Some(keychain), Some(path))).as_map_key();
             self.map.insert(key, Box::new(script.clone()));
     
    @@ -736,20 +770,20 @@
             Ok(())
         }
     
    -    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
    +    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
             let key = MapKey::Utxo(Some(&utxo.outpoint)).as_map_key();
             self.map
                 .insert(key, Box::new((utxo.txout.clone(), utxo.keychain)));
     
             Ok(())
         }
    -    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
    +    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
             let key = MapKey::RawTx(Some(&transaction.txid())).as_map_key();
             self.map.insert(key, Box::new(transaction.clone()));
     
             Ok(())
         }
    -    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
    +    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
             let key = MapKey::Transaction(Some(&transaction.txid)).as_map_key();
     
             // insert the raw_tx if present
    @@ -765,18 +799,24 @@
     
             Ok(())
         }
    -    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
    +    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
             let key = MapKey::LastIndex(keychain).as_map_key();
             self.map.insert(key, Box::new(value));
     
             Ok(())
         }
    +    fn set_sync_time(&mut self, data: SyncTime) -> Result<(), Error> {
    +        let key = MapKey::SyncTime.as_map_key();
    +        self.map.insert(key, Box::new(data));
    +
    +        Ok(())
    +    }
     
         fn del_script_pubkey_from_path(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             path: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             let key = MapKey::Path((Some(keychain), Some(path))).as_map_key();
             let res = self.map.remove(&key);
             self.deleted_keys.push(key);
    @@ -784,16 +824,16 @@
             Ok(res.map(|x| x.downcast_ref().cloned().unwrap()))
         }
         fn del_path_from_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             let key = MapKey::Script(Some(script)).as_map_key();
             let res = self.map.remove(&key);
             self.deleted_keys.push(key);
     
             match res {
    -            None => Ok(None),
    -            Some(b) => {
    +            None => Ok(None),
    +            Some(b) => {
                     let mut val: serde_json::Value = b.downcast_ref().cloned().unwrap();
                     let st = serde_json::from_value(val["t"].take())?;
                     let path = serde_json::from_value(val["p"].take())?;
    @@ -802,14 +842,14 @@
                 }
             }
         }
    -    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             let key = MapKey::Utxo(Some(outpoint)).as_map_key();
             let res = self.map.remove(&key);
             self.deleted_keys.push(key);
     
             match res {
    -            None => Ok(None),
    -            Some(b) => {
    +            None => Ok(None),
    +            Some(b) => {
                     let (txout, keychain) = b.downcast_ref().cloned().unwrap();
                     Ok(Some(LocalUtxo {
                         outpoint: *outpoint,
    @@ -819,7 +859,7 @@
                 }
             }
         }
    -    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             let key = MapKey::RawTx(Some(txid)).as_map_key();
             let res = self.map.remove(&key);
             self.deleted_keys.push(key);
    @@ -827,10 +867,10 @@
             Ok(res.map(|x| x.downcast_ref().cloned().unwrap()))
         }
         fn del_tx(
    -        &mut self,
    +        &mut self,
             txid: &Txid,
             include_raw: bool,
    -    ) -> Result<Option<TransactionDetails>, Error> {
    +    ) -> Result<Option<TransactionDetails>, Error> {
             let raw_tx = if include_raw {
                 self.del_raw_tx(txid)?
             } else {
    @@ -842,8 +882,8 @@
             self.deleted_keys.push(key);
     
             match res {
    -            None => Ok(None),
    -            Some(b) => {
    +            None => Ok(None),
    +            Some(b) => {
                     let mut val: TransactionDetails = b.downcast_ref().cloned().unwrap();
                     val.transaction = raw_tx;
     
    @@ -851,24 +891,31 @@
                 }
             }
         }
    -    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             let key = MapKey::LastIndex(keychain).as_map_key();
             let res = self.map.remove(&key);
             self.deleted_keys.push(key);
     
             match res {
    -            None => Ok(None),
    -            Some(b) => Ok(Some(*b.downcast_ref().unwrap())),
    +            None => Ok(None),
    +            Some(b) => Ok(Some(*b.downcast_ref().unwrap())),
             }
         }
    +    fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error> {
    +        let key = MapKey::SyncTime.as_map_key();
    +        let res = self.map.remove(&key);
    +        self.deleted_keys.push(key);
    +
    +        Ok(res.map(|b| b.downcast_ref().cloned().unwrap()))
    +    }
     }
     
     impl Database for MemoryDatabase {
         fn check_descriptor_checksum<B: AsRef<[u8]>>(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             bytes: B,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let key = MapKey::DescriptorChecksum(keychain).as_map_key();
     
             let prev = self
    @@ -876,7 +923,7 @@
                 .get(&key)
                 .map(|x| x.downcast_ref::<Vec<u8>>().unwrap());
             if let Some(val) = prev {
    -            if val == &bytes.as_ref().to_vec() {
    +            if val == &bytes.as_ref().to_vec() {
                     Ok(())
                 } else {
                     Err(Error::ChecksumMismatch)
    @@ -887,7 +934,7 @@
             }
         }
     
    -    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
    +    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
             let key = MapKey::Path((keychain, None)).as_map_key();
             self.map
                 .range::<Vec<u8>, _>((Included(&key), Excluded(&after(&key))))
    @@ -895,7 +942,7 @@
                 .collect()
         }
     
    -    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
    +    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
             let key = MapKey::Utxo(None).as_map_key();
             self.map
                 .range::<Vec<u8>, _>((Included(&key), Excluded(&after(&key))))
    @@ -911,7 +958,7 @@
                 .collect()
         }
     
    -    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
    +    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
             let key = MapKey::RawTx(None).as_map_key();
             self.map
                 .range::<Vec<u8>, _>((Included(&key), Excluded(&after(&key))))
    @@ -919,7 +966,7 @@
                 .collect()
         }
     
    -    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
    +    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
             let key = MapKey::Transaction(None).as_map_key();
             self.map
                 .range::<Vec<u8>, _>((Included(&key), Excluded(&after(&key))))
    @@ -939,7 +986,7 @@
             &self,
             keychain: KeychainKind,
             path: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             let key = MapKey::Path((Some(keychain), Some(path))).as_map_key();
             Ok(self
                 .map
    @@ -950,7 +997,7 @@
         fn get_path_from_script_pubkey(
             &self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             let key = MapKey::Script(Some(script)).as_map_key();
             Ok(self.map.get(&key).map(|b| {
                 let mut val: serde_json::Value = b.downcast_ref().cloned().unwrap();
    @@ -961,7 +1008,7 @@
             }))
         }
     
    -    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             let key = MapKey::Utxo(Some(outpoint)).as_map_key();
             Ok(self.map.get(&key).map(|b| {
                 let (txout, keychain) = b.downcast_ref().cloned().unwrap();
    @@ -973,7 +1020,7 @@
             }))
         }
     
    -    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             let key = MapKey::RawTx(Some(txid)).as_map_key();
             Ok(self
                 .map
    @@ -981,7 +1028,7 @@
                 .map(|b| b.downcast_ref().cloned().unwrap()))
         }
     
    -    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
    +    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
             let key = MapKey::Transaction(Some(txid)).as_map_key();
             Ok(self.map.get(&key).map(|b| {
                 let mut txdetails: TransactionDetails = b.downcast_ref().cloned().unwrap();
    @@ -993,13 +1040,21 @@
             }))
         }
     
    -    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             let key = MapKey::LastIndex(keychain).as_map_key();
             Ok(self.map.get(&key).map(|b| *b.downcast_ref().unwrap()))
         }
     
    +    fn get_sync_time(&self) -> Result<Option<SyncTime>, Error> {
    +        let key = MapKey::SyncTime.as_map_key();
    +        Ok(self
    +            .map
    +            .get(&key)
    +            .map(|b| b.downcast_ref().cloned().unwrap()))
    +    }
    +
         // inserts 0 if not present
    -    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
    +    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
             let key = MapKey::LastIndex(keychain).as_map_key();
             let value = self
                 .map
    @@ -1012,7 +1067,7 @@
             Ok(*value)
         }
     
    -    fn flush(&mut self) -> Result<(), Error> {
    +    fn flush(&mut self) -> Result<(), Error> {
             Ok(())
         }
     }
    @@ -1020,15 +1075,15 @@
     impl BatchDatabase for MemoryDatabase {
         type Batch = Self;
     
    -    fn begin_batch(&self) -> Self::Batch {
    +    fn begin_batch(&self) -> Self::Batch {
             MemoryDatabase::new()
         }
     
    -    fn commit_batch(&mut self, mut batch: Self::Batch) -> Result<(), Error> {
    +    fn commit_batch(&mut self, mut batch: Self::Batch) -> Result<(), Error> {
             for key in batch.deleted_keys.iter() {
                 self.map.remove(key);
             }
    -        self.map.append(&mut batch.map);
    +        self.map.append(&mut batch.map);
             Ok(())
         }
     }
    @@ -1036,7 +1091,7 @@
     impl ConfigurableDatabase for MemoryDatabase {
         type Config = ();
     
    -    fn from_config(_config: &Self::Config) -> Result<Self, Error> {
    +    fn from_config(_config: &Self::Config) -> Result<Self, Error> {
             Ok(MemoryDatabase::default())
         }
     }
    @@ -1047,7 +1102,7 @@
     /// macro and not a `[cfg(test)]` function so it can be called within the context of doctests which
     /// don't have `test` set.
     macro_rules! populate_test_db {
    -    ($db:expr, $tx_meta:expr, $current_height:expr$(,)?) => {{
    +    ($db:expr, $tx_meta:expr, $current_height:expr$(,)?) => {{
             use std::str::FromStr;
             use $crate::database::BatchOperations;
             let mut db = $db;
    @@ -1070,12 +1125,10 @@
             };
     
             let txid = tx.txid();
    -        let confirmation_time = tx_meta
    -            .min_confirmations
    -            .map(|conf| $crate::ConfirmationTime {
    -                height: current_height.unwrap().checked_sub(conf as u32).unwrap(),
    -                timestamp: 0,
    -            });
    +        let confirmation_time = tx_meta.min_confirmations.map(|conf| $crate::BlockTime {
    +            height: current_height.unwrap().checked_sub(conf as u32).unwrap(),
    +            timestamp: 0,
    +        });
     
             let tx_details = $crate::TransactionDetails {
                 transaction: Some(tx.clone()),
    @@ -1108,7 +1161,7 @@
     #[doc(hidden)]
     /// Macro for getting a wallet for use in a doctest
     macro_rules! doctest_wallet {
    -    () => {{
    +    () => {{
             use $crate::bitcoin::Network;
             use $crate::database::MemoryDatabase;
             use $crate::testutils;
    @@ -1117,9 +1170,9 @@
     
             let mut db = MemoryDatabase::new();
             let txid = populate_test_db!(
    -            &mut db,
    +            &mut db,
                 testutils! {
    -                @tx ( (@external descriptors, 0) => 500_000 ) (@confirmations 1)
    +                @tx ( (@external descriptors, 0) => 500_000 ) (@confirmations 1)
                 },
                 Some(100),
             );
    @@ -1138,7 +1191,7 @@
     mod test {
         use super::MemoryDatabase;
     
    -    fn get_tree() -> MemoryDatabase {
    +    fn get_tree() -> MemoryDatabase {
             MemoryDatabase::new()
         }
     
    @@ -1181,8 +1234,12 @@
         fn test_last_index() {
             crate::database::test::test_last_index(get_tree());
         }
    +
    +    #[test]
    +    fn test_sync_time() {
    +        crate::database::test::test_sync_time(get_tree());
    +    }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/mod.rs.html index 8dfc8a0079..cb98183bda 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -379,6 +381,45 @@
     379
     380
     381
    +382
    +383
    +384
    +385
    +386
    +387
    +388
    +389
    +390
    +391
    +392
    +393
    +394
    +395
    +396
    +397
    +398
    +399
    +400
    +401
    +402
    +403
    +404
    +405
    +406
    +407
    +408
    +409
    +410
    +411
    +412
    +413
    +414
    +415
    +416
    +417
    +418
    +419
    +420
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -405,6 +446,8 @@
     //!
     //! [`Wallet`]: crate::wallet::Wallet
     
    +use serde::{Deserialize, Serialize};
    +
     use bitcoin::hash_types::Txid;
     use bitcoin::{OutPoint, Script, Transaction, TxOut};
     
    @@ -425,6 +468,15 @@
     pub mod memory;
     pub use memory::MemoryDatabase;
     
    +/// Blockchain state at the time of syncing
    +///
    +/// Contains only the block time and height at the moment
    +#[derive(Clone, Debug, Serialize, Deserialize)]
    +pub struct SyncTime {
    +    /// Block timestamp and height at the time of sync
    +    pub block_time: BlockTime,
    +}
    +
     /// Trait for operations that can be batched
     ///
     /// This trait defines the list of operations that must be implemented on the [`Database`] type and
    @@ -432,44 +484,50 @@
     pub trait BatchOperations {
         /// Store a script_pubkey along with its keychain and child number.
         fn set_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<(), Error>;
    +    ) -> Result<(), Error>;
         /// Store a [`LocalUtxo`]
    -    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error>;
    +    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error>;
         /// Store a raw transaction
    -    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error>;
    +    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error>;
         /// Store the metadata of a transaction
    -    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error>;
    +    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error>;
         /// Store the last derivation index for a given keychain.
    -    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error>;
    +    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error>;
    +    /// Store the sync time
    +    fn set_sync_time(&mut self, sync_time: SyncTime) -> Result<(), Error>;
     
         /// Delete a script_pubkey given the keychain and its child number.
         fn del_script_pubkey_from_path(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error>;
    +    ) -> Result<Option<Script>, Error>;
         /// Delete the data related to a specific script_pubkey, meaning the keychain and the child
         /// number.
         fn del_path_from_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error>;
    +    ) -> Result<Option<(KeychainKind, u32)>, Error>;
         /// Delete a [`LocalUtxo`] given its [`OutPoint`]
    -    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error>;
    +    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error>;
         /// Delete a raw transaction given its [`Txid`]
    -    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error>;
    +    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error>;
         /// Delete the metadata of a transaction and optionally the raw transaction itself
         fn del_tx(
    -        &mut self,
    +        &mut self,
             txid: &Txid,
             include_raw: bool,
    -    ) -> Result<Option<TransactionDetails>, Error>;
    +    ) -> Result<Option<TransactionDetails>, Error>;
         /// Delete the last derivation index for a keychain.
    -    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error>;
    +    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error>;
    +    /// Reset the sync time to `None`
    +    ///
    +    /// Returns the removed value
    +    fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error>;
     }
     
     /// Trait for reading data from a database
    @@ -482,47 +540,49 @@
         /// checksum doesn't match. If there's no checksum in the database, simply store it for the
         /// next time.
         fn check_descriptor_checksum<B: AsRef<[u8]>>(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             bytes: B,
    -    ) -> Result<(), Error>;
    +    ) -> Result<(), Error>;
     
         /// Return the list of script_pubkeys
    -    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error>;
    +    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error>;
         /// Return the list of [`LocalUtxo`]s
    -    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error>;
    +    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error>;
         /// Return the list of raw transactions
    -    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error>;
    +    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error>;
         /// Return the list of transactions metadata
    -    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error>;
    +    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error>;
     
         /// Fetch a script_pubkey given the child number of a keychain.
         fn get_script_pubkey_from_path(
             &self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error>;
    +    ) -> Result<Option<Script>, Error>;
         /// Fetch the keychain and child number of a given script_pubkey
         fn get_path_from_script_pubkey(
             &self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error>;
    +    ) -> Result<Option<(KeychainKind, u32)>, Error>;
         /// Fetch a [`LocalUtxo`] given its [`OutPoint`]
    -    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error>;
    +    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error>;
         /// Fetch a raw transaction given its [`Txid`]
    -    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error>;
    +    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error>;
         /// Fetch the transaction metadata and optionally also the raw transaction
    -    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error>;
    -    /// Return the last defivation index for a keychain.
    -    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error>;
    +    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error>;
    +    /// Return the last derivation index for a keychain.
    +    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error>;
    +    /// Return the sync time, if present
    +    fn get_sync_time(&self) -> Result<Option<SyncTime>, Error>;
     
         /// Increment the last derivation index for a keychain and return it
         ///
         /// It should insert and return `0` if not present in the database
    -    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error>;
    +    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error>;
     
         /// Force changes to be written to disk
    -    fn flush(&mut self) -> Result<(), Error>;
    +    fn flush(&mut self) -> Result<(), Error>;
     }
     
     /// Trait for a database that supports batch operations
    @@ -533,9 +593,9 @@
         type Batch: BatchOperations;
     
         /// Create a new batch container
    -    fn begin_batch(&self) -> Self::Batch;
    +    fn begin_batch(&self) -> Self::Batch;
         /// Consume and apply a batch of operations
    -    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error>;
    +    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error>;
     }
     
     /// Trait for [`Database`] types that can be created given a configuration
    @@ -544,18 +604,18 @@
         type Config: std::fmt::Debug;
     
         /// Create a new instance given a configuration
    -    fn from_config(config: &Self::Config) -> Result<Self, Error>;
    +    fn from_config(config: &Self::Config) -> Result<Self, Error>;
     }
     
     pub(crate) trait DatabaseUtils: Database {
    -    fn is_mine(&self, script: &Script) -> Result<bool, Error> {
    +    fn is_mine(&self, script: &Script) -> Result<bool, Error> {
             self.get_path_from_script_pubkey(script)
                 .map(|o| o.is_some())
         }
     
    -    fn get_raw_tx_or<D>(&self, txid: &Txid, default: D) -> Result<Option<Transaction>, Error>
    +    fn get_raw_tx_or<D>(&self, txid: &Txid, default: D) -> Result<Option<Transaction>, Error>
         where
    -        D: FnOnce() -> Result<Option<Transaction>, Error>,
    +        D: FnOnce() -> Result<Option<Transaction>, Error>,
         {
             self.get_tx(txid, true)?
                 .map(|t| t.transaction)
    @@ -563,7 +623,7 @@
                 .map_or_else(default, |t| Ok(Some(t)))
         }
     
    -    fn get_previous_output(&self, outpoint: &OutPoint) -> Result<Option<TxOut>, Error> {
    +    fn get_previous_output(&self, outpoint: &OutPoint) -> Result<Option<TxOut>, Error> {
             self.get_raw_tx(&outpoint.txid)?
                 .map(|previous_tx| {
                     if outpoint.vout as usize >= previous_tx.output.len() {
    @@ -706,7 +766,7 @@
                 received: 1337,
                 sent: 420420,
                 fee: Some(140),
    -            confirmation_time: Some(ConfirmationTime {
    +            confirmation_time: Some(BlockTime {
                     timestamp: 123456,
                     height: 1000,
                 }),
    @@ -758,9 +818,28 @@
             );
         }
     
    +    pub fn test_sync_time<D: Database>(mut tree: D) {
    +        assert!(tree.get_sync_time().unwrap().is_none());
    +
    +        tree.set_sync_time(SyncTime {
    +            block_time: BlockTime {
    +                height: 100,
    +                timestamp: 1000,
    +            },
    +        })
    +        .unwrap();
    +
    +        let extracted = tree.get_sync_time().unwrap();
    +        assert!(extracted.is_some());
    +        assert_eq!(extracted.as_ref().unwrap().block_time.height, 100);
    +        assert_eq!(extracted.as_ref().unwrap().block_time.timestamp, 1000);
    +
    +        tree.del_sync_time().unwrap();
    +        assert!(tree.get_sync_time().unwrap().is_none());
    +    }
    +
         // TODO: more tests...
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/sqlite.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/sqlite.rs.html index ff5e01c5bf..158331d2ea 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/sqlite.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/database/sqlite.rs.html @@ -1,971 +1,1038 @@ -sqlite.rs - source
      1
    -  2
    -  3
    -  4
    -  5
    -  6
    -  7
    -  8
    -  9
    - 10
    - 11
    - 12
    - 13
    - 14
    - 15
    - 16
    - 17
    - 18
    - 19
    - 20
    - 21
    - 22
    - 23
    - 24
    - 25
    - 26
    - 27
    - 28
    - 29
    - 30
    - 31
    - 32
    - 33
    - 34
    - 35
    - 36
    - 37
    - 38
    - 39
    - 40
    - 41
    - 42
    - 43
    - 44
    - 45
    - 46
    - 47
    - 48
    - 49
    - 50
    - 51
    - 52
    - 53
    - 54
    - 55
    - 56
    - 57
    - 58
    - 59
    - 60
    - 61
    - 62
    - 63
    - 64
    - 65
    - 66
    - 67
    - 68
    - 69
    - 70
    - 71
    - 72
    - 73
    - 74
    - 75
    - 76
    - 77
    - 78
    - 79
    - 80
    - 81
    - 82
    - 83
    - 84
    - 85
    - 86
    - 87
    - 88
    - 89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
    -162
    -163
    -164
    -165
    -166
    -167
    -168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    -192
    -193
    -194
    -195
    -196
    -197
    -198
    -199
    -200
    -201
    -202
    -203
    -204
    -205
    -206
    -207
    -208
    -209
    -210
    -211
    -212
    -213
    -214
    -215
    -216
    -217
    -218
    -219
    -220
    -221
    -222
    -223
    -224
    -225
    -226
    -227
    -228
    -229
    -230
    -231
    -232
    -233
    -234
    -235
    -236
    -237
    -238
    -239
    -240
    -241
    -242
    -243
    -244
    -245
    -246
    -247
    -248
    -249
    -250
    -251
    -252
    -253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    -264
    -265
    -266
    -267
    -268
    -269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    -296
    -297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    -313
    -314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    -329
    -330
    -331
    -332
    -333
    -334
    -335
    -336
    -337
    -338
    -339
    -340
    -341
    -342
    -343
    -344
    -345
    -346
    -347
    -348
    -349
    -350
    -351
    -352
    -353
    -354
    -355
    -356
    -357
    -358
    -359
    -360
    -361
    -362
    -363
    -364
    -365
    -366
    -367
    -368
    -369
    -370
    -371
    -372
    -373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    -382
    -383
    -384
    -385
    -386
    -387
    -388
    -389
    -390
    -391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    -399
    -400
    -401
    -402
    -403
    -404
    -405
    -406
    -407
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    -421
    -422
    -423
    -424
    -425
    -426
    -427
    -428
    -429
    -430
    -431
    -432
    -433
    -434
    -435
    -436
    -437
    -438
    -439
    -440
    -441
    -442
    -443
    -444
    -445
    -446
    -447
    -448
    -449
    -450
    -451
    -452
    -453
    -454
    -455
    -456
    -457
    -458
    -459
    -460
    -461
    -462
    -463
    -464
    -465
    -466
    -467
    -468
    -469
    -470
    -471
    -472
    -473
    -474
    -475
    -476
    -477
    -478
    -479
    -480
    -481
    -482
    -483
    -484
    -485
    -486
    -487
    -488
    -489
    -490
    -491
    -492
    -493
    -494
    -495
    -496
    -497
    -498
    -499
    -500
    -501
    -502
    -503
    -504
    -505
    -506
    -507
    -508
    -509
    -510
    -511
    -512
    -513
    -514
    -515
    -516
    -517
    -518
    -519
    -520
    -521
    -522
    -523
    -524
    -525
    -526
    -527
    -528
    -529
    -530
    -531
    -532
    -533
    -534
    -535
    -536
    -537
    -538
    -539
    -540
    -541
    -542
    -543
    -544
    -545
    -546
    -547
    -548
    -549
    -550
    -551
    -552
    -553
    -554
    -555
    -556
    -557
    -558
    -559
    -560
    -561
    -562
    -563
    -564
    -565
    -566
    -567
    -568
    -569
    -570
    -571
    -572
    -573
    -574
    -575
    -576
    -577
    -578
    -579
    -580
    -581
    -582
    -583
    -584
    -585
    -586
    -587
    -588
    -589
    -590
    -591
    -592
    -593
    -594
    -595
    -596
    -597
    -598
    -599
    -600
    -601
    -602
    -603
    -604
    -605
    -606
    -607
    -608
    -609
    -610
    -611
    -612
    -613
    -614
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
    -632
    -633
    -634
    -635
    -636
    -637
    -638
    -639
    -640
    -641
    -642
    -643
    -644
    -645
    -646
    -647
    -648
    -649
    -650
    -651
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    -661
    -662
    -663
    -664
    -665
    -666
    -667
    -668
    -669
    -670
    -671
    -672
    -673
    -674
    -675
    -676
    -677
    -678
    -679
    -680
    -681
    -682
    -683
    -684
    -685
    -686
    -687
    -688
    -689
    -690
    -691
    -692
    -693
    -694
    -695
    -696
    -697
    -698
    -699
    -700
    -701
    -702
    -703
    -704
    -705
    -706
    -707
    -708
    -709
    -710
    -711
    -712
    -713
    -714
    -715
    -716
    -717
    -718
    -719
    -720
    -721
    -722
    -723
    -724
    -725
    -726
    -727
    -728
    -729
    -730
    -731
    -732
    -733
    -734
    -735
    -736
    -737
    -738
    -739
    -740
    -741
    -742
    -743
    -744
    -745
    -746
    -747
    -748
    -749
    -750
    -751
    -752
    -753
    -754
    -755
    -756
    -757
    -758
    -759
    -760
    -761
    -762
    -763
    -764
    -765
    -766
    -767
    -768
    -769
    -770
    -771
    -772
    -773
    -774
    -775
    -776
    -777
    -778
    -779
    -780
    -781
    -782
    -783
    -784
    -785
    -786
    -787
    -788
    -789
    -790
    -791
    -792
    -793
    -794
    -795
    -796
    -797
    -798
    -799
    -800
    -801
    -802
    -803
    -804
    -805
    -806
    -807
    -808
    -809
    -810
    -811
    -812
    -813
    -814
    -815
    -816
    -817
    -818
    -819
    -820
    -821
    -822
    -823
    -824
    -825
    -826
    -827
    -828
    -829
    -830
    -831
    -832
    -833
    -834
    -835
    -836
    -837
    -838
    -839
    -840
    -841
    -842
    -843
    -844
    -845
    -846
    -847
    -848
    -849
    -850
    -851
    -852
    -853
    -854
    -855
    -856
    -857
    -858
    -859
    -860
    -861
    -862
    -863
    -864
    -865
    -866
    -867
    -868
    -869
    -870
    -871
    -872
    -873
    -874
    -875
    -876
    -877
    -878
    -879
    -880
    -881
    -882
    -883
    -884
    -885
    -886
    -887
    -888
    -889
    -890
    -891
    -892
    -893
    -894
    -895
    -896
    -897
    -898
    -899
    -900
    -901
    -902
    -903
    -904
    -905
    -906
    -907
    -908
    -909
    -910
    -911
    -912
    -913
    -914
    -915
    -916
    -917
    -918
    -919
    -920
    -921
    -922
    -923
    -924
    -925
    -926
    -927
    -928
    -929
    -930
    -931
    -932
    -933
    -934
    -935
    -936
    -937
    -938
    -939
    -940
    -941
    -942
    -943
    -944
    -945
    -946
    -947
    -948
    -949
    -950
    -951
    -952
    -953
    -954
    -955
    -956
    -957
    -958
    -959
    -960
    -961
    -962
    -963
    -964
    -965
    -966
    -967
    -968
    +sqlite.rs - source
    +    
    logo
       1
    +   2
    +   3
    +   4
    +   5
    +   6
    +   7
    +   8
    +   9
    +  10
    +  11
    +  12
    +  13
    +  14
    +  15
    +  16
    +  17
    +  18
    +  19
    +  20
    +  21
    +  22
    +  23
    +  24
    +  25
    +  26
    +  27
    +  28
    +  29
    +  30
    +  31
    +  32
    +  33
    +  34
    +  35
    +  36
    +  37
    +  38
    +  39
    +  40
    +  41
    +  42
    +  43
    +  44
    +  45
    +  46
    +  47
    +  48
    +  49
    +  50
    +  51
    +  52
    +  53
    +  54
    +  55
    +  56
    +  57
    +  58
    +  59
    +  60
    +  61
    +  62
    +  63
    +  64
    +  65
    +  66
    +  67
    +  68
    +  69
    +  70
    +  71
    +  72
    +  73
    +  74
    +  75
    +  76
    +  77
    +  78
    +  79
    +  80
    +  81
    +  82
    +  83
    +  84
    +  85
    +  86
    +  87
    +  88
    +  89
    +  90
    +  91
    +  92
    +  93
    +  94
    +  95
    +  96
    +  97
    +  98
    +  99
    + 100
    + 101
    + 102
    + 103
    + 104
    + 105
    + 106
    + 107
    + 108
    + 109
    + 110
    + 111
    + 112
    + 113
    + 114
    + 115
    + 116
    + 117
    + 118
    + 119
    + 120
    + 121
    + 122
    + 123
    + 124
    + 125
    + 126
    + 127
    + 128
    + 129
    + 130
    + 131
    + 132
    + 133
    + 134
    + 135
    + 136
    + 137
    + 138
    + 139
    + 140
    + 141
    + 142
    + 143
    + 144
    + 145
    + 146
    + 147
    + 148
    + 149
    + 150
    + 151
    + 152
    + 153
    + 154
    + 155
    + 156
    + 157
    + 158
    + 159
    + 160
    + 161
    + 162
    + 163
    + 164
    + 165
    + 166
    + 167
    + 168
    + 169
    + 170
    + 171
    + 172
    + 173
    + 174
    + 175
    + 176
    + 177
    + 178
    + 179
    + 180
    + 181
    + 182
    + 183
    + 184
    + 185
    + 186
    + 187
    + 188
    + 189
    + 190
    + 191
    + 192
    + 193
    + 194
    + 195
    + 196
    + 197
    + 198
    + 199
    + 200
    + 201
    + 202
    + 203
    + 204
    + 205
    + 206
    + 207
    + 208
    + 209
    + 210
    + 211
    + 212
    + 213
    + 214
    + 215
    + 216
    + 217
    + 218
    + 219
    + 220
    + 221
    + 222
    + 223
    + 224
    + 225
    + 226
    + 227
    + 228
    + 229
    + 230
    + 231
    + 232
    + 233
    + 234
    + 235
    + 236
    + 237
    + 238
    + 239
    + 240
    + 241
    + 242
    + 243
    + 244
    + 245
    + 246
    + 247
    + 248
    + 249
    + 250
    + 251
    + 252
    + 253
    + 254
    + 255
    + 256
    + 257
    + 258
    + 259
    + 260
    + 261
    + 262
    + 263
    + 264
    + 265
    + 266
    + 267
    + 268
    + 269
    + 270
    + 271
    + 272
    + 273
    + 274
    + 275
    + 276
    + 277
    + 278
    + 279
    + 280
    + 281
    + 282
    + 283
    + 284
    + 285
    + 286
    + 287
    + 288
    + 289
    + 290
    + 291
    + 292
    + 293
    + 294
    + 295
    + 296
    + 297
    + 298
    + 299
    + 300
    + 301
    + 302
    + 303
    + 304
    + 305
    + 306
    + 307
    + 308
    + 309
    + 310
    + 311
    + 312
    + 313
    + 314
    + 315
    + 316
    + 317
    + 318
    + 319
    + 320
    + 321
    + 322
    + 323
    + 324
    + 325
    + 326
    + 327
    + 328
    + 329
    + 330
    + 331
    + 332
    + 333
    + 334
    + 335
    + 336
    + 337
    + 338
    + 339
    + 340
    + 341
    + 342
    + 343
    + 344
    + 345
    + 346
    + 347
    + 348
    + 349
    + 350
    + 351
    + 352
    + 353
    + 354
    + 355
    + 356
    + 357
    + 358
    + 359
    + 360
    + 361
    + 362
    + 363
    + 364
    + 365
    + 366
    + 367
    + 368
    + 369
    + 370
    + 371
    + 372
    + 373
    + 374
    + 375
    + 376
    + 377
    + 378
    + 379
    + 380
    + 381
    + 382
    + 383
    + 384
    + 385
    + 386
    + 387
    + 388
    + 389
    + 390
    + 391
    + 392
    + 393
    + 394
    + 395
    + 396
    + 397
    + 398
    + 399
    + 400
    + 401
    + 402
    + 403
    + 404
    + 405
    + 406
    + 407
    + 408
    + 409
    + 410
    + 411
    + 412
    + 413
    + 414
    + 415
    + 416
    + 417
    + 418
    + 419
    + 420
    + 421
    + 422
    + 423
    + 424
    + 425
    + 426
    + 427
    + 428
    + 429
    + 430
    + 431
    + 432
    + 433
    + 434
    + 435
    + 436
    + 437
    + 438
    + 439
    + 440
    + 441
    + 442
    + 443
    + 444
    + 445
    + 446
    + 447
    + 448
    + 449
    + 450
    + 451
    + 452
    + 453
    + 454
    + 455
    + 456
    + 457
    + 458
    + 459
    + 460
    + 461
    + 462
    + 463
    + 464
    + 465
    + 466
    + 467
    + 468
    + 469
    + 470
    + 471
    + 472
    + 473
    + 474
    + 475
    + 476
    + 477
    + 478
    + 479
    + 480
    + 481
    + 482
    + 483
    + 484
    + 485
    + 486
    + 487
    + 488
    + 489
    + 490
    + 491
    + 492
    + 493
    + 494
    + 495
    + 496
    + 497
    + 498
    + 499
    + 500
    + 501
    + 502
    + 503
    + 504
    + 505
    + 506
    + 507
    + 508
    + 509
    + 510
    + 511
    + 512
    + 513
    + 514
    + 515
    + 516
    + 517
    + 518
    + 519
    + 520
    + 521
    + 522
    + 523
    + 524
    + 525
    + 526
    + 527
    + 528
    + 529
    + 530
    + 531
    + 532
    + 533
    + 534
    + 535
    + 536
    + 537
    + 538
    + 539
    + 540
    + 541
    + 542
    + 543
    + 544
    + 545
    + 546
    + 547
    + 548
    + 549
    + 550
    + 551
    + 552
    + 553
    + 554
    + 555
    + 556
    + 557
    + 558
    + 559
    + 560
    + 561
    + 562
    + 563
    + 564
    + 565
    + 566
    + 567
    + 568
    + 569
    + 570
    + 571
    + 572
    + 573
    + 574
    + 575
    + 576
    + 577
    + 578
    + 579
    + 580
    + 581
    + 582
    + 583
    + 584
    + 585
    + 586
    + 587
    + 588
    + 589
    + 590
    + 591
    + 592
    + 593
    + 594
    + 595
    + 596
    + 597
    + 598
    + 599
    + 600
    + 601
    + 602
    + 603
    + 604
    + 605
    + 606
    + 607
    + 608
    + 609
    + 610
    + 611
    + 612
    + 613
    + 614
    + 615
    + 616
    + 617
    + 618
    + 619
    + 620
    + 621
    + 622
    + 623
    + 624
    + 625
    + 626
    + 627
    + 628
    + 629
    + 630
    + 631
    + 632
    + 633
    + 634
    + 635
    + 636
    + 637
    + 638
    + 639
    + 640
    + 641
    + 642
    + 643
    + 644
    + 645
    + 646
    + 647
    + 648
    + 649
    + 650
    + 651
    + 652
    + 653
    + 654
    + 655
    + 656
    + 657
    + 658
    + 659
    + 660
    + 661
    + 662
    + 663
    + 664
    + 665
    + 666
    + 667
    + 668
    + 669
    + 670
    + 671
    + 672
    + 673
    + 674
    + 675
    + 676
    + 677
    + 678
    + 679
    + 680
    + 681
    + 682
    + 683
    + 684
    + 685
    + 686
    + 687
    + 688
    + 689
    + 690
    + 691
    + 692
    + 693
    + 694
    + 695
    + 696
    + 697
    + 698
    + 699
    + 700
    + 701
    + 702
    + 703
    + 704
    + 705
    + 706
    + 707
    + 708
    + 709
    + 710
    + 711
    + 712
    + 713
    + 714
    + 715
    + 716
    + 717
    + 718
    + 719
    + 720
    + 721
    + 722
    + 723
    + 724
    + 725
    + 726
    + 727
    + 728
    + 729
    + 730
    + 731
    + 732
    + 733
    + 734
    + 735
    + 736
    + 737
    + 738
    + 739
    + 740
    + 741
    + 742
    + 743
    + 744
    + 745
    + 746
    + 747
    + 748
    + 749
    + 750
    + 751
    + 752
    + 753
    + 754
    + 755
    + 756
    + 757
    + 758
    + 759
    + 760
    + 761
    + 762
    + 763
    + 764
    + 765
    + 766
    + 767
    + 768
    + 769
    + 770
    + 771
    + 772
    + 773
    + 774
    + 775
    + 776
    + 777
    + 778
    + 779
    + 780
    + 781
    + 782
    + 783
    + 784
    + 785
    + 786
    + 787
    + 788
    + 789
    + 790
    + 791
    + 792
    + 793
    + 794
    + 795
    + 796
    + 797
    + 798
    + 799
    + 800
    + 801
    + 802
    + 803
    + 804
    + 805
    + 806
    + 807
    + 808
    + 809
    + 810
    + 811
    + 812
    + 813
    + 814
    + 815
    + 816
    + 817
    + 818
    + 819
    + 820
    + 821
    + 822
    + 823
    + 824
    + 825
    + 826
    + 827
    + 828
    + 829
    + 830
    + 831
    + 832
    + 833
    + 834
    + 835
    + 836
    + 837
    + 838
    + 839
    + 840
    + 841
    + 842
    + 843
    + 844
    + 845
    + 846
    + 847
    + 848
    + 849
    + 850
    + 851
    + 852
    + 853
    + 854
    + 855
    + 856
    + 857
    + 858
    + 859
    + 860
    + 861
    + 862
    + 863
    + 864
    + 865
    + 866
    + 867
    + 868
    + 869
    + 870
    + 871
    + 872
    + 873
    + 874
    + 875
    + 876
    + 877
    + 878
    + 879
    + 880
    + 881
    + 882
    + 883
    + 884
    + 885
    + 886
    + 887
    + 888
    + 889
    + 890
    + 891
    + 892
    + 893
    + 894
    + 895
    + 896
    + 897
    + 898
    + 899
    + 900
    + 901
    + 902
    + 903
    + 904
    + 905
    + 906
    + 907
    + 908
    + 909
    + 910
    + 911
    + 912
    + 913
    + 914
    + 915
    + 916
    + 917
    + 918
    + 919
    + 920
    + 921
    + 922
    + 923
    + 924
    + 925
    + 926
    + 927
    + 928
    + 929
    + 930
    + 931
    + 932
    + 933
    + 934
    + 935
    + 936
    + 937
    + 938
    + 939
    + 940
    + 941
    + 942
    + 943
    + 944
    + 945
    + 946
    + 947
    + 948
    + 949
    + 950
    + 951
    + 952
    + 953
    + 954
    + 955
    + 956
    + 957
    + 958
    + 959
    + 960
    + 961
    + 962
    + 963
    + 964
    + 965
    + 966
    + 967
    + 968
    + 969
    + 970
    + 971
    + 972
    + 973
    + 974
    + 975
    + 976
    + 977
    + 978
    + 979
    + 980
    + 981
    + 982
    + 983
    + 984
    + 985
    + 986
    + 987
    + 988
    + 989
    + 990
    + 991
    + 992
    + 993
    + 994
    + 995
    + 996
    + 997
    + 998
    + 999
    +1000
    +1001
    +1002
    +1003
    +1004
    +1005
    +1006
    +1007
    +1008
    +1009
    +1010
    +1011
    +1012
    +1013
    +1014
    +1015
    +1016
    +1017
    +1018
    +1019
    +1020
    +1021
    +1022
    +1023
    +1024
    +1025
    +1026
    +1027
    +1028
    +1029
    +1030
    +1031
    +1032
    +1033
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -981,7 +1048,7 @@
     use bitcoin::hash_types::Txid;
     use bitcoin::{OutPoint, Script, Transaction, TxOut};
     
    -use crate::database::{BatchDatabase, BatchOperations, Database};
    +use crate::database::{BatchDatabase, BatchOperations, Database, SyncTime};
     use crate::error::Error;
     use crate::types::*;
     
    @@ -1003,6 +1070,7 @@
         "CREATE UNIQUE INDEX idx_indices_keychain ON last_derivation_indices(keychain);",
         "CREATE TABLE checksums (keychain TEXT, checksum BLOB);",
         "CREATE INDEX idx_checksums_keychain ON checksums(keychain);",
    +    "CREATE TABLE sync_time (id INTEGER PRIMARY KEY, height INTEGER, timestamp INTEGER);"
     ];
     
     /// Sqlite database stored on filesystem
    @@ -1020,7 +1088,7 @@
     impl SqliteDatabase {
         /// Instantiate a new SqliteDatabase instance by creating a connection
         /// to the database stored at path
    -    pub fn new(path: String) -> Self {
    +    pub fn new(path: String) -> Self {
             let connection = get_connection(&path).unwrap();
             SqliteDatabase { path, connection }
         }
    @@ -1029,7 +1097,7 @@
             keychain: String,
             child: u32,
             script: &[u8],
    -    ) -> Result<i64, Error> {
    +    ) -> Result<i64, Error> {
             let mut statement = self.connection.prepare_cached("INSERT INTO script_pubkeys (keychain, child, script) VALUES (:keychain, :child, :script)")?;
             statement.execute(named_params! {
                 ":keychain": keychain,
    @@ -1046,7 +1114,7 @@
             vout: u32,
             txid: &[u8],
             script: &[u8],
    -    ) -> Result<i64, Error> {
    +    ) -> Result<i64, Error> {
             let mut statement = self.connection.prepare_cached("INSERT INTO utxos (value, keychain, vout, txid, script) VALUES (:value, :keychain, :vout, :txid, :script)")?;
             statement.execute(named_params! {
                 ":value": value,
    @@ -1058,7 +1126,7 @@
     
             Ok(self.connection.last_insert_rowid())
         }
    -    fn insert_transaction(&self, txid: &[u8], raw_tx: &[u8]) -> Result<i64, Error> {
    +    fn insert_transaction(&self, txid: &[u8], raw_tx: &[u8]) -> Result<i64, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("INSERT INTO transactions (txid, raw_tx) VALUES (:txid, :raw_tx)")?;
    @@ -1070,7 +1138,7 @@
             Ok(self.connection.last_insert_rowid())
         }
     
    -    fn update_transaction(&self, txid: &[u8], raw_tx: &[u8]) -> Result<(), Error> {
    +    fn update_transaction(&self, txid: &[u8], raw_tx: &[u8]) -> Result<(), Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("UPDATE transactions SET raw_tx=:raw_tx WHERE txid=:txid")?;
    @@ -1083,13 +1151,13 @@
             Ok(())
         }
     
    -    fn insert_transaction_details(&self, transaction: &TransactionDetails) -> Result<i64, Error> {
    +    fn insert_transaction_details(&self, transaction: &TransactionDetails) -> Result<i64, Error> {
             let (timestamp, height) = match &transaction.confirmation_time {
    -            Some(confirmation_time) => (
    +            Some(confirmation_time) => (
                     Some(confirmation_time.timestamp),
                     Some(confirmation_time.height),
                 ),
    -            None => (None, None),
    +            None => (None, None),
             };
     
             let txid: &[u8] = &transaction.txid;
    @@ -1109,13 +1177,13 @@
             Ok(self.connection.last_insert_rowid())
         }
     
    -    fn update_transaction_details(&self, transaction: &TransactionDetails) -> Result<(), Error> {
    +    fn update_transaction_details(&self, transaction: &TransactionDetails) -> Result<(), Error> {
             let (timestamp, height) = match &transaction.confirmation_time {
    -            Some(confirmation_time) => (
    +            Some(confirmation_time) => (
                     Some(confirmation_time.timestamp),
                     Some(confirmation_time.height),
                 ),
    -            None => (None, None),
    +            None => (None, None),
             };
     
             let txid: &[u8] = &transaction.txid;
    @@ -1135,7 +1203,7 @@
             Ok(())
         }
     
    -    fn insert_last_derivation_index(&self, keychain: String, value: u32) -> Result<i64, Error> {
    +    fn insert_last_derivation_index(&self, keychain: String, value: u32) -> Result<i64, Error> {
             let mut statement = self.connection.prepare_cached(
                 "INSERT INTO last_derivation_indices (keychain, value) VALUES (:keychain, :value)",
             )?;
    @@ -1148,7 +1216,7 @@
             Ok(self.connection.last_insert_rowid())
         }
     
    -    fn insert_checksum(&self, keychain: String, checksum: &[u8]) -> Result<i64, Error> {
    +    fn insert_checksum(&self, keychain: String, checksum: &[u8]) -> Result<i64, Error> {
             let mut statement = self.connection.prepare_cached(
                 "INSERT INTO checksums (keychain, checksum) VALUES (:keychain, :checksum)",
             )?;
    @@ -1160,7 +1228,7 @@
             Ok(self.connection.last_insert_rowid())
         }
     
    -    fn update_last_derivation_index(&self, keychain: String, value: u32) -> Result<(), Error> {
    +    fn update_last_derivation_index(&self, keychain: String, value: u32) -> Result<(), Error> {
             let mut statement = self.connection.prepare_cached(
                 "INSERT INTO last_derivation_indices (keychain, value) VALUES (:keychain, :value) ON CONFLICT(keychain) DO UPDATE SET value=:value WHERE keychain=:keychain",
             )?;
    @@ -1173,7 +1241,20 @@
             Ok(())
         }
     
    -    fn select_script_pubkeys(&self) -> Result<Vec<Script>, Error> {
    +    fn update_sync_time(&self, data: SyncTime) -> Result<i64, Error> {
    +        let mut statement = self.connection.prepare_cached(
    +            "INSERT INTO sync_time (id, height, timestamp) VALUES (0, :height, :timestamp) ON CONFLICT(id) DO UPDATE SET height=:height, timestamp=:timestamp WHERE id = 0",
    +        )?;
    +
    +        statement.execute(named_params! {
    +            ":height": data.block_time.height,
    +            ":timestamp": data.block_time.timestamp,
    +        })?;
    +
    +        Ok(self.connection.last_insert_rowid())
    +    }
    +
    +    fn select_script_pubkeys(&self) -> Result<Vec<Script>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT script FROM script_pubkeys")?;
    @@ -1187,7 +1268,7 @@
             Ok(scripts)
         }
     
    -    fn select_script_pubkeys_by_keychain(&self, keychain: String) -> Result<Vec<Script>, Error> {
    +    fn select_script_pubkeys_by_keychain(&self, keychain: String) -> Result<Vec<Script>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT script FROM script_pubkeys WHERE keychain=:keychain")?;
    @@ -1205,42 +1286,42 @@
             &self,
             keychain: String,
             child: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             let mut statement = self.connection.prepare_cached(
                 "SELECT script FROM script_pubkeys WHERE keychain=:keychain AND child=:child",
             )?;
             let mut rows = statement.query(named_params! {":keychain": keychain,":child": child})?;
     
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let script: Vec<u8> = row.get(0)?;
                     let script: Script = script.into();
                     Ok(Some(script))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
         fn select_script_pubkey_by_script(
             &self,
             script: &[u8],
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT keychain, child FROM script_pubkeys WHERE script=:script")?;
             let mut rows = statement.query(named_params! {":script": script})?;
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let keychain: String = row.get(0)?;
                     let keychain: KeychainKind = serde_json::from_str(&keychain)?;
                     let child: u32 = row.get(1)?;
                     Ok(Some((keychain, child)))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn select_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
    +    fn select_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT value, keychain, vout, txid, script FROM utxos")?;
    @@ -1272,13 +1353,13 @@
             &self,
             txid: &[u8],
             vout: u32,
    -    ) -> Result<Option<(u64, KeychainKind, Script)>, Error> {
    +    ) -> Result<Option<(u64, KeychainKind, Script)>, Error> {
             let mut statement = self.connection.prepare_cached(
                 "SELECT value, keychain, script FROM utxos WHERE txid=:txid AND vout=:vout",
             )?;
             let mut rows = statement.query(named_params! {":txid": txid,":vout": vout})?;
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let value: u64 = row.get(0)?;
                     let keychain: String = row.get(1)?;
                     let keychain: KeychainKind = serde_json::from_str(&keychain)?;
    @@ -1287,11 +1368,11 @@
     
                     Ok(Some((value, keychain, script)))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn select_transactions(&self) -> Result<Vec<Transaction>, Error> {
    +    fn select_transactions(&self) -> Result<Vec<Transaction>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT raw_tx FROM transactions")?;
    @@ -1305,22 +1386,22 @@
             Ok(txs)
         }
     
    -    fn select_transaction_by_txid(&self, txid: &[u8]) -> Result<Option<Transaction>, Error> {
    +    fn select_transaction_by_txid(&self, txid: &[u8]) -> Result<Option<Transaction>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT raw_tx FROM transactions WHERE txid=:txid")?;
             let mut rows = statement.query(named_params! {":txid": txid})?;
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let raw_tx: Vec<u8> = row.get(0)?;
                     let tx: Transaction = deserialize(&raw_tx)?;
                     Ok(Some(tx))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn select_transaction_details_with_raw(&self) -> Result<Vec<TransactionDetails>, Error> {
    +    fn select_transaction_details_with_raw(&self) -> Result<Vec<TransactionDetails>, Error> {
             let mut statement = self.connection.prepare_cached("SELECT transaction_details.txid, transaction_details.timestamp, transaction_details.received, transaction_details.sent, transaction_details.fee, transaction_details.height, transaction_details.verified, transactions.raw_tx FROM transaction_details, transactions WHERE transaction_details.txid = transactions.txid")?;
             let mut transaction_details: Vec<TransactionDetails> = vec![];
             let mut rows = statement.query([])?;
    @@ -1335,16 +1416,16 @@
                 let verified: bool = row.get(6)?;
                 let raw_tx: Option<Vec<u8>> = row.get(7)?;
                 let tx: Option<Transaction> = match raw_tx {
    -                Some(raw_tx) => {
    +                Some(raw_tx) => {
                         let tx: Transaction = deserialize(&raw_tx)?;
                         Some(tx)
                     }
    -                None => None,
    +                None => None,
                 };
     
                 let confirmation_time = match (height, timestamp) {
    -                (Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
    -                _ => None,
    +                (Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
    +                _ => None,
                 };
     
                 transaction_details.push(TransactionDetails {
    @@ -1360,7 +1441,7 @@
             Ok(transaction_details)
         }
     
    -    fn select_transaction_details(&self) -> Result<Vec<TransactionDetails>, Error> {
    +    fn select_transaction_details(&self) -> Result<Vec<TransactionDetails>, Error> {
             let mut statement = self.connection.prepare_cached(
                 "SELECT txid, timestamp, received, sent, fee, height, verified FROM transaction_details",
             )?;
    @@ -1377,8 +1458,8 @@
                 let verified: bool = row.get(6)?;
     
                 let confirmation_time = match (height, timestamp) {
    -                (Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
    -                _ => None,
    +                (Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
    +                _ => None,
                 };
     
                 transaction_details.push(TransactionDetails {
    @@ -1397,12 +1478,12 @@
         fn select_transaction_details_by_txid(
             &self,
             txid: &[u8],
    -    ) -> Result<Option<TransactionDetails>, Error> {
    +    ) -> Result<Option<TransactionDetails>, Error> {
             let mut statement = self.connection.prepare_cached("SELECT transaction_details.timestamp, transaction_details.received, transaction_details.sent, transaction_details.fee, transaction_details.height, transaction_details.verified, transactions.raw_tx FROM transaction_details, transactions WHERE transaction_details.txid=transactions.txid AND transaction_details.txid=:txid")?;
             let mut rows = statement.query(named_params! { ":txid": txid })?;
     
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let timestamp: Option<u64> = row.get(0)?;
                     let received: u64 = row.get(1)?;
                     let sent: u64 = row.get(2)?;
    @@ -1412,16 +1493,16 @@
     
                     let raw_tx: Option<Vec<u8>> = row.get(6)?;
                     let tx: Option<Transaction> = match raw_tx {
    -                    Some(raw_tx) => {
    +                    Some(raw_tx) => {
                             let tx: Transaction = deserialize(&raw_tx)?;
                             Some(tx)
                         }
    -                    None => None,
    +                    None => None,
                     };
     
                     let confirmation_time = match (height, timestamp) {
    -                    (Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
    -                    _ => None,
    +                    (Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
    +                    _ => None,
                     };
     
                     Ok(Some(TransactionDetails {
    @@ -1434,43 +1515,61 @@
                         verified,
                     }))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
         fn select_last_derivation_index_by_keychain(
             &self,
             keychain: String,
    -    ) -> Result<Option<u32>, Error> {
    +    ) -> Result<Option<u32>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT value FROM last_derivation_indices WHERE keychain=:keychain")?;
             let mut rows = statement.query(named_params! {":keychain": keychain})?;
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let value: u32 = row.get(0)?;
                     Ok(Some(value))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn select_checksum_by_keychain(&self, keychain: String) -> Result<Option<Vec<u8>>, Error> {
    +    fn select_sync_time(&self) -> Result<Option<SyncTime>, Error> {
    +        let mut statement = self
    +            .connection
    +            .prepare_cached("SELECT height, timestamp FROM sync_time WHERE id = 0")?;
    +        let mut rows = statement.query([])?;
    +
    +        if let Some(row) = rows.next()? {
    +            Ok(Some(SyncTime {
    +                block_time: BlockTime {
    +                    height: row.get(0)?,
    +                    timestamp: row.get(1)?,
    +                },
    +            }))
    +        } else {
    +            Ok(None)
    +        }
    +    }
    +
    +    fn select_checksum_by_keychain(&self, keychain: String) -> Result<Option<Vec<u8>>, Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("SELECT checksum FROM checksums WHERE keychain=:keychain")?;
             let mut rows = statement.query(named_params! {":keychain": keychain})?;
     
             match rows.next()? {
    -            Some(row) => {
    +            Some(row) => {
                     let checksum: Vec<u8> = row.get(0)?;
                     Ok(Some(checksum))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn delete_script_pubkey_by_path(&self, keychain: String, child: u32) -> Result<(), Error> {
    +    fn delete_script_pubkey_by_path(&self, keychain: String, child: u32) -> Result<(), Error> {
             let mut statement = self.connection.prepare_cached(
                 "DELETE FROM script_pubkeys WHERE keychain=:keychain AND child=:child",
             )?;
    @@ -1482,7 +1581,7 @@
             Ok(())
         }
     
    -    fn delete_script_pubkey_by_script(&self, script: &[u8]) -> Result<(), Error> {
    +    fn delete_script_pubkey_by_script(&self, script: &[u8]) -> Result<(), Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("DELETE FROM script_pubkeys WHERE script=:script")?;
    @@ -1493,7 +1592,7 @@
             Ok(())
         }
     
    -    fn delete_utxo_by_outpoint(&self, txid: &[u8], vout: u32) -> Result<(), Error> {
    +    fn delete_utxo_by_outpoint(&self, txid: &[u8], vout: u32) -> Result<(), Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("DELETE FROM utxos WHERE txid=:txid AND vout=:vout")?;
    @@ -1505,7 +1604,7 @@
             Ok(())
         }
     
    -    fn delete_transaction_by_txid(&self, txid: &[u8]) -> Result<(), Error> {
    +    fn delete_transaction_by_txid(&self, txid: &[u8]) -> Result<(), Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("DELETE FROM transactions WHERE txid=:txid")?;
    @@ -1513,7 +1612,7 @@
             Ok(())
         }
     
    -    fn delete_transaction_details_by_txid(&self, txid: &[u8]) -> Result<(), Error> {
    +    fn delete_transaction_details_by_txid(&self, txid: &[u8]) -> Result<(), Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("DELETE FROM transaction_details WHERE txid=:txid")?;
    @@ -1521,7 +1620,7 @@
             Ok(())
         }
     
    -    fn delete_last_derivation_index_by_keychain(&self, keychain: String) -> Result<(), Error> {
    +    fn delete_last_derivation_index_by_keychain(&self, keychain: String) -> Result<(), Error> {
             let mut statement = self
                 .connection
                 .prepare_cached("DELETE FROM last_derivation_indices WHERE keychain=:keychain")?;
    @@ -1531,21 +1630,29 @@
     
             Ok(())
         }
    +
    +    fn delete_sync_time(&self) -> Result<(), Error> {
    +        let mut statement = self
    +            .connection
    +            .prepare_cached("DELETE FROM sync_time WHERE id = 0")?;
    +        statement.execute([])?;
    +        Ok(())
    +    }
     }
     
     impl BatchOperations for SqliteDatabase {
         fn set_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let keychain = serde_json::to_string(&keychain)?;
             self.insert_script_pubkey(keychain, child, script.as_bytes())?;
             Ok(())
         }
     
    -    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
    +    fn set_utxo(&mut self, utxo: &LocalUtxo) -> Result<(), Error> {
             self.insert_utxo(
                 utxo.txout.value,
                 serde_json::to_string(&utxo.keychain)?,
    @@ -1556,24 +1663,24 @@
             Ok(())
         }
     
    -    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
    +    fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error> {
             match self.select_transaction_by_txid(&transaction.txid())? {
    -            Some(_) => {
    +            Some(_) => {
                     self.update_transaction(&transaction.txid(), &serialize(transaction))?;
                 }
    -            None => {
    +            None => {
                     self.insert_transaction(&transaction.txid(), &serialize(transaction))?;
                 }
             }
             Ok(())
         }
     
    -    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
    +    fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> {
             match self.select_transaction_details_by_txid(&transaction.txid)? {
    -            Some(_) => {
    +            Some(_) => {
                     self.update_transaction_details(transaction)?;
                 }
    -            None => {
    +            None => {
                     self.insert_transaction_details(transaction)?;
                 }
             }
    @@ -1585,43 +1692,48 @@
             Ok(())
         }
     
    -    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
    +    fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> {
             self.update_last_derivation_index(serde_json::to_string(&keychain)?, value)?;
             Ok(())
         }
     
    +    fn set_sync_time(&mut self, ct: SyncTime) -> Result<(), Error> {
    +        self.update_sync_time(ct)?;
    +        Ok(())
    +    }
    +
         fn del_script_pubkey_from_path(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             let keychain = serde_json::to_string(&keychain)?;
             let script = self.select_script_pubkey_by_path(keychain.clone(), child)?;
             match script {
    -            Some(script) => {
    +            Some(script) => {
                     self.delete_script_pubkey_by_path(keychain, child)?;
                     Ok(Some(script))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
         fn del_path_from_script_pubkey(
    -        &mut self,
    +        &mut self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             match self.select_script_pubkey_by_script(script.as_bytes())? {
    -            Some((keychain, child)) => {
    +            Some((keychain, child)) => {
                     self.delete_script_pubkey_by_script(script.as_bytes())?;
                     Ok(Some((keychain, child)))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn del_utxo(&mut self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             match self.select_utxo_by_outpoint(&outpoint.txid, outpoint.vout)? {
    -            Some((value, keychain, script_pubkey)) => {
    +            Some((value, keychain, script_pubkey)) => {
                     self.delete_utxo_by_outpoint(&outpoint.txid, outpoint.vout)?;
                     Ok(Some(LocalUtxo {
                         outpoint: *outpoint,
    @@ -1632,27 +1744,27 @@
                         keychain,
                     }))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn del_raw_tx(&mut self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             match self.select_transaction_by_txid(txid)? {
    -            Some(tx) => {
    +            Some(tx) => {
                     self.delete_transaction_by_txid(txid)?;
                     Ok(Some(tx))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
         fn del_tx(
    -        &mut self,
    +        &mut self,
             txid: &Txid,
             include_raw: bool,
    -    ) -> Result<Option<TransactionDetails>, Error> {
    +    ) -> Result<Option<TransactionDetails>, Error> {
             match self.select_transaction_details_by_txid(txid)? {
    -            Some(transaction_details) => {
    +            Some(transaction_details) => {
                     self.delete_transaction_details_by_txid(txid)?;
     
                     if include_raw {
    @@ -1660,68 +1772,79 @@
                     }
                     Ok(Some(transaction_details))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn del_last_index(&mut self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             let keychain = serde_json::to_string(&keychain)?;
             match self.select_last_derivation_index_by_keychain(keychain.clone())? {
    -            Some(value) => {
    +            Some(value) => {
                     self.delete_last_derivation_index_by_keychain(keychain)?;
     
                     Ok(Some(value))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
    +        }
    +    }
    +
    +    fn del_sync_time(&mut self) -> Result<Option<SyncTime>, Error> {
    +        match self.select_sync_time()? {
    +            Some(value) => {
    +                self.delete_sync_time()?;
    +
    +                Ok(Some(value))
    +            }
    +            None => Ok(None),
             }
         }
     }
     
     impl Database for SqliteDatabase {
         fn check_descriptor_checksum<B: AsRef<[u8]>>(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             bytes: B,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let keychain = serde_json::to_string(&keychain)?;
     
             match self.select_checksum_by_keychain(keychain.clone())? {
    -            Some(checksum) => {
    -                if checksum == bytes.as_ref().to_vec() {
    +            Some(checksum) => {
    +                if checksum == bytes.as_ref().to_vec() {
                         Ok(())
                     } else {
                         Err(Error::ChecksumMismatch)
                     }
                 }
    -            None => {
    +            None => {
                     self.insert_checksum(keychain, bytes.as_ref())?;
                     Ok(())
                 }
             }
         }
     
    -    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
    +    fn iter_script_pubkeys(&self, keychain: Option<KeychainKind>) -> Result<Vec<Script>, Error> {
             match keychain {
    -            Some(keychain) => {
    +            Some(keychain) => {
                     let keychain = serde_json::to_string(&keychain)?;
                     self.select_script_pubkeys_by_keychain(keychain)
                 }
    -            None => self.select_script_pubkeys(),
    +            None => self.select_script_pubkeys(),
             }
         }
     
    -    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
    +    fn iter_utxos(&self) -> Result<Vec<LocalUtxo>, Error> {
             self.select_utxos()
         }
     
    -    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
    +    fn iter_raw_txs(&self) -> Result<Vec<Transaction>, Error> {
             self.select_transactions()
         }
     
    -    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
    +    fn iter_txs(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
             match include_raw {
    -            true => self.select_transaction_details_with_raw(),
    -            false => self.select_transaction_details(),
    +            true => self.select_transaction_details_with_raw(),
    +            false => self.select_transaction_details(),
             }
         }
     
    @@ -1729,27 +1852,27 @@
             &self,
             keychain: KeychainKind,
             child: u32,
    -    ) -> Result<Option<Script>, Error> {
    +    ) -> Result<Option<Script>, Error> {
             let keychain = serde_json::to_string(&keychain)?;
             match self.select_script_pubkey_by_path(keychain, child)? {
    -            Some(script) => Ok(Some(script)),
    -            None => Ok(None),
    +            Some(script) => Ok(Some(script)),
    +            None => Ok(None),
             }
         }
     
         fn get_path_from_script_pubkey(
             &self,
             script: &Script,
    -    ) -> Result<Option<(KeychainKind, u32)>, Error> {
    +    ) -> Result<Option<(KeychainKind, u32)>, Error> {
             match self.select_script_pubkey_by_script(script.as_bytes())? {
    -            Some((keychain, child)) => Ok(Some((keychain, child))),
    -            None => Ok(None),
    +            Some((keychain, child)) => Ok(Some((keychain, child))),
    +            None => Ok(None),
             }
         }
     
    -    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<LocalUtxo>, Error> {
             match self.select_utxo_by_outpoint(&outpoint.txid, outpoint.vout)? {
    -            Some((value, keychain, script_pubkey)) => Ok(Some(LocalUtxo {
    +            Some((value, keychain, script_pubkey)) => Ok(Some(LocalUtxo {
                     outpoint: *outpoint,
                     txout: TxOut {
                         value,
    @@ -1757,50 +1880,54 @@
                     },
                     keychain,
                 })),
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
    +    fn get_raw_tx(&self, txid: &Txid) -> Result<Option<Transaction>, Error> {
             match self.select_transaction_by_txid(txid)? {
    -            Some(tx) => Ok(Some(tx)),
    -            None => Ok(None),
    +            Some(tx) => Ok(Some(tx)),
    +            None => Ok(None),
             }
         }
     
    -    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
    +    fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result<Option<TransactionDetails>, Error> {
             match self.select_transaction_details_by_txid(txid)? {
    -            Some(mut transaction_details) => {
    +            Some(mut transaction_details) => {
                     if !include_raw {
                         transaction_details.transaction = None;
                     }
                     Ok(Some(transaction_details))
                 }
    -            None => Ok(None),
    +            None => Ok(None),
             }
         }
     
    -    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
    +    fn get_last_index(&self, keychain: KeychainKind) -> Result<Option<u32>, Error> {
             let keychain = serde_json::to_string(&keychain)?;
             let value = self.select_last_derivation_index_by_keychain(keychain)?;
             Ok(value)
         }
     
    -    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
    +    fn get_sync_time(&self) -> Result<Option<SyncTime>, Error> {
    +        self.select_sync_time()
    +    }
    +
    +    fn increment_last_index(&mut self, keychain: KeychainKind) -> Result<u32, Error> {
             let keychain_string = serde_json::to_string(&keychain)?;
             match self.get_last_index(keychain)? {
    -            Some(value) => {
    +            Some(value) => {
                     self.update_last_derivation_index(keychain_string, value + 1)?;
                     Ok(value + 1)
                 }
    -            None => {
    +            None => {
                     self.insert_last_derivation_index(keychain_string, 0)?;
                     Ok(0)
                 }
             }
         }
     
    -    fn flush(&mut self) -> Result<(), Error> {
    +    fn flush(&mut self) -> Result<(), Error> {
             Ok(())
         }
     }
    @@ -1808,61 +1935,61 @@
     impl BatchDatabase for SqliteDatabase {
         type Batch = SqliteDatabase;
     
    -    fn begin_batch(&self) -> Self::Batch {
    +    fn begin_batch(&self) -> Self::Batch {
             let db = SqliteDatabase::new(self.path.clone());
             db.connection.execute("BEGIN TRANSACTION", []).unwrap();
             db
         }
     
    -    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error> {
    +    fn commit_batch(&mut self, batch: Self::Batch) -> Result<(), Error> {
             batch.connection.execute("COMMIT TRANSACTION", [])?;
             Ok(())
         }
     }
     
    -pub fn get_connection(path: &str) -> Result<Connection, Error> {
    +pub fn get_connection(path: &str) -> Result<Connection, Error> {
         let connection = Connection::open(path)?;
         migrate(&connection)?;
         Ok(connection)
     }
     
    -pub fn get_schema_version(conn: &Connection) -> rusqlite::Result<i32> {
    +pub fn get_schema_version(conn: &Connection) -> rusqlite::Result<i32> {
         let statement = conn.prepare_cached("SELECT version FROM version");
         match statement {
    -        Err(rusqlite::Error::SqliteFailure(e, Some(msg))) => {
    -            if msg == "no such table: version" {
    +        Err(rusqlite::Error::SqliteFailure(e, Some(msg))) => {
    +            if msg == "no such table: version" {
                     Ok(0)
                 } else {
                     Err(rusqlite::Error::SqliteFailure(e, Some(msg)))
                 }
             }
    -        Ok(mut stmt) => {
    +        Ok(mut stmt) => {
                 let mut rows = stmt.query([])?;
                 match rows.next()? {
    -                Some(row) => {
    +                Some(row) => {
                         let version: i32 = row.get(0)?;
                         Ok(version)
                     }
    -                None => Ok(0),
    +                None => Ok(0),
                 }
             }
    -        _ => Ok(0),
    +        _ => Ok(0),
         }
     }
     
    -pub fn set_schema_version(conn: &Connection, version: i32) -> rusqlite::Result<usize> {
    +pub fn set_schema_version(conn: &Connection, version: i32) -> rusqlite::Result<usize> {
         conn.execute(
             "UPDATE version SET version=:version",
             named_params! {":version": version},
         )
     }
     
    -pub fn migrate(conn: &Connection) -> rusqlite::Result<()> {
    +pub fn migrate(conn: &Connection) -> rusqlite::Result<()> {
         let version = get_schema_version(conn)?;
         let stmts = &MIGRATIONS[(version as usize)..];
         let mut i: i32 = version;
     
    -    if version == MIGRATIONS.len() as i32 {
    +    if version == MIGRATIONS.len() as i32 {
             log::info!("db up to date, no migration needed");
             return Ok(());
         }
    @@ -1887,7 +2014,7 @@
         use crate::database::SqliteDatabase;
         use std::time::{SystemTime, UNIX_EPOCH};
     
    -    fn get_database() -> SqliteDatabase {
    +    fn get_database() -> SqliteDatabase {
             let time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
             let mut dir = std::env::temp_dir();
             dir.push(format!("bdk_{}", time.as_nanos()));
    @@ -1933,8 +2060,12 @@
         fn test_last_index() {
             crate::database::test::test_last_index(get_database());
         }
    +
    +    #[test]
    +    fn test_sync_time() {
    +        crate::database::test::test_sync_time(get_database());
    +    }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/checksum.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/checksum.rs.html index 93562a5060..38ea7ac795 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/checksum.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/checksum.rs.html @@ -1,4 +1,6 @@ -checksum.rs - source
      1
    +checksum.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -134,7 +136,7 @@
     const INPUT_CHARSET: &str =  "0123456789()[],'/*abcdefgh@:$%{}IJKLMNOPQRSTUVWXYZ&+-.;<=>?!^_|~ijklmnopqrstuvwxyzABCDEFGH`#\"\\ ";
     const CHECKSUM_CHARSET: &str = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
     
    -fn poly_mod(mut c: u64, val: u64) -> u64 {
    +fn poly_mod(mut c: u64, val: u64) -> u64 {
         let c0 = c >> 35;
         c = ((c & 0x7ffffffff) << 5) ^ val;
         if c0 & 1 > 0 {
    @@ -157,7 +159,7 @@
     }
     
     /// Compute the checksum of a descriptor
    -pub fn get_checksum(desc: &str) -> Result<String, DescriptorError> {
    +pub fn get_checksum(desc: &str) -> Result<String, DescriptorError> {
         let mut c = 1;
         let mut cls = 0;
         let mut clscount = 0;
    @@ -168,7 +170,7 @@
             c = poly_mod(c, pos & 31);
             cls = cls * 3 + (pos >> 5);
             clscount += 1;
    -        if clscount == 3 {
    +        if clscount == 3 {
                 c = poly_mod(c, cls);
                 cls = 0;
                 clscount = 0;
    @@ -220,11 +222,10 @@
     
             assert!(matches!(
                 get_checksum(&invalid_desc).err(),
    -            Some(DescriptorError::InvalidDescriptorCharacter(invalid_char)) if invalid_char == sparkle_heart
    +            Some(DescriptorError::InvalidDescriptorCharacter(invalid_char)) if invalid_char == sparkle_heart
             ));
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/derived.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/derived.rs.html index edd1b2714d..78fa523ea9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/derived.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/derived.rs.html @@ -1,4 +1,6 @@ -derived.rs - source
      1
    +derived.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -187,9 +189,9 @@
         /// Construct a new derived key
         ///
         /// Panics if the key is wildcard
    -    pub fn new(key: DescriptorPublicKey, secp: &'s SecpCtx) -> DerivedDescriptorKey<'s> {
    +    pub fn new(key: DescriptorPublicKey, secp: &'s SecpCtx) -> DerivedDescriptorKey<'s> {
             if let DescriptorPublicKey::XPub(xpub) = &key {
    -            assert!(xpub.wildcard == Wildcard::None)
    +            assert!(xpub.wildcard == Wildcard::None)
             }
     
             DerivedDescriptorKey(key, secp)
    @@ -199,39 +201,39 @@
     impl<'s> Deref for DerivedDescriptorKey<'s> {
         type Target = DescriptorPublicKey;
     
    -    fn deref(&self) -> &Self::Target {
    +    fn deref(&self) -> &Self::Target {
             &self.0
         }
     }
     
     impl<'s> PartialEq for DerivedDescriptorKey<'s> {
    -    fn eq(&self, other: &Self) -> bool {
    -        self.0 == other.0
    +    fn eq(&self, other: &Self) -> bool {
    +        self.0 == other.0
         }
     }
     
     impl<'s> Eq for DerivedDescriptorKey<'s> {}
     
     impl<'s> PartialOrd for DerivedDescriptorKey<'s> {
    -    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
    +    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
             self.0.partial_cmp(&other.0)
         }
     }
     
     impl<'s> Ord for DerivedDescriptorKey<'s> {
    -    fn cmp(&self, other: &Self) -> Ordering {
    +    fn cmp(&self, other: &Self) -> Ordering {
             self.0.cmp(&other.0)
         }
     }
     
     impl<'s> fmt::Display for DerivedDescriptorKey<'s> {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             self.0.fmt(f)
         }
     }
     
     impl<'s> Hash for DerivedDescriptorKey<'s> {
    -    fn hash<H: Hasher>(&self, state: &mut H) {
    +    fn hash<H: Hasher>(&self, state: &mut H) {
             self.0.hash(state);
         }
     }
    @@ -239,23 +241,23 @@
     impl<'s> MiniscriptKey for DerivedDescriptorKey<'s> {
         type Hash = Self;
     
    -    fn to_pubkeyhash(&self) -> Self::Hash {
    +    fn to_pubkeyhash(&self) -> Self::Hash {
             DerivedDescriptorKey(self.0.to_pubkeyhash(), self.1)
         }
     
    -    fn is_uncompressed(&self) -> bool {
    +    fn is_uncompressed(&self) -> bool {
             self.0.is_uncompressed()
         }
    -    fn serialized_len(&self) -> usize {
    +    fn serialized_len(&self) -> usize {
             self.0.serialized_len()
         }
     }
     
     impl<'s> ToPublicKey for DerivedDescriptorKey<'s> {
    -    fn to_public_key(&self) -> PublicKey {
    +    fn to_public_key(&self) -> PublicKey {
             match &self.0 {
    -            DescriptorPublicKey::SinglePub(ref spub) => spub.key.to_public_key(),
    -            DescriptorPublicKey::XPub(ref xpub) => {
    +            DescriptorPublicKey::SinglePub(ref spub) => spub.key.to_public_key(),
    +            DescriptorPublicKey::XPub(ref xpub) => {
                     xpub.xkey
                         .derive_pub(self.1, &xpub.derivation_path)
                         .expect("Shouldn't fail, only normal derivations")
    @@ -264,7 +266,7 @@
             }
         }
     
    -    fn hash_to_hash160(hash: &Self::Hash) -> hash160::Hash {
    +    fn hash_to_hash160(hash: &Self::Hash) -> hash160::Hash {
             hash.to_public_key().to_pubkeyhash()
         }
     }
    @@ -272,12 +274,12 @@
     pub(crate) trait AsDerived {
         // Derive a descriptor and transform all of its keys to `DerivedDescriptorKey`
         fn as_derived<'s>(&self, index: u32, secp: &'s SecpCtx)
    -        -> Descriptor<DerivedDescriptorKey<'s>>;
    +        -> Descriptor<DerivedDescriptorKey<'s>>;
     
         // Transform the keys into `DerivedDescriptorKey`.
         //
         // Panics if the descriptor is not "fixed", i.e. if it's derivable
    -    fn as_derived_fixed<'s>(&self, secp: &'s SecpCtx) -> Descriptor<DerivedDescriptorKey<'s>>;
    +    fn as_derived_fixed<'s>(&self, secp: &'s SecpCtx) -> Descriptor<DerivedDescriptorKey<'s>>;
     }
     
     impl AsDerived for Descriptor<DescriptorPublicKey> {
    @@ -285,20 +287,19 @@
             &self,
             index: u32,
             secp: &'s SecpCtx,
    -    ) -> Descriptor<DerivedDescriptorKey<'s>> {
    +    ) -> Descriptor<DerivedDescriptorKey<'s>> {
             self.derive(index).translate_pk_infallible(
                 |key| DerivedDescriptorKey::new(key.clone(), secp),
                 |key| DerivedDescriptorKey::new(key.clone(), secp),
             )
         }
     
    -    fn as_derived_fixed<'s>(&self, secp: &'s SecpCtx) -> Descriptor<DerivedDescriptorKey<'s>> {
    +    fn as_derived_fixed<'s>(&self, secp: &'s SecpCtx) -> Descriptor<DerivedDescriptorKey<'s>> {
             assert!(!self.is_deriveable());
     
             self.as_derived(0, secp)
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/dsl.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/dsl.rs.html index 4914cdfc1d..687e65fd49 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/dsl.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/dsl.rs.html @@ -1,4 +1,6 @@ -dsl.rs - source
       1
    +dsl.rs - source
    +    
    logo
       1
        2
        3
        4
    @@ -1080,14 +1082,14 @@
     #[macro_export]
     macro_rules! impl_top_level_sh {
         // disallow `sortedmulti` in `bare()`
    -    ( Bare, new, new, Legacy, sortedmulti $( $inner:tt )* ) => {
    +    ( Bare, new, new, Legacy, sortedmulti $( $inner:tt )* ) => {
             compile_error!("`bare()` descriptors can't contain any `sortedmulti()` operands");
         };
    -    ( Bare, new, new, Legacy, sortedmulti_vec $( $inner:tt )* ) => {
    +    ( Bare, new, new, Legacy, sortedmulti_vec $( $inner:tt )* ) => {
             compile_error!("`bare()` descriptors can't contain any `sortedmulti_vec()` operands");
         };
     
    -    ( $inner_struct:ident, $constructor:ident, $sortedmulti_constructor:ident, $ctx:ident, sortedmulti $( $inner:tt )* ) => {{
    +    ( $inner_struct:ident, $constructor:ident, $sortedmulti_constructor:ident, $ctx:ident, sortedmulti $( $inner:tt )* ) => {{
             use std::marker::PhantomData;
     
             use $crate::miniscript::descriptor::{$inner_struct, Descriptor, DescriptorPublicKey};
    @@ -1099,7 +1101,7 @@
     
             $crate::impl_sortedmulti!(build_desc, sortedmulti $( $inner )*)
         }};
    -    ( $inner_struct:ident, $constructor:ident, $sortedmulti_constructor:ident, $ctx:ident, sortedmulti_vec $( $inner:tt )* ) => {{
    +    ( $inner_struct:ident, $constructor:ident, $sortedmulti_constructor:ident, $ctx:ident, sortedmulti_vec $( $inner:tt )* ) => {{
             use std::marker::PhantomData;
     
             use $crate::miniscript::descriptor::{$inner_struct, Descriptor, DescriptorPublicKey};
    @@ -1112,7 +1114,7 @@
             $crate::impl_sortedmulti!(build_desc, sortedmulti_vec $( $inner )*)
         }};
     
    -    ( $inner_struct:ident, $constructor:ident, $sortedmulti_constructor:ident, $ctx:ident, $( $minisc:tt )* ) => {{
    +    ( $inner_struct:ident, $constructor:ident, $sortedmulti_constructor:ident, $ctx:ident, $( $minisc:tt )* ) => {{
             use $crate::miniscript::descriptor::{$inner_struct, Descriptor, DescriptorPublicKey};
     
             $crate::fragment!($( $minisc )*)
    @@ -1124,7 +1126,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_top_level_pk {
    -    ( $inner_type:ident, $ctx:ty, $key:expr ) => {{
    +    ( $inner_type:ident, $ctx:ty, $key:expr ) => {{
             use $crate::miniscript::descriptor::$inner_type;
     
             #[allow(unused_imports)]
    @@ -1141,7 +1143,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_leaf_opcode {
    -    ( $terminal_variant:ident ) => {{
    +    ( $terminal_variant:ident ) => {{
             use $crate::descriptor::CheckMiniscript;
     
             $crate::miniscript::Miniscript::from_ast(
    @@ -1149,7 +1151,7 @@
             )
             .map_err($crate::descriptor::DescriptorError::Miniscript)
             .and_then(|minisc| {
    -            minisc.check_minsicript()?;
    +            minisc.check_miniscript()?;
                 Ok(minisc)
             })
             .map(|minisc| {
    @@ -1165,7 +1167,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_leaf_opcode_value {
    -    ( $terminal_variant:ident, $value:expr ) => {{
    +    ( $terminal_variant:ident, $value:expr ) => {{
             use $crate::descriptor::CheckMiniscript;
     
             $crate::miniscript::Miniscript::from_ast(
    @@ -1173,7 +1175,7 @@
             )
             .map_err($crate::descriptor::DescriptorError::Miniscript)
             .and_then(|minisc| {
    -            minisc.check_minsicript()?;
    +            minisc.check_miniscript()?;
                 Ok(minisc)
             })
             .map(|minisc| {
    @@ -1189,7 +1191,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_leaf_opcode_value_two {
    -    ( $terminal_variant:ident, $one:expr, $two:expr ) => {{
    +    ( $terminal_variant:ident, $one:expr, $two:expr ) => {{
             use $crate::descriptor::CheckMiniscript;
     
             $crate::miniscript::Miniscript::from_ast(
    @@ -1197,7 +1199,7 @@
             )
             .map_err($crate::descriptor::DescriptorError::Miniscript)
             .and_then(|minisc| {
    -            minisc.check_minsicript()?;
    +            minisc.check_miniscript()?;
                 Ok(minisc)
             })
             .map(|minisc| {
    @@ -1213,7 +1215,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_node_opcode_two {
    -    ( $terminal_variant:ident, $( $inner:tt )* ) => ({
    +    ( $terminal_variant:ident, $( $inner:tt )* ) => ({
             use $crate::descriptor::CheckMiniscript;
     
             let inner = $crate::fragment_internal!( @t $( $inner )* );
    @@ -1230,7 +1232,7 @@
                         std::sync::Arc::new(b_minisc),
                     ))?;
     
    -                minisc.check_minsicript()?;
    +                minisc.check_miniscript()?;
     
                     Ok((minisc, a_keymap, $crate::keys::merge_networks(&a_networks, &b_networks)))
                 })
    @@ -1240,7 +1242,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_node_opcode_three {
    -    ( $terminal_variant:ident, $( $inner:tt )* ) => ({
    +    ( $terminal_variant:ident, $( $inner:tt )* ) => ({
             use $crate::descriptor::CheckMiniscript;
     
             let inner = $crate::fragment_internal!( @t $( $inner )* );
    @@ -1262,7 +1264,7 @@
                         std::sync::Arc::new(c_minisc),
                     ))?;
     
    -                minisc.check_minsicript()?;
    +                minisc.check_miniscript()?;
     
                     Ok((minisc, a_keymap, networks))
                 })
    @@ -1272,11 +1274,11 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! impl_sortedmulti {
    -    ( $build_desc:expr, sortedmulti_vec ( $thresh:expr, $keys:expr ) ) => ({
    +    ( $build_desc:expr, sortedmulti_vec ( $thresh:expr, $keys:expr ) ) => ({
             let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
             $crate::keys::make_sortedmulti($thresh, $keys, $build_desc, &secp)
         });
    -    ( $build_desc:expr, sortedmulti ( $thresh:expr $(, $key:expr )+ ) ) => ({
    +    ( $build_desc:expr, sortedmulti ( $thresh:expr $(, $key:expr )+ ) ) => ({
             use $crate::keys::IntoDescriptorKey;
             let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
     
    @@ -1296,11 +1298,11 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! apply_modifier {
    -    ( $terminal_variant:ident, $inner:expr ) => {{
    +    ( $terminal_variant:ident, $inner:expr ) => {{
             use $crate::descriptor::CheckMiniscript;
     
             $inner
    -            .map_err(|e| -> $crate::descriptor::DescriptorError { e.into() })
    +            .map_err(|e| -> $crate::descriptor::DescriptorError { e.into() })
                 .and_then(|(minisc, keymap, networks)| {
                     let minisc = $crate::miniscript::Miniscript::from_ast(
                         $crate::miniscript::miniscript::decode::Terminal::$terminal_variant(
    @@ -1308,36 +1310,36 @@
                         ),
                     )?;
     
    -                minisc.check_minsicript()?;
    +                minisc.check_miniscript()?;
     
                     Ok((minisc, keymap, networks))
                 })
         }};
     
    -    ( a: $inner:expr ) => {{
    +    ( a: $inner:expr ) => {{
             $crate::apply_modifier!(Alt, $inner)
         }};
    -    ( s: $inner:expr ) => {{
    +    ( s: $inner:expr ) => {{
             $crate::apply_modifier!(Swap, $inner)
         }};
    -    ( c: $inner:expr ) => {{
    +    ( c: $inner:expr ) => {{
             $crate::apply_modifier!(Check, $inner)
         }};
    -    ( d: $inner:expr ) => {{
    +    ( d: $inner:expr ) => {{
             $crate::apply_modifier!(DupIf, $inner)
         }};
    -    ( v: $inner:expr ) => {{
    +    ( v: $inner:expr ) => {{
             $crate::apply_modifier!(Verify, $inner)
         }};
    -    ( j: $inner:expr ) => {{
    +    ( j: $inner:expr ) => {{
             $crate::apply_modifier!(NonZero, $inner)
         }};
    -    ( n: $inner:expr ) => {{
    +    ( n: $inner:expr ) => {{
             $crate::apply_modifier!(ZeroNotEqual, $inner)
         }};
     
         // Modifiers expanded to other operators
    -    ( t: $inner:expr ) => {{
    +    ( t: $inner:expr ) => {{
             $inner.and_then(|(a_minisc, a_keymap, a_networks)| {
                 $crate::impl_leaf_opcode_value_two!(
                     AndV,
    @@ -1347,7 +1349,7 @@
                 .map(|(minisc, _, _)| (minisc, a_keymap, a_networks))
             })
         }};
    -    ( l: $inner:expr ) => {{
    +    ( l: $inner:expr ) => {{
             $inner.and_then(|(a_minisc, a_keymap, a_networks)| {
                 $crate::impl_leaf_opcode_value_two!(
                     OrI,
    @@ -1357,7 +1359,7 @@
                 .map(|(minisc, _, _)| (minisc, a_keymap, a_networks))
             })
         }};
    -    ( u: $inner:expr ) => {{
    +    ( u: $inner:expr ) => {{
             $inner.and_then(|(a_minisc, a_keymap, a_networks)| {
                 $crate::impl_leaf_opcode_value_two!(
                     OrI,
    @@ -1464,46 +1466,46 @@
     /// ```
     #[macro_export]
     macro_rules! descriptor {
    -    ( bare ( $( $minisc:tt )* ) ) => ({
    +    ( bare ( $( $minisc:tt )* ) ) => ({
             $crate::impl_top_level_sh!(Bare, new, new, Legacy, $( $minisc )*)
         });
    -    ( sh ( wsh ( $( $minisc:tt )* ) ) ) => ({
    +    ( sh ( wsh ( $( $minisc:tt )* ) ) ) => ({
             $crate::descriptor!(shwsh ($( $minisc )*))
         });
    -    ( shwsh ( $( $minisc:tt )* ) ) => ({
    +    ( shwsh ( $( $minisc:tt )* ) ) => ({
             $crate::impl_top_level_sh!(Sh, new_wsh, new_wsh_sortedmulti, Segwitv0, $( $minisc )*)
         });
    -    ( pk ( $key:expr ) ) => ({
    +    ( pk ( $key:expr ) ) => ({
             // `pk()` is actually implemented as `bare(pk())`
             $crate::descriptor!( bare ( pk ( $key ) ) )
         });
    -    ( pkh ( $key:expr ) ) => ({
    +    ( pkh ( $key:expr ) ) => ({
             use $crate::miniscript::descriptor::{Descriptor, DescriptorPublicKey};
     
             $crate::impl_top_level_pk!(Pkh, $crate::miniscript::Legacy, $key)
                 .map(|(a, b, c)| (Descriptor::<DescriptorPublicKey>::Pkh(a), b, c))
         });
    -    ( wpkh ( $key:expr ) ) => ({
    +    ( wpkh ( $key:expr ) ) => ({
             use $crate::miniscript::descriptor::{Descriptor, DescriptorPublicKey};
     
             $crate::impl_top_level_pk!(Wpkh, $crate::miniscript::Segwitv0, $key)
                 .and_then(|(a, b, c)| Ok((a?, b, c)))
                 .map(|(a, b, c)| (Descriptor::<DescriptorPublicKey>::Wpkh(a), b, c))
         });
    -    ( sh ( wpkh ( $key:expr ) ) ) => ({
    +    ( sh ( wpkh ( $key:expr ) ) ) => ({
             $crate::descriptor!(shwpkh ( $key ))
         });
    -    ( shwpkh ( $key:expr ) ) => ({
    +    ( shwpkh ( $key:expr ) ) => ({
             use $crate::miniscript::descriptor::{Descriptor, DescriptorPublicKey, Sh};
     
             $crate::impl_top_level_pk!(Wpkh, $crate::miniscript::Segwitv0, $key)
                 .and_then(|(a, b, c)| Ok((a?, b, c)))
                 .and_then(|(a, b, c)| Ok((Descriptor::<DescriptorPublicKey>::Sh(Sh::new_wpkh(a.into_inner())?), b, c)))
         });
    -    ( sh ( $( $minisc:tt )* ) ) => ({
    +    ( sh ( $( $minisc:tt )* ) ) => ({
             $crate::impl_top_level_sh!(Sh, new, new_sortedmulti, Legacy, $( $minisc )*)
         });
    -    ( wsh ( $( $minisc:tt )* ) ) => ({
    +    ( wsh ( $( $minisc:tt )* ) ) => ({
             $crate::impl_top_level_sh!(Wsh, new, new_sortedmulti, Segwitv0, $( $minisc )*)
         });
     }
    @@ -1515,13 +1517,13 @@
     }
     
     impl<A, B> TupleTwo<A, B> {
    -    pub fn flattened(self) -> (A, B) {
    +    pub fn flattened(self) -> (A, B) {
             (self.a, self.b)
         }
     }
     
     impl<A, B> From<(A, (B, ()))> for TupleTwo<A, B> {
    -    fn from((a, (b, _)): (A, (B, ()))) -> Self {
    +    fn from((a, (b, _)): (A, (B, ()))) -> Self {
             TupleTwo { a, b }
         }
     }
    @@ -1534,13 +1536,13 @@
     }
     
     impl<A, B, C> TupleThree<A, B, C> {
    -    pub fn flattened(self) -> (A, B, C) {
    +    pub fn flattened(self) -> (A, B, C) {
             (self.a, self.b, self.c)
         }
     }
     
     impl<A, B, C> From<(A, (B, (C, ())))> for TupleThree<A, B, C> {
    -    fn from((a, (b, (c, _))): (A, (B, (C, ())))) -> Self {
    +    fn from((a, (b, (c, _))): (A, (B, (C, ())))) -> Self {
             TupleThree { a, b, c }
         }
     }
    @@ -1550,29 +1552,29 @@
     macro_rules! fragment_internal {
         // The @v prefix is used to parse a sequence of operands and return them in a vector. This is
         // used by operands that take a variable number of arguments, like `thresh()` and `multi()`.
    -    ( @v $op:ident ( $( $args:tt )* ) $( $tail:tt )* ) => ({
    +    ( @v $op:ident ( $( $args:tt )* ) $( $tail:tt )* ) => ({
             let mut v = vec![$crate::fragment!( $op ( $( $args )* ) )];
    -        v.append(&mut $crate::fragment_internal!( @v $( $tail )* ));
    +        v.append(&mut $crate::fragment_internal!( @v $( $tail )* ));
     
             v
         });
         // Match modifiers
    -    ( @v $modif:tt : $( $tail:tt )* ) => ({
    +    ( @v $modif:tt : $( $tail:tt )* ) => ({
             let mut v = $crate::fragment_internal!( @v $( $tail )* );
             let first = v.drain(..1).next().unwrap();
     
             let first = $crate::apply_modifier!($modif:first);
     
             let mut v_final = vec![first];
    -        v_final.append(&mut v);
    +        v_final.append(&mut v);
     
             v_final
         });
         // Remove commas between operands
    -    ( @v , $( $tail:tt )* ) => ({
    +    ( @v , $( $tail:tt )* ) => ({
             $crate::fragment_internal!( @v $( $tail )* )
         });
    -    ( @v ) => ({
    +    ( @v ) => ({
             vec![]
         });
     
    @@ -1586,24 +1588,24 @@
         // three operands it's (X, (X, (X, ()))), etc.
         //
         // To check that the right number of arguments has been passed we can "cast" those tuples to
    -    // more convenient structures like `TupleTwo`. If the conversion succedes, the right number of
    +    // more convenient structures like `TupleTwo`. If the conversion succeeds, the right number of
         // args was passed. Otherwise the compilation fails entirely.
    -    ( @t $op:ident ( $( $args:tt )* ) $( $tail:tt )* ) => ({
    +    ( @t $op:ident ( $( $args:tt )* ) $( $tail:tt )* ) => ({
             ($crate::fragment!( $op ( $( $args )* ) ), $crate::fragment_internal!( @t $( $tail )* ))
         });
         // Match modifiers
    -    ( @t $modif:tt : $( $tail:tt )* ) => ({
    +    ( @t $modif:tt : $( $tail:tt )* ) => ({
             let (first, tail) = $crate::fragment_internal!( @t $( $tail )* );
             ($crate::apply_modifier!($modif:first), tail)
         });
         // Remove commas between operands
    -    ( @t , $( $tail:tt )* ) => ({
    +    ( @t , $( $tail:tt )* ) => ({
             $crate::fragment_internal!( @t $( $tail )* )
         });
    -    ( @t ) => ({});
    +    ( @t ) => ({});
     
         // Fallback to calling `fragment!()`
    -    ( $( $tokens:tt )* ) => ({
    +    ( $( $tokens:tt )* ) => ({
             $crate::fragment!($( $tokens )*)
         });
     }
    @@ -1617,72 +1619,72 @@
     #[macro_export]
     macro_rules! fragment {
         // Modifiers
    -    ( $modif:tt : $( $tail:tt )* ) => ({
    +    ( $modif:tt : $( $tail:tt )* ) => ({
             let op = $crate::fragment!( $( $tail )* );
             $crate::apply_modifier!($modif:op)
         });
     
         // Miniscript
    -    ( true ) => ({
    +    ( true ) => ({
             $crate::impl_leaf_opcode!(True)
         });
    -    ( false ) => ({
    +    ( false ) => ({
             $crate::impl_leaf_opcode!(False)
         });
    -    ( pk_k ( $key:expr ) ) => ({
    +    ( pk_k ( $key:expr ) ) => ({
             let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
             $crate::keys::make_pk($key, &secp)
         });
    -    ( pk ( $key:expr ) ) => ({
    +    ( pk ( $key:expr ) ) => ({
             $crate::fragment!(c:pk_k ( $key ))
         });
    -    ( pk_h ( $key:expr ) ) => ({
    +    ( pk_h ( $key:expr ) ) => ({
             let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
             $crate::keys::make_pkh($key, &secp)
         });
    -    ( after ( $value:expr ) ) => ({
    +    ( after ( $value:expr ) ) => ({
             $crate::impl_leaf_opcode_value!(After, $value)
         });
    -    ( older ( $value:expr ) ) => ({
    +    ( older ( $value:expr ) ) => ({
             $crate::impl_leaf_opcode_value!(Older, $value)
         });
    -    ( sha256 ( $hash:expr ) ) => ({
    +    ( sha256 ( $hash:expr ) ) => ({
             $crate::impl_leaf_opcode_value!(Sha256, $hash)
         });
    -    ( hash256 ( $hash:expr ) ) => ({
    +    ( hash256 ( $hash:expr ) ) => ({
             $crate::impl_leaf_opcode_value!(Hash256, $hash)
         });
    -    ( ripemd160 ( $hash:expr ) ) => ({
    +    ( ripemd160 ( $hash:expr ) ) => ({
             $crate::impl_leaf_opcode_value!(Ripemd160, $hash)
         });
    -    ( hash160 ( $hash:expr ) ) => ({
    +    ( hash160 ( $hash:expr ) ) => ({
             $crate::impl_leaf_opcode_value!(Hash160, $hash)
         });
    -    ( and_v ( $( $inner:tt )* ) ) => ({
    +    ( and_v ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_two!(AndV, $( $inner )*)
         });
    -    ( and_b ( $( $inner:tt )* ) ) => ({
    +    ( and_b ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_two!(AndB, $( $inner )*)
         });
    -    ( and_or ( $( $inner:tt )* ) ) => ({
    +    ( and_or ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_three!(AndOr, $( $inner )*)
         });
    -    ( andor ( $( $inner:tt )* ) ) => ({
    +    ( andor ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_three!(AndOr, $( $inner )*)
         });
    -    ( or_b ( $( $inner:tt )* ) ) => ({
    +    ( or_b ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_two!(OrB, $( $inner )*)
         });
    -    ( or_d ( $( $inner:tt )* ) ) => ({
    +    ( or_d ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_two!(OrD, $( $inner )*)
         });
    -    ( or_c ( $( $inner:tt )* ) ) => ({
    +    ( or_c ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_two!(OrC, $( $inner )*)
         });
    -    ( or_i ( $( $inner:tt )* ) ) => ({
    +    ( or_i ( $( $inner:tt )* ) ) => ({
             $crate::impl_node_opcode_two!(OrI, $( $inner )*)
         });
    -    ( thresh_vec ( $thresh:expr, $items:expr ) ) => ({
    +    ( thresh_vec ( $thresh:expr, $items:expr ) ) => ({
             use $crate::miniscript::descriptor::KeyMap;
     
             let (items, key_maps_networks): (Vec<_>, Vec<_>) = $items.into_iter().map(|(a, b, c)| (a, (b, c))).unzip();
    @@ -1698,16 +1700,16 @@
             $crate::impl_leaf_opcode_value_two!(Thresh, $thresh, items)
                 .map(|(minisc, _, _)| (minisc, key_maps, valid_networks))
         });
    -    ( thresh ( $thresh:expr, $( $inner:tt )* ) ) => ({
    +    ( thresh ( $thresh:expr, $( $inner:tt )* ) ) => ({
             let items = $crate::fragment_internal!( @v $( $inner )* );
     
             items.into_iter().collect::<Result<Vec<_>, _>>()
                 .and_then(|items| $crate::fragment!(thresh_vec($thresh, items)))
         });
    -    ( multi_vec ( $thresh:expr, $keys:expr ) ) => ({
    +    ( multi_vec ( $thresh:expr, $keys:expr ) ) => ({
             $crate::keys::make_multi($thresh, $keys)
         });
    -    ( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({
    +    ( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({
             use $crate::keys::IntoDescriptorKey;
             let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
     
    @@ -1723,10 +1725,10 @@
         });
     
         // `sortedmulti()` is handled separately
    -    ( sortedmulti ( $( $inner:tt )* ) ) => ({
    +    ( sortedmulti ( $( $inner:tt )* ) ) => ({
             compile_error!("`sortedmulti` can only be used as the root operand of a descriptor");
         });
    -    ( sortedmulti_vec ( $( $inner:tt )* ) ) => ({
    +    ( sortedmulti_vec ( $( $inner:tt )* ) ) => ({
             compile_error!("`sortedmulti_vec` can only be used as the root operand of a descriptor");
         });
     }
    @@ -2129,6 +2131,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/error.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/error.rs.html index 49cea1f62b..47b08bc819 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/error.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/error.rs.html @@ -1,4 +1,6 @@ -error.rs - source
     1
    +error.rs - source
    +    
    logo
     1
      2
      3
      4
    @@ -113,17 +115,17 @@
     }
     
     impl From<crate::keys::KeyError> for Error {
    -    fn from(key_error: crate::keys::KeyError) -> Error {
    +    fn from(key_error: crate::keys::KeyError) -> Error {
             match key_error {
    -            crate::keys::KeyError::Miniscript(inner) => Error::Miniscript(inner),
    -            crate::keys::KeyError::Bip32(inner) => Error::Bip32(inner),
    -            e => Error::Key(e),
    +            crate::keys::KeyError::Miniscript(inner) => Error::Miniscript(inner),
    +            crate::keys::KeyError::Bip32(inner) => Error::Bip32(inner),
    +            e => Error::Key(e),
             }
         }
     }
     
     impl std::fmt::Display for Error {
    -    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    +    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -137,6 +139,5 @@
     impl_error!(bitcoin::hashes::hex::Error, Hex);
     impl_error!(crate::descriptor::policy::PolicyError, Policy);
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/mod.rs.html index 628c70d6f8..2e17f53ced 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -871,7 +873,7 @@
             self,
             secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError>;
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError>;
     }
     
     impl IntoWalletDescriptor for &str {
    @@ -879,12 +881,12 @@
             self,
             secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
             let descriptor = if self.contains('#') {
                 let parts: Vec<&str> = self.splitn(2, '#').collect();
                 if !get_checksum(parts[0])
                     .ok()
    -                .map(|computed| computed == parts[1])
    +                .map(|computed| computed == parts[1])
                     .unwrap_or(false)
                 {
                     return Err(DescriptorError::InvalidDescriptorChecksum);
    @@ -905,7 +907,7 @@
             self,
             secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
             self.as_str().into_wallet_descriptor(secp, network)
         }
     }
    @@ -915,7 +917,7 @@
             self,
             secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
             (self, KeyMap::default()).into_wallet_descriptor(secp, network)
         }
     }
    @@ -925,7 +927,7 @@
             self,
             secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
             use crate::keys::DescriptorKey;
     
             let check_key = |pk: &DescriptorPublicKey| {
    @@ -958,7 +960,7 @@
             self,
             _secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
             let valid_networks = &self.2;
     
             let fix_key = |pk: &DescriptorPublicKey| {
    @@ -969,13 +971,13 @@
                     // them are valid. here we reset the network to make sure the wallet struct gets a
                     // descriptor with the right network everywhere.
                     let pk = match pk {
    -                    DescriptorPublicKey::XPub(ref xpub) => {
    +                    DescriptorPublicKey::XPub(ref xpub) => {
                             let mut xpub = xpub.clone();
                             xpub.xkey.network = network;
     
                             DescriptorPublicKey::XPub(xpub)
                         }
    -                    other => other.clone(),
    +                    other => other.clone(),
                     };
     
                     Ok(pk)
    @@ -997,7 +999,7 @@
         inner: T,
         secp: &SecpCtx,
         network: Network,
    -) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
         let (descriptor, keymap) = inner.into_wallet_descriptor(secp, network)?;
     
         // Ensure the keys don't contain any hardened derivation steps or hardened wildcards
    @@ -1008,7 +1010,7 @@
                 ..
             }) = k.as_key()
             {
    -            return *wildcard == Wildcard::Hardened
    +            return *wildcard == Wildcard::Hardened
                     || derivation_path.into_iter().any(ChildNumber::is_hardened);
             }
     
    @@ -1042,13 +1044,13 @@
     #[doc(hidden)]
     /// Used internally mainly by the `descriptor!()` and `fragment!()` macros
     pub trait CheckMiniscript<Ctx: miniscript::ScriptContext> {
    -    fn check_minsicript(&self) -> Result<(), miniscript::Error>;
    +    fn check_miniscript(&self) -> Result<(), miniscript::Error>;
     }
     
     impl<Ctx: miniscript::ScriptContext, Pk: miniscript::MiniscriptKey> CheckMiniscript<Ctx>
         for miniscript::Miniscript<Pk, Ctx>
     {
    -    fn check_minsicript(&self) -> Result<(), miniscript::Error> {
    +    fn check_miniscript(&self) -> Result<(), miniscript::Error> {
             Ctx::check_global_validity(self)?;
     
             Ok(())
    @@ -1063,12 +1065,12 @@
             signers: &SignersContainer,
             psbt: BuildSatisfaction,
             secp: &SecpCtx,
    -    ) -> Result<Option<Policy>, DescriptorError>;
    +    ) -> Result<Option<Policy>, DescriptorError>;
     }
     
     pub(crate) trait XKeyUtils {
    -    fn full_path(&self, append: &[ChildNumber]) -> DerivationPath;
    -    fn root_fingerprint(&self, secp: &SecpCtx) -> Fingerprint;
    +    fn full_path(&self, append: &[ChildNumber]) -> DerivationPath;
    +    fn root_fingerprint(&self, secp: &SecpCtx) -> Fingerprint;
     }
     
     // FIXME: `InnerXKey` was made private in rust-miniscript, so we have to implement this manually on
    @@ -1077,14 +1079,14 @@
     // Revert back to using the trait once https://github.com/rust-bitcoin/rust-miniscript/pull/230 is
     // released
     impl XKeyUtils for DescriptorXKey<ExtendedPubKey> {
    -    fn full_path(&self, append: &[ChildNumber]) -> DerivationPath {
    +    fn full_path(&self, append: &[ChildNumber]) -> DerivationPath {
             let full_path = match self.origin {
    -            Some((_, ref path)) => path
    +            Some((_, ref path)) => path
                     .into_iter()
                     .chain(self.derivation_path.into_iter())
                     .cloned()
                     .collect(),
    -            None => self.derivation_path.clone(),
    +            None => self.derivation_path.clone(),
             };
     
             if self.wildcard != Wildcard::None {
    @@ -1098,22 +1100,22 @@
             }
         }
     
    -    fn root_fingerprint(&self, _: &SecpCtx) -> Fingerprint {
    +    fn root_fingerprint(&self, _: &SecpCtx) -> Fingerprint {
             match self.origin {
    -            Some((fingerprint, _)) => fingerprint,
    -            None => self.xkey.fingerprint(),
    +            Some((fingerprint, _)) => fingerprint,
    +            None => self.xkey.fingerprint(),
             }
         }
     }
     impl XKeyUtils for DescriptorXKey<ExtendedPrivKey> {
    -    fn full_path(&self, append: &[ChildNumber]) -> DerivationPath {
    +    fn full_path(&self, append: &[ChildNumber]) -> DerivationPath {
             let full_path = match self.origin {
    -            Some((_, ref path)) => path
    +            Some((_, ref path)) => path
                     .into_iter()
                     .chain(self.derivation_path.into_iter())
                     .cloned()
                     .collect(),
    -            None => self.derivation_path.clone(),
    +            None => self.derivation_path.clone(),
             };
     
             if self.wildcard != Wildcard::None {
    @@ -1127,65 +1129,65 @@
             }
         }
     
    -    fn root_fingerprint(&self, secp: &SecpCtx) -> Fingerprint {
    +    fn root_fingerprint(&self, secp: &SecpCtx) -> Fingerprint {
             match self.origin {
    -            Some((fingerprint, _)) => fingerprint,
    -            None => self.xkey.fingerprint(secp),
    +            Some((fingerprint, _)) => fingerprint,
    +            None => self.xkey.fingerprint(secp),
             }
         }
     }
     
     pub(crate) trait DerivedDescriptorMeta {
    -    fn get_hd_keypaths(&self, secp: &SecpCtx) -> Result<HdKeyPaths, DescriptorError>;
    +    fn get_hd_keypaths(&self, secp: &SecpCtx) -> Result<HdKeyPaths, DescriptorError>;
     }
     
     pub(crate) trait DescriptorMeta {
    -    fn is_witness(&self) -> bool;
    -    fn get_extended_keys(&self) -> Result<Vec<DescriptorXKey<ExtendedPubKey>>, DescriptorError>;
    +    fn is_witness(&self) -> bool;
    +    fn get_extended_keys(&self) -> Result<Vec<DescriptorXKey<ExtendedPubKey>>, DescriptorError>;
         fn derive_from_hd_keypaths<'s>(
             &self,
             hd_keypaths: &HdKeyPaths,
             secp: &'s SecpCtx,
    -    ) -> Option<DerivedDescriptor<'s>>;
    +    ) -> Option<DerivedDescriptor<'s>>;
         fn derive_from_psbt_input<'s>(
             &self,
             psbt_input: &psbt::Input,
             utxo: Option<TxOut>,
             secp: &'s SecpCtx,
    -    ) -> Option<DerivedDescriptor<'s>>;
    +    ) -> Option<DerivedDescriptor<'s>>;
     }
     
     pub(crate) trait DescriptorScripts {
    -    fn psbt_redeem_script(&self) -> Option<Script>;
    -    fn psbt_witness_script(&self) -> Option<Script>;
    +    fn psbt_redeem_script(&self) -> Option<Script>;
    +    fn psbt_witness_script(&self) -> Option<Script>;
     }
     
     impl<'s> DescriptorScripts for DerivedDescriptor<'s> {
    -    fn psbt_redeem_script(&self) -> Option<Script> {
    +    fn psbt_redeem_script(&self) -> Option<Script> {
             match self.desc_type() {
    -            DescriptorType::ShWpkh => Some(self.explicit_script()),
    -            DescriptorType::ShWsh => Some(self.explicit_script().to_v0_p2wsh()),
    -            DescriptorType::Sh => Some(self.explicit_script()),
    -            DescriptorType::Bare => Some(self.explicit_script()),
    -            DescriptorType::ShSortedMulti => Some(self.explicit_script()),
    -            _ => None,
    +            DescriptorType::ShWpkh => Some(self.explicit_script()),
    +            DescriptorType::ShWsh => Some(self.explicit_script().to_v0_p2wsh()),
    +            DescriptorType::Sh => Some(self.explicit_script()),
    +            DescriptorType::Bare => Some(self.explicit_script()),
    +            DescriptorType::ShSortedMulti => Some(self.explicit_script()),
    +            _ => None,
             }
         }
     
    -    fn psbt_witness_script(&self) -> Option<Script> {
    +    fn psbt_witness_script(&self) -> Option<Script> {
             match self.desc_type() {
    -            DescriptorType::Wsh => Some(self.explicit_script()),
    -            DescriptorType::ShWsh => Some(self.explicit_script()),
    -            DescriptorType::WshSortedMulti | DescriptorType::ShWshSortedMulti => {
    +            DescriptorType::Wsh => Some(self.explicit_script()),
    +            DescriptorType::ShWsh => Some(self.explicit_script()),
    +            DescriptorType::WshSortedMulti | DescriptorType::ShWshSortedMulti => {
                     Some(self.explicit_script())
                 }
    -            _ => None,
    +            _ => None,
             }
         }
     }
     
     impl DescriptorMeta for ExtendedDescriptor {
    -    fn is_witness(&self) -> bool {
    +    fn is_witness(&self) -> bool {
             matches!(
                 self.desc_type(),
                 DescriptorType::Wpkh
    @@ -1197,7 +1199,7 @@
             )
         }
     
    -    fn get_extended_keys(&self) -> Result<Vec<DescriptorXKey<ExtendedPubKey>>, DescriptorError> {
    +    fn get_extended_keys(&self) -> Result<Vec<DescriptorXKey<ExtendedPubKey>>, DescriptorError> {
             let mut answer = Vec::new();
     
             self.for_each_key(|pk| {
    @@ -1215,7 +1217,7 @@
             &self,
             hd_keypaths: &HdKeyPaths,
             secp: &'s SecpCtx,
    -    ) -> Option<DerivedDescriptor<'s>> {
    +    ) -> Option<DerivedDescriptor<'s>> {
             let index: HashMap<_, _> = hd_keypaths.values().map(|(a, b)| (a, b)).collect();
     
             let mut path_found = None;
    @@ -1247,16 +1249,16 @@
                         });
     
                     match derivation_path {
    -                    Some(path) if xpub.wildcard != Wildcard::None && path.len() == 1 => {
    +                    Some(path) if xpub.wildcard != Wildcard::None && path.len() == 1 => {
                             // Ignore hardened wildcards
                             if let ChildNumber::Normal { index } = path[0] {
                                 path_found = Some(index)
                             }
                         }
    -                    Some(path) if xpub.wildcard == Wildcard::None && path.is_empty() => {
    +                    Some(path) if xpub.wildcard == Wildcard::None && path.is_empty() => {
                             path_found = Some(0)
                         }
    -                    _ => {}
    +                    _ => {}
                     }
                 }
     
    @@ -1271,7 +1273,7 @@
             psbt_input: &psbt::Input,
             utxo: Option<TxOut>,
             secp: &'s SecpCtx,
    -    ) -> Option<DerivedDescriptor<'s>> {
    +    ) -> Option<DerivedDescriptor<'s>> {
             if let Some(derived) = self.derive_from_hd_keypaths(&psbt_input.bip32_derivation, secp) {
                 return Some(derived);
             }
    @@ -1285,14 +1287,14 @@
                 // TODO: add pk() here
                 DescriptorType::Pkh | DescriptorType::Wpkh | DescriptorType::ShWpkh
                     if utxo.is_some()
    -                    && descriptor.script_pubkey() == utxo.as_ref().unwrap().script_pubkey =>
    +                    && descriptor.script_pubkey() == utxo.as_ref().unwrap().script_pubkey =>
                 {
                     Some(descriptor)
                 }
                 DescriptorType::Bare | DescriptorType::Sh | DescriptorType::ShSortedMulti
                     if psbt_input.redeem_script.is_some()
                         && &descriptor.explicit_script()
    -                        == psbt_input.redeem_script.as_ref().unwrap() =>
    +                        == psbt_input.redeem_script.as_ref().unwrap() =>
                 {
                     Some(descriptor)
                 }
    @@ -1302,17 +1304,17 @@
                 | DescriptorType::WshSortedMulti
                     if psbt_input.witness_script.is_some()
                         && &descriptor.explicit_script()
    -                        == psbt_input.witness_script.as_ref().unwrap() =>
    +                        == psbt_input.witness_script.as_ref().unwrap() =>
                 {
                     Some(descriptor)
                 }
    -            _ => None,
    +            _ => None,
             }
         }
     }
     
     impl<'s> DerivedDescriptorMeta for DerivedDescriptor<'s> {
    -    fn get_hd_keypaths(&self, secp: &SecpCtx) -> Result<HdKeyPaths, DescriptorError> {
    +    fn get_hd_keypaths(&self, secp: &SecpCtx) -> Result<HdKeyPaths, DescriptorError> {
             let mut answer = BTreeMap::new();
             self.for_each_key(|key| {
                 if let DescriptorPublicKey::XPub(xpub) = key.as_key().deref() {
    @@ -1471,7 +1473,7 @@
     
             // make a descriptor out of it
             let desc = crate::descriptor!(wpkh(key)).unwrap();
    -        // this should conver the key that supports "any_network" to the right network (testnet)
    +        // this should convert the key that supports "any_network" to the right network (testnet)
             let (wallet_desc, _) = desc
                 .into_wallet_descriptor(&secp, Network::Testnet)
                 .unwrap();
    @@ -1607,6 +1609,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/policy.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/policy.rs.html index 98bb3b3e19..b190eaec9d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/policy.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/policy.rs.html @@ -1,4 +1,6 @@ -policy.rs - source
       1
    +policy.rs - source
    +    
    logo
       1
        2
        3
        4
    @@ -1676,13 +1678,13 @@
     }
     
     impl PkOrF {
    -    fn from_key(k: &DescriptorPublicKey, secp: &SecpCtx) -> Self {
    +    fn from_key(k: &DescriptorPublicKey, secp: &SecpCtx) -> Self {
             match k {
    -            DescriptorPublicKey::SinglePub(pubkey) => PkOrF {
    +            DescriptorPublicKey::SinglePub(pubkey) => PkOrF {
                     pubkey: Some(pubkey.key),
                     ..Default::default()
                 },
    -            DescriptorPublicKey::XPub(xpub) => PkOrF {
    +            DescriptorPublicKey::XPub(xpub) => PkOrF {
                     fingerprint: Some(xpub.root_fingerprint(secp)),
                     ..Default::default()
                 },
    @@ -1749,7 +1751,7 @@
     
     impl SatisfiableItem {
         /// Returns whether the [`SatisfiableItem`] is a leaf item
    -    pub fn is_leaf(&self) -> bool {
    +    pub fn is_leaf(&self) -> bool {
             !matches!(
                 self,
                 SatisfiableItem::Thresh {
    @@ -1760,13 +1762,13 @@
         }
     
         /// Returns a unique id for the [`SatisfiableItem`]
    -    pub fn id(&self) -> String {
    +    pub fn id(&self) -> String {
             get_checksum(&serde_json::to_string(self).expect("Failed to serialize a SatisfiableItem"))
                 .expect("Failed to compute a SatisfiableItem id")
         }
     }
     
    -fn combinations(vec: &[usize], size: usize) -> Vec<Vec<usize>> {
    +fn combinations(vec: &[usize], size: usize) -> Vec<Vec<usize>> {
         assert!(vec.len() >= size);
     
         let mut answer = Vec::new();
    @@ -1793,7 +1795,7 @@
         answer
     }
     
    -fn mix<T: Clone>(vec: Vec<Vec<T>>) -> Vec<Vec<T>> {
    +fn mix<T: Clone>(vec: Vec<Vec<T>>) -> Vec<Vec<T>> {
         if vec.is_empty() || vec.iter().any(Vec::is_empty) {
             return vec![];
         }
    @@ -1832,7 +1834,7 @@
     fn serialize_folded_cond_map<S>(
         input_map: &FoldedConditionMap,
         serializer: S,
    -) -> Result<S::Ok, S::Error>
    +) -> Result<S::Ok, S::Error>
     where
         S: Serializer,
     {
    @@ -1893,39 +1895,39 @@
     
     impl Satisfaction {
         /// Returns whether the [`Satisfaction`] is a leaf item
    -    pub fn is_leaf(&self) -> bool {
    +    pub fn is_leaf(&self) -> bool {
             match self {
    -            Satisfaction::None | Satisfaction::Complete { .. } => true,
    -            Satisfaction::PartialComplete { .. } | Satisfaction::Partial { .. } => false,
    +            Satisfaction::None | Satisfaction::Complete { .. } => true,
    +            Satisfaction::PartialComplete { .. } | Satisfaction::Partial { .. } => false,
             }
         }
     
         // add `inner` as one of self's partial items. this only makes sense on partials
    -    fn add(&mut self, inner: &Satisfaction, inner_index: usize) -> Result<(), PolicyError> {
    +    fn add(&mut self, inner: &Satisfaction, inner_index: usize) -> Result<(), PolicyError> {
             match self {
    -            Satisfaction::None | Satisfaction::Complete { .. } => Err(PolicyError::AddOnLeaf),
    -            Satisfaction::PartialComplete { .. } => Err(PolicyError::AddOnPartialComplete),
    +            Satisfaction::None | Satisfaction::Complete { .. } => Err(PolicyError::AddOnLeaf),
    +            Satisfaction::PartialComplete { .. } => Err(PolicyError::AddOnPartialComplete),
                 Satisfaction::Partial {
                     n,
                     ref mut conditions,
                     ref mut items,
                     ..
    -            } => {
    +            } => {
                     if inner_index >= *n || items.contains(&inner_index) {
                         return Err(PolicyError::IndexOutOfRange(inner_index));
                     }
     
                     match inner {
                         // not relevant if not completed yet
    -                    Satisfaction::None | Satisfaction::Partial { .. } => return Ok(()),
    -                    Satisfaction::Complete { condition } => {
    +                    Satisfaction::None | Satisfaction::Partial { .. } => return Ok(()),
    +                    Satisfaction::Complete { condition } => {
                             items.push(inner_index);
                             conditions.insert(inner_index, vec![*condition].into_iter().collect());
                         }
                         Satisfaction::PartialComplete {
                             conditions: other_conditions,
                             ..
    -                    } => {
    +                    } => {
                             items.push(inner_index);
                             let conditions_set = other_conditions
                                 .values()
    @@ -1939,7 +1941,7 @@
             }
         }
     
    -    fn finalize(&mut self) {
    +    fn finalize(&mut self) {
             // if partial try to bump it to a partialcomplete
             if let Satisfaction::Partial {
                 n,
    @@ -1956,9 +1958,9 @@
                     indexes
                         .into_iter()
                         // .inspect(|x| println!("--- orig --- {:?}", x))
    -                    // we map each of the combinations of elements into a tuple of ([choosen items], [conditions]). unfortunately, those items have potentially more than one
    +                    // we map each of the combinations of elements into a tuple of ([chosen items], [conditions]). unfortunately, those items have potentially more than one
                         // condition (think about ORs), so we also use `mix` to expand those, i.e. [[0], [1, 2]] becomes [[0, 1], [0, 2]]. This is necessary to make sure that we
    -                    // consider every possibile options and check whether or not they are compatible.
    +                    // consider every possible options and check whether or not they are compatible.
                         .map(|i_vec| {
                             mix(i_vec
                                 .iter()
    @@ -2009,7 +2011,7 @@
     }
     
     impl From<bool> for Satisfaction {
    -    fn from(other: bool) -> Self {
    +    fn from(other: bool) -> Self {
             if other {
                 Satisfaction::Complete {
                     condition: Default::default(),
    @@ -2047,7 +2049,7 @@
     }
     
     impl Condition {
    -    fn merge_nlocktime(a: u32, b: u32) -> Result<u32, PolicyError> {
    +    fn merge_nlocktime(a: u32, b: u32) -> Result<u32, PolicyError> {
             if (a < utils::BLOCKS_TIMELOCK_THRESHOLD) != (b < utils::BLOCKS_TIMELOCK_THRESHOLD) {
                 Err(PolicyError::MixedTimelockUnits)
             } else {
    @@ -2055,7 +2057,7 @@
             }
         }
     
    -    fn merge_nsequence(a: u32, b: u32) -> Result<u32, PolicyError> {
    +    fn merge_nsequence(a: u32, b: u32) -> Result<u32, PolicyError> {
             let mask = utils::SEQUENCE_LOCKTIME_TYPE_FLAG | utils::SEQUENCE_LOCKTIME_MASK;
     
             let a = a & mask;
    @@ -2068,24 +2070,24 @@
             }
         }
     
    -    pub(crate) fn merge(mut self, other: &Condition) -> Result<Self, PolicyError> {
    +    pub(crate) fn merge(mut self, other: &Condition) -> Result<Self, PolicyError> {
             match (self.csv, other.csv) {
    -            (Some(a), Some(b)) => self.csv = Some(Self::merge_nsequence(a, b)?),
    -            (None, any) => self.csv = any,
    -            _ => {}
    +            (Some(a), Some(b)) => self.csv = Some(Self::merge_nsequence(a, b)?),
    +            (None, any) => self.csv = any,
    +            _ => {}
             }
     
             match (self.timelock, other.timelock) {
    -            (Some(a), Some(b)) => self.timelock = Some(Self::merge_nlocktime(a, b)?),
    -            (None, any) => self.timelock = any,
    -            _ => {}
    +            (Some(a), Some(b)) => self.timelock = Some(Self::merge_nlocktime(a, b)?),
    +            (None, any) => self.timelock = any,
    +            _ => {}
             }
     
             Ok(self)
         }
     
         /// Returns `true` if there are no extra conditions to verify
    -    pub fn is_null(&self) -> bool {
    +    pub fn is_null(&self) -> bool {
             self.csv.is_none() && self.timelock.is_none()
         }
     }
    @@ -2108,7 +2110,7 @@
     }
     
     impl fmt::Display for PolicyError {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -2116,7 +2118,7 @@
     impl std::error::Error for PolicyError {}
     
     impl Policy {
    -    fn new(item: SatisfiableItem) -> Self {
    +    fn new(item: SatisfiableItem) -> Self {
             Policy {
                 id: item.id(),
                 item,
    @@ -2125,24 +2127,24 @@
             }
         }
     
    -    fn make_and(a: Option<Policy>, b: Option<Policy>) -> Result<Option<Policy>, PolicyError> {
    +    fn make_and(a: Option<Policy>, b: Option<Policy>) -> Result<Option<Policy>, PolicyError> {
             match (a, b) {
    -            (None, None) => Ok(None),
    -            (Some(x), None) | (None, Some(x)) => Ok(Some(x)),
    -            (Some(a), Some(b)) => Self::make_thresh(vec![a, b], 2),
    +            (None, None) => Ok(None),
    +            (Some(x), None) | (None, Some(x)) => Ok(Some(x)),
    +            (Some(a), Some(b)) => Self::make_thresh(vec![a, b], 2),
             }
         }
     
    -    fn make_or(a: Option<Policy>, b: Option<Policy>) -> Result<Option<Policy>, PolicyError> {
    +    fn make_or(a: Option<Policy>, b: Option<Policy>) -> Result<Option<Policy>, PolicyError> {
             match (a, b) {
    -            (None, None) => Ok(None),
    -            (Some(x), None) | (None, Some(x)) => Ok(Some(x)),
    -            (Some(a), Some(b)) => Self::make_thresh(vec![a, b], 1),
    +            (None, None) => Ok(None),
    +            (Some(x), None) | (None, Some(x)) => Ok(Some(x)),
    +            (Some(a), Some(b)) => Self::make_thresh(vec![a, b], 1),
             }
         }
     
    -    fn make_thresh(items: Vec<Policy>, threshold: usize) -> Result<Option<Policy>, PolicyError> {
    -        if threshold == 0 {
    +    fn make_thresh(items: Vec<Policy>, threshold: usize) -> Result<Option<Policy>, PolicyError> {
    +        if threshold == 0 {
                 return Ok(None);
             }
     
    @@ -2176,8 +2178,8 @@
             threshold: usize,
             sorted: bool,
             secp: &SecpCtx,
    -    ) -> Result<Option<Policy>, PolicyError> {
    -        if threshold == 0 {
    +    ) -> Result<Option<Policy>, PolicyError> {
    +        if threshold == 0 {
                 return Ok(None);
             }
     
    @@ -2233,7 +2235,7 @@
         /// What this means is that for some spending policies the user should select which paths in
         /// the tree it intends to satisfy while signing, because the transaction must be created differently based
         /// on that.
    -    pub fn requires_path(&self) -> bool {
    +    pub fn requires_path(&self) -> bool {
             self.get_condition(&BTreeMap::new()).is_err()
         }
     
    @@ -2242,22 +2244,22 @@
         pub fn get_condition(
             &self,
             path: &BTreeMap<String, Vec<usize>>,
    -    ) -> Result<Condition, PolicyError> {
    +    ) -> Result<Condition, PolicyError> {
             // if items.len() == threshold, selected can be omitted and we take all of them by default
             let default = match &self.item {
    -            SatisfiableItem::Thresh { items, threshold } if items.len() == *threshold => {
    +            SatisfiableItem::Thresh { items, threshold } if items.len() == *threshold => {
                     (0..*threshold).collect()
                 }
    -            SatisfiableItem::Multisig { keys, .. } => (0..keys.len()).collect(),
    -            _ => vec![],
    +            SatisfiableItem::Multisig { keys, .. } => (0..keys.len()).collect(),
    +            _ => vec![],
             };
             let selected = match path.get(&self.id) {
    -            Some(arr) => arr,
    -            _ => &default,
    +            Some(arr) => arr,
    +            _ => &default,
             };
     
             match &self.item {
    -            SatisfiableItem::Thresh { items, threshold } => {
    +            SatisfiableItem::Thresh { items, threshold } => {
                     let mapped_req = items
                         .iter()
                         .map(|i| i.get_condition(path))
    @@ -2288,7 +2290,7 @@
     
                     Ok(requirements)
                 }
    -            SatisfiableItem::Multisig { keys, threshold } => {
    +            SatisfiableItem::Multisig { keys, threshold } => {
                     if selected.len() < *threshold {
                         return Err(PolicyError::NotEnoughItemsSelected(self.id.clone()));
                     }
    @@ -2298,29 +2300,29 @@
     
                     Ok(Condition::default())
                 }
    -            SatisfiableItem::AbsoluteTimelock { value } => Ok(Condition {
    +            SatisfiableItem::AbsoluteTimelock { value } => Ok(Condition {
                     csv: None,
                     timelock: Some(*value),
                 }),
    -            SatisfiableItem::RelativeTimelock { value } => Ok(Condition {
    +            SatisfiableItem::RelativeTimelock { value } => Ok(Condition {
                     csv: Some(*value),
                     timelock: None,
                 }),
    -            _ => Ok(Condition::default()),
    +            _ => Ok(Condition::default()),
             }
         }
     }
     
     impl From<SatisfiableItem> for Policy {
    -    fn from(other: SatisfiableItem) -> Self {
    +    fn from(other: SatisfiableItem) -> Self {
             Self::new(other)
         }
     }
     
    -fn signer_id(key: &DescriptorPublicKey, secp: &SecpCtx) -> SignerId {
    +fn signer_id(key: &DescriptorPublicKey, secp: &SecpCtx) -> SignerId {
         match key {
    -        DescriptorPublicKey::SinglePub(pubkey) => pubkey.key.to_pubkeyhash().into(),
    -        DescriptorPublicKey::XPub(xpub) => xpub.root_fingerprint(secp).into(),
    +        DescriptorPublicKey::SinglePub(pubkey) => pubkey.key.to_pubkeyhash().into(),
    +        DescriptorPublicKey::XPub(xpub) => xpub.root_fingerprint(secp).into(),
         }
     }
     
    @@ -2329,7 +2331,7 @@
         signers: &SignersContainer,
         build_sat: BuildSatisfaction,
         secp: &SecpCtx,
    -) -> Policy {
    +) -> Policy {
         let mut policy: Policy = SatisfiableItem::Signature(PkOrF::from_key(key, secp)).into();
     
         policy.contribution = if signers.find(signer_id(key, secp)).is_some() {
    @@ -2353,20 +2355,20 @@
         policy
     }
     
    -fn signature_in_psbt(psbt: &Psbt, key: &DescriptorPublicKey, secp: &SecpCtx) -> bool {
    +fn signature_in_psbt(psbt: &Psbt, key: &DescriptorPublicKey, secp: &SecpCtx) -> bool {
         //TODO check signature validity
         psbt.inputs.iter().all(|input| match key {
    -        DescriptorPublicKey::SinglePub(key) => input.partial_sigs.contains_key(&key.key),
    -        DescriptorPublicKey::XPub(xpub) => {
    +        DescriptorPublicKey::SinglePub(key) => input.partial_sigs.contains_key(&key.key),
    +        DescriptorPublicKey::XPub(xpub) => {
                 let pubkey = input
                     .bip32_derivation
                     .iter()
    -                .find(|(_, (f, _))| *f == xpub.root_fingerprint(secp))
    +                .find(|(_, (f, _))| *f == xpub.root_fingerprint(secp))
                     .map(|(p, _)| p);
                 //TODO check actual derivation matches
                 match pubkey {
    -                Some(pubkey) => input.partial_sigs.contains_key(pubkey),
    -                None => false,
    +                Some(pubkey) => input.partial_sigs.contains_key(pubkey),
    +                None => false,
                 }
             }
         })
    @@ -2378,13 +2380,13 @@
             signers: &SignersContainer,
             build_sat: BuildSatisfaction,
             secp: &SecpCtx,
    -    ) -> Result<Option<Policy>, Error> {
    +    ) -> Result<Option<Policy>, Error> {
             Ok(match &self.node {
                 // Leaves
    -            Terminal::True | Terminal::False => None,
    -            Terminal::PkK(pubkey) => Some(signature(pubkey, signers, build_sat, secp)),
    -            Terminal::PkH(pubkey_hash) => Some(signature(pubkey_hash, signers, build_sat, secp)),
    -            Terminal::After(value) => {
    +            Terminal::True | Terminal::False => None,
    +            Terminal::PkK(pubkey) => Some(signature(pubkey, signers, build_sat, secp)),
    +            Terminal::PkH(pubkey_hash) => Some(signature(pubkey_hash, signers, build_sat, secp)),
    +            Terminal::After(value) => {
                     let mut policy: Policy = SatisfiableItem::AbsoluteTimelock { value: *value }.into();
                     policy.contribution = Satisfaction::Complete {
                         condition: Condition {
    @@ -2409,7 +2411,7 @@
     
                     Some(policy)
                 }
    -            Terminal::Older(value) => {
    +            Terminal::Older(value) => {
                     let mut policy: Policy = SatisfiableItem::RelativeTimelock { value: *value }.into();
                     policy.contribution = Satisfaction::Complete {
                         condition: Condition {
    @@ -2434,17 +2436,17 @@
     
                     Some(policy)
                 }
    -            Terminal::Sha256(hash) => Some(SatisfiableItem::Sha256Preimage { hash: *hash }.into()),
    -            Terminal::Hash256(hash) => {
    +            Terminal::Sha256(hash) => Some(SatisfiableItem::Sha256Preimage { hash: *hash }.into()),
    +            Terminal::Hash256(hash) => {
                     Some(SatisfiableItem::Hash256Preimage { hash: *hash }.into())
                 }
    -            Terminal::Ripemd160(hash) => {
    +            Terminal::Ripemd160(hash) => {
                     Some(SatisfiableItem::Ripemd160Preimage { hash: *hash }.into())
                 }
    -            Terminal::Hash160(hash) => {
    +            Terminal::Hash160(hash) => {
                     Some(SatisfiableItem::Hash160Preimage { hash: *hash }.into())
                 }
    -            Terminal::Multi(k, pks) => {
    +            Terminal::Multi(k, pks) => {
                     Policy::make_multisig(pks, signers, build_sat, *k, false, secp)?
                 }
                 // Identities
    @@ -2454,13 +2456,13 @@
                 | Terminal::DupIf(inner)
                 | Terminal::Verify(inner)
                 | Terminal::NonZero(inner)
    -            | Terminal::ZeroNotEqual(inner) => inner.extract_policy(signers, build_sat, secp)?,
    +            | Terminal::ZeroNotEqual(inner) => inner.extract_policy(signers, build_sat, secp)?,
                 // Complex policies
    -            Terminal::AndV(a, b) | Terminal::AndB(a, b) => Policy::make_and(
    +            Terminal::AndV(a, b) | Terminal::AndB(a, b) => Policy::make_and(
                     a.extract_policy(signers, build_sat, secp)?,
                     b.extract_policy(signers, build_sat, secp)?,
                 )?,
    -            Terminal::AndOr(x, y, z) => Policy::make_or(
    +            Terminal::AndOr(x, y, z) => Policy::make_or(
                     Policy::make_and(
                         x.extract_policy(signers, build_sat, secp)?,
                         y.extract_policy(signers, build_sat, secp)?,
    @@ -2470,11 +2472,11 @@
                 Terminal::OrB(a, b)
                 | Terminal::OrD(a, b)
                 | Terminal::OrC(a, b)
    -            | Terminal::OrI(a, b) => Policy::make_or(
    +            | Terminal::OrI(a, b) => Policy::make_or(
                     a.extract_policy(signers, build_sat, secp)?,
                     b.extract_policy(signers, build_sat, secp)?,
                 )?,
    -            Terminal::Thresh(k, nodes) => {
    +            Terminal::Thresh(k, nodes) => {
                     let mut threshold = *k;
                     let mapped: Vec<_> = nodes
                         .iter()
    @@ -2486,8 +2488,8 @@
     
                     if mapped.len() < nodes.len() {
                         threshold = match threshold.checked_sub(nodes.len() - mapped.len()) {
    -                        None => return Ok(None),
    -                        Some(x) => x,
    +                        None => return Ok(None),
    +                        Some(x) => x,
                         };
                     }
     
    @@ -2497,7 +2499,7 @@
         }
     }
     
    -fn psbt_inputs_sat(psbt: &Psbt) -> impl Iterator<Item = PsbtInputSatisfier> {
    +fn psbt_inputs_sat(psbt: &Psbt) -> impl Iterator<Item = PsbtInputSatisfier> {
         (0..psbt.inputs.len()).map(move |i| PsbtInputSatisfier::new(psbt, i))
     }
     
    @@ -2520,11 +2522,11 @@
         },
     }
     impl<'a> BuildSatisfaction<'a> {
    -    fn psbt(&self) -> Option<&'a Psbt> {
    +    fn psbt(&self) -> Option<&'a Psbt> {
             match self {
    -            BuildSatisfaction::None => None,
    -            BuildSatisfaction::Psbt(psbt) => Some(psbt),
    -            BuildSatisfaction::PsbtTimelocks { psbt, .. } => Some(psbt),
    +            BuildSatisfaction::None => None,
    +            BuildSatisfaction::Psbt(psbt) => Some(psbt),
    +            BuildSatisfaction::PsbtTimelocks { psbt, .. } => Some(psbt),
             }
         }
     }
    @@ -2535,13 +2537,13 @@
             signers: &SignersContainer,
             build_sat: BuildSatisfaction,
             secp: &SecpCtx,
    -    ) -> Result<Option<Policy>, Error> {
    +    ) -> Result<Option<Policy>, Error> {
             fn make_sortedmulti<Ctx: ScriptContext>(
                 keys: &SortedMultiVec<DescriptorPublicKey, Ctx>,
                 signers: &SignersContainer,
                 build_sat: BuildSatisfaction,
                 secp: &SecpCtx,
    -        ) -> Result<Option<Policy>, Error> {
    +        ) -> Result<Option<Policy>, Error> {
                 Ok(Policy::make_multisig(
                     keys.pks.as_ref(),
                     signers,
    @@ -2553,24 +2555,24 @@
             }
     
             match self {
    -            Descriptor::Pkh(pk) => Ok(Some(signature(pk.as_inner(), signers, build_sat, secp))),
    -            Descriptor::Wpkh(pk) => Ok(Some(signature(pk.as_inner(), signers, build_sat, secp))),
    -            Descriptor::Sh(sh) => match sh.as_inner() {
    -                ShInner::Wpkh(pk) => Ok(Some(signature(pk.as_inner(), signers, build_sat, secp))),
    -                ShInner::Ms(ms) => Ok(ms.extract_policy(signers, build_sat, secp)?),
    -                ShInner::SortedMulti(ref keys) => make_sortedmulti(keys, signers, build_sat, secp),
    -                ShInner::Wsh(wsh) => match wsh.as_inner() {
    -                    WshInner::Ms(ms) => Ok(ms.extract_policy(signers, build_sat, secp)?),
    -                    WshInner::SortedMulti(ref keys) => {
    +            Descriptor::Pkh(pk) => Ok(Some(signature(pk.as_inner(), signers, build_sat, secp))),
    +            Descriptor::Wpkh(pk) => Ok(Some(signature(pk.as_inner(), signers, build_sat, secp))),
    +            Descriptor::Sh(sh) => match sh.as_inner() {
    +                ShInner::Wpkh(pk) => Ok(Some(signature(pk.as_inner(), signers, build_sat, secp))),
    +                ShInner::Ms(ms) => Ok(ms.extract_policy(signers, build_sat, secp)?),
    +                ShInner::SortedMulti(ref keys) => make_sortedmulti(keys, signers, build_sat, secp),
    +                ShInner::Wsh(wsh) => match wsh.as_inner() {
    +                    WshInner::Ms(ms) => Ok(ms.extract_policy(signers, build_sat, secp)?),
    +                    WshInner::SortedMulti(ref keys) => {
                             make_sortedmulti(keys, signers, build_sat, secp)
                         }
                     },
                 },
    -            Descriptor::Wsh(wsh) => match wsh.as_inner() {
    -                WshInner::Ms(ms) => Ok(ms.extract_policy(signers, build_sat, secp)?),
    -                WshInner::SortedMulti(ref keys) => make_sortedmulti(keys, signers, build_sat, secp),
    +            Descriptor::Wsh(wsh) => match wsh.as_inner() {
    +                WshInner::Ms(ms) => Ok(ms.extract_policy(signers, build_sat, secp)?),
    +                WshInner::SortedMulti(ref keys) => make_sortedmulti(keys, signers, build_sat, secp),
                 },
    -            Descriptor::Bare(ms) => Ok(ms.as_inner().extract_policy(signers, build_sat, secp)?),
    +            Descriptor::Bare(ms) => Ok(ms.as_inner().extract_policy(signers, build_sat, secp)?),
             }
         }
     }
    @@ -2601,7 +2603,7 @@
             tprv: &str,
             path: &str,
             secp: &SecpCtx,
    -    ) -> (DescriptorKey<Ctx>, DescriptorKey<Ctx>, Fingerprint) {
    +    ) -> (DescriptorKey<Ctx>, DescriptorKey<Ctx>, Fingerprint) {
             let path = bip32::DerivationPath::from_str(path).unwrap();
             let tprv = bip32::ExtendedPrivKey::from_str(tprv).unwrap();
             let tpub = bip32::ExtendedPubKey::from_private(secp, &tprv);
    @@ -2630,7 +2632,7 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
    +            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
             );
             assert!(matches!(&policy.contribution, Satisfaction::None));
     
    @@ -2645,10 +2647,10 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
    +            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
             );
             assert!(
    -            matches!(&policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None)
    +            matches!(&policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None)
             );
         }
     
    @@ -2669,15 +2671,15 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
    -            && keys[0].fingerprint.unwrap() == fingerprint0
    -            && keys[1].fingerprint.unwrap() == fingerprint1)
    +            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
    +            && keys[0].fingerprint.unwrap() == fingerprint0
    +            && keys[1].fingerprint.unwrap() == fingerprint1)
             );
             // TODO should this be "Satisfaction::None" since we have no prv keys?
             // TODO should items and conditions not be empty?
             assert!(
    -            matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
    -            && m == &2usize
    +            matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
    +            && m == &2usize
                 && items.is_empty()
                 && conditions.is_empty()
                 )
    @@ -2700,15 +2702,15 @@
                 .unwrap()
                 .unwrap();
             assert!(
    -            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
    -            && keys[0].fingerprint.unwrap() == fingerprint0
    -            && keys[1].fingerprint.unwrap() == fingerprint1)
    +            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
    +            && keys[0].fingerprint.unwrap() == fingerprint0
    +            && keys[1].fingerprint.unwrap() == fingerprint1)
             );
     
             assert!(
    -            matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
    -             && m == &2usize
    -             && items.len() == 1
    +            matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
    +             && m == &2usize
    +             && items.len() == 1
                  && conditions.contains_key(&0)
                 )
             );
    @@ -2733,14 +2735,14 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Multisig { keys, threshold } if threshold == &1
    -            && keys[0].fingerprint.unwrap() == fingerprint0
    -            && keys[1].fingerprint.unwrap() == fingerprint1)
    +            matches!(&policy.item, Multisig { keys, threshold } if threshold == &1
    +            && keys[0].fingerprint.unwrap() == fingerprint0
    +            && keys[1].fingerprint.unwrap() == fingerprint1)
             );
             assert!(
    -            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
    -             && m == &1
    -             && items.len() == 2
    +            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
    +             && m == &1
    +             && items.len() == 2
                  && conditions.contains_key(&vec![0])
                  && conditions.contains_key(&vec![1])
                 )
    @@ -2765,15 +2767,15 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2
    -            && keys[0].fingerprint.unwrap() == fingerprint0
    -            && keys[1].fingerprint.unwrap() == fingerprint1)
    +            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2
    +            && keys[0].fingerprint.unwrap() == fingerprint0
    +            && keys[1].fingerprint.unwrap() == fingerprint1)
             );
     
             assert!(
    -            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
    -             && m == &2
    -             && items.len() == 2
    +            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
    +             && m == &2
    +             && items.len() == 2
                  && conditions.contains_key(&vec![0,1])
                 )
             );
    @@ -2798,7 +2800,7 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
    +            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
             );
             assert!(matches!(&policy.contribution, Satisfaction::None));
     
    @@ -2814,10 +2816,10 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
    +            matches!(&policy.item, Signature(pk_or_f) if pk_or_f.fingerprint.unwrap() == fingerprint)
             );
             assert!(
    -            matches!(&policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None)
    +            matches!(&policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None)
             );
         }
     
    @@ -2841,14 +2843,14 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Multisig { keys, threshold } if threshold == &1
    -            && keys[0].fingerprint.unwrap() == fingerprint0
    -            && keys[1].fingerprint.unwrap() == fingerprint1)
    +            matches!(&policy.item, Multisig { keys, threshold } if threshold == &1
    +            && keys[0].fingerprint.unwrap() == fingerprint0
    +            && keys[1].fingerprint.unwrap() == fingerprint1)
             );
             assert!(
    -            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
    -             && m == &1
    -             && items.len() == 2
    +            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
    +             && m == &1
    +             && items.len() == 2
                  && conditions.contains_key(&vec![0])
                  && conditions.contains_key(&vec![1])
                 )
    @@ -2884,16 +2886,16 @@
                 .unwrap();
     
             assert!(
    -            matches!(&policy.item, Thresh { items, threshold } if items.len() == 3 && threshold == &2)
    +            matches!(&policy.item, Thresh { items, threshold } if items.len() == 3 && threshold == &2)
             );
     
             assert!(
    -            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &3
    -             && m == &2
    -             && items.len() == 3
    +            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &3
    +             && m == &2
    +             && items.len() == 3
                  && conditions.get(&vec![0,1]).unwrap().iter().next().unwrap().csv.is_none()
    -             && conditions.get(&vec![0,2]).unwrap().iter().next().unwrap().csv == Some(sequence)
    -             && conditions.get(&vec![1,2]).unwrap().iter().next().unwrap().csv == Some(sequence)
    +             && conditions.get(&vec![0,2]).unwrap().iter().next().unwrap().csv == Some(sequence)
    +             && conditions.get(&vec![1,2]).unwrap().iter().next().unwrap().csv == Some(sequence)
                 )
             );
         }
    @@ -3058,9 +3060,9 @@
             //println!("{}", serde_json::to_string(&policy_alice_psbt).unwrap());
     
             assert!(
    -            matches!(&policy_alice_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
    -             && m == &2
    -             && items == &vec![0]
    +            matches!(&policy_alice_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
    +             && m == &2
    +             && items == &vec![0]
                 )
             );
     
    @@ -3072,9 +3074,9 @@
             //println!("{}", serde_json::to_string(&policy_bob_psbt).unwrap());
     
             assert!(
    -            matches!(&policy_bob_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
    -             && m == &2
    -             && items == &vec![1]
    +            matches!(&policy_bob_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
    +             && m == &2
    +             && items == &vec![1]
                 )
             );
     
    @@ -3084,9 +3086,9 @@
                 .unwrap()
                 .unwrap();
             assert!(
    -            matches!(&policy_alice_bob_psbt.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &2
    -             && m == &2
    -             && items == &vec![0, 1]
    +            matches!(&policy_alice_bob_psbt.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &2
    +             && m == &2
    +             && items == &vec![0, 1]
                 )
             );
         }
    @@ -3132,8 +3134,8 @@
                 .unwrap()
                 .unwrap();
             assert!(
    -            matches!(&policy.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
    -             && m == &2
    +            matches!(&policy.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
    +             && m == &2
                  && items.is_empty()
                 )
             );
    @@ -3150,9 +3152,9 @@
                 .unwrap()
                 .unwrap();
             assert!(
    -            matches!(&policy_expired.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
    -             && m == &2
    -             && items == &vec![0]
    +            matches!(&policy_expired.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
    +             && m == &2
    +             && items == &vec![0]
                 )
             );
             //println!("{}", serde_json::to_string(&policy_expired).unwrap());
    @@ -3170,9 +3172,9 @@
                 .unwrap()
                 .unwrap();
             assert!(
    -            matches!(&policy_expired_signed.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &3
    -             && m == &2
    -             && items == &vec![0, 1]
    +            matches!(&policy_expired_signed.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &3
    +             && m == &2
    +             && items == &vec![0, 1]
                 )
             );
             //println!("{}", serde_json::to_string(&policy_expired_signed).unwrap());
    @@ -3203,6 +3205,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/template.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/template.rs.html index 31d6c7edbe..0988411021 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/template.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/descriptor/template.rs.html @@ -1,4 +1,6 @@ -template.rs - source
      1
    +template.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -777,7 +779,7 @@
     /// ```
     pub trait DescriptorTemplate {
         /// Build the complete descriptor
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError>;
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError>;
     }
     
     /// Turns a [`DescriptorTemplate`] into a valid wallet descriptor by calling its
    @@ -787,7 +789,7 @@
             self,
             secp: &SecpCtx,
             network: Network,
    -    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
    +    ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> {
             self.build()?.into_wallet_descriptor(secp, network)
         }
     }
    @@ -821,7 +823,7 @@
     pub struct P2Pkh<K: IntoDescriptorKey<Legacy>>(pub K);
     
     impl<K: IntoDescriptorKey<Legacy>> DescriptorTemplate for P2Pkh<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             descriptor!(pkh(self.0))
         }
     }
    @@ -856,7 +858,7 @@
     pub struct P2Wpkh_P2Sh<K: IntoDescriptorKey<Segwitv0>>(pub K);
     
     impl<K: IntoDescriptorKey<Segwitv0>> DescriptorTemplate for P2Wpkh_P2Sh<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             descriptor!(sh(wpkh(self.0)))
         }
     }
    @@ -890,7 +892,7 @@
     pub struct P2Wpkh<K: IntoDescriptorKey<Segwitv0>>(pub K);
     
     impl<K: IntoDescriptorKey<Segwitv0>> DescriptorTemplate for P2Wpkh<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             descriptor!(wpkh(self.0))
         }
     }
    @@ -926,7 +928,7 @@
     pub struct Bip44<K: DerivableKey<Legacy>>(pub K, pub KeychainKind);
     
     impl<K: DerivableKey<Legacy>> DescriptorTemplate for Bip44<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             P2Pkh(legacy::make_bipxx_private(44, self.0, self.1)?).build()
         }
     }
    @@ -966,7 +968,7 @@
     pub struct Bip44Public<K: DerivableKey<Legacy>>(pub K, pub bip32::Fingerprint, pub KeychainKind);
     
     impl<K: DerivableKey<Legacy>> DescriptorTemplate for Bip44Public<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             P2Pkh(legacy::make_bipxx_public(44, self.0, self.1, self.2)?).build()
         }
     }
    @@ -1002,7 +1004,7 @@
     pub struct Bip49<K: DerivableKey<Segwitv0>>(pub K, pub KeychainKind);
     
     impl<K: DerivableKey<Segwitv0>> DescriptorTemplate for Bip49<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             P2Wpkh_P2Sh(segwit_v0::make_bipxx_private(49, self.0, self.1)?).build()
         }
     }
    @@ -1042,7 +1044,7 @@
     pub struct Bip49Public<K: DerivableKey<Segwitv0>>(pub K, pub bip32::Fingerprint, pub KeychainKind);
     
     impl<K: DerivableKey<Segwitv0>> DescriptorTemplate for Bip49Public<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             P2Wpkh_P2Sh(segwit_v0::make_bipxx_public(49, self.0, self.1, self.2)?).build()
         }
     }
    @@ -1078,7 +1080,7 @@
     pub struct Bip84<K: DerivableKey<Segwitv0>>(pub K, pub KeychainKind);
     
     impl<K: DerivableKey<Segwitv0>> DescriptorTemplate for Bip84<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             P2Wpkh(segwit_v0::make_bipxx_private(84, self.0, self.1)?).build()
         }
     }
    @@ -1118,13 +1120,13 @@
     pub struct Bip84Public<K: DerivableKey<Segwitv0>>(pub K, pub bip32::Fingerprint, pub KeychainKind);
     
     impl<K: DerivableKey<Segwitv0>> DescriptorTemplate for Bip84Public<K> {
    -    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
    +    fn build(self) -> Result<DescriptorTemplateOut, DescriptorError> {
             P2Wpkh(segwit_v0::make_bipxx_public(84, self.0, self.1, self.2)?).build()
         }
     }
     
     macro_rules! expand_make_bipxx {
    -    ( $mod_name:ident, $ctx:ty ) => {
    +    ( $mod_name:ident, $ctx:ty ) => {
             mod $mod_name {
                 use super::*;
     
    @@ -1132,17 +1134,17 @@
                     bip: u32,
                     key: K,
                     keychain: KeychainKind,
    -            ) -> Result<impl IntoDescriptorKey<$ctx>, DescriptorError> {
    +            ) -> Result<impl IntoDescriptorKey<$ctx>, DescriptorError> {
                     let mut derivation_path = Vec::with_capacity(4);
                     derivation_path.push(bip32::ChildNumber::from_hardened_idx(bip)?);
                     derivation_path.push(bip32::ChildNumber::from_hardened_idx(0)?);
                     derivation_path.push(bip32::ChildNumber::from_hardened_idx(0)?);
     
                     match keychain {
    -                    KeychainKind::External => {
    +                    KeychainKind::External => {
                             derivation_path.push(bip32::ChildNumber::from_normal_idx(0)?)
                         }
    -                    KeychainKind::Internal => {
    +                    KeychainKind::Internal => {
                             derivation_path.push(bip32::ChildNumber::from_normal_idx(1)?)
                         }
                     };
    @@ -1156,10 +1158,10 @@
                     key: K,
                     parent_fingerprint: bip32::Fingerprint,
                     keychain: KeychainKind,
    -            ) -> Result<impl IntoDescriptorKey<$ctx>, DescriptorError> {
    +            ) -> Result<impl IntoDescriptorKey<$ctx>, DescriptorError> {
                     let derivation_path: bip32::DerivationPath = match keychain {
    -                    KeychainKind::External => vec![bip32::ChildNumber::from_normal_idx(0)?].into(),
    -                    KeychainKind::Internal => vec![bip32::ChildNumber::from_normal_idx(1)?].into(),
    +                    KeychainKind::External => vec![bip32::ChildNumber::from_normal_idx(0)?].into(),
    +                    KeychainKind::Internal => vec![bip32::ChildNumber::from_normal_idx(1)?].into(),
                     };
     
                     let source_path = bip32::DerivationPath::from(vec![
    @@ -1451,6 +1453,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/error.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/error.rs.html index d6c5f36fbc..6afb717d0c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/error.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/error.rs.html @@ -1,4 +1,6 @@ -error.rs - source
      1
    +error.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -343,7 +345,7 @@
         Hex(bitcoin::hashes::hex::Error),
         /// Partially signed bitcoin transaction error
         Psbt(bitcoin::util::psbt::Error),
    -    /// Partially signed bitcoin transaction parseerror
    +    /// Partially signed bitcoin transaction parse error
         PsbtParse(bitcoin::util::psbt::PsbtParseError),
     
         //KeyMismatch(bitcoin::secp256k1::PublicKey, bitcoin::secp256k1::PublicKey),
    @@ -367,14 +369,14 @@
         Sled(sled::Error),
         #[cfg(feature = "rpc")]
         /// Rpc client error
    -    Rpc(core_rpc::Error),
    +    Rpc(bitcoincore_rpc::Error),
         #[cfg(feature = "sqlite")]
         /// Rusqlite client error
         Rusqlite(rusqlite::Error),
     }
     
     impl fmt::Display for Error {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -382,12 +384,12 @@
     impl std::error::Error for Error {}
     
     macro_rules! impl_error {
    -    ( $from:ty, $to:ident ) => {
    +    ( $from:ty, $to:ident ) => {
             impl_error!($from, $to, Error);
         };
    -    ( $from:ty, $to:ident, $impl_for:ty ) => {
    +    ( $from:ty, $to:ident, $impl_for:ty ) => {
             impl std::convert::From<$from> for $impl_for {
    -            fn from(err: $from) -> Self {
    +            fn from(err: $from) -> Self {
                     <$impl_for>::$to(err)
                 }
             }
    @@ -400,12 +402,12 @@
     impl_error!(wallet::signer::SignerError, Signer);
     
     impl From<crate::keys::KeyError> for Error {
    -    fn from(key_error: crate::keys::KeyError) -> Error {
    +    fn from(key_error: crate::keys::KeyError) -> Error {
             match key_error {
    -            crate::keys::KeyError::Miniscript(inner) => Error::Miniscript(inner),
    -            crate::keys::KeyError::Bip32(inner) => Error::Bip32(inner),
    -            crate::keys::KeyError::InvalidChecksum => Error::ChecksumMismatch,
    -            e => Error::Key(e),
    +            crate::keys::KeyError::Miniscript(inner) => Error::Miniscript(inner),
    +            crate::keys::KeyError::Bip32(inner) => Error::Bip32(inner),
    +            crate::keys::KeyError::InvalidChecksum => Error::ChecksumMismatch,
    +            e => Error::Key(e),
             }
         }
     }
    @@ -424,37 +426,36 @@
     #[cfg(feature = "key-value-db")]
     impl_error!(sled::Error, Sled);
     #[cfg(feature = "rpc")]
    -impl_error!(core_rpc::Error, Rpc);
    +impl_error!(bitcoincore_rpc::Error, Rpc);
     #[cfg(feature = "sqlite")]
     impl_error!(rusqlite::Error, Rusqlite);
     
     #[cfg(feature = "compact_filters")]
     impl From<crate::blockchain::compact_filters::CompactFiltersError> for Error {
    -    fn from(other: crate::blockchain::compact_filters::CompactFiltersError) -> Self {
    +    fn from(other: crate::blockchain::compact_filters::CompactFiltersError) -> Self {
             match other {
    -            crate::blockchain::compact_filters::CompactFiltersError::Global(e) => *e,
    -            err => Error::CompactFilters(err),
    +            crate::blockchain::compact_filters::CompactFiltersError::Global(e) => *e,
    +            err => Error::CompactFilters(err),
             }
         }
     }
     
     #[cfg(feature = "verify")]
     impl From<crate::wallet::verify::VerifyError> for Error {
    -    fn from(other: crate::wallet::verify::VerifyError) -> Self {
    +    fn from(other: crate::wallet::verify::VerifyError) -> Self {
             match other {
    -            crate::wallet::verify::VerifyError::Global(inner) => *inner,
    -            err => Error::Verification(err),
    +            crate::wallet::verify::VerifyError::Global(inner) => *inner,
    +            err => Error::Verification(err),
             }
         }
     }
     
     #[cfg(feature = "esplora")]
     impl From<crate::blockchain::esplora::EsploraError> for Error {
    -    fn from(other: crate::blockchain::esplora::EsploraError) -> Self {
    +    fn from(other: crate::blockchain::esplora::EsploraError) -> Self {
             Error::Esplora(Box::new(other))
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/bip39.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/bip39.rs.html index 3cf8935dbd..b0257554bc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/bip39.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/bip39.rs.html @@ -1,4 +1,6 @@ -bip39.rs - source
      1
    +bip39.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -188,6 +190,24 @@
     188
     189
     190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -209,7 +229,23 @@
     
     use miniscript::ScriptContext;
     
    -pub use bip39::{Language, Mnemonic, MnemonicType, Seed};
    +pub use bip39::{Language, Mnemonic};
    +
    +type Seed = [u8; 64];
    +
    +/// Type describing entropy length (aka word count) in the mnemonic
    +pub enum WordCount {
    +    /// 12 words mnemonic (128 bits entropy)
    +    Words12 = 128,
    +    /// 15 words mnemonic (160 bits entropy)
    +    Words15 = 160,
    +    /// 18 words mnemonic (192 bits entropy)
    +    Words18 = 192,
    +    /// 21 words mnemonic (224 bits entropy)
    +    Words21 = 224,
    +    /// 24 words mnemonic (256 bits entropy)
    +    Words24 = 256,
    +}
     
     use super::{
         any_network, DerivableKey, DescriptorKey, ExtendedKey, GeneratableKey, GeneratedKey, KeyError,
    @@ -217,7 +253,7 @@
     
     fn set_valid_on_any_network<Ctx: ScriptContext>(
         descriptor_key: DescriptorKey<Ctx>,
    -) -> DescriptorKey<Ctx> {
    +) -> DescriptorKey<Ctx> {
         // We have to pick one network to build the xprv, but since the bip39 standard doesn't
         // encode the network, the xprv we create is actually valid everywhere. So we override the
         // valid networks with `any_network()`.
    @@ -229,15 +265,15 @@
     
     #[cfg_attr(docsrs, doc(cfg(feature = "keys-bip39")))]
     impl<Ctx: ScriptContext> DerivableKey<Ctx> for Seed {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    -        Ok(bip32::ExtendedPrivKey::new_master(Network::Bitcoin, &self.as_bytes())?.into())
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +        Ok(bip32::ExtendedPrivKey::new_master(Network::Bitcoin, &self[..])?.into())
         }
     
         fn into_descriptor_key(
             self,
             source: Option<bip32::KeySource>,
             derivation_path: bip32::DerivationPath,
    -    ) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    ) -> Result<DescriptorKey<Ctx>, KeyError> {
             let descriptor_key = self
                 .into_extended_key()?
                 .into_descriptor_key(source, derivation_path)?;
    @@ -248,9 +284,9 @@
     
     #[cfg_attr(docsrs, doc(cfg(feature = "keys-bip39")))]
     impl<Ctx: ScriptContext> DerivableKey<Ctx> for MnemonicWithPassphrase {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
             let (mnemonic, passphrase) = self;
    -        let seed = Seed::new(&mnemonic, passphrase.as_deref().unwrap_or(""));
    +        let seed: Seed = mnemonic.to_seed(passphrase.as_deref().unwrap_or(""));
     
             seed.into_extended_key()
         }
    @@ -259,7 +295,7 @@
             self,
             source: Option<bip32::KeySource>,
             derivation_path: bip32::DerivationPath,
    -    ) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    ) -> Result<DescriptorKey<Ctx>, KeyError> {
             let descriptor_key = self
                 .into_extended_key()?
                 .into_descriptor_key(source, derivation_path)?;
    @@ -270,7 +306,7 @@
     
     #[cfg_attr(docsrs, doc(cfg(feature = "keys-bip39")))]
     impl<Ctx: ScriptContext> DerivableKey<Ctx> for Mnemonic {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
             (self, None).into_extended_key()
         }
     
    @@ -278,7 +314,7 @@
             self,
             source: Option<bip32::KeySource>,
             derivation_path: bip32::DerivationPath,
    -    ) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    ) -> Result<DescriptorKey<Ctx>, KeyError> {
             let descriptor_key = self
                 .into_extended_key()?
                 .into_descriptor_key(source, derivation_path)?;
    @@ -291,15 +327,15 @@
     impl<Ctx: ScriptContext> GeneratableKey<Ctx> for Mnemonic {
         type Entropy = [u8; 32];
     
    -    type Options = (MnemonicType, Language);
    -    type Error = Option<bip39::ErrorKind>;
    +    type Options = (WordCount, Language);
    +    type Error = Option<bip39::Error>;
     
         fn generate_with_entropy(
    -        (mnemonic_type, language): Self::Options,
    +        (word_count, language): Self::Options,
             entropy: Self::Entropy,
    -    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    -        let entropy = &entropy.as_ref()[..(mnemonic_type.entropy_bits() / 8)];
    -        let mnemonic = Mnemonic::from_entropy(entropy, language).map_err(|e| e.downcast().ok())?;
    +    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    +        let entropy = &entropy.as_ref()[..(word_count as usize / 8)];
    +        let mnemonic = Mnemonic::from_entropy_in(language, entropy)?;
     
             Ok(GeneratedKey::new(mnemonic, any_network()))
         }
    @@ -311,15 +347,17 @@
     
         use bitcoin::util::bip32;
     
    -    use bip39::{Language, Mnemonic, MnemonicType};
    +    use bip39::{Language, Mnemonic};
     
         use crate::keys::{any_network, GeneratableKey, GeneratedKey};
     
    +    use super::WordCount;
    +
         #[test]
         fn test_keys_bip39_mnemonic() {
             let mnemonic =
                 "aim bunker wash balance finish force paper analyst cabin spoon stable organ";
    -        let mnemonic = Mnemonic::from_phrase(mnemonic, Language::English).unwrap();
    +        let mnemonic = Mnemonic::parse_in(Language::English, mnemonic).unwrap();
             let path = bip32::DerivationPath::from_str("m/44'/0'/0'/0").unwrap();
     
             let key = (mnemonic, path);
    @@ -333,7 +371,7 @@
         fn test_keys_bip39_mnemonic_passphrase() {
             let mnemonic =
                 "aim bunker wash balance finish force paper analyst cabin spoon stable organ";
    -        let mnemonic = Mnemonic::from_phrase(mnemonic, Language::English).unwrap();
    +        let mnemonic = Mnemonic::parse_in(Language::English, mnemonic).unwrap();
             let path = bip32::DerivationPath::from_str("m/44'/0'/0'/0").unwrap();
     
             let key = ((mnemonic, Some("passphrase".into())), path);
    @@ -347,7 +385,7 @@
         fn test_keys_generate_bip39() {
             let generated_mnemonic: GeneratedKey<_, miniscript::Segwitv0> =
                 Mnemonic::generate_with_entropy(
    -                (MnemonicType::Words12, Language::English),
    +                (WordCount::Words12, Language::English),
                     crate::keys::test::TEST_ENTROPY,
                 )
                 .unwrap();
    @@ -359,7 +397,7 @@
     
             let generated_mnemonic: GeneratedKey<_, miniscript::Segwitv0> =
                 Mnemonic::generate_with_entropy(
    -                (MnemonicType::Words24, Language::English),
    +                (WordCount::Words24, Language::English),
                     crate::keys::test::TEST_ENTROPY,
                 )
                 .unwrap();
    @@ -370,15 +408,14 @@
         #[test]
         fn test_keys_generate_bip39_random() {
             let generated_mnemonic: GeneratedKey<_, miniscript::Segwitv0> =
    -            Mnemonic::generate((MnemonicType::Words12, Language::English)).unwrap();
    +            Mnemonic::generate((WordCount::Words12, Language::English)).unwrap();
             assert_eq!(generated_mnemonic.valid_networks, any_network());
     
             let generated_mnemonic: GeneratedKey<_, miniscript::Segwitv0> =
    -            Mnemonic::generate((MnemonicType::Words24, Language::English)).unwrap();
    +            Mnemonic::generate((WordCount::Words24, Language::English)).unwrap();
             assert_eq!(generated_mnemonic.valid_networks, any_network());
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/mod.rs.html index 7dc8e48126..7056fdb442 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/keys/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -932,6 +934,46 @@
     932
     933
     934
    +935
    +936
    +937
    +938
    +939
    +940
    +941
    +942
    +943
    +944
    +945
    +946
    +947
    +948
    +949
    +950
    +951
    +952
    +953
    +954
    +955
    +956
    +957
    +958
    +959
    +960
    +961
    +962
    +963
    +964
    +965
    +966
    +967
    +968
    +969
    +970
    +971
    +972
    +973
    +974
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -975,7 +1017,7 @@
     pub type ValidNetworks = HashSet<Network>;
     
     /// Create a set containing mainnet, testnet and regtest
    -pub fn any_network() -> ValidNetworks {
    +pub fn any_network() -> ValidNetworks {
         vec![
             Network::Bitcoin,
             Network::Testnet,
    @@ -986,17 +1028,17 @@
         .collect()
     }
     /// Create a set only containing mainnet
    -pub fn mainnet_network() -> ValidNetworks {
    +pub fn mainnet_network() -> ValidNetworks {
         vec![Network::Bitcoin].into_iter().collect()
     }
     /// Create a set containing testnet and regtest
    -pub fn test_networks() -> ValidNetworks {
    +pub fn test_networks() -> ValidNetworks {
         vec![Network::Testnet, Network::Regtest, Network::Signet]
             .into_iter()
             .collect()
     }
     /// Compute the intersection of two sets
    -pub fn merge_networks(a: &ValidNetworks, b: &ValidNetworks) -> ValidNetworks {
    +pub fn merge_networks(a: &ValidNetworks, b: &ValidNetworks) -> ValidNetworks {
         a.intersection(b).cloned().collect()
     }
     
    @@ -1011,20 +1053,20 @@
     
     impl<Ctx: ScriptContext> DescriptorKey<Ctx> {
         /// Create an instance given a public key and a set of valid networks
    -    pub fn from_public(public: DescriptorPublicKey, networks: ValidNetworks) -> Self {
    +    pub fn from_public(public: DescriptorPublicKey, networks: ValidNetworks) -> Self {
             DescriptorKey::Public(public, networks, PhantomData)
         }
     
         /// Create an instance given a secret key and a set of valid networks
    -    pub fn from_secret(secret: DescriptorSecretKey, networks: ValidNetworks) -> Self {
    +    pub fn from_secret(secret: DescriptorSecretKey, networks: ValidNetworks) -> Self {
             DescriptorKey::Secret(secret, networks, PhantomData)
         }
     
         /// Override the computed set of valid networks
    -    pub fn override_valid_networks(self, networks: ValidNetworks) -> Self {
    +    pub fn override_valid_networks(self, networks: ValidNetworks) -> Self {
             match self {
    -            DescriptorKey::Public(key, _, _) => DescriptorKey::Public(key, networks, PhantomData),
    -            DescriptorKey::Secret(key, _, _) => DescriptorKey::Secret(key, networks, PhantomData),
    +            DescriptorKey::Public(key, _, _) => DescriptorKey::Public(key, networks, PhantomData),
    +            DescriptorKey::Secret(key, _, _) => DescriptorKey::Secret(key, networks, PhantomData),
             }
         }
     
    @@ -1035,12 +1077,12 @@
         pub fn extract(
             self,
             secp: &SecpCtx,
    -    ) -> Result<(DescriptorPublicKey, KeyMap, ValidNetworks), KeyError> {
    +    ) -> Result<(DescriptorPublicKey, KeyMap, ValidNetworks), KeyError> {
             match self {
    -            DescriptorKey::Public(public, valid_networks, _) => {
    +            DescriptorKey::Public(public, valid_networks, _) => {
                     Ok((public, KeyMap::default(), valid_networks))
                 }
    -            DescriptorKey::Secret(secret, valid_networks, _) => {
    +            DescriptorKey::Secret(secret, valid_networks, _) => {
                     let mut key_map = KeyMap::with_capacity(1);
     
                     let public = secret
    @@ -1065,38 +1107,38 @@
     
     impl ScriptContextEnum {
         /// Returns whether the script context is [`ScriptContextEnum::Legacy`]
    -    pub fn is_legacy(&self) -> bool {
    -        self == &ScriptContextEnum::Legacy
    +    pub fn is_legacy(&self) -> bool {
    +        self == &ScriptContextEnum::Legacy
         }
     
         /// Returns whether the script context is [`ScriptContextEnum::Segwitv0`]
    -    pub fn is_segwit_v0(&self) -> bool {
    -        self == &ScriptContextEnum::Segwitv0
    +    pub fn is_segwit_v0(&self) -> bool {
    +        self == &ScriptContextEnum::Segwitv0
         }
     }
     
     /// Trait that adds extra useful methods to [`ScriptContext`]s
     pub trait ExtScriptContext: ScriptContext {
         /// Returns the [`ScriptContext`] as a [`ScriptContextEnum`]
    -    fn as_enum() -> ScriptContextEnum;
    +    fn as_enum() -> ScriptContextEnum;
     
         /// Returns whether the script context is [`Legacy`](miniscript::Legacy)
    -    fn is_legacy() -> bool {
    +    fn is_legacy() -> bool {
             Self::as_enum().is_legacy()
         }
     
         /// Returns whether the script context is [`Segwitv0`](miniscript::Segwitv0)
    -    fn is_segwit_v0() -> bool {
    +    fn is_segwit_v0() -> bool {
             Self::as_enum().is_segwit_v0()
         }
     }
     
     impl<Ctx: ScriptContext + 'static> ExtScriptContext for Ctx {
    -    fn as_enum() -> ScriptContextEnum {
    +    fn as_enum() -> ScriptContextEnum {
             match TypeId::of::<Ctx>() {
    -            t if t == TypeId::of::<miniscript::Legacy>() => ScriptContextEnum::Legacy,
    -            t if t == TypeId::of::<miniscript::Segwitv0>() => ScriptContextEnum::Segwitv0,
    -            _ => unimplemented!("Unknown ScriptContext type"),
    +            t if t == TypeId::of::<miniscript::Legacy>() => ScriptContextEnum::Legacy,
    +            t if t == TypeId::of::<miniscript::Segwitv0>() => ScriptContextEnum::Segwitv0,
    +            _ => unimplemented!("Unknown ScriptContext type"),
             }
         }
     }
    @@ -1222,7 +1264,7 @@
     /// ```
     pub trait IntoDescriptorKey<Ctx: ScriptContext>: Sized {
         /// Turn the key into a [`DescriptorKey`] within the requested [`ScriptContext`]
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError>;
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError>;
     }
     
     /// Enum for extended keys that can be either `xprv` or `xpub`
    @@ -1240,22 +1282,23 @@
     
     impl<Ctx: ScriptContext> ExtendedKey<Ctx> {
         /// Return whether or not the key contains the private data
    -    pub fn has_secret(&self) -> bool {
    +    pub fn has_secret(&self) -> bool {
             match self {
    -            ExtendedKey::Private(_) => true,
    -            ExtendedKey::Public(_) => false,
    +            ExtendedKey::Private(_) => true,
    +            ExtendedKey::Public(_) => false,
             }
         }
     
         /// Transform the [`ExtendedKey`] into an [`ExtendedPrivKey`](bip32::ExtendedPrivKey) for the
         /// given [`Network`], if the key contains the private data
    -    pub fn into_xprv(self, network: Network) -> Option<bip32::ExtendedPrivKey> {
    +    pub fn into_xprv(self, network: Network) -> Option<bip32::ExtendedPrivKey> {
             match self {
    -            ExtendedKey::Private((mut xprv, _)) => {
    +            ExtendedKey::Private((mut xprv, _)) => {
                     xprv.network = network;
    +                xprv.private_key.network = network;
                     Some(xprv)
                 }
    -            ExtendedKey::Public(_) => None,
    +            ExtendedKey::Public(_) => None,
             }
         }
     
    @@ -1265,10 +1308,10 @@
             self,
             network: bitcoin::Network,
             secp: &Secp256k1<C>,
    -    ) -> bip32::ExtendedPubKey {
    +    ) -> bip32::ExtendedPubKey {
             let mut xpub = match self {
    -            ExtendedKey::Private((xprv, _)) => bip32::ExtendedPubKey::from_private(secp, &xprv),
    -            ExtendedKey::Public((xpub, _)) => xpub,
    +            ExtendedKey::Private((xprv, _)) => bip32::ExtendedPubKey::from_private(secp, &xprv),
    +            ExtendedKey::Public((xpub, _)) => xpub,
             };
     
             xpub.network = network;
    @@ -1277,20 +1320,20 @@
     }
     
     impl<Ctx: ScriptContext> From<bip32::ExtendedPubKey> for ExtendedKey<Ctx> {
    -    fn from(xpub: bip32::ExtendedPubKey) -> Self {
    +    fn from(xpub: bip32::ExtendedPubKey) -> Self {
             ExtendedKey::Public((xpub, PhantomData))
         }
     }
     
     impl<Ctx: ScriptContext> From<bip32::ExtendedPrivKey> for ExtendedKey<Ctx> {
    -    fn from(xprv: bip32::ExtendedPrivKey) -> Self {
    +    fn from(xprv: bip32::ExtendedPrivKey) -> Self {
             ExtendedKey::Private((xprv, PhantomData))
         }
     }
     
     /// Trait for keys that can be derived.
     ///
    -/// When extra metadata are provided, a [`DerivableKey`] can be transofrmed into a
    +/// When extra metadata are provided, a [`DerivableKey`] can be transformed into a
     /// [`DescriptorKey`]: the trait [`IntoDescriptorKey`] is automatically implemented
     /// for `(DerivableKey, DerivationPath)` and
     /// `(DerivableKey, KeySource, DerivationPath)` tuples.
    @@ -1394,9 +1437,9 @@ use bdk::keys::bip39::{Mnemonic, Language};
     
     # fn main() -> Result<(), Box<dyn std::error::Error>> {
     let xkey: ExtendedKey =
    -    Mnemonic::from_phrase(
    +    Mnemonic::parse_in(
    +        Language::English,
             "jelly crash boy whisper mouse ecology tuna soccer memory million news short",
    -        Language::English
         )?
         .into_extended_key()?;
     let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
    @@ -1404,7 +1447,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     ```
     "##
         )]
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError>;
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError>;
     
         /// Consume `self` and turn it into a [`DescriptorKey`] by adding the extra metadata, such as
         /// key origin and derivation path
    @@ -1412,16 +1455,16 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
             self,
             origin: Option<bip32::KeySource>,
             derivation_path: bip32::DerivationPath,
    -    ) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    ) -> Result<DescriptorKey<Ctx>, KeyError> {
             match self.into_extended_key()? {
    -            ExtendedKey::Private((xprv, _)) => DescriptorSecretKey::XPrv(DescriptorXKey {
    +            ExtendedKey::Private((xprv, _)) => DescriptorSecretKey::XPrv(DescriptorXKey {
                     origin,
                     xkey: xprv,
                     derivation_path,
                     wildcard: Wildcard::Unhardened,
                 })
                 .into_descriptor_key(),
    -            ExtendedKey::Public((xpub, _)) => DescriptorPublicKey::XPub(DescriptorXKey {
    +            ExtendedKey::Public((xpub, _)) => DescriptorPublicKey::XPub(DescriptorXKey {
                     origin,
                     xkey: xpub,
                     derivation_path,
    @@ -1434,19 +1477,19 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     
     /// Identity conversion
     impl<Ctx: ScriptContext> DerivableKey<Ctx> for ExtendedKey<Ctx> {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
             Ok(self)
         }
     }
     
     impl<Ctx: ScriptContext> DerivableKey<Ctx> for bip32::ExtendedPubKey {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
             Ok(self.into())
         }
     }
     
     impl<Ctx: ScriptContext> DerivableKey<Ctx> for bip32::ExtendedPrivKey {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
             Ok(self.into())
         }
     }
    @@ -1459,7 +1502,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     }
     
     impl<K, Ctx: ScriptContext> GeneratedKey<K, Ctx> {
    -    fn new(key: K, valid_networks: ValidNetworks) -> Self {
    +    fn new(key: K, valid_networks: ValidNetworks) -> Self {
             GeneratedKey {
                 key,
                 valid_networks,
    @@ -1468,7 +1511,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         }
     
         /// Consumes `self` and returns the key
    -    pub fn into_key(self) -> K {
    +    pub fn into_key(self) -> K {
             self.key
         }
     }
    @@ -1476,7 +1519,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     impl<K, Ctx: ScriptContext> Deref for GeneratedKey<K, Ctx> {
         type Target = K;
     
    -    fn deref(&self) -> &Self::Target {
    +    fn deref(&self) -> &Self::Target {
             &self.key
         }
     }
    @@ -1488,7 +1531,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         Ctx: ScriptContext,
         K: DerivableKey<Ctx>,
     {
    -    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
    +    fn into_extended_key(self) -> Result<ExtendedKey<Ctx>, KeyError> {
             self.key.into_extended_key()
         }
     
    @@ -1496,7 +1539,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
             self,
             origin: Option<bip32::KeySource>,
             derivation_path: bip32::DerivationPath,
    -    ) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    ) -> Result<DescriptorKey<Ctx>, KeyError> {
             let descriptor_key = self.key.into_descriptor_key(origin, derivation_path)?;
             Ok(descriptor_key.override_valid_networks(self.valid_networks))
         }
    @@ -1509,7 +1552,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         Ctx: ScriptContext,
         K: IntoDescriptorKey<Ctx>,
     {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             let desc_key = self.key.into_descriptor_key()?;
             Ok(desc_key.override_valid_networks(self.valid_networks))
         }
    @@ -1536,10 +1579,10 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         fn generate_with_entropy(
             options: Self::Options,
             entropy: Self::Entropy,
    -    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error>;
    +    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error>;
     
         /// Generate a key given the options with a random entropy
    -    fn generate(options: Self::Options) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    +    fn generate(options: Self::Options) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
             use rand::{thread_rng, Rng};
     
             let mut entropy = Self::Entropy::default();
    @@ -1559,12 +1602,12 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         /// Generate a key with the default options and a given entropy
         fn generate_with_entropy_default(
             entropy: Self::Entropy,
    -    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    +    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
             Self::generate_with_entropy(Default::default(), entropy)
         }
     
         /// Generate a key with the default options and a random entropy
    -    fn generate_default() -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    +    fn generate_default() -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
             Self::generate(Default::default())
         }
     }
    @@ -1588,7 +1631,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         fn generate_with_entropy(
             _: Self::Options,
             entropy: Self::Entropy,
    -    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    +    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
             // pick a arbitrary network here, but say that we support all of them
             let xprv = bip32::ExtendedPrivKey::new_master(Network::Bitcoin, entropy.as_ref())?;
             Ok(GeneratedKey::new(xprv, any_network()))
    @@ -1605,7 +1648,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     }
     
     impl Default for PrivateKeyGenerateOptions {
    -    fn default() -> Self {
    +    fn default() -> Self {
             PrivateKeyGenerateOptions { compressed: true }
         }
     }
    @@ -1619,7 +1662,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         fn generate_with_entropy(
             options: Self::Options,
             entropy: Self::Entropy,
    -    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
    +    ) -> Result<GeneratedKey<Self, Ctx>, Self::Error> {
             // pick a arbitrary network here, but say that we support all of them
             let key = secp256k1::SecretKey::from_slice(&entropy)?;
             let private_key = PrivateKey {
    @@ -1635,7 +1678,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     impl<Ctx: ScriptContext, T: DerivableKey<Ctx>> IntoDescriptorKey<Ctx>
         for (T, bip32::DerivationPath)
     {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             self.0.into_descriptor_key(None, self.1)
         }
     }
    @@ -1643,7 +1686,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     impl<Ctx: ScriptContext, T: DerivableKey<Ctx>> IntoDescriptorKey<Ctx>
         for (T, bip32::KeySource, bip32::DerivationPath)
     {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             self.0.into_descriptor_key(Some(self.1), self.2)
         }
     }
    @@ -1651,7 +1694,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     fn expand_multi_keys<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
         pks: Vec<Pk>,
         secp: &SecpCtx,
    -) -> Result<(Vec<DescriptorPublicKey>, KeyMap, ValidNetworks), KeyError> {
    +) -> Result<(Vec<DescriptorPublicKey>, KeyMap, ValidNetworks), KeyError> {
         let (pks, key_maps_networks): (Vec<_>, Vec<_>) = pks
             .into_iter()
             .map(|key| key.into_descriptor_key()?.extract(secp))
    @@ -1678,11 +1721,11 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     pub fn make_pk<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
         descriptor_key: Pk,
         secp: &SecpCtx,
    -) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
    +) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
         let (key, key_map, valid_networks) = descriptor_key.into_descriptor_key()?.extract(secp)?;
         let minisc = Miniscript::from_ast(Terminal::PkK(key))?;
     
    -    minisc.check_minsicript()?;
    +    minisc.check_miniscript()?;
     
         Ok((minisc, key_map, valid_networks))
     }
    @@ -1692,11 +1735,11 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     pub fn make_pkh<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
         descriptor_key: Pk,
         secp: &SecpCtx,
    -) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
    +) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
         let (key, key_map, valid_networks) = descriptor_key.into_descriptor_key()?.extract(secp)?;
         let minisc = Miniscript::from_ast(Terminal::PkH(key))?;
     
    -    minisc.check_minsicript()?;
    +    minisc.check_miniscript()?;
     
         Ok((minisc, key_map, valid_networks))
     }
    @@ -1707,11 +1750,11 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         thresh: usize,
         pks: Vec<Pk>,
         secp: &SecpCtx,
    -) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
    +) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
         let (pks, key_map, valid_networks) = expand_multi_keys(pks, secp)?;
         let minisc = Miniscript::from_ast(Terminal::Multi(thresh, pks))?;
     
    -    minisc.check_minsicript()?;
    +    minisc.check_miniscript()?;
     
         Ok((minisc, key_map, valid_networks))
     }
    @@ -1723,14 +1766,14 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
         pks: Vec<Pk>,
         build_desc: F,
         secp: &SecpCtx,
    -) -> Result<(Descriptor<DescriptorPublicKey>, KeyMap, ValidNetworks), DescriptorError>
    +) -> Result<(Descriptor<DescriptorPublicKey>, KeyMap, ValidNetworks), DescriptorError>
     where
         Pk: IntoDescriptorKey<Ctx>,
         Ctx: ScriptContext,
         F: Fn(
             usize,
             Vec<DescriptorPublicKey>,
    -    ) -> Result<(Descriptor<DescriptorPublicKey>, PhantomData<Ctx>), DescriptorError>,
    +    ) -> Result<(Descriptor<DescriptorPublicKey>, PhantomData<Ctx>), DescriptorError>,
     {
         let (pks, key_map, valid_networks) = expand_multi_keys(pks, secp)?;
         let descriptor = build_desc(thresh, pks)?.0;
    @@ -1740,21 +1783,21 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     
     /// The "identity" conversion is used internally by some `bdk::fragment`s
     impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorKey<Ctx> {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             Ok(self)
         }
     }
     
     impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorPublicKey {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             let networks = match self {
    -            DescriptorPublicKey::SinglePub(_) => any_network(),
    +            DescriptorPublicKey::SinglePub(_) => any_network(),
                 DescriptorPublicKey::XPub(DescriptorXKey { xkey, .. })
    -                if xkey.network == Network::Bitcoin =>
    +                if xkey.network == Network::Bitcoin =>
                 {
                     mainnet_network()
                 }
    -            _ => test_networks(),
    +            _ => test_networks(),
             };
     
             Ok(DescriptorKey::from_public(self, networks))
    @@ -1762,7 +1805,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     }
     
     impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for PublicKey {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             DescriptorPublicKey::SinglePub(DescriptorSinglePub {
                 key: self,
                 origin: None,
    @@ -1772,17 +1815,17 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     }
     
     impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorSecretKey {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             let networks = match &self {
    -            DescriptorSecretKey::SinglePriv(sk) if sk.key.network == Network::Bitcoin => {
    +            DescriptorSecretKey::SinglePriv(sk) if sk.key.network == Network::Bitcoin => {
                     mainnet_network()
                 }
                 DescriptorSecretKey::XPrv(DescriptorXKey { xkey, .. })
    -                if xkey.network == Network::Bitcoin =>
    +                if xkey.network == Network::Bitcoin =>
                 {
                     mainnet_network()
                 }
    -            _ => test_networks(),
    +            _ => test_networks(),
             };
     
             Ok(DescriptorKey::from_secret(self, networks))
    @@ -1790,7 +1833,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     }
     
     impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for &'_ str {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             DescriptorSecretKey::from_str(self)
                 .map_err(|e| KeyError::Message(e.to_string()))?
                 .into_descriptor_key()
    @@ -1798,7 +1841,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     }
     
     impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for PrivateKey {
    -    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
    +    fn into_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
             DescriptorSecretKey::SinglePriv(DescriptorSinglePriv {
                 key: self,
                 origin: None,
    @@ -1830,7 +1873,7 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
     impl_error!(bitcoin::util::bip32::Error, Bip32, KeyError);
     
     impl std::fmt::Display for KeyError {
    -    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    +    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -1865,8 +1908,46 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap();
                 "L2wTu6hQrnDMiFNWA5na6jB12ErGQqtXwqpSL7aWquJaZG8Ai3ch"
             );
         }
    +
    +    #[test]
    +    fn test_keys_wif_network() {
    +        // test mainnet wif
    +        let generated_xprv: GeneratedKey<_, miniscript::Segwitv0> =
    +            bip32::ExtendedPrivKey::generate_with_entropy_default(TEST_ENTROPY).unwrap();
    +        let xkey = generated_xprv.into_extended_key().unwrap();
    +
    +        let network = Network::Bitcoin;
    +        let xprv = xkey.into_xprv(network).unwrap();
    +        let wif = PrivateKey::from_wif(&xprv.private_key.to_wif()).unwrap();
    +        assert_eq!(wif.network, network);
    +
    +        // test testnet wif
    +        let generated_xprv: GeneratedKey<_, miniscript::Segwitv0> =
    +            bip32::ExtendedPrivKey::generate_with_entropy_default(TEST_ENTROPY).unwrap();
    +        let xkey = generated_xprv.into_extended_key().unwrap();
    +
    +        let network = Network::Testnet;
    +        let xprv = xkey.into_xprv(network).unwrap();
    +        let wif = PrivateKey::from_wif(&xprv.private_key.to_wif()).unwrap();
    +        assert_eq!(wif.network, network);
    +    }
    +
    +    #[cfg(feature = "keys-bip39")]
    +    #[test]
    +    fn test_keys_wif_network_bip39() {
    +        let xkey: ExtendedKey = bip39::Mnemonic::parse_in(
    +            bip39::Language::English,
    +            "jelly crash boy whisper mouse ecology tuna soccer memory million news short",
    +        )
    +        .unwrap()
    +        .into_extended_key()
    +        .unwrap();
    +        let xprv = xkey.into_xprv(Network::Testnet).unwrap();
    +        let wif = PrivateKey::from_wif(&xprv.private_key.to_wif()).unwrap();
    +
    +        assert_eq!(wif.network, Network::Testnet);
    +    }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html index 5b66f7a5df..d79695c209 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html @@ -1,4 +1,6 @@ -lib.rs - source
      1
    +lib.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -281,6 +283,10 @@
     281
     282
     283
    +284
    +285
    +286
    +287
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -297,6 +303,10 @@
     // only enables the `doc_cfg` feature when
     // the `docsrs` configuration attribute is defined
     #![cfg_attr(docsrs, feature(doc_cfg))]
    +#![cfg_attr(
    +    docsrs,
    +    doc(html_logo_url = "https://github.com/bitcoindevkit/bdk/raw/master/static/bdk.png")
    +)]
     
     //! A modern, lightweight, descriptor-based wallet library written in Rust.
     //!
    @@ -323,7 +333,7 @@
     //! interact with the bitcoin P2P network.
     //!
     //! ```toml
    -//! bdk = "0.11.0"
    +//! bdk = "0.14.0"
     //! ```
     #![cfg_attr(
         feature = "electrum",
    @@ -519,7 +529,7 @@ fn main() -> Result<(), bdk::Error> {
     extern crate lazy_static;
     
     #[cfg(feature = "rpc")]
    -pub extern crate core_rpc;
    +pub extern crate bitcoincore_rpc;
     
     #[cfg(feature = "electrum")]
     pub extern crate electrum_client;
    @@ -554,17 +564,16 @@ fn main() -> Result<(), bdk::Error> {
     pub use wallet::Wallet;
     
     /// Get the version of BDK at runtime
    -pub fn version() -> &'static str {
    +pub fn version() -> &'static str {
         env!("CARGO_PKG_VERSION", "unknown")
     }
     
    -// We should consider putting this under a feature flag but we need the macro in doctets so we need
    +// We should consider putting this under a feature flag but we need the macro in doctests so we need
     // to wait until https://github.com/rust-lang/rust/issues/67295 is fixed.
     //
     // Stuff in here is too rough to document atm
     #[doc(hidden)]
     pub mod testutils;
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/psbt/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/psbt/mod.rs.html index ca046b7b88..13392d3d83 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/psbt/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/psbt/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -135,12 +137,12 @@
     use bitcoin::TxOut;
     
     pub trait PsbtUtils {
    -    fn get_utxo_for(&self, input_index: usize) -> Option<TxOut>;
    +    fn get_utxo_for(&self, input_index: usize) -> Option<TxOut>;
     }
     
     impl PsbtUtils for Psbt {
         #[allow(clippy::all)] // We want to allow `manual_map` but it is too new.
    -    fn get_utxo_for(&self, input_index: usize) -> Option<TxOut> {
    +    fn get_utxo_for(&self, input_index: usize) -> Option<TxOut> {
             let tx = &self.global.unsigned_tx;
     
             if input_index >= tx.input.len() {
    @@ -187,7 +189,7 @@
                 trust_witness_utxo: true,
                 ..Default::default()
             };
    -        let _ = wallet.sign(&mut psbt, options).unwrap();
    +        let _ = wallet.sign(&mut psbt, options).unwrap();
         }
     
         #[test]
    @@ -204,7 +206,7 @@
                 trust_witness_utxo: true,
                 ..Default::default()
             };
    -        let _ = wallet.sign(&mut psbt, options).unwrap();
    +        let _ = wallet.sign(&mut psbt, options).unwrap();
         }
     
         #[test]
    @@ -220,7 +222,7 @@
                 trust_witness_utxo: true,
                 ..Default::default()
             };
    -        let _ = wallet.sign(&mut psbt, options).unwrap();
    +        let _ = wallet.sign(&mut psbt, options).unwrap();
         }
     
         #[test]
    @@ -239,10 +241,9 @@
                 .input
                 .push(psbt_bip.global.unsigned_tx.input[0].clone());
     
    -        let _ = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
    +        let _ = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/testutils/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/testutils/mod.rs.html index a673857c4e..63fc2e7730 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/testutils/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/testutils/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
      1
    +mod.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -258,7 +260,7 @@
     }
     
     impl TestIncomingOutput {
    -    pub fn new(value: u64, to_address: Address) -> Self {
    +    pub fn new(value: u64, to_address: Address) -> Self {
             Self {
                 value,
                 to_address: to_address.to_string(),
    @@ -280,7 +282,7 @@
             min_confirmations: Option<u64>,
             locktime: Option<i64>,
             replaceable: Option<bool>,
    -    ) -> Self {
    +    ) -> Self {
             Self {
                 output,
                 min_confirmations,
    @@ -289,7 +291,7 @@
             }
         }
     
    -    pub fn add_output(&mut self, output: TestIncomingOutput) {
    +    pub fn add_output(&mut self, output: TestIncomingOutput) {
             self.output.push(output);
         }
     }
    @@ -301,7 +303,7 @@
             &self,
             secp: &Secp256k1<C>,
             index: u32,
    -    ) -> Descriptor<PublicKey>;
    +    ) -> Descriptor<PublicKey>;
     }
     
     impl TranslateDescriptor for Descriptor<DescriptorPublicKey> {
    @@ -309,16 +311,16 @@
             &self,
             secp: &Secp256k1<C>,
             index: u32,
    -    ) -> Descriptor<PublicKey> {
    -        let translate = |key: &DescriptorPublicKey| -> PublicKey {
    +    ) -> Descriptor<PublicKey> {
    +        let translate = |key: &DescriptorPublicKey| -> PublicKey {
                 match key {
    -                DescriptorPublicKey::XPub(xpub) => {
    +                DescriptorPublicKey::XPub(xpub) => {
                         xpub.xkey
                             .derive_pub(secp, &xpub.derivation_path)
                             .expect("hardened derivation steps")
                             .public_key
                     }
    -                DescriptorPublicKey::SinglePub(key) => key.key,
    +                DescriptorPublicKey::SinglePub(key) => key.key,
                 }
             };
     
    @@ -330,7 +332,7 @@
     #[doc(hidden)]
     #[macro_export]
     macro_rules! testutils {
    -    ( @external $descriptors:expr, $child:expr ) => ({
    +    ( @external $descriptors:expr, $child:expr ) => ({
             use $crate::bitcoin::secp256k1::Secp256k1;
             use $crate::miniscript::descriptor::{Descriptor, DescriptorPublicKey, DescriptorTrait};
     
    @@ -341,7 +343,7 @@
             let parsed = Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, &$descriptors.0).expect("Failed to parse descriptor in `testutils!(@external)`").0;
             parsed.derive_translated(&secp, $child).address(bitcoin::Network::Regtest).expect("No address form")
         });
    -    ( @internal $descriptors:expr, $child:expr ) => ({
    +    ( @internal $descriptors:expr, $child:expr ) => ({
             use $crate::bitcoin::secp256k1::Secp256k1;
             use $crate::miniscript::descriptor::{Descriptor, DescriptorPublicKey, DescriptorTrait};
     
    @@ -352,10 +354,10 @@
             let parsed = Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, &$descriptors.1.expect("Missing internal descriptor")).expect("Failed to parse descriptor in `testutils!(@internal)`").0;
             parsed.derive_translated(&secp, $child).address($crate::bitcoin::Network::Regtest).expect("No address form")
         });
    -    ( @e $descriptors:expr, $child:expr ) => ({ testutils!(@external $descriptors, $child) });
    -    ( @i $descriptors:expr, $child:expr ) => ({ testutils!(@internal $descriptors, $child) });
    +    ( @e $descriptors:expr, $child:expr ) => ({ testutils!(@external $descriptors, $child) });
    +    ( @i $descriptors:expr, $child:expr ) => ({ testutils!(@internal $descriptors, $child) });
     
    -    ( @tx ( $( ( $( $addr:tt )* ) => $amount:expr ),+ ) $( ( @locktime $locktime:expr ) )? $( ( @confirmations $confirmations:expr ) )? $( ( @replaceable $replaceable:expr ) )? ) => ({
    +    ( @tx ( $( ( $( $addr:tt )* ) => $amount:expr ),+ ) $( ( @locktime $locktime:expr ) )? $( ( @confirmations $confirmations:expr ) )? $( ( @replaceable $replaceable:expr ) )? ) => ({
             let outs = vec![$( $crate::testutils::TestIncomingOutput::new($amount, testutils!( $($addr)* ))),+];
     
             let locktime = None::<i64>$(.or(Some($locktime)))?;
    @@ -366,15 +368,15 @@
             $crate::testutils::TestIncomingTx::new(outs, min_confirmations, locktime, replaceable)
         });
     
    -    ( @literal $key:expr ) => ({
    +    ( @literal $key:expr ) => ({
             let key = $key.to_string();
             (key, None::<String>, None::<String>)
         });
    -    ( @generate_xprv $( $external_path:expr )? $( ,$internal_path:expr )? ) => ({
    +    ( @generate_xprv $( $external_path:expr )? $( ,$internal_path:expr )? ) => ({
             use rand::Rng;
     
             let mut seed = [0u8; 32];
    -        rand::thread_rng().fill(&mut seed[..]);
    +        rand::thread_rng().fill(&mut seed[..]);
     
             let key = $crate::bitcoin::util::bip32::ExtendedPrivKey::new_master(
                 $crate::bitcoin::Network::Testnet,
    @@ -386,11 +388,11 @@
     
             (key.unwrap().to_string(), external_path, internal_path)
         });
    -    ( @generate_wif ) => ({
    +    ( @generate_wif ) => ({
             use rand::Rng;
     
             let mut key = [0u8; $crate::bitcoin::secp256k1::constants::SECRET_KEY_SIZE];
    -        rand::thread_rng().fill(&mut key[..]);
    +        rand::thread_rng().fill(&mut key[..]);
     
             ($crate::bitcoin::PrivateKey {
                 compressed: true,
    @@ -399,7 +401,7 @@
             }.to_string(), None::<String>, None::<String>)
         });
     
    -    ( @keys ( $( $alias:expr => ( $( $key_type:tt )* ) ),+ ) ) => ({
    +    ( @keys ( $( $alias:expr => ( $( $key_type:tt )* ) ),+ ) ) => ({
             let mut map = std::collections::HashMap::new();
             $(
                 let alias: &str = $alias;
    @@ -409,7 +411,7 @@
             map
         });
     
    -    ( @descriptors ( $external_descriptor:expr ) $( ( $internal_descriptor:expr ) )? $( ( @keys $( $keys:tt )* ) )* ) => ({
    +    ( @descriptors ( $external_descriptor:expr ) $( ( $internal_descriptor:expr ) )? $( ( @keys $( $keys:tt )* ) )* ) => ({
             use std::str::FromStr;
             use std::collections::HashMap;
             use $crate::miniscript::descriptor::Descriptor;
    @@ -461,6 +463,5 @@
         })
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html index a5f9e76a88..dfe709fdc9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html @@ -1,4 +1,6 @@ -types.rs - source
      1
    +types.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -251,6 +253,12 @@
     251
     252
     253
    +254
    +255
    +256
    +257
    +258
    +259
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -281,19 +289,19 @@
     
     impl KeychainKind {
         /// Return [`KeychainKind`] as a byte
    -    pub fn as_byte(&self) -> u8 {
    +    pub fn as_byte(&self) -> u8 {
             match self {
    -            KeychainKind::External => b'e',
    -            KeychainKind::Internal => b'i',
    +            KeychainKind::External => b'e',
    +            KeychainKind::Internal => b'i',
             }
         }
     }
     
     impl AsRef<[u8]> for KeychainKind {
    -    fn as_ref(&self) -> &[u8] {
    +    fn as_ref(&self) -> &[u8] {
             match self {
    -            KeychainKind::External => b"e",
    -            KeychainKind::Internal => b"i",
    +            KeychainKind::External => b"e",
    +            KeychainKind::Internal => b"i",
             }
         }
     }
    @@ -305,49 +313,49 @@
     
     impl FeeRate {
         /// Create a new instance of [`FeeRate`] given a float fee rate in btc/kvbytes
    -    pub fn from_btc_per_kvb(btc_per_kvb: f32) -> Self {
    +    pub fn from_btc_per_kvb(btc_per_kvb: f32) -> Self {
             FeeRate(btc_per_kvb * 1e5)
         }
     
         /// Create a new instance of [`FeeRate`] given a float fee rate in satoshi/vbyte
    -    pub const fn from_sat_per_vb(sat_per_vb: f32) -> Self {
    +    pub const fn from_sat_per_vb(sat_per_vb: f32) -> Self {
             FeeRate(sat_per_vb)
         }
     
         /// Create a new [`FeeRate`] with the default min relay fee value
    -    pub const fn default_min_relay_fee() -> Self {
    +    pub const fn default_min_relay_fee() -> Self {
             FeeRate(1.0)
         }
     
         /// Calculate fee rate from `fee` and weight units (`wu`).
    -    pub fn from_wu(fee: u64, wu: usize) -> FeeRate {
    +    pub fn from_wu(fee: u64, wu: usize) -> FeeRate {
             Self::from_vb(fee, wu.vbytes())
         }
     
         /// Calculate fee rate from `fee` and `vbytes`.
    -    pub fn from_vb(fee: u64, vbytes: usize) -> FeeRate {
    +    pub fn from_vb(fee: u64, vbytes: usize) -> FeeRate {
             let rate = fee as f32 / vbytes as f32;
             Self::from_sat_per_vb(rate)
         }
     
         /// Return the value as satoshi/vbyte
    -    pub fn as_sat_vb(&self) -> f32 {
    +    pub fn as_sat_vb(&self) -> f32 {
             self.0
         }
     
         /// Calculate absolute fee in Satoshis using size in weight units.
    -    pub fn fee_wu(&self, wu: usize) -> u64 {
    +    pub fn fee_wu(&self, wu: usize) -> u64 {
             self.fee_vb(wu.vbytes())
         }
     
         /// Calculate absolute fee in Satoshis using size in virtual bytes.
    -    pub fn fee_vb(&self, vbytes: usize) -> u64 {
    +    pub fn fee_vb(&self, vbytes: usize) -> u64 {
             (self.as_sat_vb() * vbytes as f32).ceil() as u64
         }
     }
     
     impl std::default::Default for FeeRate {
    -    fn default() -> Self {
    +    fn default() -> Self {
             FeeRate::default_min_relay_fee()
         }
     }
    @@ -355,7 +363,7 @@
     impl Sub for FeeRate {
         type Output = Self;
     
    -    fn sub(self, other: FeeRate) -> Self::Output {
    +    fn sub(self, other: FeeRate) -> Self::Output {
             FeeRate(self.0 - other.0)
         }
     }
    @@ -363,11 +371,11 @@
     /// Trait implemented by types that can be used to measure weight units.
     pub trait Vbytes {
         /// Convert weight units to virtual bytes.
    -    fn vbytes(self) -> usize;
    +    fn vbytes(self) -> usize;
     }
     
     impl Vbytes for usize {
    -    fn vbytes(self) -> usize {
    +    fn vbytes(self) -> usize {
             // ref: https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#transaction-size-calculations
             (self as f32 / 4.0).ceil() as usize
         }
    @@ -415,21 +423,21 @@
     
     impl Utxo {
         /// Get the location of the UTXO
    -    pub fn outpoint(&self) -> OutPoint {
    +    pub fn outpoint(&self) -> OutPoint {
             match &self {
    -            Utxo::Local(local) => local.outpoint,
    -            Utxo::Foreign { outpoint, .. } => *outpoint,
    +            Utxo::Local(local) => local.outpoint,
    +            Utxo::Foreign { outpoint, .. } => *outpoint,
             }
         }
     
         /// Get the `TxOut` of the UTXO
    -    pub fn txout(&self) -> &TxOut {
    +    pub fn txout(&self) -> &TxOut {
             match &self {
    -            Utxo::Local(local) => &local.txout,
    +            Utxo::Local(local) => &local.txout,
                 Utxo::Foreign {
                     outpoint,
                     psbt_input,
    -            } => {
    +            } => {
                     if let Some(prev_tx) = &psbt_input.non_witness_utxo {
                         return &prev_tx.output[outpoint.vout as usize];
                     }
    @@ -463,33 +471,39 @@
         pub fee: Option<u64>,
         /// If the transaction is confirmed, contains height and timestamp of the block containing the
         /// transaction, unconfirmed transaction contains `None`.
    -    pub confirmation_time: Option<ConfirmationTime>,
    +    pub confirmation_time: Option<BlockTime>,
         /// Whether the tx has been verified against the consensus rules
         ///
         /// Confirmed txs are considered "verified" by default, while unconfirmed txs are checked to
         /// ensure an unstrusted [`Blockchain`](crate::blockchain::Blockchain) backend can't trick the
         /// wallet into using an invalid tx as an RBF template.
         ///
    -    /// The check is only perfomed when the `verify` feature is enabled.
    +    /// The check is only performed when the `verify` feature is enabled.
         #[serde(default = "bool::default")] // default to `false` if not specified
         pub verified: bool,
     }
     
    -/// Block height and timestamp of the block containing the confirmed transaction
    +/// Block height and timestamp of a block
     #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Default)]
    -pub struct ConfirmationTime {
    +pub struct BlockTime {
         /// confirmation block height
         pub height: u32,
         /// confirmation block timestamp
         pub timestamp: u64,
     }
     
    -impl ConfirmationTime {
    -    /// Returns `Some` `ConfirmationTime` if both `height` and `timestamp` are `Some`
    -    pub fn new(height: Option<u32>, timestamp: Option<u64>) -> Option<Self> {
    +/// **DEPRECATED**: Confirmation time of a transaction
    +///
    +/// The structure has been renamed to `BlockTime`
    +#[deprecated(note = "This structure has been renamed to `BlockTime`")]
    +pub type ConfirmationTime = BlockTime;
    +
    +impl BlockTime {
    +    /// Returns `Some` `BlockTime` if both `height` and `timestamp` are `Some`
    +    pub fn new(height: Option<u32>, timestamp: Option<u64>) -> Option<Self> {
             match (height, timestamp) {
    -            (Some(height), Some(timestamp)) => Some(ConfirmationTime { height, timestamp }),
    -            _ => None,
    +            (Some(height), Some(timestamp)) => Some(BlockTime { height, timestamp }),
    +            _ => None,
             }
         }
     }
    @@ -505,6 +519,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/address_validator.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/address_validator.rs.html index b4b1b942ac..96ce914fe3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/address_validator.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/address_validator.rs.html @@ -1,4 +1,6 @@ -address_validator.rs - source
      1
    +address_validator.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -240,7 +242,7 @@
     }
     
     impl fmt::Display for AddressValidatorError {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -261,7 +263,7 @@
             keychain: KeychainKind,
             hd_keypaths: &HdKeyPaths,
             script: &Script,
    -    ) -> Result<(), AddressValidatorError>;
    +    ) -> Result<(), AddressValidatorError>;
     }
     
     #[cfg(test)]
    @@ -280,7 +282,7 @@
                 _keychain: KeychainKind,
                 _hd_keypaths: &HdKeyPaths,
                 _script: &bitcoin::Script,
    -        ) -> Result<(), AddressValidatorError> {
    +        ) -> Result<(), AddressValidatorError> {
                 Err(AddressValidatorError::InvalidScript)
             }
         }
    @@ -307,6 +309,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html index dc5c9f14b7..032d48b8f4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html @@ -1,4 +1,6 @@ -coin_selection.rs - source
       1
    +coin_selection.rs - source
    +    
    logo
       1
        2
        3
        4
    @@ -1180,17 +1182,17 @@
     
     impl CoinSelectionResult {
         /// The total value of the inputs selected.
    -    pub fn selected_amount(&self) -> u64 {
    +    pub fn selected_amount(&self) -> u64 {
             self.selected.iter().map(|u| u.txout().value).sum()
         }
     
         /// The total value of the inputs selected from the local wallet.
    -    pub fn local_selected_amount(&self) -> u64 {
    +    pub fn local_selected_amount(&self) -> u64 {
             self.selected
                 .iter()
                 .filter_map(|u| match u {
    -                Utxo::Local(_) => Some(u.txout().value),
    -                _ => None,
    +                Utxo::Local(_) => Some(u.txout().value),
    +                _ => None,
                 })
                 .sum()
         }
    @@ -1223,7 +1225,7 @@
             fee_rate: FeeRate,
             amount_needed: u64,
             fee_amount: u64,
    -    ) -> Result<CoinSelectionResult, Error>;
    +    ) -> Result<CoinSelectionResult, Error>;
     }
     
     /// Simple and dumb coin selection
    @@ -1242,7 +1244,7 @@
             fee_rate: FeeRate,
             amount_needed: u64,
             mut fee_amount: u64,
    -    ) -> Result<CoinSelectionResult, Error> {
    +    ) -> Result<CoinSelectionResult, Error> {
             log::debug!(
                 "amount_needed = `{}`, fee_amount = `{}`, fee_rate = `{:?}`",
                 amount_needed,
    @@ -1265,7 +1267,7 @@
             let mut selected_amount = 0;
             let selected = utxos
                 .scan(
    -                (&mut selected_amount, &mut fee_amount),
    +                (&mut selected_amount, &mut fee_amount),
                     |(selected_amount, fee_amount), (must_use, weighted_utxo)| {
                         if must_use || **selected_amount < amount_needed + **fee_amount {
                             **fee_amount +=
    @@ -1312,7 +1314,7 @@
     }
     
     impl OutputGroup {
    -    fn new(weighted_utxo: WeightedUtxo, fee_rate: FeeRate) -> Self {
    +    fn new(weighted_utxo: WeightedUtxo, fee_rate: FeeRate) -> Self {
             let fee = fee_rate.fee_wu(TXIN_BASE_WEIGHT + weighted_utxo.satisfaction_weight);
             let effective_value = weighted_utxo.utxo.txout().value as i64 - fee as i64;
             OutputGroup {
    @@ -1332,7 +1334,7 @@
     }
     
     impl Default for BranchAndBoundCoinSelection {
    -    fn default() -> Self {
    +    fn default() -> Self {
             Self {
                 // P2WPKH cost of change -> value (8 bytes) + script len (1 bytes) + script (22 bytes)
                 size_of_change: 8 + 1 + 22,
    @@ -1342,7 +1344,7 @@
     
     impl BranchAndBoundCoinSelection {
         /// Create new instance with target size for change output
    -    pub fn new(size_of_change: u64) -> Self {
    +    pub fn new(size_of_change: u64) -> Self {
             Self { size_of_change }
         }
     }
    @@ -1358,7 +1360,7 @@
             fee_rate: FeeRate,
             amount_needed: u64,
             fee_amount: u64,
    -    ) -> Result<CoinSelectionResult, Error> {
    +    ) -> Result<CoinSelectionResult, Error> {
             // Mapping every (UTXO, usize) to an output group
             let required_utxos: Vec<OutputGroup> = required_utxos
                 .into_iter()
    @@ -1431,7 +1433,7 @@
     
     impl BranchAndBoundCoinSelection {
         // TODO: make this more Rust-onic :)
    -    // (And perhpaps refactor with less arguments?)
    +    // (And perhaps refactor with less arguments?)
         #[allow(clippy::too_many_arguments)]
         fn bnb(
             &self,
    @@ -1442,7 +1444,7 @@
             actual_target: i64,
             fee_amount: u64,
             cost_of_change: f32,
    -    ) -> Result<CoinSelectionResult, Error> {
    +    ) -> Result<CoinSelectionResult, Error> {
             // current_selection[i] will contain true if we are using optional_utxos[i],
             // false otherwise. Note that current_selection.len() could be less than
             // optional_utxos.len(), it just means that we still haven't decided if we should keep
    @@ -1481,7 +1483,7 @@
                     }
     
                     // If we found a perfect match, break here
    -                if curr_value == actual_target {
    +                if curr_value == actual_target {
                         break;
                     }
                 }
    @@ -1549,14 +1551,14 @@
             curr_value: i64,
             actual_target: i64,
             fee_amount: u64,
    -    ) -> CoinSelectionResult {
    +    ) -> CoinSelectionResult {
             #[cfg(not(test))]
    -        optional_utxos.shuffle(&mut thread_rng());
    +        optional_utxos.shuffle(&mut thread_rng());
             #[cfg(test)]
             {
                 let seed = [0; 32];
                 let mut rng: StdRng = SeedableRng::from_seed(seed);
    -            optional_utxos.shuffle(&mut rng);
    +            optional_utxos.shuffle(&mut rng);
             }
     
             let selected_utxos = optional_utxos
    @@ -1578,8 +1580,8 @@
             mut selected_utxos: Vec<OutputGroup>,
             mut required_utxos: Vec<OutputGroup>,
             mut fee_amount: u64,
    -    ) -> CoinSelectionResult {
    -        selected_utxos.append(&mut required_utxos);
    +    ) -> CoinSelectionResult {
    +        selected_utxos.append(&mut required_utxos);
             fee_amount += selected_utxos.iter().map(|u| u.fee).sum::<u64>();
             let selected = selected_utxos
                 .into_iter()
    @@ -1612,7 +1614,7 @@
     
         const FEE_AMOUNT: u64 = 50;
     
    -    fn utxo(value: u64, index: u32) -> WeightedUtxo {
    +    fn utxo(value: u64, index: u32) -> WeightedUtxo {
             assert!(index < 10);
             let outpoint = OutPoint::from_str(&format!(
                 "000000000000000000000000000000000000000000000000000000000000000{}:0",
    @@ -1632,7 +1634,7 @@
             }
         }
     
    -    fn get_test_utxos() -> Vec<WeightedUtxo> {
    +    fn get_test_utxos() -> Vec<WeightedUtxo> {
             vec![
                 utxo(100_000, 0),
                 utxo(FEE_AMOUNT as u64 - 40, 1),
    @@ -1640,7 +1642,7 @@
             ]
         }
     
    -    fn generate_random_utxos(rng: &mut StdRng, utxos_number: usize) -> Vec<WeightedUtxo> {
    +    fn generate_random_utxos(rng: &mut StdRng, utxos_number: usize) -> Vec<WeightedUtxo> {
             let mut res = Vec::new();
             for _ in 0..utxos_number {
                 res.push(WeightedUtxo {
    @@ -1661,7 +1663,7 @@
             res
         }
     
    -    fn generate_same_value_utxos(utxos_value: u64, utxos_number: usize) -> Vec<WeightedUtxo> {
    +    fn generate_same_value_utxos(utxos_value: u64, utxos_number: usize) -> Vec<WeightedUtxo> {
             let utxo = WeightedUtxo {
                 satisfaction_weight: P2WPKH_WITNESS_SIZE,
                 utxo: Utxo::Local(LocalUtxo {
    @@ -1679,9 +1681,9 @@
             vec![utxo; utxos_number]
         }
     
    -    fn sum_random_utxos(mut rng: &mut StdRng, utxos: &mut Vec<WeightedUtxo>) -> u64 {
    +    fn sum_random_utxos(mut rng: &mut StdRng, utxos: &mut Vec<WeightedUtxo>) -> u64 {
             let utxos_picked_len = rng.gen_range(2, utxos.len() / 2);
    -        utxos.shuffle(&mut rng);
    +        utxos.shuffle(&mut rng);
             utxos[..utxos_picked_len]
                 .iter()
                 .map(|u| u.utxo.txout().value)
    @@ -1950,8 +1952,8 @@
             let database = MemoryDatabase::default();
     
             for _i in 0..200 {
    -            let mut optional_utxos = generate_random_utxos(&mut rng, 16);
    -            let target_amount = sum_random_utxos(&mut rng, &mut optional_utxos);
    +            let mut optional_utxos = generate_random_utxos(&mut rng, 16);
    +            let target_amount = sum_random_utxos(&mut rng, &mut optional_utxos);
                 let result = BranchAndBoundCoinSelection::new(0)
                     .coin_select(
                         &database,
    @@ -2062,7 +2064,7 @@
             let fee_rate = FeeRate::from_sat_per_vb(0.0);
     
             for _ in 0..200 {
    -            let optional_utxos: Vec<_> = generate_random_utxos(&mut rng, 40)
    +            let optional_utxos: Vec<_> = generate_random_utxos(&mut rng, 40)
                     .into_iter()
                     .map(|u| OutputGroup::new(u, fee_rate))
                     .collect();
    @@ -2095,8 +2097,8 @@
         fn test_single_random_draw_function_success() {
             let seed = [0; 32];
             let mut rng: StdRng = SeedableRng::from_seed(seed);
    -        let mut utxos = generate_random_utxos(&mut rng, 300);
    -        let target_amount = sum_random_utxos(&mut rng, &mut utxos);
    +        let mut utxos = generate_random_utxos(&mut rng, 300);
    +        let target_amount = sum_random_utxos(&mut rng, &mut utxos);
     
             let fee_rate = FeeRate::from_sat_per_vb(1.0);
             let utxos: Vec<OutputGroup> = utxos
    @@ -2117,6 +2119,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html index a78d0d922f..b9fc2cd53e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html @@ -1,4 +1,6 @@ -export.rs - source
      1
    +export.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -433,7 +435,7 @@
     }
     
     impl ToString for WalletExport {
    -    fn to_string(&self) -> String {
    +    fn to_string(&self) -> String {
             serde_json::to_string(self).unwrap()
         }
     }
    @@ -441,12 +443,12 @@
     impl FromStr for WalletExport {
         type Err = serde_json::Error;
     
    -    fn from_str(s: &str) -> Result<Self, Self::Err> {
    +    fn from_str(s: &str) -> Result<Self, Self::Err> {
             serde_json::from_str(s)
         }
     }
     
    -fn remove_checksum(s: String) -> String {
    +fn remove_checksum(s: String) -> String {
         s.splitn(2, '#').next().map(String::from).unwrap()
     }
     
    @@ -466,7 +468,7 @@
             wallet: &Wallet<B, D>,
             label: &str,
             include_blockheight: bool,
    -    ) -> Result<Self, &'static str> {
    +    ) -> Result<Self, &'static str> {
             let descriptor = wallet
                 .descriptor
                 .to_string_with_secret(&wallet.signers.as_key_map(wallet.secp_ctx()));
    @@ -474,9 +476,9 @@
             Self::is_compatible_with_core(&descriptor)?;
     
             let blockheight = match wallet.database.borrow().iter_txs(false) {
    -            _ if !include_blockheight => 0,
    -            Err(_) => 0,
    -            Ok(txs) => {
    +            _ if !include_blockheight => 0,
    +            Err(_) => 0,
    +            Ok(txs) => {
                     let mut heights = txs
                         .into_iter()
                         .map(|tx| tx.confirmation_time.map(|c| c.height).unwrap_or(0))
    @@ -505,10 +507,10 @@
             Ok(export)
         }
     
    -    fn is_compatible_with_core(descriptor: &str) -> Result<(), &'static str> {
    +    fn is_compatible_with_core(descriptor: &str) -> Result<(), &'static str> {
             fn check_ms<Ctx: ScriptContext>(
                 terminal: &Terminal<String, Ctx>,
    -        ) -> Result<(), &'static str> {
    +        ) -> Result<(), &'static str> {
                 if let Terminal::Multi(_, _) = terminal {
                     Ok(())
                 } else {
    @@ -518,31 +520,31 @@
     
             // pkh(), wpkh(), sh(wpkh()) are always fine, as well as multi() and sortedmulti()
             match Descriptor::<String>::from_str(descriptor).map_err(|_| "Invalid descriptor")? {
    -            Descriptor::Pkh(_) | Descriptor::Wpkh(_) => Ok(()),
    -            Descriptor::Sh(sh) => match sh.as_inner() {
    -                ShInner::Wpkh(_) => Ok(()),
    -                ShInner::SortedMulti(_) => Ok(()),
    -                ShInner::Wsh(wsh) => match wsh.as_inner() {
    -                    WshInner::SortedMulti(_) => Ok(()),
    -                    WshInner::Ms(ms) => check_ms(&ms.node),
    +            Descriptor::Pkh(_) | Descriptor::Wpkh(_) => Ok(()),
    +            Descriptor::Sh(sh) => match sh.as_inner() {
    +                ShInner::Wpkh(_) => Ok(()),
    +                ShInner::SortedMulti(_) => Ok(()),
    +                ShInner::Wsh(wsh) => match wsh.as_inner() {
    +                    WshInner::SortedMulti(_) => Ok(()),
    +                    WshInner::Ms(ms) => check_ms(&ms.node),
                     },
    -                ShInner::Ms(ms) => check_ms(&ms.node),
    +                ShInner::Ms(ms) => check_ms(&ms.node),
                 },
    -            Descriptor::Wsh(wsh) => match wsh.as_inner() {
    -                WshInner::SortedMulti(_) => Ok(()),
    -                WshInner::Ms(ms) => check_ms(&ms.node),
    +            Descriptor::Wsh(wsh) => match wsh.as_inner() {
    +                WshInner::SortedMulti(_) => Ok(()),
    +                WshInner::Ms(ms) => check_ms(&ms.node),
                 },
    -            _ => Err("The descriptor is not compatible with Bitcoin Core"),
    +            _ => Err("The descriptor is not compatible with Bitcoin Core"),
             }
         }
     
         /// Return the external descriptor
    -    pub fn descriptor(&self) -> String {
    +    pub fn descriptor(&self) -> String {
             self.descriptor.clone()
         }
     
         /// Return the internal descriptor, if present
    -    pub fn change_descriptor(&self) -> Option<String> {
    +    pub fn change_descriptor(&self) -> Option<String> {
             let replaced = self.descriptor.replace("/0/*", "/1/*");
     
             if replaced != self.descriptor {
    @@ -563,9 +565,9 @@
         use crate::database::{memory::MemoryDatabase, BatchOperations};
         use crate::types::TransactionDetails;
         use crate::wallet::Wallet;
    -    use crate::ConfirmationTime;
    +    use crate::BlockTime;
     
    -    fn get_test_db() -> MemoryDatabase {
    +    fn get_test_db() -> MemoryDatabase {
             let mut db = MemoryDatabase::new();
             db.set_tx(&TransactionDetails {
                 transaction: None,
    @@ -577,7 +579,7 @@
                 received: 100_000,
                 sent: 0,
                 fee: Some(500),
    -            confirmation_time: Some(ConfirmationTime {
    +            confirmation_time: Some(BlockTime {
                     timestamp: 12345678,
                     height: 5000,
                 }),
    @@ -701,6 +703,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html index e4602b959b..7d6625b993 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html @@ -1,4 +1,6 @@ -mod.rs - source
       1
    +mod.rs - source
    +    
    logo
       1
        2
        3
        4
    @@ -3966,6 +3968,75 @@
     3966
     3967
     3968
    +3969
    +3970
    +3971
    +3972
    +3973
    +3974
    +3975
    +3976
    +3977
    +3978
    +3979
    +3980
    +3981
    +3982
    +3983
    +3984
    +3985
    +3986
    +3987
    +3988
    +3989
    +3990
    +3991
    +3992
    +3993
    +3994
    +3995
    +3996
    +3997
    +3998
    +3999
    +4000
    +4001
    +4002
    +4003
    +4004
    +4005
    +4006
    +4007
    +4008
    +4009
    +4010
    +4011
    +4012
    +4013
    +4014
    +4015
    +4016
    +4017
    +4018
    +4019
    +4020
    +4021
    +4022
    +4023
    +4024
    +4025
    +4026
    +4027
    +4028
    +4029
    +4030
    +4031
    +4032
    +4033
    +4034
    +4035
    +4036
    +4037
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -4025,7 +4096,7 @@
     
     use crate::blockchain::{Blockchain, Progress};
     use crate::database::memory::MemoryDatabase;
    -use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils};
    +use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils, SyncTime};
     use crate::descriptor::derived::AsDerived;
     use crate::descriptor::policy::BuildSatisfaction;
     use crate::descriptor::{
    @@ -4081,7 +4152,7 @@
             change_descriptor: Option<E>,
             network: Network,
             database: D,
    -    ) -> Result<Self, Error> {
    +    ) -> Result<Self, Error> {
             Self::_new(descriptor, change_descriptor, network, database, (), None)
         }
     }
    @@ -4097,7 +4168,7 @@
             mut database: D,
             client: B,
             current_height: Option<u32>,
    -    ) -> Result<Self, Error> {
    +    ) -> Result<Self, Error> {
             let secp = Secp256k1::new();
     
             let (descriptor, keymap) = into_wallet_descriptor_checked(descriptor, &secp, network)?;
    @@ -4107,7 +4178,7 @@
             )?;
             let signers = Arc::new(SignersContainer::from(keymap));
             let (change_descriptor, change_signers) = match change_descriptor {
    -            Some(desc) => {
    +            Some(desc) => {
                     let (change_descriptor, change_keymap) =
                         into_wallet_descriptor_checked(desc, &secp, network)?;
                     database.check_descriptor_checksum(
    @@ -4122,7 +4193,7 @@
     
                     (Some(change_descriptor), change_signers)
                 }
    -            None => (None, Arc::new(SignersContainer::new())),
    +            None => (None, Arc::new(SignersContainer::new())),
             };
     
             Ok(Wallet {
    @@ -4140,7 +4211,7 @@
         }
     
         /// Get the Bitcoin network the wallet is using.
    -    pub fn network(&self) -> Network {
    +    pub fn network(&self) -> Network {
             self.network
         }
     }
    @@ -4189,13 +4260,13 @@
     impl Deref for AddressInfo {
         type Target = Address;
     
    -    fn deref(&self) -> &Self::Target {
    +    fn deref(&self) -> &Self::Target {
             &self.address
         }
     }
     
     impl fmt::Display for AddressInfo {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{}", self.address)
         }
     }
    @@ -4206,7 +4277,7 @@
         D: BatchDatabase,
     {
         // Return a newly derived address using the external descriptor
    -    fn get_new_address(&self) -> Result<AddressInfo, Error> {
    +    fn get_new_address(&self) -> Result<AddressInfo, Error> {
             let incremented_index = self.fetch_and_increment_index(KeychainKind::External)?;
     
             let address_result = self
    @@ -4224,7 +4295,7 @@
     
         // Return the the last previously derived address if it has not been used in a received
         // transaction. Otherwise return a new address using [`Wallet::get_new_address`].
    -    fn get_unused_address(&self) -> Result<AddressInfo, Error> {
    +    fn get_unused_address(&self) -> Result<AddressInfo, Error> {
             let current_index = self.fetch_index(KeychainKind::External)?;
     
             let derived_key = self.descriptor.as_derived(current_index, &self.secp);
    @@ -4236,7 +4307,7 @@
                 .iter()
                 .flat_map(|tx_details| tx_details.transaction.as_ref())
                 .flat_map(|tx| tx.output.iter())
    -            .any(|o| o.script_pubkey == script_pubkey);
    +            .any(|o| o.script_pubkey == script_pubkey);
     
             if found_used {
                 self.get_new_address()
    @@ -4252,7 +4323,7 @@
         }
     
         // Return derived address for the external descriptor at a specific index
    -    fn peek_address(&self, index: u32) -> Result<AddressInfo, Error> {
    +    fn peek_address(&self, index: u32) -> Result<AddressInfo, Error> {
             self.descriptor
                 .as_derived(index, &self.secp)
                 .address(self.network)
    @@ -4262,7 +4333,7 @@
     
         // Return derived address for the external descriptor at a specific index and reset current
         // address index
    -    fn reset_address(&self, index: u32) -> Result<AddressInfo, Error> {
    +    fn reset_address(&self, index: u32) -> Result<AddressInfo, Error> {
             self.set_index(KeychainKind::External, index)?;
     
             self.descriptor
    @@ -4275,34 +4346,49 @@
         /// Return a derived address using the external descriptor, see [`AddressIndex`] for
         /// available address index selection strategies. If none of the keys in the descriptor are derivable
         /// (ie. does not end with /*) then the same address will always be returned for any [`AddressIndex`].
    -    pub fn get_address(&self, address_index: AddressIndex) -> Result<AddressInfo, Error> {
    +    pub fn get_address(&self, address_index: AddressIndex) -> Result<AddressInfo, Error> {
             match address_index {
    -            AddressIndex::New => self.get_new_address(),
    -            AddressIndex::LastUnused => self.get_unused_address(),
    -            AddressIndex::Peek(index) => self.peek_address(index),
    -            AddressIndex::Reset(index) => self.reset_address(index),
    +            AddressIndex::New => self.get_new_address(),
    +            AddressIndex::LastUnused => self.get_unused_address(),
    +            AddressIndex::Peek(index) => self.peek_address(index),
    +            AddressIndex::Reset(index) => self.reset_address(index),
             }
         }
     
         /// Return whether or not a `script` is part of this wallet (either internal or external)
    -    pub fn is_mine(&self, script: &Script) -> Result<bool, Error> {
    +    pub fn is_mine(&self, script: &Script) -> Result<bool, Error> {
             self.database.borrow().is_mine(script)
         }
     
         /// Return the list of unspent outputs of this wallet
         ///
    -    /// Note that this methods only operate on the internal database, which first needs to be
    +    /// Note that this method only operates on the internal database, which first needs to be
         /// [`Wallet::sync`] manually.
    -    pub fn list_unspent(&self) -> Result<Vec<LocalUtxo>, Error> {
    +    pub fn list_unspent(&self) -> Result<Vec<LocalUtxo>, Error> {
             self.database.borrow().iter_utxos()
         }
     
         /// Returns the `UTXO` owned by this wallet corresponding to `outpoint` if it exists in the
         /// wallet's database.
    -    pub fn get_utxo(&self, outpoint: OutPoint) -> Result<Option<LocalUtxo>, Error> {
    +    pub fn get_utxo(&self, outpoint: OutPoint) -> Result<Option<LocalUtxo>, Error> {
             self.database.borrow().get_utxo(&outpoint)
         }
     
    +    /// Return a single transactions made and received by the wallet
    +    ///
    +    /// Optionally fill the [`TransactionDetails::transaction`] field with the raw transaction if
    +    /// `include_raw` is `true`.
    +    ///
    +    /// Note that this method only operates on the internal database, which first needs to be
    +    /// [`Wallet::sync`] manually.
    +    pub fn get_tx(
    +        &self,
    +        txid: &Txid,
    +        include_raw: bool,
    +    ) -> Result<Option<TransactionDetails>, Error> {
    +        self.database.borrow().get_tx(txid, include_raw)
    +    }
    +
         /// Return the list of transactions made and received by the wallet
         ///
         /// Optionally fill the [`TransactionDetails::transaction`] field with the raw transaction if
    @@ -4310,7 +4396,7 @@
         ///
         /// Note that this methods only operate on the internal database, which first needs to be
         /// [`Wallet::sync`] manually.
    -    pub fn list_transactions(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
    +    pub fn list_transactions(&self, include_raw: bool) -> Result<Vec<TransactionDetails>, Error> {
             self.database.borrow().iter_txs(include_raw)
         }
     
    @@ -4318,7 +4404,7 @@
         ///
         /// Note that this methods only operate on the internal database, which first needs to be
         /// [`Wallet::sync`] manually.
    -    pub fn get_balance(&self) -> Result<u64, Error> {
    +    pub fn get_balance(&self) -> Result<u64, Error> {
             Ok(self
                 .list_unspent()?
                 .iter()
    @@ -4329,14 +4415,14 @@
         ///
         /// See [the `signer` module](signer) for an example.
         pub fn add_signer(
    -        &mut self,
    +        &mut self,
             keychain: KeychainKind,
             ordering: SignerOrdering,
             signer: Arc<dyn Signer>,
         ) {
             let signers = match keychain {
    -            KeychainKind::External => Arc::make_mut(&mut self.signers),
    -            KeychainKind::Internal => Arc::make_mut(&mut self.change_signers),
    +            KeychainKind::External => Arc::make_mut(&mut self.signers),
    +            KeychainKind::Internal => Arc::make_mut(&mut self.change_signers),
             };
     
             signers.add_external(signer.id(&self.secp), ordering, signer);
    @@ -4345,7 +4431,7 @@
         /// Add an address validator
         ///
         /// See [the `address_validator` module](address_validator) for an example.
    -    pub fn add_address_validator(&mut self, validator: Arc<dyn AddressValidator>) {
    +    pub fn add_address_validator(&mut self, validator: Arc<dyn AddressValidator>) {
             self.address_validators.push(validator);
         }
     
    @@ -4375,7 +4461,7 @@
         /// ```
         ///
         /// [`TxBuilder`]: crate::TxBuilder
    -    pub fn build_tx(&self) -> TxBuilder<'_, B, D, DefaultCoinSelectionAlgorithm, CreateTx> {
    +    pub fn build_tx(&self) -> TxBuilder<'_, B, D, DefaultCoinSelectionAlgorithm, CreateTx> {
             TxBuilder {
                 wallet: self,
                 params: TxParams::default(),
    @@ -4388,7 +4474,7 @@
             &self,
             coin_selection: Cs,
             params: TxParams,
    -    ) -> Result<(Psbt, TransactionDetails), Error> {
    +    ) -> Result<(Psbt, TransactionDetails), Error> {
             let external_policy = self
                 .descriptor
                 .extract_policy(&self.signers, BuildSatisfaction::None, &self.secp)?
    @@ -4446,51 +4532,51 @@
             debug!("Policy requirements: {:?}", requirements);
     
             let version = match params.version {
    -            Some(tx_builder::Version(0)) => {
    +            Some(tx_builder::Version(0)) => {
                     return Err(Error::Generic("Invalid version `0`".into()))
                 }
    -            Some(tx_builder::Version(1)) if requirements.csv.is_some() => {
    +            Some(tx_builder::Version(1)) if requirements.csv.is_some() => {
                     return Err(Error::Generic(
                         "TxBuilder requested version `1`, but at least `2` is needed to use OP_CSV"
                             .into(),
                     ))
                 }
    -            Some(tx_builder::Version(x)) => x,
    -            None if requirements.csv.is_some() => 2,
    -            _ => 1,
    +            Some(tx_builder::Version(x)) => x,
    +            None if requirements.csv.is_some() => 2,
    +            _ => 1,
             };
     
             let lock_time = match params.locktime {
                 // No nLockTime, default to 0
    -            None => requirements.timelock.unwrap_or(0),
    +            None => requirements.timelock.unwrap_or(0),
                 // Specific nLockTime required and we have no constraints, so just set to that value
    -            Some(x) if requirements.timelock.is_none() => x,
    +            Some(x) if requirements.timelock.is_none() => x,
                 // Specific nLockTime required and it's compatible with the constraints
    -            Some(x) if check_nlocktime(x, requirements.timelock.unwrap()) => x,
    +            Some(x) if check_nlocktime(x, requirements.timelock.unwrap()) => x,
                 // Invalid nLockTime required
    -            Some(x) => return Err(Error::Generic(format!("TxBuilder requested timelock of `{}`, but at least `{}` is required to spend from this script", x, requirements.timelock.unwrap())))
    +            Some(x) => return Err(Error::Generic(format!("TxBuilder requested timelock of `{}`, but at least `{}` is required to spend from this script", x, requirements.timelock.unwrap())))
             };
     
             let n_sequence = match (params.rbf, requirements.csv) {
                 // No RBF or CSV but there's an nLockTime, so the nSequence cannot be final
    -            (None, None) if lock_time != 0 => 0xFFFFFFFE,
    +            (None, None) if lock_time != 0 => 0xFFFFFFFE,
                 // No RBF, CSV or nLockTime, make the transaction final
    -            (None, None) => 0xFFFFFFFF,
    +            (None, None) => 0xFFFFFFFF,
     
                 // No RBF requested, use the value from CSV. Note that this value is by definition
                 // non-final, so even if a timelock is enabled this nSequence is fine, hence why we
                 // don't bother checking for it here. The same is true for all the other branches below
    -            (None, Some(csv)) => csv,
    +            (None, Some(csv)) => csv,
     
                 // RBF with a specific value but that value is too high
    -            (Some(tx_builder::RbfValue::Value(rbf)), _) if rbf >= 0xFFFFFFFE => {
    +            (Some(tx_builder::RbfValue::Value(rbf)), _) if rbf >= 0xFFFFFFFE => {
                     return Err(Error::Generic(
                         "Cannot enable RBF with a nSequence >= 0xFFFFFFFE".into(),
                     ))
                 }
                 // RBF with a specific value requested, but the value is incompatible with CSV
                 (Some(tx_builder::RbfValue::Value(rbf)), Some(csv))
    -                if !check_nsequence_rbf(rbf, csv) =>
    +                if !check_nsequence_rbf(rbf, csv) =>
                 {
                     return Err(Error::Generic(format!(
                         "Cannot enable RBF with nSequence `{}` given a required OP_CSV of `{}`",
    @@ -4499,10 +4585,10 @@
                 }
     
                 // RBF enabled with the default value with CSV also enabled. CSV takes precedence
    -            (Some(tx_builder::RbfValue::Default), Some(csv)) => csv,
    +            (Some(tx_builder::RbfValue::Default), Some(csv)) => csv,
                 // Valid RBF, either default or with a specific value. We ignore the `CSV` value
                 // because we've already checked it before
    -            (Some(rbf), _) => rbf.get_value(),
    +            (Some(rbf), _) => rbf.get_value(),
             };
     
             let (fee_rate, mut fee_amount) = match params
    @@ -4511,7 +4597,7 @@
                 .unwrap_or(&FeePolicy::FeeRate(FeeRate::default()))
             {
                 //FIXME: see https://github.com/bitcoindevkit/bdk/issues/256
    -            FeePolicy::FeeAmount(fee) => {
    +            FeePolicy::FeeAmount(fee) => {
                     if let Some(previous_fee) = params.bumping_fee {
                         if *fee < previous_fee.absolute {
                             return Err(Error::FeeTooLow {
    @@ -4521,7 +4607,7 @@
                     }
                     (FeeRate::from_sat_per_vb(0.0), *fee)
                 }
    -            FeePolicy::FeeRate(rate) => {
    +            FeePolicy::FeeRate(rate) => {
                     if let Some(previous_fee) = params.bumping_fee {
                         let required_feerate = FeeRate::from_sat_per_vb(previous_fee.rate + 1.0);
                         if *rate < required_feerate {
    @@ -4554,7 +4640,7 @@
             let recipients = params.recipients.iter().map(|(r, v)| (r, *v));
     
             for (index, (script_pubkey, value)) in recipients.enumerate() {
    -            if value.is_dust() {
    +            if value.is_dust() && !script_pubkey.is_provably_unspendable() {
                     return Err(Error::OutputBelowDustLimit(index));
                 }
     
    @@ -4614,8 +4700,8 @@
             // prepare the drain output
             let mut drain_output = {
                 let script_pubkey = match params.drain_to {
    -                Some(ref drain_recipient) => drain_recipient.clone(),
    -                None => self.get_change_address()?,
    +                Some(ref drain_recipient) => drain_recipient.clone(),
    +                None => self.get_change_address()?,
                 };
     
                 TxOut {
    @@ -4652,7 +4738,7 @@
             }
     
             // sort input/outputs according to the chosen algorithm
    -        params.ordering.sort_tx(&mut tx);
    +        params.ordering.sort_tx(&mut tx);
     
             let txid = tx.txid();
             let sent = coin_selection.local_selected_amount();
    @@ -4674,7 +4760,7 @@
         /// Bump the fee of a transaction previously created with this wallet.
         ///
         /// Returns an error if the transaction is already confirmed or doesn't explicitly signal
    -    /// *repalce by fee* (RBF). If the transaction can be fee bumped then it returns a [`TxBuilder`]
    +    /// *replace by fee* (RBF). If the transaction can be fee bumped then it returns a [`TxBuilder`]
         /// pre-populated with the inputs and outputs of the original transaction.
         ///
         /// ## Example
    @@ -4716,12 +4802,12 @@
         pub fn build_fee_bump(
             &self,
             txid: Txid,
    -    ) -> Result<TxBuilder<'_, B, D, DefaultCoinSelectionAlgorithm, BumpFee>, Error> {
    +    ) -> Result<TxBuilder<'_, B, D, DefaultCoinSelectionAlgorithm, BumpFee>, Error> {
             let mut details = match self.database.borrow().get_tx(&txid, true)? {
    -            None => return Err(Error::TransactionNotFound),
    -            Some(tx) if tx.transaction.is_none() => return Err(Error::TransactionNotFound),
    -            Some(tx) if tx.confirmation_time.is_some() => return Err(Error::TransactionConfirmed),
    -            Some(tx) => tx,
    +            None => return Err(Error::TransactionNotFound),
    +            Some(tx) if tx.transaction.is_none() => return Err(Error::TransactionNotFound),
    +            Some(tx) if tx.confirmation_time.is_some() => return Err(Error::TransactionConfirmed),
    +            Some(tx) => tx,
             };
             let mut tx = details.transaction.take().unwrap();
             if !tx.input.iter().any(|txin| txin.sequence <= 0xFFFFFFFD) {
    @@ -4737,7 +4823,7 @@
             let original_txin = tx.input.drain(..).collect::<Vec<_>>();
             let original_utxos = original_txin
                 .iter()
    -            .map(|txin| -> Result<_, Error> {
    +            .map(|txin| -> Result<_, Error> {
                     let txout = self
                         .database
                         .borrow()
    @@ -4749,14 +4835,14 @@
                         .borrow()
                         .get_path_from_script_pubkey(&txout.script_pubkey)?
                     {
    -                    Some((keychain, _)) => (
    +                    Some((keychain, _)) => (
                             self._get_descriptor_for_keychain(keychain)
                                 .0
                                 .max_satisfaction_weight()
                                 .unwrap(),
                             keychain,
                         ),
    -                    None => {
    +                    None => {
                             // estimate the weight based on the scriptsig/witness size present in the
                             // original transaction
                             let weight =
    @@ -4787,8 +4873,8 @@
                         .borrow()
                         .get_path_from_script_pubkey(&txout.script_pubkey)?
                     {
    -                    Some((keychain, _)) if keychain == change_type => change_index = Some(index),
    -                    _ => {}
    +                    Some((keychain, _)) if keychain == change_type => change_index = Some(index),
    +                    _ => {}
                     }
                 }
     
    @@ -4847,7 +4933,7 @@
         /// let  finalized = wallet.sign(&mut psbt, SignOptions::default())?;
         /// assert!(finalized, "we should have signed all the inputs");
         /// # Ok::<(), bdk::Error>(())
    -    pub fn sign(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result<bool, Error> {
    +    pub fn sign(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result<bool, Error> {
             // this helps us doing our job later
             self.add_input_hd_keypaths(psbt)?;
     
    @@ -4869,7 +4955,7 @@
                 && !psbt
                     .inputs
                     .iter()
    -                .all(|i| i.sighash_type.is_none() || i.sighash_type == Some(SigHashType::All))
    +                .all(|i| i.sighash_type.is_none() || i.sighash_type == Some(SigHashType::All))
             {
                 return Err(Error::Signer(signer::SignerError::NonStandardSighash));
             }
    @@ -4894,15 +4980,15 @@
         }
     
         /// Return the spending policies for the wallet's descriptor
    -    pub fn policies(&self, keychain: KeychainKind) -> Result<Option<Policy>, Error> {
    +    pub fn policies(&self, keychain: KeychainKind) -> Result<Option<Policy>, Error> {
             match (keychain, self.change_descriptor.as_ref()) {
    -            (KeychainKind::External, _) => Ok(self.descriptor.extract_policy(
    +            (KeychainKind::External, _) => Ok(self.descriptor.extract_policy(
                     &self.signers,
                     BuildSatisfaction::None,
                     &self.secp,
                 )?),
    -            (KeychainKind::Internal, None) => Ok(None),
    -            (KeychainKind::Internal, Some(desc)) => Ok(desc.extract_policy(
    +            (KeychainKind::Internal, None) => Ok(None),
    +            (KeychainKind::Internal, Some(desc)) => Ok(desc.extract_policy(
                     &self.change_signers,
                     BuildSatisfaction::None,
                     &self.secp,
    @@ -4917,18 +5003,18 @@
         pub fn public_descriptor(
             &self,
             keychain: KeychainKind,
    -    ) -> Result<Option<ExtendedDescriptor>, Error> {
    +    ) -> Result<Option<ExtendedDescriptor>, Error> {
             match (keychain, self.change_descriptor.as_ref()) {
    -            (KeychainKind::External, _) => Ok(Some(self.descriptor.clone())),
    -            (KeychainKind::Internal, None) => Ok(None),
    -            (KeychainKind::Internal, Some(desc)) => Ok(Some(desc.clone())),
    +            (KeychainKind::External, _) => Ok(Some(self.descriptor.clone())),
    +            (KeychainKind::Internal, None) => Ok(None),
    +            (KeychainKind::Internal, Some(desc)) => Ok(Some(desc.clone())),
             }
         }
     
         /// Try to finalize a PSBT
         ///
         /// The [`SignOptions`] can be used to tweak the behavior of the finalizer.
    -    pub fn finalize_psbt(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result<bool, Error> {
    +    pub fn finalize_psbt(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result<bool, Error> {
             let tx = &psbt.global.unsigned_tx;
             let mut finished = true;
     
    @@ -4979,28 +5065,28 @@
                     });
     
                 match desc {
    -                Some(desc) => {
    +                Some(desc) => {
                         let mut tmp_input = bitcoin::TxIn::default();
                         match desc.satisfy(
    -                        &mut tmp_input,
    +                        &mut tmp_input,
                             (
                                 PsbtInputSatisfier::new(psbt, n),
                                 After::new(current_height, false),
                                 Older::new(current_height, create_height, false),
                             ),
                         ) {
    -                        Ok(_) => {
    -                            let psbt_input = &mut psbt.inputs[n];
    +                        Ok(_) => {
    +                            let psbt_input = &mut psbt.inputs[n];
                                 psbt_input.final_script_sig = Some(tmp_input.script_sig);
                                 psbt_input.final_script_witness = Some(tmp_input.witness);
                             }
    -                        Err(e) => {
    +                        Err(e) => {
                                 debug!("satisfy error {:?} for input {}", e, n);
                                 finished = false
                             }
                         }
                     }
    -                None => finished = false,
    +                None => finished = false,
                 }
             }
     
    @@ -5008,12 +5094,12 @@
         }
     
         /// Return the secp256k1 context used for all signing operations
    -    pub fn secp_ctx(&self) -> &SecpCtx {
    +    pub fn secp_ctx(&self) -> &SecpCtx {
             &self.secp
         }
     
    -    /// Returns the descriptor used to create adddresses for a particular `keychain`.
    -    pub fn get_descriptor_for_keychain(&self, keychain: KeychainKind) -> &ExtendedDescriptor {
    +    /// Returns the descriptor used to create addresses for a particular `keychain`.
    +    pub fn get_descriptor_for_keychain(&self, keychain: KeychainKind) -> &ExtendedDescriptor {
             let (descriptor, _) = self._get_descriptor_for_keychain(keychain);
             descriptor
         }
    @@ -5023,20 +5109,20 @@
         fn _get_descriptor_for_keychain(
             &self,
             keychain: KeychainKind,
    -    ) -> (&ExtendedDescriptor, KeychainKind) {
    +    ) -> (&ExtendedDescriptor, KeychainKind) {
             match keychain {
    -            KeychainKind::Internal if self.change_descriptor.is_some() => (
    +            KeychainKind::Internal if self.change_descriptor.is_some() => (
                     self.change_descriptor.as_ref().unwrap(),
                     KeychainKind::Internal,
                 ),
    -            _ => (&self.descriptor, KeychainKind::External),
    +            _ => (&self.descriptor, KeychainKind::External),
             }
         }
     
         fn get_descriptor_for_txout(
             &self,
             txout: &TxOut,
    -    ) -> Result<Option<DerivedDescriptor<'_>>, Error> {
    +    ) -> Result<Option<DerivedDescriptor<'_>>, Error> {
             Ok(self
                 .database
                 .borrow()
    @@ -5045,18 +5131,18 @@
                 .map(|(desc, child)| desc.as_derived(child, &self.secp)))
         }
     
    -    fn get_change_address(&self) -> Result<Script, Error> {
    +    fn get_change_address(&self) -> Result<Script, Error> {
             let (desc, keychain) = self._get_descriptor_for_keychain(KeychainKind::Internal);
             let index = self.fetch_and_increment_index(keychain)?;
     
             Ok(desc.as_derived(index, &self.secp).script_pubkey())
         }
     
    -    fn fetch_and_increment_index(&self, keychain: KeychainKind) -> Result<u32, Error> {
    +    fn fetch_and_increment_index(&self, keychain: KeychainKind) -> Result<u32, Error> {
             let (descriptor, keychain) = self._get_descriptor_for_keychain(keychain);
             let index = match descriptor.is_deriveable() {
    -            false => 0,
    -            true => self.database.borrow_mut().increment_last_index(keychain)?,
    +            false => 0,
    +            true => self.database.borrow_mut().increment_last_index(keychain)?,
             };
     
             if self
    @@ -5080,11 +5166,11 @@
             Ok(index)
         }
     
    -    fn fetch_index(&self, keychain: KeychainKind) -> Result<u32, Error> {
    +    fn fetch_index(&self, keychain: KeychainKind) -> Result<u32, Error> {
             let (descriptor, keychain) = self._get_descriptor_for_keychain(keychain);
             let index = match descriptor.is_deriveable() {
    -            false => Some(0),
    -            true => self.database.borrow_mut().get_last_index(keychain)?,
    +            false => Some(0),
    +            true => self.database.borrow_mut().get_last_index(keychain)?,
             };
     
             if let Some(i) = index {
    @@ -5094,7 +5180,7 @@
             }
         }
     
    -    fn set_index(&self, keychain: KeychainKind, index: u32) -> Result<(), Error> {
    +    fn set_index(&self, keychain: KeychainKind, index: u32) -> Result<(), Error> {
             self.database.borrow_mut().set_last_index(keychain, index)?;
             Ok(())
         }
    @@ -5104,7 +5190,7 @@
             keychain: KeychainKind,
             from: u32,
             mut count: u32,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             let (descriptor, keychain) = self._get_descriptor_for_keychain(keychain);
             if !descriptor.is_deriveable() {
                 if from > 0 {
    @@ -5137,7 +5223,7 @@
             Ok(())
         }
     
    -    fn get_available_utxos(&self) -> Result<Vec<(LocalUtxo, usize)>, Error> {
    +    fn get_available_utxos(&self) -> Result<Vec<(LocalUtxo, usize)>, Error> {
             Ok(self
                 .list_unspent()?
                 .into_iter()
    @@ -5164,7 +5250,7 @@
             must_use_all_available: bool,
             manual_only: bool,
             must_only_use_confirmed_tx: bool,
    -    ) -> Result<(Vec<WeightedUtxo>, Vec<WeightedUtxo>), Error> {
    +    ) -> Result<(Vec<WeightedUtxo>, Vec<WeightedUtxo>), Error> {
             //    must_spend <- manually selected utxos
             //    may_spend  <- all other available utxos
             let mut may_spend = self.get_available_utxos()?;
    @@ -5172,7 +5258,7 @@
             may_spend.retain(|may_spend| {
                 !manually_selected
                     .iter()
    -                .any(|manually_selected| manually_selected.utxo.outpoint() == may_spend.0.outpoint)
    +                .any(|manually_selected| manually_selected.utxo.outpoint() == may_spend.0.outpoint)
             });
             let mut must_spend = manually_selected;
     
    @@ -5183,7 +5269,7 @@
             }
     
             let satisfies_confirmed = match must_only_use_confirmed_tx {
    -            true => {
    +            true => {
                     let database = self.database.borrow();
                     may_spend
                         .iter()
    @@ -5191,13 +5277,13 @@
                             database
                                 .get_tx(&u.0.outpoint.txid, true)
                                 .map(|tx| match tx {
    -                                None => false,
    -                                Some(tx) => tx.confirmation_time.is_some(),
    +                                None => false,
    +                                Some(tx) => tx.confirmation_time.is_some(),
                                 })
                         })
                         .collect::<Result<Vec<_>, _>>()?
                 }
    -            false => vec![true; may_spend.len()],
    +            false => vec![true; may_spend.len()],
             };
     
             let mut i = 0;
    @@ -5218,7 +5304,7 @@
                 .collect();
     
             if must_use_all_available {
    -            must_spend.append(&mut may_spend);
    +            must_spend.append(&mut may_spend);
             }
     
             Ok((must_spend, may_spend))
    @@ -5229,7 +5315,7 @@
             tx: Transaction,
             selected: Vec<Utxo>,
             params: TxParams,
    -    ) -> Result<Psbt, Error> {
    +    ) -> Result<Psbt, Error> {
             use bitcoin::util::psbt::serialize::Serialize;
     
             let mut psbt = Psbt::from_unsigned_tx(tx)?;
    @@ -5249,11 +5335,11 @@
                     };
     
                     let origin = match xpub.origin {
    -                    Some(origin) => origin,
    -                    None if xpub.xkey.depth == 0 => {
    +                    Some(origin) => origin,
    +                    None if xpub.xkey.depth == 0 => {
                             (xpub.root_fingerprint(&self.secp), vec![].into())
                         }
    -                    _ => return Err(Error::MissingKeyOrigin(xpub.xkey.to_string())),
    +                    _ => return Err(Error::MissingKeyOrigin(xpub.xkey.to_string())),
                     };
     
                     psbt.global.unknown.insert(key, origin.serialize());
    @@ -5272,28 +5358,28 @@
                 .zip(psbt.global.unsigned_tx.input.iter())
             {
                 let utxo = match lookup_output.remove(&input.previous_output) {
    -                Some(utxo) => utxo,
    -                None => continue,
    +                Some(utxo) => utxo,
    +                None => continue,
                 };
     
                 match utxo {
    -                Utxo::Local(utxo) => {
    +                Utxo::Local(utxo) => {
                         *psbt_input =
                             match self.get_psbt_input(utxo, params.sighash, params.only_witness_utxo) {
    -                            Ok(psbt_input) => psbt_input,
    -                            Err(e) => match e {
    -                                Error::UnknownUtxo => Input {
    +                            Ok(psbt_input) => psbt_input,
    +                            Err(e) => match e {
    +                                Error::UnknownUtxo => Input {
                                         sighash_type: params.sighash,
                                         ..Input::default()
                                     },
    -                                _ => return Err(e),
    +                                _ => return Err(e),
                                 },
                             }
                     }
                     Utxo::Foreign {
                         psbt_input: foreign_psbt_input,
                         outpoint,
    -                } => {
    +                } => {
                         if !params.only_witness_utxo && foreign_psbt_input.non_witness_utxo.is_none() {
                             return Err(Error::Generic(format!(
                                 "Missing non_witness_utxo on foreign utxo {}",
    @@ -5306,7 +5392,7 @@
             }
     
             // probably redundant but it doesn't hurt...
    -        self.add_input_hd_keypaths(&mut psbt)?;
    +        self.add_input_hd_keypaths(&mut psbt)?;
     
             // add metadata for the outputs
             for (psbt_output, tx_output) in psbt
    @@ -5339,7 +5425,7 @@
             utxo: LocalUtxo,
             sighash_type: Option<SigHashType>,
             only_witness_utxo: bool,
    -    ) -> Result<Input, Error> {
    +    ) -> Result<Input, Error> {
             // Try to find the prev_script in our db to figure out if this is internal or external,
             // and the derivation index
             let (keychain, child) = self
    @@ -5372,7 +5458,7 @@
             Ok(psbt_input)
         }
     
    -    fn add_input_hd_keypaths(&self, psbt: &mut Psbt) -> Result<(), Error> {
    +    fn add_input_hd_keypaths(&self, psbt: &mut Psbt) -> Result<(), Error> {
             let mut input_utxos = Vec::with_capacity(psbt.inputs.len());
             for n in 0..psbt.inputs.len() {
                 input_utxos.push(psbt.get_utxo_for(n).clone());
    @@ -5393,13 +5479,18 @@
                         let mut hd_keypaths = desc
                             .as_derived(child, &self.secp)
                             .get_hd_keypaths(&self.secp)?;
    -                    psbt_input.bip32_derivation.append(&mut hd_keypaths);
    +                    psbt_input.bip32_derivation.append(&mut hd_keypaths);
                     }
                 }
             }
     
             Ok(())
         }
    +
    +    /// Return an immutable reference to the internal database
    +    pub fn database(&self) -> impl std::ops::Deref<Target = D> + '_ {
    +        self.database.borrow()
    +    }
     }
     
     impl<B, D> Wallet<B, D>
    @@ -5415,7 +5506,7 @@
             network: Network,
             database: D,
             client: B,
    -    ) -> Result<Self, Error> {
    +    ) -> Result<Self, Error> {
             let current_height = Some(maybe_await!(client.get_height())? as u32);
             Self::_new(
                 descriptor,
    @@ -5433,14 +5524,14 @@
             &self,
             progress_update: P,
             max_address_param: Option<u32>,
    -    ) -> Result<(), Error> {
    +    ) -> Result<(), Error> {
             debug!("Begin sync...");
     
             let mut run_setup = false;
     
             let max_address = match self.descriptor.is_deriveable() {
    -            false => 0,
    -            true => max_address_param.unwrap_or(CACHE_ADDR_BATCH_SIZE),
    +            false => 0,
    +            true => max_address_param.unwrap_or(CACHE_ADDR_BATCH_SIZE),
             };
             debug!("max_address {}", max_address);
             if self
    @@ -5456,8 +5547,8 @@
     
             if let Some(change_descriptor) = &self.change_descriptor {
                 let max_address = match change_descriptor.is_deriveable() {
    -                false => 0,
    -                true => max_address_param.unwrap_or(CACHE_ADDR_BATCH_SIZE),
    +                false => 0,
    +                true => max_address_param.unwrap_or(CACHE_ADDR_BATCH_SIZE),
                 };
     
                 if self
    @@ -5502,18 +5593,27 @@
                 }
             }
     
    +        let sync_time = SyncTime {
    +            block_time: BlockTime {
    +                height: maybe_await!(self.client.get_height())?,
    +                timestamp: time::get_timestamp(),
    +            },
    +        };
    +        debug!("Saving `sync_time` = {:?}", sync_time);
    +        self.database.borrow_mut().set_sync_time(sync_time)?;
    +
             Ok(())
         }
     
         /// Return a reference to the internal blockchain client
    -    pub fn client(&self) -> &B {
    +    pub fn client(&self) -> &B {
             &self.client
         }
     
         /// Broadcast a transaction to the network
         #[maybe_async]
    -    pub fn broadcast(&self, tx: Transaction) -> Result<Txid, Error> {
    -        maybe_await!(self.client.broadcast(&tx))?;
    +    pub fn broadcast(&self, tx: &Transaction) -> Result<Txid, Error> {
    +        maybe_await!(self.client.broadcast(tx))?;
     
             Ok(tx.txid())
         }
    @@ -5522,7 +5622,7 @@
     /// Return a fake wallet that appears to be funded for testing.
     pub fn get_funded_wallet(
         descriptor: &str,
    -) -> (
    +) -> (
         Wallet<(), MemoryDatabase>,
         (String, Option<String>),
         bitcoin::Txid,
    @@ -5539,7 +5639,7 @@
         let funding_address_kix = 0;
     
         let tx_meta = testutils! {
    -            @tx ( (@external descriptors, funding_address_kix) => 50_000 ) (@confirmations 1)
    +            @tx ( (@external descriptors, funding_address_kix) => 50_000 ) (@confirmations 1)
         };
     
         wallet
    @@ -5665,31 +5765,31 @@
                 .is_some());
         }
     
    -    pub(crate) fn get_test_wpkh() -> &'static str {
    +    pub(crate) fn get_test_wpkh() -> &'static str {
             "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)"
         }
     
    -    pub(crate) fn get_test_single_sig_csv() -> &'static str {
    +    pub(crate) fn get_test_single_sig_csv() -> &'static str {
             // and(pk(Alice),older(6))
             "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),older(6)))"
         }
     
    -    pub(crate) fn get_test_a_or_b_plus_csv() -> &'static str {
    +    pub(crate) fn get_test_a_or_b_plus_csv() -> &'static str {
             // or(pk(Alice),and(pk(Bob),older(144)))
             "wsh(or_d(pk(cRjo6jqfVNP33HhSS76UhXETZsGTZYx8FMFvR9kpbtCSV1PmdZdu),and_v(v:pk(cMnkdebixpXMPfkcNEjjGin7s94hiehAH4mLbYkZoh9KSiNNmqC8),older(144))))"
         }
     
    -    pub(crate) fn get_test_single_sig_cltv() -> &'static str {
    +    pub(crate) fn get_test_single_sig_cltv() -> &'static str {
             // and(pk(Alice),after(100000))
             "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(100000)))"
         }
     
         macro_rules! assert_fee_rate {
    -        ($tx:expr, $fees:expr, $fee_rate:expr $( ,@dust_change $( $dust_change:expr )* )* $( ,@add_signature $( $add_signature:expr )* )* ) => ({
    +        ($tx:expr, $fees:expr, $fee_rate:expr $( ,@dust_change $( $dust_change:expr )* )* $( ,@add_signature $( $add_signature:expr )* )* ) => ({
                 let mut tx = $tx.clone();
                 $(
                     $( $add_signature )*
    -                for txin in &mut tx.input {
    +                for txin in &mut tx.input {
                         txin.witness.push([0x00; 108].to_vec()); // fake signature
                     }
                 )*
    @@ -5965,11 +6065,11 @@
             assert_eq!(outputs.len(), 2);
             let main_output = outputs
                 .iter()
    -            .find(|x| x.script_pubkey == addr.script_pubkey())
    +            .find(|x| x.script_pubkey == addr.script_pubkey())
                 .unwrap();
             let drain_output = outputs
                 .iter()
    -            .find(|x| x.script_pubkey == drain_addr.script_pubkey())
    +            .find(|x| x.script_pubkey == drain_addr.script_pubkey())
                 .unwrap();
             assert_eq!(main_output.value, 20_000,);
             assert_eq!(drain_output.value, 30_000 - details.fee.unwrap_or(0));
    @@ -6316,7 +6416,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             let small_output_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -6345,7 +6445,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             let small_output_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -6474,13 +6574,13 @@
                     .unsigned_tx
                     .input
                     .iter()
    -                .any(|input| input.previous_output == utxo.outpoint),
    +                .any(|input| input.previous_output == utxo.outpoint),
                 "foreign_utxo should be in there"
             );
     
             let finished = wallet1
                 .sign(
    -                &mut psbt,
    +                &mut psbt,
                     SignOptions {
                         trust_witness_utxo: true,
                         ..Default::default()
    @@ -6495,7 +6595,7 @@
     
             let finished = wallet2
                 .sign(
    -                &mut psbt,
    +                &mut psbt,
                     SignOptions {
                         trust_witness_utxo: true,
                         ..Default::default()
    @@ -6731,7 +6831,7 @@
             let txid = tx.txid();
             // skip saving the utxos, we know they can't be used anyways
             details.transaction = Some(tx);
    -        details.confirmation_time = Some(ConfirmationTime {
    +        details.confirmation_time = Some(BlockTime {
                 timestamp: 12345678,
                 height: 42,
             });
    @@ -6818,7 +6918,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -6849,7 +6949,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 25_000
    @@ -6878,7 +6978,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -6915,7 +7015,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 25_000
    @@ -6944,7 +7044,7 @@
             let (psbt, mut original_details) = builder.finish().unwrap();
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -6988,7 +7088,7 @@
             let (psbt, mut original_details) = builder.finish().unwrap();
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7026,7 +7126,7 @@
             // receive an extra tx so that our wallet has two utxos.
             let incoming_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
             let outpoint = OutPoint {
    @@ -7044,7 +7144,7 @@
             let (psbt, mut original_details) = builder.finish().unwrap();
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7083,7 +7183,7 @@
             // unless you've also set "allow_shrinking" OR there is a change output.
             let incoming_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
             let outpoint = OutPoint {
    @@ -7101,7 +7201,7 @@
             let (psbt, mut original_details) = builder.finish().unwrap();
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7129,7 +7229,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7142,7 +7242,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7170,7 +7270,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 45_000
    @@ -7192,7 +7292,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7205,7 +7305,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7233,7 +7333,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 45_000
    @@ -7255,7 +7355,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             let incoming_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7276,7 +7376,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7310,7 +7410,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 original_send_all_amount
    @@ -7332,7 +7432,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7347,7 +7447,7 @@
             assert_eq!(tx.output.len(), 2);
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7381,7 +7481,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 45_000
    @@ -7395,7 +7495,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             let incoming_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7408,7 +7508,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7444,7 +7544,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 45_000
    @@ -7466,7 +7566,7 @@
             let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
             let incoming_txid = crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7479,7 +7579,7 @@
             let mut tx = psbt.extract_tx();
             let txid = tx.txid();
             // skip saving the new utxos, we know they can't be used anyways
    -        for txin in &mut tx.input {
    +        for txin in &mut tx.input {
                 txin.witness.push([0x00; 108].to_vec()); // fake signature
                 wallet
                     .database
    @@ -7515,7 +7615,7 @@
             assert_eq!(
                 tx.output
                     .iter()
    -                .find(|txout| txout.script_pubkey == addr.script_pubkey())
    +                .find(|txout| txout.script_pubkey == addr.script_pubkey())
                     .unwrap()
                     .value,
                 45_000
    @@ -7540,7 +7640,7 @@
             builder.drain_to(addr.script_pubkey()).drain_wallet();
             let (mut psbt, _) = builder.finish().unwrap();
     
    -        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
    +        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
             assert!(finalized);
     
             let extracted = psbt.extract_tx();
    @@ -7555,7 +7655,7 @@
             builder.drain_to(addr.script_pubkey()).drain_wallet();
             let (mut psbt, _) = builder.finish().unwrap();
     
    -        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
    +        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
             assert!(finalized);
     
             let extracted = psbt.extract_tx();
    @@ -7570,7 +7670,7 @@
             builder.drain_to(addr.script_pubkey()).drain_wallet();
             let (mut psbt, _) = builder.finish().unwrap();
     
    -        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
    +        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
             assert!(finalized);
     
             let extracted = psbt.extract_tx();
    @@ -7585,7 +7685,7 @@
             builder.drain_to(addr.script_pubkey()).drain_wallet();
             let (mut psbt, _) = builder.finish().unwrap();
     
    -        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
    +        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
             assert!(finalized);
     
             let extracted = psbt.extract_tx();
    @@ -7601,7 +7701,7 @@
             builder.drain_to(addr.script_pubkey()).drain_wallet();
             let (mut psbt, _) = builder.finish().unwrap();
     
    -        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
    +        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
             assert!(finalized);
     
             let extracted = psbt.extract_tx();
    @@ -7619,7 +7719,7 @@
             psbt.inputs[0].bip32_derivation.clear();
             assert_eq!(psbt.inputs[0].bip32_derivation.len(), 0);
     
    -        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
    +        let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
             assert!(finalized);
     
             let extracted = psbt.extract_tx();
    @@ -7670,7 +7770,7 @@
             psbt.global.unsigned_tx.input.push(bitcoin::TxIn::default());
             let is_final = wallet
                 .sign(
    -                &mut psbt,
    +                &mut psbt,
                     SignOptions {
                         trust_witness_utxo: true,
                         ..Default::default()
    @@ -7700,7 +7800,7 @@
                 .drain_wallet();
             let (mut psbt, _) = builder.finish().unwrap();
     
    -        let result = wallet.sign(&mut psbt, Default::default());
    +        let result = wallet.sign(&mut psbt, Default::default());
             assert!(
                 result.is_err(),
                 "Signing should have failed because the TX uses non-standard sighashes"
    @@ -7715,7 +7815,7 @@
     
             // try again after opting-in
             let result = wallet.sign(
    -            &mut psbt,
    +            &mut psbt,
                 SignOptions {
                     allow_all_sighashes: true,
                     ..Default::default()
    @@ -7771,7 +7871,7 @@
             // use the above address
             crate::populate_test_db!(
                 wallet.database.borrow_mut(),
    -            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
    +            testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
                 Some(100),
             );
     
    @@ -7933,8 +8033,47 @@
                 }
             );
         }
    +
    +    #[test]
    +    fn test_sending_to_bip350_bech32m_address() {
    +        let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
    +        let addr =
    +            Address::from_str("tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c")
    +                .unwrap();
    +        let mut builder = wallet.build_tx();
    +        builder.add_recipient(addr.script_pubkey(), 45_000);
    +        builder.finish().unwrap();
    +    }
    +}
    +
    +/// Deterministically generate a unique name given the descriptors defining the wallet
    +pub fn wallet_name_from_descriptor<T>(
    +    descriptor: T,
    +    change_descriptor: Option<T>,
    +    network: Network,
    +    secp: &SecpCtx,
    +) -> Result<String, Error>
    +where
    +    T: IntoWalletDescriptor,
    +{
    +    //TODO check descriptors contains only public keys
    +    let descriptor = descriptor
    +        .into_wallet_descriptor(secp, network)?
    +        .0
    +        .to_string();
    +    let mut wallet_name = get_checksum(&descriptor[..descriptor.find('#').unwrap()])?;
    +    if let Some(change_descriptor) = change_descriptor {
    +        let change_descriptor = change_descriptor
    +            .into_wallet_descriptor(secp, network)?
    +            .0
    +            .to_string();
    +        wallet_name.push_str(
    +            get_checksum(&change_descriptor[..change_descriptor.find('#').unwrap()])?.as_str(),
    +        );
    +    }
    +
    +    Ok(wallet_name)
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/signer.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/signer.rs.html index 77838e7d8e..28a606c35b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/signer.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/signer.rs.html @@ -1,4 +1,6 @@ -signer.rs - source
      1
    +signer.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -881,13 +883,13 @@
     }
     
     impl From<hash160::Hash> for SignerId {
    -    fn from(hash: hash160::Hash) -> SignerId {
    +    fn from(hash: hash160::Hash) -> SignerId {
             SignerId::PkHash(hash)
         }
     }
     
     impl From<Fingerprint> for SignerId {
    -    fn from(fing: Fingerprint) -> SignerId {
    +    fn from(fing: Fingerprint) -> SignerId {
             SignerId::Fingerprint(fing)
         }
     }
    @@ -909,7 +911,7 @@
         InvalidNonWitnessUtxo,
         /// The `witness_utxo` field of the transaction is required to sign this input
         MissingWitnessUtxo,
    -    /// The `witness_script` field of the transaction is requied to sign this input
    +    /// The `witness_script` field of the transaction is required to sign this input
         MissingWitnessScript,
         /// The fingerprint and derivation path are missing from the psbt input
         MissingHdKeypath,
    @@ -922,7 +924,7 @@
     }
     
     impl fmt::Display for SignerError {
    -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             write!(f, "{:?}", self)
         }
     }
    @@ -941,27 +943,27 @@
         /// can be ignored.
         fn sign(
             &self,
    -        psbt: &mut psbt::PartiallySignedTransaction,
    +        psbt: &mut psbt::PartiallySignedTransaction,
             input_index: Option<usize>,
             secp: &SecpCtx,
    -    ) -> Result<(), SignerError>;
    +    ) -> Result<(), SignerError>;
     
         /// Return whether or not the signer signs the whole transaction in one go instead of every
         /// input individually
    -    fn sign_whole_tx(&self) -> bool;
    +    fn sign_whole_tx(&self) -> bool;
     
         /// Return the [`SignerId`] for this signer
         ///
         /// The [`SignerId`] can be used to lookup a signer in the [`Wallet`](crate::Wallet)'s signers map or to
         /// compare two signers.
    -    fn id(&self, secp: &SecpCtx) -> SignerId;
    +    fn id(&self, secp: &SecpCtx) -> SignerId;
     
         /// Return the secret key for the signer
         ///
         /// This is used internally to reconstruct the original descriptor that may contain secrets.
         /// External signers that are meant to keep key isolated should just return `None` here (which
         /// is the default for this method, if not overridden).
    -    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
    +    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
             None
         }
     }
    @@ -969,10 +971,10 @@
     impl Signer for DescriptorXKey<ExtendedPrivKey> {
         fn sign(
             &self,
    -        psbt: &mut psbt::PartiallySignedTransaction,
    +        psbt: &mut psbt::PartiallySignedTransaction,
             input_index: Option<usize>,
             secp: &SecpCtx,
    -    ) -> Result<(), SignerError> {
    +    ) -> Result<(), SignerError> {
             let input_index = input_index.unwrap();
             if input_index >= psbt.inputs.len() {
                 return Err(SignerError::InputIndexOutOfRange);
    @@ -996,19 +998,19 @@
                 })
                 .next()
             {
    -            Some((pk, full_path)) => (pk, full_path.clone()),
    -            None => return Ok(()),
    +            Some((pk, full_path)) => (pk, full_path.clone()),
    +            None => return Ok(()),
             };
     
             let derived_key = match self.origin.clone() {
    -            Some((_fingerprint, origin_path)) => {
    +            Some((_fingerprint, origin_path)) => {
                     let deriv_path = DerivationPath::from(
                         &full_path.into_iter().cloned().collect::<Vec<ChildNumber>>()
                             [origin_path.len()..],
                     );
                     self.xkey.derive_priv(secp, &deriv_path).unwrap()
                 }
    -            None => self.xkey.derive_priv(secp, &full_path).unwrap(),
    +            None => self.xkey.derive_priv(secp, &full_path).unwrap(),
             };
     
             if &derived_key.private_key.public_key(secp) != public_key {
    @@ -1018,15 +1020,15 @@
             }
         }
     
    -    fn sign_whole_tx(&self) -> bool {
    +    fn sign_whole_tx(&self) -> bool {
             false
         }
     
    -    fn id(&self, secp: &SecpCtx) -> SignerId {
    +    fn id(&self, secp: &SecpCtx) -> SignerId {
             SignerId::from(self.root_fingerprint(secp))
         }
     
    -    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
    +    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
             Some(DescriptorSecretKey::XPrv(self.clone()))
         }
     }
    @@ -1034,10 +1036,10 @@
     impl Signer for PrivateKey {
         fn sign(
             &self,
    -        psbt: &mut psbt::PartiallySignedTransaction,
    +        psbt: &mut psbt::PartiallySignedTransaction,
             input_index: Option<usize>,
             secp: &SecpCtx,
    -    ) -> Result<(), SignerError> {
    +    ) -> Result<(), SignerError> {
             let input_index = input_index.unwrap();
             if input_index >= psbt.inputs.len() || input_index >= psbt.global.unsigned_tx.input.len() {
                 return Err(SignerError::InputIndexOutOfRange);
    @@ -1055,12 +1057,12 @@
             }
     
             // FIXME: use the presence of `witness_utxo` as an indication that we should make a bip143
    -        // sig. Does this make sense? Should we add an extra argument to explicitly swith between
    +        // sig. Does this make sense? Should we add an extra argument to explicitly switch between
             // these? The original idea was to declare sign() as sign<Ctx: ScriptContex>() and use Ctx,
             // but that violates the rules for trait-objects, so we can't do it.
             let (hash, sighash) = match psbt.inputs[input_index].witness_utxo {
    -            Some(_) => Segwitv0::sighash(psbt, input_index)?,
    -            None => Legacy::sighash(psbt, input_index)?,
    +            Some(_) => Segwitv0::sighash(psbt, input_index)?,
    +            None => Legacy::sighash(psbt, input_index)?,
             };
     
             let signature = secp.sign(
    @@ -1079,15 +1081,15 @@
             Ok(())
         }
     
    -    fn sign_whole_tx(&self) -> bool {
    +    fn sign_whole_tx(&self) -> bool {
             false
         }
     
    -    fn id(&self, secp: &SecpCtx) -> SignerId {
    +    fn id(&self, secp: &SecpCtx) -> SignerId {
             SignerId::from(self.public_key(secp).to_pubkeyhash())
         }
     
    -    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
    +    fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
             Some(DescriptorSecretKey::SinglePriv(DescriptorSinglePriv {
                 key: *self,
                 origin: None,
    @@ -1104,7 +1106,7 @@
     pub struct SignerOrdering(pub usize);
     
     impl std::default::Default for SignerOrdering {
    -    fn default() -> Self {
    +    fn default() -> Self {
             SignerOrdering(100)
         }
     }
    @@ -1116,7 +1118,7 @@
     }
     
     impl From<(SignerId, SignerOrdering)> for SignersContainerKey {
    -    fn from(tuple: (SignerId, SignerOrdering)) -> Self {
    +    fn from(tuple: (SignerId, SignerOrdering)) -> Self {
             SignersContainerKey {
                 id: tuple.0,
                 ordering: tuple.1,
    @@ -1130,7 +1132,7 @@
     
     impl SignersContainer {
         /// Create a map of public keys to secret keys
    -    pub fn as_key_map(&self, secp: &SecpCtx) -> KeyMap {
    +    pub fn as_key_map(&self, secp: &SecpCtx) -> KeyMap {
             self.0
                 .values()
                 .filter_map(|signer| signer.descriptor_secret_key())
    @@ -1140,18 +1142,18 @@
     }
     
     impl From<KeyMap> for SignersContainer {
    -    fn from(keymap: KeyMap) -> SignersContainer {
    +    fn from(keymap: KeyMap) -> SignersContainer {
             let secp = Secp256k1::new();
             let mut container = SignersContainer::new();
     
             for (_, secret) in keymap {
                 match secret {
    -                DescriptorSecretKey::SinglePriv(private_key) => container.add_external(
    +                DescriptorSecretKey::SinglePriv(private_key) => container.add_external(
                         SignerId::from(private_key.key.public_key(&secp).to_pubkeyhash()),
                         SignerOrdering::default(),
                         Arc::new(private_key.key),
                     ),
    -                DescriptorSecretKey::XPrv(xprv) => container.add_external(
    +                DescriptorSecretKey::XPrv(xprv) => container.add_external(
                         SignerId::from(xprv.root_fingerprint(&secp)),
                         SignerOrdering::default(),
                         Arc::new(xprv),
    @@ -1165,28 +1167,28 @@
     
     impl SignersContainer {
         /// Default constructor
    -    pub fn new() -> Self {
    +    pub fn new() -> Self {
             SignersContainer(Default::default())
         }
     
         /// Adds an external signer to the container for the specified id. Optionally returns the
         /// signer that was previously in the container, if any
         pub fn add_external(
    -        &mut self,
    +        &mut self,
             id: SignerId,
             ordering: SignerOrdering,
             signer: Arc<dyn Signer>,
    -    ) -> Option<Arc<dyn Signer>> {
    +    ) -> Option<Arc<dyn Signer>> {
             self.0.insert((id, ordering).into(), signer)
         }
     
         /// Removes a signer from the container and returns it
    -    pub fn remove(&mut self, id: SignerId, ordering: SignerOrdering) -> Option<Arc<dyn Signer>> {
    +    pub fn remove(&mut self, id: SignerId, ordering: SignerOrdering) -> Option<Arc<dyn Signer>> {
             self.0.remove(&(id, ordering).into())
         }
     
         /// Returns the list of identifiers of all the signers in the container
    -    pub fn ids(&self) -> Vec<&SignerId> {
    +    pub fn ids(&self) -> Vec<&SignerId> {
             self.0
                 .keys()
                 .map(|SignersContainerKey { id, .. }| id)
    @@ -1194,18 +1196,18 @@
         }
     
         /// Returns the list of signers in the container, sorted by lowest to highest `ordering`
    -    pub fn signers(&self) -> Vec<&Arc<dyn Signer>> {
    +    pub fn signers(&self) -> Vec<&Arc<dyn Signer>> {
             self.0.values().collect()
         }
     
         /// Finds the signer with lowest ordering for a given id in the container.
    -    pub fn find(&self, id: SignerId) -> Option<&Arc<dyn Signer>> {
    +    pub fn find(&self, id: SignerId) -> Option<&Arc<dyn Signer>> {
             self.0
                 .range((
                     Included(&(id.clone(), SignerOrdering(0)).into()),
                     Included(&(id.clone(), SignerOrdering(usize::MAX)).into()),
                 ))
    -            .filter(|(k, _)| k.id == id)
    +            .filter(|(k, _)| k.id == id)
                 .map(|(_, v)| v)
                 .next()
         }
    @@ -1246,7 +1248,7 @@
     }
     
     impl Default for SignOptions {
    -    fn default() -> Self {
    +    fn default() -> Self {
             SignOptions {
                 trust_witness_utxo: false,
                 assume_height: None,
    @@ -1259,14 +1261,14 @@
         fn sighash(
             psbt: &psbt::PartiallySignedTransaction,
             input_index: usize,
    -    ) -> Result<(SigHash, SigHashType), SignerError>;
    +    ) -> Result<(SigHash, SigHashType), SignerError>;
     }
     
     impl ComputeSighash for Legacy {
         fn sighash(
             psbt: &psbt::PartiallySignedTransaction,
             input_index: usize,
    -    ) -> Result<(SigHash, SigHashType), SignerError> {
    +    ) -> Result<(SigHash, SigHashType), SignerError> {
             if input_index >= psbt.inputs.len() || input_index >= psbt.global.unsigned_tx.input.len() {
                 return Err(SignerError::InputIndexOutOfRange);
             }
    @@ -1276,8 +1278,8 @@
     
             let sighash = psbt_input.sighash_type.unwrap_or(SigHashType::All);
             let script = match psbt_input.redeem_script {
    -            Some(ref redeem_script) => redeem_script.clone(),
    -            None => {
    +            Some(ref redeem_script) => redeem_script.clone(),
    +            None => {
                     let non_witness_utxo = psbt_input
                         .non_witness_utxo
                         .as_ref()
    @@ -1300,7 +1302,7 @@
         }
     }
     
    -fn p2wpkh_script_code(script: &Script) -> Script {
    +fn p2wpkh_script_code(script: &Script) -> Script {
         ScriptBuilder::new()
             .push_opcode(opcodes::all::OP_DUP)
             .push_opcode(opcodes::all::OP_HASH160)
    @@ -1314,7 +1316,7 @@
         fn sighash(
             psbt: &psbt::PartiallySignedTransaction,
             input_index: usize,
    -    ) -> Result<(SigHash, SigHashType), SignerError> {
    +    ) -> Result<(SigHash, SigHashType), SignerError> {
             if input_index >= psbt.inputs.len() || input_index >= psbt.global.unsigned_tx.input.len() {
                 return Err(SignerError::InputIndexOutOfRange);
             }
    @@ -1347,8 +1349,8 @@
             let value = utxo.value;
     
             let script = match psbt_input.witness_script {
    -            Some(ref witness_script) => witness_script.clone(),
    -            None => {
    +            Some(ref witness_script) => witness_script.clone(),
    +            None => {
                     if utxo.script_pubkey.is_v0_p2wpkh() {
                         p2wpkh_script_code(&utxo.script_pubkey)
                     } else if psbt_input
    @@ -1377,13 +1379,13 @@
     }
     
     impl PartialOrd for SignersContainerKey {
    -    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
    +    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
             Some(self.cmp(other))
         }
     }
     
     impl Ord for SignersContainerKey {
    -    fn cmp(&self, other: &Self) -> Ordering {
    +    fn cmp(&self, other: &Self) -> Ordering {
             self.ordering
                 .cmp(&other.ordering)
                 .then(self.id.cmp(&other.id))
    @@ -1391,8 +1393,8 @@
     }
     
     impl PartialEq for SignersContainerKey {
    -    fn eq(&self, other: &Self) -> bool {
    -        self.id == other.id && self.ordering == other.ordering
    +    fn eq(&self, other: &Self) -> bool {
    +        self.id == other.id && self.ordering == other.ordering
         }
     }
     
    @@ -1411,9 +1413,9 @@
         use miniscript::ScriptContext;
         use std::str::FromStr;
     
    -    fn is_equal(this: &Arc<dyn Signer>, that: &Arc<DummySigner>) -> bool {
    +    fn is_equal(this: &Arc<dyn Signer>, that: &Arc<DummySigner>) -> bool {
             let secp = Secp256k1::new();
    -        this.id(&secp) == that.id(&secp)
    +        this.id(&secp) == that.id(&secp)
         }
     
         // Signers added with the same ordering (like `Ordering::default`) created from `KeyMap`
    @@ -1495,18 +1497,18 @@
         impl Signer for DummySigner {
             fn sign(
                 &self,
    -            _psbt: &mut PartiallySignedTransaction,
    +            _psbt: &mut PartiallySignedTransaction,
                 _input_index: Option<usize>,
                 _secp: &SecpCtx,
    -        ) -> Result<(), SignerError> {
    +        ) -> Result<(), SignerError> {
                 Ok(())
             }
     
    -        fn id(&self, _secp: &SecpCtx) -> SignerId {
    +        fn id(&self, _secp: &SecpCtx) -> SignerId {
                 SignerId::Dummy(self.number)
             }
     
    -        fn sign_whole_tx(&self) -> bool {
    +        fn sign_whole_tx(&self) -> bool {
                 true
             }
         }
    @@ -1518,7 +1520,7 @@
     
         fn setup_keys<Ctx: ScriptContext>(
             tprv: &str,
    -    ) -> (DescriptorKey<Ctx>, DescriptorKey<Ctx>, Fingerprint) {
    +    ) -> (DescriptorKey<Ctx>, DescriptorKey<Ctx>, Fingerprint) {
             let secp: Secp256k1<All> = Secp256k1::new();
             let path = bip32::DerivationPath::from_str(PATH).unwrap();
             let tprv = bip32::ExtendedPrivKey::from_str(tprv).unwrap();
    @@ -1531,6 +1533,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/time.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/time.rs.html index 48832d0f43..b98a60a3e4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/time.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/time.rs.html @@ -1,4 +1,6 @@ -time.rs - source
     1
    +time.rs - source
    +    
    logo
     1
      2
      3
      4
    @@ -99,7 +101,7 @@
     
     /// Return the current timestamp in seconds
     #[cfg(not(target_arch = "wasm32"))]
    -pub fn get_timestamp() -> u64 {
    +pub fn get_timestamp() -> u64 {
         SystemTime::now()
             .duration_since(UNIX_EPOCH)
             .unwrap()
    @@ -107,7 +109,7 @@
     }
     /// Return the current timestamp in seconds
     #[cfg(target_arch = "wasm32")]
    -pub fn get_timestamp() -> u64 {
    +pub fn get_timestamp() -> u64 {
         let millis = Date::now();
     
         (millis / 1000.0) as u64
    @@ -120,11 +122,11 @@
     
     impl Instant {
         #[cfg(not(target_arch = "wasm32"))]
    -    pub fn new() -> Self {
    +    pub fn new() -> Self {
             Instant(SystemInstant::now())
         }
         #[cfg(target_arch = "wasm32")]
    -    pub fn new() -> Self {
    +    pub fn new() -> Self {
             let millis = Date::now();
     
             let secs = millis / 1000.0;
    @@ -134,17 +136,16 @@
         }
     
         #[cfg(not(target_arch = "wasm32"))]
    -    pub fn elapsed(&self) -> Duration {
    +    pub fn elapsed(&self) -> Duration {
             self.0.elapsed()
         }
         #[cfg(target_arch = "wasm32")]
    -    pub fn elapsed(&self) -> Duration {
    +    pub fn elapsed(&self) -> Duration {
             let now = Instant::new();
     
             now.0.checked_sub(self.0).unwrap_or(Duration::new(0, 0))
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html index 732238dba1..d8a37cfce1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html @@ -1,4 +1,6 @@ -tx_builder.rs - source
      1
    +tx_builder.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -884,6 +886,13 @@
     884
     885
     886
    +887
    +888
    +889
    +890
    +891
    +892
    +893
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -1051,13 +1060,13 @@
     }
     
     impl std::default::Default for FeePolicy {
    -    fn default() -> Self {
    +    fn default() -> Self {
             FeePolicy::FeeRate(FeeRate::default_min_relay_fee())
         }
     }
     
     impl<'a, Cs: Clone, Ctx, B, D> Clone for TxBuilder<'a, B, D, Cs, Ctx> {
    -    fn clone(&self) -> Self {
    +    fn clone(&self) -> Self {
             TxBuilder {
                 wallet: self.wallet,
                 params: self.params.clone(),
    @@ -1072,13 +1081,13 @@
         TxBuilder<'a, B, D, Cs, Ctx>
     {
         /// Set a custom fee rate
    -    pub fn fee_rate(&mut self, fee_rate: FeeRate) -> &mut Self {
    +    pub fn fee_rate(&mut self, fee_rate: FeeRate) -> &mut Self {
             self.params.fee_policy = Some(FeePolicy::FeeRate(fee_rate));
             self
         }
     
         /// Set an absolute fee
    -    pub fn fee_absolute(&mut self, fee_amount: u64) -> &mut Self {
    +    pub fn fee_absolute(&mut self, fee_amount: u64) -> &mut Self {
             self.params.fee_policy = Some(FeePolicy::FeeAmount(fee_amount));
             self
         }
    @@ -1143,13 +1152,13 @@
         /// # Ok::<(), bdk::Error>(())
         /// ```
         pub fn policy_path(
    -        &mut self,
    +        &mut self,
             policy_path: BTreeMap<String, Vec<usize>>,
             keychain: KeychainKind,
    -    ) -> &mut Self {
    +    ) -> &mut Self {
             let to_update = match keychain {
    -            KeychainKind::Internal => &mut self.params.internal_policy_path,
    -            KeychainKind::External => &mut self.params.external_policy_path,
    +            KeychainKind::Internal => &mut self.params.internal_policy_path,
    +            KeychainKind::External => &mut self.params.external_policy_path,
             };
     
             *to_update = Some(policy_path);
    @@ -1162,7 +1171,7 @@
         ///
         /// These have priority over the "unspendable" utxos, meaning that if a utxo is present both in
         /// the "utxos" and the "unspendable" list, it will be spent.
    -    pub fn add_utxos(&mut self, outpoints: &[OutPoint]) -> Result<&mut Self, Error> {
    +    pub fn add_utxos(&mut self, outpoints: &[OutPoint]) -> Result<&mut Self, Error> {
             let utxos = outpoints
                 .iter()
                 .map(|outpoint| self.wallet.get_utxo(*outpoint)?.ok_or(Error::UnknownUtxo))
    @@ -1184,7 +1193,7 @@
         ///
         /// These have priority over the "unspendable" utxos, meaning that if a utxo is present both in
         /// the "utxos" and the "unspendable" list, it will be spent.
    -    pub fn add_utxo(&mut self, outpoint: OutPoint) -> Result<&mut Self, Error> {
    +    pub fn add_utxo(&mut self, outpoint: OutPoint) -> Result<&mut Self, Error> {
             self.add_utxos(&[outpoint])
         }
     
    @@ -1196,7 +1205,7 @@
         /// 2. `psbt_input`: To know the value.
         /// 3. `satisfaction_weight`: To know how much weight/vbytes the input will add to the transaction for fee calculation.
         ///
    -    /// There are several security concerns about adding foregin UTXOs that application
    +    /// There are several security concerns about adding foreign UTXOs that application
         /// developers should consider. First, how do you know the value of the input is correct? If a
         /// `non_witness_utxo` is provided in the `psbt_input` then this method implicitly verifies the
         /// value by checking it against the transaction. If only a `witness_utxo` is provided then this
    @@ -1230,14 +1239,14 @@
         /// [`finish`]: Self::finish
         /// [`max_satisfaction_weight`]: miniscript::Descriptor::max_satisfaction_weight
         pub fn add_foreign_utxo(
    -        &mut self,
    +        &mut self,
             outpoint: OutPoint,
             psbt_input: psbt::Input,
             satisfaction_weight: usize,
    -    ) -> Result<&mut Self, Error> {
    +    ) -> Result<&mut Self, Error> {
             if psbt_input.witness_utxo.is_none() {
                 match psbt_input.non_witness_utxo.as_ref() {
    -                Some(tx) => {
    +                Some(tx) => {
                         if tx.txid() != outpoint.txid {
                             return Err(Error::Generic(
                                 "Foreign utxo outpoint does not match PSBT input".into(),
    @@ -1247,7 +1256,7 @@
                             return Err(Error::InvalidOutpoint(outpoint));
                         }
                     }
    -                None => {
    +                None => {
                         return Err(Error::Generic(
                             "Foreign utxo missing witness_utxo or non_witness_utxo".into(),
                         ))
    @@ -1272,7 +1281,7 @@
         /// make the transaction valid.
         ///
         /// [`add_utxo`]: Self::add_utxo
    -    pub fn manually_selected_only(&mut self) -> &mut Self {
    +    pub fn manually_selected_only(&mut self) -> &mut Self {
             self.params.manually_selected_only = true;
             self
         }
    @@ -1281,7 +1290,7 @@
         ///
         /// It's important to note that the "must-be-spent" utxos added with [`TxBuilder::add_utxo`]
         /// have priority over these. See the docs of the two linked methods for more details.
    -    pub fn unspendable(&mut self, unspendable: Vec<OutPoint>) -> &mut Self {
    +    pub fn unspendable(&mut self, unspendable: Vec<OutPoint>) -> &mut Self {
             self.params.unspendable = unspendable.into_iter().collect();
             self
         }
    @@ -1290,7 +1299,7 @@
         ///
         /// It's important to note that the "must-be-spent" utxos added with [`TxBuilder::add_utxo`]
         /// have priority over this. See the docs of the two linked methods for more details.
    -    pub fn add_unspendable(&mut self, unspendable: OutPoint) -> &mut Self {
    +    pub fn add_unspendable(&mut self, unspendable: OutPoint) -> &mut Self {
             self.params.unspendable.insert(unspendable);
             self
         }
    @@ -1298,13 +1307,13 @@
         /// Sign with a specific sig hash
         ///
         /// **Use this option very carefully**
    -    pub fn sighash(&mut self, sighash: SigHashType) -> &mut Self {
    +    pub fn sighash(&mut self, sighash: SigHashType) -> &mut Self {
             self.params.sighash = Some(sighash);
             self
         }
     
         /// Choose the ordering for inputs and outputs of the transaction
    -    pub fn ordering(&mut self, ordering: TxOrdering) -> &mut Self {
    +    pub fn ordering(&mut self, ordering: TxOrdering) -> &mut Self {
             self.params.ordering = ordering;
             self
         }
    @@ -1312,7 +1321,7 @@
         /// Use a specific nLockTime while creating the transaction
         ///
         /// This can cause conflicts if the wallet's descriptors contain an "after" (OP_CLTV) operator.
    -    pub fn nlocktime(&mut self, locktime: u32) -> &mut Self {
    +    pub fn nlocktime(&mut self, locktime: u32) -> &mut Self {
             self.params.locktime = Some(locktime);
             self
         }
    @@ -1321,7 +1330,7 @@
         ///
         /// The `version` should always be greater than `0` and greater than `1` if the wallet's
         /// descriptors contain an "older" (OP_CSV) operator.
    -    pub fn version(&mut self, version: i32) -> &mut Self {
    +    pub fn version(&mut self, version: i32) -> &mut Self {
             self.params.version = Some(Version(version));
             self
         }
    @@ -1330,7 +1339,7 @@
         ///
         /// This effectively adds all the change outputs to the "unspendable" list. See
         /// [`TxBuilder::unspendable`].
    -    pub fn do_not_spend_change(&mut self) -> &mut Self {
    +    pub fn do_not_spend_change(&mut self) -> &mut Self {
             self.params.change_policy = ChangeSpendPolicy::ChangeForbidden;
             self
         }
    @@ -1339,14 +1348,14 @@
         ///
         /// This effectively adds all the non-change outputs to the "unspendable" list. See
         /// [`TxBuilder::unspendable`].
    -    pub fn only_spend_change(&mut self) -> &mut Self {
    +    pub fn only_spend_change(&mut self) -> &mut Self {
             self.params.change_policy = ChangeSpendPolicy::OnlyChange;
             self
         }
     
         /// Set a specific [`ChangeSpendPolicy`]. See [`TxBuilder::do_not_spend_change`] and
         /// [`TxBuilder::only_spend_change`] for some shortcuts.
    -    pub fn change_policy(&mut self, change_policy: ChangeSpendPolicy) -> &mut Self {
    +    pub fn change_policy(&mut self, change_policy: ChangeSpendPolicy) -> &mut Self {
             self.params.change_policy = change_policy;
             self
         }
    @@ -1356,7 +1365,7 @@
         ///
         /// This reduces the size of the PSBT, but some signers might reject them due to the lack of
         /// the `non_witness_utxo`.
    -    pub fn only_witness_utxo(&mut self) -> &mut Self {
    +    pub fn only_witness_utxo(&mut self) -> &mut Self {
             self.params.only_witness_utxo = true;
             self
         }
    @@ -1365,7 +1374,7 @@
         /// [`psbt::Output::witness_script`](bitcoin::util::psbt::Output::witness_script) fields.
         ///
         /// This is useful for signers which always require it, like ColdCard hardware wallets.
    -    pub fn include_output_redeem_witness_script(&mut self) -> &mut Self {
    +    pub fn include_output_redeem_witness_script(&mut self) -> &mut Self {
             self.params.include_output_redeem_witness_script = true;
             self
         }
    @@ -1375,13 +1384,13 @@
         ///
         /// This is useful for offline signers that take part to a multisig. Some hardware wallets like
         /// BitBox and ColdCard are known to require this.
    -    pub fn add_global_xpubs(&mut self) -> &mut Self {
    +    pub fn add_global_xpubs(&mut self) -> &mut Self {
             self.params.add_global_xpubs = true;
             self
         }
     
         /// Spend all the available inputs. This respects filters like [`TxBuilder::unspendable`] and the change policy.
    -    pub fn drain_wallet(&mut self) -> &mut Self {
    +    pub fn drain_wallet(&mut self) -> &mut Self {
             self.params.drain_wallet = true;
             self
         }
    @@ -1394,7 +1403,7 @@
         pub fn coin_selection<P: CoinSelectionAlgorithm<D>>(
             self,
             coin_selection: P,
    -    ) -> TxBuilder<'a, B, D, P, Ctx> {
    +    ) -> TxBuilder<'a, B, D, P, Ctx> {
             TxBuilder {
                 wallet: self.wallet,
                 params: self.params,
    @@ -1408,14 +1417,14 @@
         /// Returns the [`BIP174`] "PSBT" and summary details about the transaction.
         ///
         /// [`BIP174`]: https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
    -    pub fn finish(self) -> Result<(Psbt, TransactionDetails), Error> {
    +    pub fn finish(self) -> Result<(Psbt, TransactionDetails), Error> {
             self.wallet.create_tx(self.coin_selection, self.params)
         }
     
         /// Enable signaling RBF
         ///
         /// This will use the default nSequence value of `0xFFFFFFFD`.
    -    pub fn enable_rbf(&mut self) -> &mut Self {
    +    pub fn enable_rbf(&mut self) -> &mut Self {
             self.params.rbf = Some(RbfValue::Default);
             self
         }
    @@ -1427,7 +1436,7 @@
         ///
         /// If the `nsequence` is higher than `0xFFFFFFFD` an error will be thrown, since it would not
         /// be a valid nSequence to signal RBF.
    -    pub fn enable_rbf_with_sequence(&mut self, nsequence: u32) -> &mut Self {
    +    pub fn enable_rbf_with_sequence(&mut self, nsequence: u32) -> &mut Self {
             self.params.rbf = Some(RbfValue::Value(nsequence));
             self
         }
    @@ -1435,17 +1444,24 @@
     
     impl<'a, B, D: BatchDatabase, Cs: CoinSelectionAlgorithm<D>> TxBuilder<'a, B, D, Cs, CreateTx> {
         /// Replace the recipients already added with a new list
    -    pub fn set_recipients(&mut self, recipients: Vec<(Script, u64)>) -> &mut Self {
    +    pub fn set_recipients(&mut self, recipients: Vec<(Script, u64)>) -> &mut Self {
             self.params.recipients = recipients;
             self
         }
     
         /// Add a recipient to the internal list
    -    pub fn add_recipient(&mut self, script_pubkey: Script, amount: u64) -> &mut Self {
    +    pub fn add_recipient(&mut self, script_pubkey: Script, amount: u64) -> &mut Self {
             self.params.recipients.push((script_pubkey, amount));
             self
         }
     
    +    /// Add data as an output, using OP_RETURN
    +    pub fn add_data(&mut self, data: &[u8]) -> &mut Self {
    +        let script = Script::new_op_return(data);
    +        self.add_recipient(script, 0u64);
    +        self
    +    }
    +
         /// Sets the address to *drain* excess coins to.
         ///
         /// Usually, when there are excess coins they are sent to a change address generated by the
    @@ -1486,7 +1502,7 @@
         /// [`allow_shrinking`]: Self::allow_shrinking
         /// [`add_recipient`]: Self::add_recipient
         /// [`drain_wallet`]: Self::drain_wallet
    -    pub fn drain_to(&mut self, script_pubkey: Script) -> &mut Self {
    +    pub fn drain_to(&mut self, script_pubkey: Script) -> &mut Self {
             self.params.drain_to = Some(script_pubkey);
             self
         }
    @@ -1504,19 +1520,19 @@
         ///
         /// Returns an `Err` if `script_pubkey` can't be found among the recipients of the
         /// transaction we are bumping.
    -    pub fn allow_shrinking(&mut self, script_pubkey: Script) -> Result<&mut Self, Error> {
    +    pub fn allow_shrinking(&mut self, script_pubkey: Script) -> Result<&mut Self, Error> {
             match self
                 .params
                 .recipients
                 .iter()
    -            .position(|(recipient_script, _)| *recipient_script == script_pubkey)
    +            .position(|(recipient_script, _)| *recipient_script == script_pubkey)
             {
    -            Some(position) => {
    +            Some(position) => {
                     self.params.recipients.remove(position);
                     self.params.drain_to = Some(script_pubkey);
                     Ok(self)
                 }
    -            None => Err(Error::Generic(format!(
    +            None => Err(Error::Generic(format!(
                     "{} was not in the original transaction",
                     script_pubkey
                 ))),
    @@ -1536,17 +1552,17 @@
     }
     
     impl Default for TxOrdering {
    -    fn default() -> Self {
    +    fn default() -> Self {
             TxOrdering::Shuffle
         }
     }
     
     impl TxOrdering {
         /// Sort transaction inputs and outputs by [`TxOrdering`] variant
    -    pub fn sort_tx(&self, tx: &mut Transaction) {
    +    pub fn sort_tx(&self, tx: &mut Transaction) {
             match self {
    -            TxOrdering::Untouched => {}
    -            TxOrdering::Shuffle => {
    +            TxOrdering::Untouched => {}
    +            TxOrdering::Shuffle => {
                     use rand::seq::SliceRandom;
                     #[cfg(test)]
                     use rand::SeedableRng;
    @@ -1556,9 +1572,9 @@
                     #[cfg(test)]
                     let mut rng = rand::rngs::StdRng::seed_from_u64(0);
     
    -                tx.output.shuffle(&mut rng);
    +                tx.output.shuffle(&mut rng);
                 }
    -            TxOrdering::Bip69Lexicographic => {
    +            TxOrdering::Bip69Lexicographic => {
                     tx.input.sort_unstable_by_key(|txin| {
                         (txin.previous_output.txid, txin.previous_output.vout)
                     });
    @@ -1576,7 +1592,7 @@
     pub(crate) struct Version(pub(crate) i32);
     
     impl Default for Version {
    -    fn default() -> Self {
    +    fn default() -> Self {
             Version(1)
         }
     }
    @@ -1591,10 +1607,10 @@
     }
     
     impl RbfValue {
    -    pub(crate) fn get_value(&self) -> u32 {
    +    pub(crate) fn get_value(&self) -> u32 {
             match self {
    -            RbfValue::Default => 0xFFFFFFFD,
    -            RbfValue::Value(v) => *v,
    +            RbfValue::Default => 0xFFFFFFFD,
    +            RbfValue::Value(v) => *v,
             }
         }
     }
    @@ -1611,17 +1627,17 @@
     }
     
     impl Default for ChangeSpendPolicy {
    -    fn default() -> Self {
    +    fn default() -> Self {
             ChangeSpendPolicy::ChangeAllowed
         }
     }
     
     impl ChangeSpendPolicy {
    -    pub(crate) fn is_satisfied_by(&self, utxo: &LocalUtxo) -> bool {
    +    pub(crate) fn is_satisfied_by(&self, utxo: &LocalUtxo) -> bool {
             match self {
    -            ChangeSpendPolicy::ChangeAllowed => true,
    -            ChangeSpendPolicy::OnlyChange => utxo.keychain == KeychainKind::Internal,
    -            ChangeSpendPolicy::ChangeForbidden => utxo.keychain == KeychainKind::External,
    +            ChangeSpendPolicy::ChangeAllowed => true,
    +            ChangeSpendPolicy::OnlyChange => utxo.keychain == KeychainKind::Internal,
    +            ChangeSpendPolicy::ChangeForbidden => utxo.keychain == KeychainKind::External,
             }
         }
     }
    @@ -1635,7 +1651,7 @@
                                         03e80300000000000002aaeee80300000000000001aa200300000000000001ff\
                                         00000000";
         macro_rules! ordering_test_tx {
    -        () => {
    +        () => {
                 deserialize::<bitcoin::Transaction>(&Vec::<u8>::from_hex(ORDERING_TEST_TX).unwrap())
                     .unwrap()
             };
    @@ -1656,7 +1672,7 @@
             let original_tx = ordering_test_tx!();
             let mut tx = original_tx.clone();
     
    -        TxOrdering::Untouched.sort_tx(&mut tx);
    +        TxOrdering::Untouched.sort_tx(&mut tx);
     
             assert_eq!(original_tx, tx);
         }
    @@ -1666,7 +1682,7 @@
             let original_tx = ordering_test_tx!();
             let mut tx = original_tx.clone();
     
    -        TxOrdering::Shuffle.sort_tx(&mut tx);
    +        TxOrdering::Shuffle.sort_tx(&mut tx);
     
             assert_eq!(original_tx.input, tx.input);
             assert_ne!(original_tx.output, tx.output);
    @@ -1679,7 +1695,7 @@
             let original_tx = ordering_test_tx!();
             let mut tx = original_tx;
     
    -        TxOrdering::Bip69Lexicographic.sort_tx(&mut tx);
    +        TxOrdering::Bip69Lexicographic.sort_tx(&mut tx);
     
             assert_eq!(
                 tx.input[0].previous_output,
    @@ -1708,7 +1724,7 @@
             assert_eq!(tx.output[2].script_pubkey, From::from(vec![0xAA, 0xEE]));
         }
     
    -    fn get_test_utxos() -> Vec<LocalUtxo> {
    +    fn get_test_utxos() -> Vec<LocalUtxo> {
             vec![
                 LocalUtxo {
                     outpoint: OutPoint {
    @@ -1771,6 +1787,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/utils.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/utils.rs.html index 5154e583bb..eff1d29dbf 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/utils.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/utils.rs.html @@ -1,4 +1,6 @@ -utils.rs - source
      1
    +utils.rs - source
    +    
    logo
      1
       2
       3
       4
    @@ -230,40 +232,6 @@
     230
     231
     232
    -233
    -234
    -235
    -236
    -237
    -238
    -239
    -240
    -241
    -242
    -243
    -244
    -245
    -246
    -247
    -248
    -249
    -250
    -251
    -252
    -253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    -264
    -265
    -266
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -300,11 +268,11 @@
     // encourage the usage of this trait.
     pub trait IsDust {
         /// Check whether or not a value is below dust limit
    -    fn is_dust(&self) -> bool;
    +    fn is_dust(&self) -> bool;
     }
     
     impl IsDust for u64 {
    -    fn is_dust(&self) -> bool {
    +    fn is_dust(&self) -> bool {
             *self <= DUST_LIMIT_SATOSHI
         }
     }
    @@ -315,7 +283,7 @@
     }
     
     impl After {
    -    pub(crate) fn new(current_height: Option<u32>, assume_height_reached: bool) -> After {
    +    pub(crate) fn new(current_height: Option<u32>, assume_height_reached: bool) -> After {
             After {
                 current_height,
                 assume_height_reached,
    @@ -323,7 +291,7 @@
         }
     }
     
    -pub(crate) fn check_nsequence_rbf(rbf: u32, csv: u32) -> bool {
    +pub(crate) fn check_nsequence_rbf(rbf: u32, csv: u32) -> bool {
         // This flag cannot be set in the nSequence when spending using OP_CSV
         if rbf & SEQUENCE_LOCKTIME_DISABLE_FLAG != 0 {
             return false;
    @@ -347,7 +315,7 @@
         true
     }
     
    -pub(crate) fn check_nlocktime(nlocktime: u32, required: u32) -> bool {
    +pub(crate) fn check_nlocktime(nlocktime: u32, required: u32) -> bool {
         // Both values should be expressed in the same unit
         if (nlocktime < BLOCKS_TIMELOCK_THRESHOLD) != (required < BLOCKS_TIMELOCK_THRESHOLD) {
             return false;
    @@ -362,7 +330,7 @@
     }
     
     impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for After {
    -    fn check_after(&self, n: u32) -> bool {
    +    fn check_after(&self, n: u32) -> bool {
             if let Some(current_height) = self.current_height {
                 current_height >= n
             } else {
    @@ -382,7 +350,7 @@
             current_height: Option<u32>,
             create_height: Option<u32>,
             assume_height_reached: bool,
    -    ) -> Older {
    +    ) -> Older {
             Older {
                 current_height,
                 create_height,
    @@ -392,7 +360,7 @@
     }
     
     impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for Older {
    -    fn check_older(&self, n: u32) -> bool {
    +    fn check_older(&self, n: u32) -> bool {
             if let Some(current_height) = self.current_height {
                 // TODO: test >= / >
                 current_height as u64 >= self.create_height.unwrap_or(0) as u64 + n as u64
    @@ -404,40 +372,6 @@
     
     pub(crate) type SecpCtx = Secp256k1<All>;
     
    -pub struct ChunksIterator<I: Iterator> {
    -    iter: I,
    -    size: usize,
    -}
    -
    -#[cfg(any(feature = "electrum", feature = "esplora"))]
    -impl<I: Iterator> ChunksIterator<I> {
    -    pub fn new(iter: I, size: usize) -> Self {
    -        ChunksIterator { iter, size }
    -    }
    -}
    -
    -impl<I: Iterator> Iterator for ChunksIterator<I> {
    -    type Item = Vec<<I as std::iter::Iterator>::Item>;
    -
    -    fn next(&mut self) -> Option<Self::Item> {
    -        let mut v = Vec::new();
    -        for _ in 0..self.size {
    -            let e = self.iter.next();
    -
    -            match e {
    -                None => break,
    -                Some(val) => v.push(val),
    -            }
    -        }
    -
    -        if v.is_empty() {
    -            return None;
    -        }
    -
    -        Some(v)
    -    }
    -}
    -
     #[cfg(test)]
     mod test {
         use super::{
    @@ -531,6 +465,5 @@
         }
     }
     
    -
    - +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/storage.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/storage.js index 6b16cbd83c..dd18db8a72 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/storage.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/storage.js @@ -1 +1 @@ -var resourcesSuffix="";var darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");window.mainTheme=document.getElementById("mainThemeStyle");var settingsDataset=(function(){var settingsElement=document.getElementById("default-settings");if(settingsElement===null){return null}var dataset=settingsElement.dataset;if(dataset===undefined){return null}return dataset})();function getSettingValue(settingName){var current=getCurrentValue('rustdoc-'+settingName);if(current!==null){return current}if(settingsDataset!==null){var def=settingsDataset[settingName.replace(/-/g,'_')];if(def!==undefined){return def}}return null}var localStoredTheme=getSettingValue("theme");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(!elem||!elem.classList){return}elem.classList.add(className)}function removeClass(elem,className){if(!elem||!elem.classList){return}elem.classList.remove(className)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;var i;if(reversed){for(i=length-1;i>=0;--i){if(func(arr[i])){return true}}}else{for(i=0;i=0){updateLocalStorage("rustdoc-preferred-dark-theme",localStoredTheme)}updateSystemTheme()}else{switchTheme(window.currentTheme,window.mainTheme,getSettingValue("theme")||"light",false)} \ No newline at end of file +var darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");window.mainTheme=document.getElementById("mainThemeStyle");var settingsDataset=(function(){var settingsElement=document.getElementById("default-settings");if(settingsElement===null){return null}var dataset=settingsElement.dataset;if(dataset===undefined){return null}return dataset})();function getSettingValue(settingName){var current=getCurrentValue('rustdoc-'+settingName);if(current!==null){return current}if(settingsDataset!==null){var def=settingsDataset[settingName.replace(/-/g,'_')];if(def!==undefined){return def}}return null}var localStoredTheme=getSettingValue("theme");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(!elem||!elem.classList){return}elem.classList.add(className)}function removeClass(elem,className){if(!elem||!elem.classList){return}elem.classList.remove(className)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;var i;if(reversed){for(i=length-1;i>=0;--i){if(func(arr[i])){return true}}}else{for(i=0;i=0){updateLocalStorage("rustdoc-preferred-dark-theme",localStoredTheme)}updateSystemTheme()}else{switchTheme(window.currentTheme,window.mainTheme,getSettingValue("theme")||"light",false)} \ No newline at end of file