]> Untitled Git - bitcoindevkit.org/blob
751445aba5d6c4cc1e9da4c0cb047ae59188fc9b
[bitcoindevkit.org] /
1 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/descriptor/template.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>template.rs - source</title><link rel="stylesheet" type="text/css" href="../../../normalize.css"><link rel="stylesheet" type="text/css" href="../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../../ayu.css" disabled ><script id="default-settings"></script><script src="../../../storage.js"></script><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../../favicon.svg">
2 <link rel="alternate icon" type="image/png" href="../../../favicon-16x16.png">
3 <link rel="alternate icon" type="image/png" href="../../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../../bdk/index.html'><div class='logo-container rust-logo'><img src='../../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu"><img src="../../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><script src="../../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" class="help-button">?</button>
4 <a id="settings-menu" href="../../../settings.html"><img src="../../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
5 <span id="2"> 2</span>
6 <span id="3"> 3</span>
7 <span id="4"> 4</span>
8 <span id="5"> 5</span>
9 <span id="6"> 6</span>
10 <span id="7"> 7</span>
11 <span id="8"> 8</span>
12 <span id="9"> 9</span>
13 <span id="10"> 10</span>
14 <span id="11"> 11</span>
15 <span id="12"> 12</span>
16 <span id="13"> 13</span>
17 <span id="14"> 14</span>
18 <span id="15"> 15</span>
19 <span id="16"> 16</span>
20 <span id="17"> 17</span>
21 <span id="18"> 18</span>
22 <span id="19"> 19</span>
23 <span id="20"> 20</span>
24 <span id="21"> 21</span>
25 <span id="22"> 22</span>
26 <span id="23"> 23</span>
27 <span id="24"> 24</span>
28 <span id="25"> 25</span>
29 <span id="26"> 26</span>
30 <span id="27"> 27</span>
31 <span id="28"> 28</span>
32 <span id="29"> 29</span>
33 <span id="30"> 30</span>
34 <span id="31"> 31</span>
35 <span id="32"> 32</span>
36 <span id="33"> 33</span>
37 <span id="34"> 34</span>
38 <span id="35"> 35</span>
39 <span id="36"> 36</span>
40 <span id="37"> 37</span>
41 <span id="38"> 38</span>
42 <span id="39"> 39</span>
43 <span id="40"> 40</span>
44 <span id="41"> 41</span>
45 <span id="42"> 42</span>
46 <span id="43"> 43</span>
47 <span id="44"> 44</span>
48 <span id="45"> 45</span>
49 <span id="46"> 46</span>
50 <span id="47"> 47</span>
51 <span id="48"> 48</span>
52 <span id="49"> 49</span>
53 <span id="50"> 50</span>
54 <span id="51"> 51</span>
55 <span id="52"> 52</span>
56 <span id="53"> 53</span>
57 <span id="54"> 54</span>
58 <span id="55"> 55</span>
59 <span id="56"> 56</span>
60 <span id="57"> 57</span>
61 <span id="58"> 58</span>
62 <span id="59"> 59</span>
63 <span id="60"> 60</span>
64 <span id="61"> 61</span>
65 <span id="62"> 62</span>
66 <span id="63"> 63</span>
67 <span id="64"> 64</span>
68 <span id="65"> 65</span>
69 <span id="66"> 66</span>
70 <span id="67"> 67</span>
71 <span id="68"> 68</span>
72 <span id="69"> 69</span>
73 <span id="70"> 70</span>
74 <span id="71"> 71</span>
75 <span id="72"> 72</span>
76 <span id="73"> 73</span>
77 <span id="74"> 74</span>
78 <span id="75"> 75</span>
79 <span id="76"> 76</span>
80 <span id="77"> 77</span>
81 <span id="78"> 78</span>
82 <span id="79"> 79</span>
83 <span id="80"> 80</span>
84 <span id="81"> 81</span>
85 <span id="82"> 82</span>
86 <span id="83"> 83</span>
87 <span id="84"> 84</span>
88 <span id="85"> 85</span>
89 <span id="86"> 86</span>
90 <span id="87"> 87</span>
91 <span id="88"> 88</span>
92 <span id="89"> 89</span>
93 <span id="90"> 90</span>
94 <span id="91"> 91</span>
95 <span id="92"> 92</span>
96 <span id="93"> 93</span>
97 <span id="94"> 94</span>
98 <span id="95"> 95</span>
99 <span id="96"> 96</span>
100 <span id="97"> 97</span>
101 <span id="98"> 98</span>
102 <span id="99"> 99</span>
103 <span id="100">100</span>
104 <span id="101">101</span>
105 <span id="102">102</span>
106 <span id="103">103</span>
107 <span id="104">104</span>
108 <span id="105">105</span>
109 <span id="106">106</span>
110 <span id="107">107</span>
111 <span id="108">108</span>
112 <span id="109">109</span>
113 <span id="110">110</span>
114 <span id="111">111</span>
115 <span id="112">112</span>
116 <span id="113">113</span>
117 <span id="114">114</span>
118 <span id="115">115</span>
119 <span id="116">116</span>
120 <span id="117">117</span>
121 <span id="118">118</span>
122 <span id="119">119</span>
123 <span id="120">120</span>
124 <span id="121">121</span>
125 <span id="122">122</span>
126 <span id="123">123</span>
127 <span id="124">124</span>
128 <span id="125">125</span>
129 <span id="126">126</span>
130 <span id="127">127</span>
131 <span id="128">128</span>
132 <span id="129">129</span>
133 <span id="130">130</span>
134 <span id="131">131</span>
135 <span id="132">132</span>
136 <span id="133">133</span>
137 <span id="134">134</span>
138 <span id="135">135</span>
139 <span id="136">136</span>
140 <span id="137">137</span>
141 <span id="138">138</span>
142 <span id="139">139</span>
143 <span id="140">140</span>
144 <span id="141">141</span>
145 <span id="142">142</span>
146 <span id="143">143</span>
147 <span id="144">144</span>
148 <span id="145">145</span>
149 <span id="146">146</span>
150 <span id="147">147</span>
151 <span id="148">148</span>
152 <span id="149">149</span>
153 <span id="150">150</span>
154 <span id="151">151</span>
155 <span id="152">152</span>
156 <span id="153">153</span>
157 <span id="154">154</span>
158 <span id="155">155</span>
159 <span id="156">156</span>
160 <span id="157">157</span>
161 <span id="158">158</span>
162 <span id="159">159</span>
163 <span id="160">160</span>
164 <span id="161">161</span>
165 <span id="162">162</span>
166 <span id="163">163</span>
167 <span id="164">164</span>
168 <span id="165">165</span>
169 <span id="166">166</span>
170 <span id="167">167</span>
171 <span id="168">168</span>
172 <span id="169">169</span>
173 <span id="170">170</span>
174 <span id="171">171</span>
175 <span id="172">172</span>
176 <span id="173">173</span>
177 <span id="174">174</span>
178 <span id="175">175</span>
179 <span id="176">176</span>
180 <span id="177">177</span>
181 <span id="178">178</span>
182 <span id="179">179</span>
183 <span id="180">180</span>
184 <span id="181">181</span>
185 <span id="182">182</span>
186 <span id="183">183</span>
187 <span id="184">184</span>
188 <span id="185">185</span>
189 <span id="186">186</span>
190 <span id="187">187</span>
191 <span id="188">188</span>
192 <span id="189">189</span>
193 <span id="190">190</span>
194 <span id="191">191</span>
195 <span id="192">192</span>
196 <span id="193">193</span>
197 <span id="194">194</span>
198 <span id="195">195</span>
199 <span id="196">196</span>
200 <span id="197">197</span>
201 <span id="198">198</span>
202 <span id="199">199</span>
203 <span id="200">200</span>
204 <span id="201">201</span>
205 <span id="202">202</span>
206 <span id="203">203</span>
207 <span id="204">204</span>
208 <span id="205">205</span>
209 <span id="206">206</span>
210 <span id="207">207</span>
211 <span id="208">208</span>
212 <span id="209">209</span>
213 <span id="210">210</span>
214 <span id="211">211</span>
215 <span id="212">212</span>
216 <span id="213">213</span>
217 <span id="214">214</span>
218 <span id="215">215</span>
219 <span id="216">216</span>
220 <span id="217">217</span>
221 <span id="218">218</span>
222 <span id="219">219</span>
223 <span id="220">220</span>
224 <span id="221">221</span>
225 <span id="222">222</span>
226 <span id="223">223</span>
227 <span id="224">224</span>
228 <span id="225">225</span>
229 <span id="226">226</span>
230 <span id="227">227</span>
231 <span id="228">228</span>
232 <span id="229">229</span>
233 <span id="230">230</span>
234 <span id="231">231</span>
235 <span id="232">232</span>
236 <span id="233">233</span>
237 <span id="234">234</span>
238 <span id="235">235</span>
239 <span id="236">236</span>
240 <span id="237">237</span>
241 <span id="238">238</span>
242 <span id="239">239</span>
243 <span id="240">240</span>
244 <span id="241">241</span>
245 <span id="242">242</span>
246 <span id="243">243</span>
247 <span id="244">244</span>
248 <span id="245">245</span>
249 <span id="246">246</span>
250 <span id="247">247</span>
251 <span id="248">248</span>
252 <span id="249">249</span>
253 <span id="250">250</span>
254 <span id="251">251</span>
255 <span id="252">252</span>
256 <span id="253">253</span>
257 <span id="254">254</span>
258 <span id="255">255</span>
259 <span id="256">256</span>
260 <span id="257">257</span>
261 <span id="258">258</span>
262 <span id="259">259</span>
263 <span id="260">260</span>
264 <span id="261">261</span>
265 <span id="262">262</span>
266 <span id="263">263</span>
267 <span id="264">264</span>
268 <span id="265">265</span>
269 <span id="266">266</span>
270 <span id="267">267</span>
271 <span id="268">268</span>
272 <span id="269">269</span>
273 <span id="270">270</span>
274 <span id="271">271</span>
275 <span id="272">272</span>
276 <span id="273">273</span>
277 <span id="274">274</span>
278 <span id="275">275</span>
279 <span id="276">276</span>
280 <span id="277">277</span>
281 <span id="278">278</span>
282 <span id="279">279</span>
283 <span id="280">280</span>
284 <span id="281">281</span>
285 <span id="282">282</span>
286 <span id="283">283</span>
287 <span id="284">284</span>
288 <span id="285">285</span>
289 <span id="286">286</span>
290 <span id="287">287</span>
291 <span id="288">288</span>
292 <span id="289">289</span>
293 <span id="290">290</span>
294 <span id="291">291</span>
295 <span id="292">292</span>
296 <span id="293">293</span>
297 <span id="294">294</span>
298 <span id="295">295</span>
299 <span id="296">296</span>
300 <span id="297">297</span>
301 <span id="298">298</span>
302 <span id="299">299</span>
303 <span id="300">300</span>
304 <span id="301">301</span>
305 <span id="302">302</span>
306 <span id="303">303</span>
307 <span id="304">304</span>
308 <span id="305">305</span>
309 <span id="306">306</span>
310 <span id="307">307</span>
311 <span id="308">308</span>
312 <span id="309">309</span>
313 <span id="310">310</span>
314 <span id="311">311</span>
315 <span id="312">312</span>
316 <span id="313">313</span>
317 <span id="314">314</span>
318 <span id="315">315</span>
319 <span id="316">316</span>
320 <span id="317">317</span>
321 <span id="318">318</span>
322 <span id="319">319</span>
323 <span id="320">320</span>
324 <span id="321">321</span>
325 <span id="322">322</span>
326 <span id="323">323</span>
327 <span id="324">324</span>
328 <span id="325">325</span>
329 <span id="326">326</span>
330 <span id="327">327</span>
331 <span id="328">328</span>
332 <span id="329">329</span>
333 <span id="330">330</span>
334 <span id="331">331</span>
335 <span id="332">332</span>
336 <span id="333">333</span>
337 <span id="334">334</span>
338 <span id="335">335</span>
339 <span id="336">336</span>
340 <span id="337">337</span>
341 <span id="338">338</span>
342 <span id="339">339</span>
343 <span id="340">340</span>
344 <span id="341">341</span>
345 <span id="342">342</span>
346 <span id="343">343</span>
347 <span id="344">344</span>
348 <span id="345">345</span>
349 <span id="346">346</span>
350 <span id="347">347</span>
351 <span id="348">348</span>
352 <span id="349">349</span>
353 <span id="350">350</span>
354 <span id="351">351</span>
355 <span id="352">352</span>
356 <span id="353">353</span>
357 <span id="354">354</span>
358 <span id="355">355</span>
359 <span id="356">356</span>
360 <span id="357">357</span>
361 <span id="358">358</span>
362 <span id="359">359</span>
363 <span id="360">360</span>
364 <span id="361">361</span>
365 <span id="362">362</span>
366 <span id="363">363</span>
367 <span id="364">364</span>
368 <span id="365">365</span>
369 <span id="366">366</span>
370 <span id="367">367</span>
371 <span id="368">368</span>
372 <span id="369">369</span>
373 <span id="370">370</span>
374 <span id="371">371</span>
375 <span id="372">372</span>
376 <span id="373">373</span>
377 <span id="374">374</span>
378 <span id="375">375</span>
379 <span id="376">376</span>
380 <span id="377">377</span>
381 <span id="378">378</span>
382 <span id="379">379</span>
383 <span id="380">380</span>
384 <span id="381">381</span>
385 <span id="382">382</span>
386 <span id="383">383</span>
387 <span id="384">384</span>
388 <span id="385">385</span>
389 <span id="386">386</span>
390 <span id="387">387</span>
391 <span id="388">388</span>
392 <span id="389">389</span>
393 <span id="390">390</span>
394 <span id="391">391</span>
395 <span id="392">392</span>
396 <span id="393">393</span>
397 <span id="394">394</span>
398 <span id="395">395</span>
399 <span id="396">396</span>
400 <span id="397">397</span>
401 <span id="398">398</span>
402 <span id="399">399</span>
403 <span id="400">400</span>
404 <span id="401">401</span>
405 <span id="402">402</span>
406 <span id="403">403</span>
407 <span id="404">404</span>
408 <span id="405">405</span>
409 <span id="406">406</span>
410 <span id="407">407</span>
411 <span id="408">408</span>
412 <span id="409">409</span>
413 <span id="410">410</span>
414 <span id="411">411</span>
415 <span id="412">412</span>
416 <span id="413">413</span>
417 <span id="414">414</span>
418 <span id="415">415</span>
419 <span id="416">416</span>
420 <span id="417">417</span>
421 <span id="418">418</span>
422 <span id="419">419</span>
423 <span id="420">420</span>
424 <span id="421">421</span>
425 <span id="422">422</span>
426 <span id="423">423</span>
427 <span id="424">424</span>
428 <span id="425">425</span>
429 <span id="426">426</span>
430 <span id="427">427</span>
431 <span id="428">428</span>
432 <span id="429">429</span>
433 <span id="430">430</span>
434 <span id="431">431</span>
435 <span id="432">432</span>
436 <span id="433">433</span>
437 <span id="434">434</span>
438 <span id="435">435</span>
439 <span id="436">436</span>
440 <span id="437">437</span>
441 <span id="438">438</span>
442 <span id="439">439</span>
443 <span id="440">440</span>
444 <span id="441">441</span>
445 <span id="442">442</span>
446 <span id="443">443</span>
447 <span id="444">444</span>
448 <span id="445">445</span>
449 <span id="446">446</span>
450 <span id="447">447</span>
451 <span id="448">448</span>
452 <span id="449">449</span>
453 <span id="450">450</span>
454 <span id="451">451</span>
455 <span id="452">452</span>
456 <span id="453">453</span>
457 <span id="454">454</span>
458 <span id="455">455</span>
459 <span id="456">456</span>
460 <span id="457">457</span>
461 <span id="458">458</span>
462 <span id="459">459</span>
463 <span id="460">460</span>
464 <span id="461">461</span>
465 <span id="462">462</span>
466 <span id="463">463</span>
467 <span id="464">464</span>
468 <span id="465">465</span>
469 <span id="466">466</span>
470 <span id="467">467</span>
471 <span id="468">468</span>
472 <span id="469">469</span>
473 <span id="470">470</span>
474 <span id="471">471</span>
475 <span id="472">472</span>
476 <span id="473">473</span>
477 <span id="474">474</span>
478 <span id="475">475</span>
479 <span id="476">476</span>
480 <span id="477">477</span>
481 <span id="478">478</span>
482 <span id="479">479</span>
483 <span id="480">480</span>
484 <span id="481">481</span>
485 <span id="482">482</span>
486 <span id="483">483</span>
487 <span id="484">484</span>
488 <span id="485">485</span>
489 <span id="486">486</span>
490 <span id="487">487</span>
491 <span id="488">488</span>
492 <span id="489">489</span>
493 <span id="490">490</span>
494 <span id="491">491</span>
495 <span id="492">492</span>
496 <span id="493">493</span>
497 <span id="494">494</span>
498 <span id="495">495</span>
499 <span id="496">496</span>
500 <span id="497">497</span>
501 <span id="498">498</span>
502 <span id="499">499</span>
503 <span id="500">500</span>
504 <span id="501">501</span>
505 <span id="502">502</span>
506 <span id="503">503</span>
507 <span id="504">504</span>
508 <span id="505">505</span>
509 <span id="506">506</span>
510 <span id="507">507</span>
511 <span id="508">508</span>
512 <span id="509">509</span>
513 <span id="510">510</span>
514 <span id="511">511</span>
515 <span id="512">512</span>
516 <span id="513">513</span>
517 <span id="514">514</span>
518 <span id="515">515</span>
519 <span id="516">516</span>
520 <span id="517">517</span>
521 <span id="518">518</span>
522 <span id="519">519</span>
523 <span id="520">520</span>
524 <span id="521">521</span>
525 <span id="522">522</span>
526 <span id="523">523</span>
527 <span id="524">524</span>
528 <span id="525">525</span>
529 <span id="526">526</span>
530 <span id="527">527</span>
531 <span id="528">528</span>
532 <span id="529">529</span>
533 <span id="530">530</span>
534 <span id="531">531</span>
535 <span id="532">532</span>
536 <span id="533">533</span>
537 <span id="534">534</span>
538 <span id="535">535</span>
539 <span id="536">536</span>
540 <span id="537">537</span>
541 <span id="538">538</span>
542 <span id="539">539</span>
543 <span id="540">540</span>
544 <span id="541">541</span>
545 <span id="542">542</span>
546 <span id="543">543</span>
547 <span id="544">544</span>
548 <span id="545">545</span>
549 <span id="546">546</span>
550 <span id="547">547</span>
551 <span id="548">548</span>
552 <span id="549">549</span>
553 <span id="550">550</span>
554 <span id="551">551</span>
555 <span id="552">552</span>
556 <span id="553">553</span>
557 <span id="554">554</span>
558 <span id="555">555</span>
559 <span id="556">556</span>
560 <span id="557">557</span>
561 <span id="558">558</span>
562 <span id="559">559</span>
563 <span id="560">560</span>
564 <span id="561">561</span>
565 <span id="562">562</span>
566 <span id="563">563</span>
567 <span id="564">564</span>
568 <span id="565">565</span>
569 <span id="566">566</span>
570 <span id="567">567</span>
571 <span id="568">568</span>
572 <span id="569">569</span>
573 <span id="570">570</span>
574 <span id="571">571</span>
575 <span id="572">572</span>
576 <span id="573">573</span>
577 <span id="574">574</span>
578 <span id="575">575</span>
579 <span id="576">576</span>
580 <span id="577">577</span>
581 <span id="578">578</span>
582 <span id="579">579</span>
583 <span id="580">580</span>
584 <span id="581">581</span>
585 <span id="582">582</span>
586 <span id="583">583</span>
587 <span id="584">584</span>
588 <span id="585">585</span>
589 <span id="586">586</span>
590 <span id="587">587</span>
591 <span id="588">588</span>
592 <span id="589">589</span>
593 <span id="590">590</span>
594 <span id="591">591</span>
595 <span id="592">592</span>
596 <span id="593">593</span>
597 <span id="594">594</span>
598 <span id="595">595</span>
599 <span id="596">596</span>
600 <span id="597">597</span>
601 <span id="598">598</span>
602 <span id="599">599</span>
603 <span id="600">600</span>
604 <span id="601">601</span>
605 <span id="602">602</span>
606 <span id="603">603</span>
607 <span id="604">604</span>
608 <span id="605">605</span>
609 <span id="606">606</span>
610 <span id="607">607</span>
611 <span id="608">608</span>
612 <span id="609">609</span>
613 <span id="610">610</span>
614 <span id="611">611</span>
615 <span id="612">612</span>
616 <span id="613">613</span>
617 <span id="614">614</span>
618 <span id="615">615</span>
619 <span id="616">616</span>
620 <span id="617">617</span>
621 <span id="618">618</span>
622 <span id="619">619</span>
623 <span id="620">620</span>
624 <span id="621">621</span>
625 <span id="622">622</span>
626 <span id="623">623</span>
627 <span id="624">624</span>
628 <span id="625">625</span>
629 <span id="626">626</span>
630 <span id="627">627</span>
631 <span id="628">628</span>
632 <span id="629">629</span>
633 <span id="630">630</span>
634 <span id="631">631</span>
635 <span id="632">632</span>
636 <span id="633">633</span>
637 <span id="634">634</span>
638 <span id="635">635</span>
639 <span id="636">636</span>
640 <span id="637">637</span>
641 <span id="638">638</span>
642 <span id="639">639</span>
643 <span id="640">640</span>
644 <span id="641">641</span>
645 <span id="642">642</span>
646 <span id="643">643</span>
647 <span id="644">644</span>
648 <span id="645">645</span>
649 <span id="646">646</span>
650 <span id="647">647</span>
651 <span id="648">648</span>
652 <span id="649">649</span>
653 <span id="650">650</span>
654 <span id="651">651</span>
655 <span id="652">652</span>
656 <span id="653">653</span>
657 <span id="654">654</span>
658 <span id="655">655</span>
659 <span id="656">656</span>
660 <span id="657">657</span>
661 <span id="658">658</span>
662 <span id="659">659</span>
663 <span id="660">660</span>
664 <span id="661">661</span>
665 <span id="662">662</span>
666 <span id="663">663</span>
667 <span id="664">664</span>
668 <span id="665">665</span>
669 <span id="666">666</span>
670 <span id="667">667</span>
671 <span id="668">668</span>
672 <span id="669">669</span>
673 <span id="670">670</span>
674 <span id="671">671</span>
675 <span id="672">672</span>
676 <span id="673">673</span>
677 <span id="674">674</span>
678 <span id="675">675</span>
679 <span id="676">676</span>
680 <span id="677">677</span>
681 <span id="678">678</span>
682 <span id="679">679</span>
683 <span id="680">680</span>
684 <span id="681">681</span>
685 <span id="682">682</span>
686 <span id="683">683</span>
687 <span id="684">684</span>
688 <span id="685">685</span>
689 <span id="686">686</span>
690 <span id="687">687</span>
691 <span id="688">688</span>
692 <span id="689">689</span>
693 <span id="690">690</span>
694 <span id="691">691</span>
695 <span id="692">692</span>
696 <span id="693">693</span>
697 <span id="694">694</span>
698 <span id="695">695</span>
699 <span id="696">696</span>
700 <span id="697">697</span>
701 <span id="698">698</span>
702 <span id="699">699</span>
703 <span id="700">700</span>
704 <span id="701">701</span>
705 <span id="702">702</span>
706 <span id="703">703</span>
707 <span id="704">704</span>
708 <span id="705">705</span>
709 <span id="706">706</span>
710 <span id="707">707</span>
711 <span id="708">708</span>
712 <span id="709">709</span>
713 <span id="710">710</span>
714 <span id="711">711</span>
715 <span id="712">712</span>
716 <span id="713">713</span>
717 <span id="714">714</span>
718 <span id="715">715</span>
719 <span id="716">716</span>
720 <span id="717">717</span>
721 <span id="718">718</span>
722 <span id="719">719</span>
723 <span id="720">720</span>
724 <span id="721">721</span>
725 <span id="722">722</span>
726 <span id="723">723</span>
727 <span id="724">724</span>
728 <span id="725">725</span>
729 <span id="726">726</span>
730 <span id="727">727</span>
731 </pre><div class="example-wrap"><pre class="rust ">
732 <span class="comment">// Magical Bitcoin Library</span>
733 <span class="comment">// Written in 2020 by</span>
734 <span class="comment">// Alekos Filini &lt;alekos.filini@gmail.com&gt;</span>
735 <span class="comment">//</span>
736 <span class="comment">// Copyright (c) 2020 Magical Bitcoin</span>
737 <span class="comment">//</span>
738 <span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span>
739 <span class="comment">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
740 <span class="comment">// in the Software without restriction, including without limitation the rights</span>
741 <span class="comment">// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
742 <span class="comment">// copies of the Software, and to permit persons to whom the Software is</span>
743 <span class="comment">// furnished to do so, subject to the following conditions:</span>
744 <span class="comment">//</span>
745 <span class="comment">// The above copyright notice and this permission notice shall be included in all</span>
746 <span class="comment">// copies or substantial portions of the Software.</span>
747 <span class="comment">//</span>
748 <span class="comment">// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
749 <span class="comment">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
750 <span class="comment">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
751 <span class="comment">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
752 <span class="comment">// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
753 <span class="comment">// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span>
754 <span class="comment">// SOFTWARE.</span>
755
756 <span class="doccomment">//! Descriptor templates</span>
757 <span class="doccomment">//!</span>
758 <span class="doccomment">//! This module contains the definition of various common script templates that are ready to be</span>
759 <span class="doccomment">//! used. See the documentation of each template for an example.</span>
760
761 <span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>;
762 <span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">Network</span>;
763
764 <span class="kw">use</span> <span class="ident">miniscript</span>::{<span class="ident">Legacy</span>, <span class="ident">Segwitv0</span>};
765
766 <span class="kw">use</span> <span class="kw">super</span>::{<span class="ident">ExtendedDescriptor</span>, <span class="ident">KeyMap</span>, <span class="ident">ToWalletDescriptor</span>};
767 <span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">keys</span>::{<span class="ident">DerivableKey</span>, <span class="ident">KeyError</span>, <span class="ident">ToDescriptorKey</span>, <span class="ident">ValidNetworks</span>};
768 <span class="kw">use</span> <span class="kw">crate</span>::{<span class="ident">descriptor</span>, <span class="ident">KeychainKind</span>};
769
770 <span class="doccomment">/// Type alias for the return type of [`DescriptorTemplate`], [`descriptor!`](crate::descriptor!) and others</span>
771 <span class="kw">pub</span> <span class="kw">type</span> <span class="ident">DescriptorTemplateOut</span> <span class="op">=</span> (<span class="ident">ExtendedDescriptor</span>, <span class="ident">KeyMap</span>, <span class="ident">ValidNetworks</span>);
772
773 <span class="doccomment">/// Trait for descriptor templates that can be built into a full descriptor</span>
774 <span class="doccomment">///</span>
775 <span class="doccomment">/// Since [`ToWalletDescriptor`] is implemented for any [`DescriptorTemplate`], they can also be</span>
776 <span class="doccomment">/// passed directly to the [`Wallet`](crate::Wallet) constructor.</span>
777 <span class="doccomment">///</span>
778 <span class="doccomment">/// ## Example</span>
779 <span class="doccomment">///</span>
780 <span class="doccomment">/// ```</span>
781 <span class="doccomment">/// use bdk::keys::{KeyError, ToDescriptorKey};</span>
782 <span class="doccomment">/// use bdk::miniscript::Legacy;</span>
783 <span class="doccomment">/// use bdk::template::{DescriptorTemplate, DescriptorTemplateOut};</span>
784 <span class="doccomment">///</span>
785 <span class="doccomment">/// struct MyP2PKH&lt;K: ToDescriptorKey&lt;Legacy&gt;&gt;(K);</span>
786 <span class="doccomment">///</span>
787 <span class="doccomment">/// impl&lt;K: ToDescriptorKey&lt;Legacy&gt;&gt; DescriptorTemplate for MyP2PKH&lt;K&gt; {</span>
788 <span class="doccomment">/// fn build(self) -&gt; Result&lt;DescriptorTemplateOut, KeyError&gt; {</span>
789 <span class="doccomment">/// Ok(bdk::descriptor!(pkh(self.0))?)</span>
790 <span class="doccomment">/// }</span>
791 <span class="doccomment">/// }</span>
792 <span class="doccomment">/// ```</span>
793 <span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">DescriptorTemplate</span> {
794 <span class="doccomment">/// Build the complete descriptor</span>
795 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span>;
796 }
797
798 <span class="doccomment">/// Turns a [`DescriptorTemplate`] into a valid wallet descriptor by calling its</span>
799 <span class="doccomment">/// [`build`](DescriptorTemplate::build) method</span>
800 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">DescriptorTemplate</span><span class="op">&gt;</span> <span class="ident">ToWalletDescriptor</span> <span class="kw">for</span> <span class="ident">T</span> {
801 <span class="kw">fn</span> <span class="ident">to_wallet_descriptor</span>(
802 <span class="self">self</span>,
803 <span class="ident">network</span>: <span class="ident">Network</span>,
804 ) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">ExtendedDescriptor</span>, <span class="ident">KeyMap</span>), <span class="ident">KeyError</span><span class="op">&gt;</span> {
805 <span class="prelude-val">Ok</span>(<span class="self">self</span>.<span class="ident">build</span>()<span class="question-mark">?</span>.<span class="ident">to_wallet_descriptor</span>(<span class="ident">network</span>)<span class="question-mark">?</span>)
806 }
807 }
808
809 <span class="doccomment">/// P2PKH template. Expands to a descriptor `pkh(key)`</span>
810 <span class="doccomment">///</span>
811 <span class="doccomment">/// ## Example</span>
812 <span class="doccomment">///</span>
813 <span class="doccomment">/// ```</span>
814 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
815 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet};</span>
816 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
817 <span class="doccomment">/// use bdk::template::P2PKH;</span>
818 <span class="doccomment">///</span>
819 <span class="doccomment">/// let key =</span>
820 <span class="doccomment">/// bitcoin::PrivateKey::from_wif(&quot;cTc4vURSzdx6QE6KVynWGomDbLaA75dNALMNyfjh3p8DRRar84Um&quot;)?;</span>
821 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
822 <span class="doccomment">/// P2PKH(key),</span>
823 <span class="doccomment">/// None,</span>
824 <span class="doccomment">/// Network::Testnet,</span>
825 <span class="doccomment">/// MemoryDatabase::default(),</span>
826 <span class="doccomment">/// )?;</span>
827 <span class="doccomment">///</span>
828 <span class="doccomment">/// assert_eq!(</span>
829 <span class="doccomment">/// wallet.get_new_address()?.to_string(),</span>
830 <span class="doccomment">/// &quot;mwJ8hxFYW19JLuc65RCTaP4v1rzVU8cVMT&quot;</span>
831 <span class="doccomment">/// );</span>
832 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
833 <span class="doccomment">/// ```</span>
834 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">P2PKH</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="ident">Legacy</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>);
835
836 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="ident">Legacy</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">P2PKH</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
837 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
838 <span class="prelude-val">Ok</span>(<span class="macro">descriptor</span><span class="macro">!</span>(<span class="ident">pkh</span>(<span class="self">self</span>.<span class="number">0</span>))<span class="question-mark">?</span>)
839 }
840 }
841
842 <span class="doccomment">/// P2WPKH-P2SH template. Expands to a descriptor `sh(wpkh(key))`</span>
843 <span class="doccomment">///</span>
844 <span class="doccomment">/// ## Example</span>
845 <span class="doccomment">///</span>
846 <span class="doccomment">/// ```</span>
847 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
848 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet};</span>
849 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
850 <span class="doccomment">/// use bdk::template::P2WPKH_P2SH;</span>
851 <span class="doccomment">///</span>
852 <span class="doccomment">/// let key =</span>
853 <span class="doccomment">/// bitcoin::PrivateKey::from_wif(&quot;cTc4vURSzdx6QE6KVynWGomDbLaA75dNALMNyfjh3p8DRRar84Um&quot;)?;</span>
854 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
855 <span class="doccomment">/// P2WPKH_P2SH(key),</span>
856 <span class="doccomment">/// None,</span>
857 <span class="doccomment">/// Network::Testnet,</span>
858 <span class="doccomment">/// MemoryDatabase::default(),</span>
859 <span class="doccomment">/// )?;</span>
860 <span class="doccomment">///</span>
861 <span class="doccomment">/// assert_eq!(</span>
862 <span class="doccomment">/// wallet.get_new_address()?.to_string(),</span>
863 <span class="doccomment">/// &quot;2NB4ox5VDRw1ecUv6SnT3VQHPXveYztRqk5&quot;</span>
864 <span class="doccomment">/// );</span>
865 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
866 <span class="doccomment">/// ```</span>
867 <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_camel_case_types</span>)]</span>
868 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">P2WPKH_P2SH</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>);
869
870 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">P2WPKH_P2SH</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
871 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
872 <span class="prelude-val">Ok</span>(<span class="macro">descriptor</span><span class="macro">!</span>(<span class="ident">sh</span>(<span class="ident">wpkh</span>(<span class="self">self</span>.<span class="number">0</span>)))<span class="question-mark">?</span>)
873 }
874 }
875
876 <span class="doccomment">/// P2WPKH template. Expands to a descriptor `wpkh(key)`</span>
877 <span class="doccomment">///</span>
878 <span class="doccomment">/// ## Example</span>
879 <span class="doccomment">///</span>
880 <span class="doccomment">/// ```</span>
881 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
882 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet};</span>
883 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
884 <span class="doccomment">/// use bdk::template::P2WPKH;</span>
885 <span class="doccomment">///</span>
886 <span class="doccomment">/// let key =</span>
887 <span class="doccomment">/// bitcoin::PrivateKey::from_wif(&quot;cTc4vURSzdx6QE6KVynWGomDbLaA75dNALMNyfjh3p8DRRar84Um&quot;)?;</span>
888 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
889 <span class="doccomment">/// P2WPKH(key),</span>
890 <span class="doccomment">/// None,</span>
891 <span class="doccomment">/// Network::Testnet,</span>
892 <span class="doccomment">/// MemoryDatabase::default(),</span>
893 <span class="doccomment">/// )?;</span>
894 <span class="doccomment">///</span>
895 <span class="doccomment">/// assert_eq!(</span>
896 <span class="doccomment">/// wallet.get_new_address()?.to_string(),</span>
897 <span class="doccomment">/// &quot;tb1q4525hmgw265tl3drrl8jjta7ayffu6jf68ltjd&quot;</span>
898 <span class="doccomment">/// );</span>
899 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
900 <span class="doccomment">/// ```</span>
901 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">P2WPKH</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>);
902
903 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">P2WPKH</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
904 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
905 <span class="prelude-val">Ok</span>(<span class="macro">descriptor</span><span class="macro">!</span>(<span class="ident">wpkh</span>(<span class="self">self</span>.<span class="number">0</span>))<span class="question-mark">?</span>)
906 }
907 }
908
909 <span class="doccomment">/// BIP44 template. Expands to `pkh(key/44&#39;/0&#39;/0&#39;/{0,1}/*)`</span>
910 <span class="doccomment">///</span>
911 <span class="doccomment">/// Since there are hardened derivation steps, this template requires a private derivable key (generally a `xprv`/`tprv`).</span>
912 <span class="doccomment">///</span>
913 <span class="doccomment">/// See [`BIP44Public`] for a template that can work with a `xpub`/`tpub`.</span>
914 <span class="doccomment">///</span>
915 <span class="doccomment">/// ## Example</span>
916 <span class="doccomment">///</span>
917 <span class="doccomment">/// ```</span>
918 <span class="doccomment">/// # use std::str::FromStr;</span>
919 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
920 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet, KeychainKind};</span>
921 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
922 <span class="doccomment">/// use bdk::template::BIP44;</span>
923 <span class="doccomment">///</span>
924 <span class="doccomment">/// let key = bitcoin::util::bip32::ExtendedPrivKey::from_str(&quot;tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m&quot;)?;</span>
925 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
926 <span class="doccomment">/// BIP44(key.clone(), KeychainKind::External),</span>
927 <span class="doccomment">/// Some(BIP44(key, KeychainKind::Internal)),</span>
928 <span class="doccomment">/// Network::Testnet,</span>
929 <span class="doccomment">/// MemoryDatabase::default()</span>
930 <span class="doccomment">/// )?;</span>
931 <span class="doccomment">///</span>
932 <span class="doccomment">/// assert_eq!(wallet.get_new_address()?.to_string(), &quot;miNG7dJTzJqNbFS19svRdTCisC65dsubtR&quot;);</span>
933 <span class="doccomment">/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), &quot;pkh([c55b303f/44&#39;/0&#39;/0&#39;]tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)&quot;);</span>
934 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
935 <span class="doccomment">/// ```</span>
936 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BIP44</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Legacy</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>, <span class="kw">pub</span> <span class="ident">KeychainKind</span>);
937
938 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Legacy</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">BIP44</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
939 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
940 <span class="prelude-val">Ok</span>(<span class="ident">P2PKH</span>(<span class="ident">legacy</span>::<span class="ident">make_bipxx_private</span>(<span class="number">44</span>, <span class="self">self</span>.<span class="number">0</span>, <span class="self">self</span>.<span class="number">1</span>)<span class="question-mark">?</span>).<span class="ident">build</span>()<span class="question-mark">?</span>)
941 }
942 }
943
944 <span class="doccomment">/// BIP44 public template. Expands to `pkh(key/{0,1}/*)`</span>
945 <span class="doccomment">///</span>
946 <span class="doccomment">/// This assumes that the key used has already been derived with `m/44&#39;/0&#39;/0&#39;`.</span>
947 <span class="doccomment">///</span>
948 <span class="doccomment">/// This template requires the parent fingerprint to populate correctly the metadata of PSBTs.</span>
949 <span class="doccomment">///</span>
950 <span class="doccomment">/// See [`BIP44`] for a template that does the full derivation, but requires private data</span>
951 <span class="doccomment">/// for the key.</span>
952 <span class="doccomment">///</span>
953 <span class="doccomment">/// ## Example</span>
954 <span class="doccomment">///</span>
955 <span class="doccomment">/// ```</span>
956 <span class="doccomment">/// # use std::str::FromStr;</span>
957 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
958 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet, KeychainKind};</span>
959 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
960 <span class="doccomment">/// use bdk::template::BIP44Public;</span>
961 <span class="doccomment">///</span>
962 <span class="doccomment">/// let key = bitcoin::util::bip32::ExtendedPubKey::from_str(&quot;tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU&quot;)?;</span>
963 <span class="doccomment">/// let fingerprint = bitcoin::util::bip32::Fingerprint::from_str(&quot;c55b303f&quot;)?;</span>
964 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
965 <span class="doccomment">/// BIP44Public(key.clone(), fingerprint, KeychainKind::External),</span>
966 <span class="doccomment">/// Some(BIP44Public(key, fingerprint, KeychainKind::Internal)),</span>
967 <span class="doccomment">/// Network::Testnet,</span>
968 <span class="doccomment">/// MemoryDatabase::default()</span>
969 <span class="doccomment">/// )?;</span>
970 <span class="doccomment">///</span>
971 <span class="doccomment">/// assert_eq!(wallet.get_new_address()?.to_string(), &quot;miNG7dJTzJqNbFS19svRdTCisC65dsubtR&quot;);</span>
972 <span class="doccomment">/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), &quot;pkh([c55b303f/44&#39;/0&#39;/0&#39;]tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)&quot;);</span>
973 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
974 <span class="doccomment">/// ```</span>
975 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BIP44Public</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Legacy</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>, <span class="kw">pub</span> <span class="ident">bip32</span>::<span class="ident">Fingerprint</span>, <span class="kw">pub</span> <span class="ident">KeychainKind</span>);
976
977 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Legacy</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">BIP44Public</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
978 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
979 <span class="prelude-val">Ok</span>(<span class="ident">P2PKH</span>(<span class="ident">legacy</span>::<span class="ident">make_bipxx_public</span>(<span class="number">44</span>, <span class="self">self</span>.<span class="number">0</span>, <span class="self">self</span>.<span class="number">1</span>, <span class="self">self</span>.<span class="number">2</span>)<span class="question-mark">?</span>).<span class="ident">build</span>()<span class="question-mark">?</span>)
980 }
981 }
982
983 <span class="doccomment">/// BIP49 template. Expands to `sh(wpkh(key/49&#39;/0&#39;/0&#39;/{0,1}/*))`</span>
984 <span class="doccomment">///</span>
985 <span class="doccomment">/// Since there are hardened derivation steps, this template requires a private derivable key (generally a `xprv`/`tprv`).</span>
986 <span class="doccomment">///</span>
987 <span class="doccomment">/// See [`BIP49Public`] for a template that can work with a `xpub`/`tpub`.</span>
988 <span class="doccomment">///</span>
989 <span class="doccomment">/// ## Example</span>
990 <span class="doccomment">///</span>
991 <span class="doccomment">/// ```</span>
992 <span class="doccomment">/// # use std::str::FromStr;</span>
993 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
994 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet, KeychainKind};</span>
995 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
996 <span class="doccomment">/// use bdk::template::BIP49;</span>
997 <span class="doccomment">///</span>
998 <span class="doccomment">/// let key = bitcoin::util::bip32::ExtendedPrivKey::from_str(&quot;tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m&quot;)?;</span>
999 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
1000 <span class="doccomment">/// BIP49(key.clone(), KeychainKind::External),</span>
1001 <span class="doccomment">/// Some(BIP49(key, KeychainKind::Internal)),</span>
1002 <span class="doccomment">/// Network::Testnet,</span>
1003 <span class="doccomment">/// MemoryDatabase::default()</span>
1004 <span class="doccomment">/// )?;</span>
1005 <span class="doccomment">///</span>
1006 <span class="doccomment">/// assert_eq!(wallet.get_new_address()?.to_string(), &quot;2N3K4xbVAHoiTQSwxkZjWDfKoNC27pLkYnt&quot;);</span>
1007 <span class="doccomment">/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), &quot;sh(wpkh([c55b303f/49\&#39;/0\&#39;/0\&#39;]tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))&quot;);</span>
1008 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
1009 <span class="doccomment">/// ```</span>
1010 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BIP49</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>, <span class="kw">pub</span> <span class="ident">KeychainKind</span>);
1011
1012 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">BIP49</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
1013 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
1014 <span class="prelude-val">Ok</span>(<span class="ident">P2WPKH_P2SH</span>(<span class="ident">segwit_v0</span>::<span class="ident">make_bipxx_private</span>(<span class="number">49</span>, <span class="self">self</span>.<span class="number">0</span>, <span class="self">self</span>.<span class="number">1</span>)<span class="question-mark">?</span>).<span class="ident">build</span>()<span class="question-mark">?</span>)
1015 }
1016 }
1017
1018 <span class="doccomment">/// BIP49 public template. Expands to `sh(wpkh(key/{0,1}/*))`</span>
1019 <span class="doccomment">///</span>
1020 <span class="doccomment">/// This assumes that the key used has already been derived with `m/49&#39;/0&#39;/0&#39;`.</span>
1021 <span class="doccomment">///</span>
1022 <span class="doccomment">/// This template requires the parent fingerprint to populate correctly the metadata of PSBTs.</span>
1023 <span class="doccomment">///</span>
1024 <span class="doccomment">/// See [`BIP49`] for a template that does the full derivation, but requires private data</span>
1025 <span class="doccomment">/// for the key.</span>
1026 <span class="doccomment">///</span>
1027 <span class="doccomment">/// ## Example</span>
1028 <span class="doccomment">///</span>
1029 <span class="doccomment">/// ```</span>
1030 <span class="doccomment">/// # use std::str::FromStr;</span>
1031 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
1032 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet, KeychainKind};</span>
1033 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
1034 <span class="doccomment">/// use bdk::template::BIP49Public;</span>
1035 <span class="doccomment">///</span>
1036 <span class="doccomment">/// let key = bitcoin::util::bip32::ExtendedPubKey::from_str(&quot;tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L&quot;)?;</span>
1037 <span class="doccomment">/// let fingerprint = bitcoin::util::bip32::Fingerprint::from_str(&quot;c55b303f&quot;)?;</span>
1038 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
1039 <span class="doccomment">/// BIP49Public(key.clone(), fingerprint, KeychainKind::External),</span>
1040 <span class="doccomment">/// Some(BIP49Public(key, fingerprint, KeychainKind::Internal)),</span>
1041 <span class="doccomment">/// Network::Testnet,</span>
1042 <span class="doccomment">/// MemoryDatabase::default()</span>
1043 <span class="doccomment">/// )?;</span>
1044 <span class="doccomment">///</span>
1045 <span class="doccomment">/// assert_eq!(wallet.get_new_address()?.to_string(), &quot;2N3K4xbVAHoiTQSwxkZjWDfKoNC27pLkYnt&quot;);</span>
1046 <span class="doccomment">/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), &quot;sh(wpkh([c55b303f/49\&#39;/0\&#39;/0\&#39;]tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))&quot;);</span>
1047 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
1048 <span class="doccomment">/// ```</span>
1049 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BIP49Public</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>, <span class="kw">pub</span> <span class="ident">bip32</span>::<span class="ident">Fingerprint</span>, <span class="kw">pub</span> <span class="ident">KeychainKind</span>);
1050
1051 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">BIP49Public</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
1052 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
1053 <span class="prelude-val">Ok</span>(<span class="ident">P2WPKH_P2SH</span>(<span class="ident">segwit_v0</span>::<span class="ident">make_bipxx_public</span>(<span class="number">49</span>, <span class="self">self</span>.<span class="number">0</span>, <span class="self">self</span>.<span class="number">1</span>, <span class="self">self</span>.<span class="number">2</span>)<span class="question-mark">?</span>).<span class="ident">build</span>()<span class="question-mark">?</span>)
1054 }
1055 }
1056
1057 <span class="doccomment">/// BIP84 template. Expands to `wpkh(key/84&#39;/0&#39;/0&#39;/{0,1}/*)`</span>
1058 <span class="doccomment">///</span>
1059 <span class="doccomment">/// Since there are hardened derivation steps, this template requires a private derivable key (generally a `xprv`/`tprv`).</span>
1060 <span class="doccomment">///</span>
1061 <span class="doccomment">/// See [`BIP84Public`] for a template that can work with a `xpub`/`tpub`.</span>
1062 <span class="doccomment">///</span>
1063 <span class="doccomment">/// ## Example</span>
1064 <span class="doccomment">///</span>
1065 <span class="doccomment">/// ```</span>
1066 <span class="doccomment">/// # use std::str::FromStr;</span>
1067 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
1068 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet, KeychainKind};</span>
1069 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
1070 <span class="doccomment">/// use bdk::template::BIP84;</span>
1071 <span class="doccomment">///</span>
1072 <span class="doccomment">/// let key = bitcoin::util::bip32::ExtendedPrivKey::from_str(&quot;tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m&quot;)?;</span>
1073 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
1074 <span class="doccomment">/// BIP84(key.clone(), KeychainKind::External),</span>
1075 <span class="doccomment">/// Some(BIP84(key, KeychainKind::Internal)),</span>
1076 <span class="doccomment">/// Network::Testnet,</span>
1077 <span class="doccomment">/// MemoryDatabase::default()</span>
1078 <span class="doccomment">/// )?;</span>
1079 <span class="doccomment">///</span>
1080 <span class="doccomment">/// assert_eq!(wallet.get_new_address()?.to_string(), &quot;tb1qedg9fdlf8cnnqfd5mks6uz5w4kgpk2pr6y4qc7&quot;);</span>
1081 <span class="doccomment">/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), &quot;wpkh([c55b303f/84\&#39;/0\&#39;/0\&#39;]tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)&quot;);</span>
1082 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
1083 <span class="doccomment">/// ```</span>
1084 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BIP84</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>, <span class="kw">pub</span> <span class="ident">KeychainKind</span>);
1085
1086 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">BIP84</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
1087 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
1088 <span class="prelude-val">Ok</span>(<span class="ident">P2WPKH</span>(<span class="ident">segwit_v0</span>::<span class="ident">make_bipxx_private</span>(<span class="number">84</span>, <span class="self">self</span>.<span class="number">0</span>, <span class="self">self</span>.<span class="number">1</span>)<span class="question-mark">?</span>).<span class="ident">build</span>()<span class="question-mark">?</span>)
1089 }
1090 }
1091
1092 <span class="doccomment">/// BIP84 public template. Expands to `wpkh(key/{0,1}/*)`</span>
1093 <span class="doccomment">///</span>
1094 <span class="doccomment">/// This assumes that the key used has already been derived with `m/84&#39;/0&#39;/0&#39;`.</span>
1095 <span class="doccomment">///</span>
1096 <span class="doccomment">/// This template requires the parent fingerprint to populate correctly the metadata of PSBTs.</span>
1097 <span class="doccomment">///</span>
1098 <span class="doccomment">/// See [`BIP84`] for a template that does the full derivation, but requires private data</span>
1099 <span class="doccomment">/// for the key.</span>
1100 <span class="doccomment">///</span>
1101 <span class="doccomment">/// ## Example</span>
1102 <span class="doccomment">///</span>
1103 <span class="doccomment">/// ```</span>
1104 <span class="doccomment">/// # use std::str::FromStr;</span>
1105 <span class="doccomment">/// # use bdk::bitcoin::{PrivateKey, Network};</span>
1106 <span class="doccomment">/// # use bdk::{Wallet, OfflineWallet, KeychainKind};</span>
1107 <span class="doccomment">/// # use bdk::database::MemoryDatabase;</span>
1108 <span class="doccomment">/// use bdk::template::BIP84Public;</span>
1109 <span class="doccomment">///</span>
1110 <span class="doccomment">/// let key = bitcoin::util::bip32::ExtendedPubKey::from_str(&quot;tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q&quot;)?;</span>
1111 <span class="doccomment">/// let fingerprint = bitcoin::util::bip32::Fingerprint::from_str(&quot;c55b303f&quot;)?;</span>
1112 <span class="doccomment">/// let wallet: OfflineWallet&lt;_&gt; = Wallet::new_offline(</span>
1113 <span class="doccomment">/// BIP84Public(key.clone(), fingerprint, KeychainKind::External),</span>
1114 <span class="doccomment">/// Some(BIP84Public(key, fingerprint, KeychainKind::Internal)),</span>
1115 <span class="doccomment">/// Network::Testnet,</span>
1116 <span class="doccomment">/// MemoryDatabase::default()</span>
1117 <span class="doccomment">/// )?;</span>
1118 <span class="doccomment">///</span>
1119 <span class="doccomment">/// assert_eq!(wallet.get_new_address()?.to_string(), &quot;tb1qedg9fdlf8cnnqfd5mks6uz5w4kgpk2pr6y4qc7&quot;);</span>
1120 <span class="doccomment">/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), &quot;wpkh([c55b303f/84\&#39;/0\&#39;/0\&#39;]tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)&quot;);</span>
1121 <span class="doccomment">/// # Ok::&lt;_, Box&lt;dyn std::error::Error&gt;&gt;(())</span>
1122 <span class="doccomment">/// ```</span>
1123 <span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">BIP84Public</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="kw">pub</span> <span class="ident">K</span>, <span class="kw">pub</span> <span class="ident">bip32</span>::<span class="ident">Fingerprint</span>, <span class="kw">pub</span> <span class="ident">KeychainKind</span>);
1124
1125 <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="ident">Segwitv0</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="ident">DescriptorTemplate</span> <span class="kw">for</span> <span class="ident">BIP84Public</span><span class="op">&lt;</span><span class="ident">K</span><span class="op">&gt;</span> {
1126 <span class="kw">fn</span> <span class="ident">build</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">DescriptorTemplateOut</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
1127 <span class="prelude-val">Ok</span>(<span class="ident">P2WPKH</span>(<span class="ident">segwit_v0</span>::<span class="ident">make_bipxx_public</span>(<span class="number">84</span>, <span class="self">self</span>.<span class="number">0</span>, <span class="self">self</span>.<span class="number">1</span>, <span class="self">self</span>.<span class="number">2</span>)<span class="question-mark">?</span>).<span class="ident">build</span>()<span class="question-mark">?</span>)
1128 }
1129 }
1130
1131 <span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">expand_make_bipxx</span> {
1132 ( <span class="macro-nonterminal">$</span><span class="macro-nonterminal">mod_name</span>:<span class="ident">ident</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">ctx</span>:<span class="ident">ty</span> ) <span class="op">=</span><span class="op">&gt;</span> {
1133 <span class="kw">mod</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">mod_name</span> {
1134 <span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;
1135
1136 <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn</span> <span class="ident">make_bipxx_private</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">ctx</span><span class="op">&gt;</span><span class="op">&gt;</span>(
1137 <span class="ident">bip</span>: <span class="ident">u32</span>,
1138 <span class="ident">key</span>: <span class="ident">K</span>,
1139 <span class="ident">keychain</span>: <span class="ident">KeychainKind</span>,
1140 ) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="kw">impl</span> <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">ctx</span><span class="op">&gt;</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
1141 <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">derivation_path</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">with_capacity</span>(<span class="number">4</span>);
1142 <span class="ident">derivation_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_hardened_idx</span>(<span class="ident">bip</span>)<span class="question-mark">?</span>);
1143 <span class="ident">derivation_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_hardened_idx</span>(<span class="number">0</span>)<span class="question-mark">?</span>);
1144 <span class="ident">derivation_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_hardened_idx</span>(<span class="number">0</span>)<span class="question-mark">?</span>);
1145
1146 <span class="kw">match</span> <span class="ident">keychain</span> {
1147 <span class="ident">KeychainKind</span>::<span class="ident">External</span> <span class="op">=</span><span class="op">&gt;</span> {
1148 <span class="ident">derivation_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="number">0</span>)<span class="question-mark">?</span>)
1149 }
1150 <span class="ident">KeychainKind</span>::<span class="ident">Internal</span> <span class="op">=</span><span class="op">&gt;</span> {
1151 <span class="ident">derivation_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="number">1</span>)<span class="question-mark">?</span>)
1152 }
1153 };
1154
1155 <span class="kw">let</span> <span class="ident">derivation_path</span>: <span class="ident">bip32</span>::<span class="ident">DerivationPath</span> <span class="op">=</span> <span class="ident">derivation_path</span>.<span class="ident">into</span>();
1156
1157 <span class="prelude-val">Ok</span>((<span class="ident">key</span>, <span class="ident">derivation_path</span>))
1158 }
1159 <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn</span> <span class="ident">make_bipxx_public</span><span class="op">&lt;</span><span class="ident">K</span>: <span class="ident">DerivableKey</span><span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">ctx</span><span class="op">&gt;</span><span class="op">&gt;</span>(
1160 <span class="ident">bip</span>: <span class="ident">u32</span>,
1161 <span class="ident">key</span>: <span class="ident">K</span>,
1162 <span class="ident">parent_fingerprint</span>: <span class="ident">bip32</span>::<span class="ident">Fingerprint</span>,
1163 <span class="ident">keychain</span>: <span class="ident">KeychainKind</span>,
1164 ) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="kw">impl</span> <span class="ident">ToDescriptorKey</span><span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">ctx</span><span class="op">&gt;</span>, <span class="ident">KeyError</span><span class="op">&gt;</span> {
1165 <span class="kw">let</span> <span class="ident">derivation_path</span>: <span class="ident">bip32</span>::<span class="ident">DerivationPath</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">keychain</span> {
1166 <span class="ident">KeychainKind</span>::<span class="ident">External</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">vec</span><span class="macro">!</span>[<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="number">0</span>)<span class="question-mark">?</span>].<span class="ident">into</span>(),
1167 <span class="ident">KeychainKind</span>::<span class="ident">Internal</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">vec</span><span class="macro">!</span>[<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="number">1</span>)<span class="question-mark">?</span>].<span class="ident">into</span>(),
1168 };
1169
1170 <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">source_path</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">with_capacity</span>(<span class="number">3</span>);
1171 <span class="ident">source_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_hardened_idx</span>(<span class="ident">bip</span>)<span class="question-mark">?</span>);
1172 <span class="ident">source_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_hardened_idx</span>(<span class="number">0</span>)<span class="question-mark">?</span>);
1173 <span class="ident">source_path</span>.<span class="ident">push</span>(<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>::<span class="ident">from_hardened_idx</span>(<span class="number">0</span>)<span class="question-mark">?</span>);
1174 <span class="kw">let</span> <span class="ident">source_path</span>: <span class="ident">bip32</span>::<span class="ident">DerivationPath</span> <span class="op">=</span> <span class="ident">source_path</span>.<span class="ident">into</span>();
1175
1176 <span class="prelude-val">Ok</span>((<span class="ident">key</span>, (<span class="ident">parent_fingerprint</span>, <span class="ident">source_path</span>), <span class="ident">derivation_path</span>))
1177 }
1178 }
1179 };
1180 }
1181
1182 <span class="macro">expand_make_bipxx</span><span class="macro">!</span>(<span class="ident">legacy</span>, <span class="ident">Legacy</span>);
1183 <span class="macro">expand_make_bipxx</span><span class="macro">!</span>(<span class="ident">segwit_v0</span>, <span class="ident">Segwitv0</span>);
1184
1185 <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
1186 <span class="kw">mod</span> <span class="ident">test</span> {
1187 <span class="comment">// test existing descriptor templates, make sure they are expanded to the right descriptors</span>
1188
1189 <span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;
1190 <span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">descriptor</span>::<span class="ident">DescriptorMeta</span>;
1191 <span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">keys</span>::{<span class="ident">KeyError</span>, <span class="ident">ValidNetworks</span>};
1192 <span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">hashes</span>::<span class="ident">core</span>::<span class="ident">str</span>::<span class="ident">FromStr</span>;
1193 <span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">network</span>::<span class="ident">constants</span>::<span class="ident">Network</span>::<span class="ident">Regtest</span>;
1194 <span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">secp256k1</span>::<span class="ident">Secp256k1</span>;
1195 <span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ChildNumber</span>;
1196 <span class="kw">use</span> <span class="ident">miniscript</span>::<span class="ident">descriptor</span>::{<span class="ident">DescriptorPublicKey</span>, <span class="ident">DescriptorPublicKeyCtx</span>, <span class="ident">KeyMap</span>};
1197 <span class="kw">use</span> <span class="ident">miniscript</span>::<span class="ident">Descriptor</span>;
1198
1199 <span class="comment">// verify template descriptor generates expected address(es)</span>
1200 <span class="kw">fn</span> <span class="ident">check</span>(
1201 <span class="ident">desc</span>: <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">Descriptor</span><span class="op">&lt;</span><span class="ident">DescriptorPublicKey</span><span class="op">&gt;</span>, <span class="ident">KeyMap</span>, <span class="ident">ValidNetworks</span>), <span class="ident">KeyError</span><span class="op">&gt;</span>,
1202 <span class="ident">is_witness</span>: <span class="ident">bool</span>,
1203 <span class="ident">is_fixed</span>: <span class="ident">bool</span>,
1204 <span class="ident">expected</span>: <span class="kw-2">&amp;</span>[<span class="kw-2">&amp;</span><span class="ident">str</span>],
1205 ) {
1206 <span class="kw">let</span> <span class="ident">secp</span> <span class="op">=</span> <span class="ident">Secp256k1</span>::<span class="ident">new</span>();
1207 <span class="kw">let</span> <span class="ident">deriv_ctx</span> <span class="op">=</span>
1208 <span class="ident">DescriptorPublicKeyCtx</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">secp</span>, <span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="number">0</span>).<span class="ident">unwrap</span>());
1209
1210 <span class="kw">let</span> (<span class="ident">desc</span>, <span class="ident">_key_map</span>, <span class="ident">_networks</span>) <span class="op">=</span> <span class="ident">desc</span>.<span class="ident">unwrap</span>();
1211 <span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">desc</span>.<span class="ident">is_witness</span>(), <span class="ident">is_witness</span>);
1212 <span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">desc</span>.<span class="ident">is_fixed</span>(), <span class="ident">is_fixed</span>);
1213 <span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> <span class="number">0</span>..<span class="ident">expected</span>.<span class="ident">len</span>() {
1214 <span class="kw">let</span> <span class="ident">index</span> <span class="op">=</span> <span class="ident">i</span> <span class="kw">as</span> <span class="ident">u32</span>;
1215 <span class="kw">let</span> <span class="ident">child_desc</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">desc</span>.<span class="ident">is_fixed</span>() {
1216 <span class="ident">desc</span>.<span class="ident">clone</span>()
1217 } <span class="kw">else</span> {
1218 <span class="ident">desc</span>.<span class="ident">derive</span>(<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="ident">index</span>).<span class="ident">unwrap</span>())
1219 };
1220 <span class="kw">let</span> <span class="ident">address</span> <span class="op">=</span> <span class="ident">child_desc</span>.<span class="ident">address</span>(<span class="ident">Regtest</span>, <span class="ident">deriv_ctx</span>).<span class="ident">unwrap</span>();
1221 <span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">address</span>.<span class="ident">to_string</span>(), <span class="kw-2">*</span><span class="ident">expected</span>.<span class="ident">get</span>(<span class="ident">i</span>).<span class="ident">unwrap</span>());
1222 }
1223 }
1224
1225 <span class="comment">// P2PKH</span>
1226 <span class="attribute">#[<span class="ident">test</span>]</span>
1227 <span class="kw">fn</span> <span class="ident">test_p2ph_template</span>() {
1228 <span class="kw">let</span> <span class="ident">prvkey</span> <span class="op">=</span>
1229 <span class="ident">bitcoin</span>::<span class="ident">PrivateKey</span>::<span class="ident">from_wif</span>(<span class="string">&quot;cTc4vURSzdx6QE6KVynWGomDbLaA75dNALMNyfjh3p8DRRar84Um&quot;</span>)
1230 .<span class="ident">unwrap</span>();
1231 <span class="ident">check</span>(
1232 <span class="ident">P2PKH</span>(<span class="ident">prvkey</span>).<span class="ident">build</span>(),
1233 <span class="bool-val">false</span>,
1234 <span class="bool-val">true</span>,
1235 <span class="kw-2">&amp;</span>[<span class="string">&quot;mwJ8hxFYW19JLuc65RCTaP4v1rzVU8cVMT&quot;</span>],
1236 );
1237
1238 <span class="kw">let</span> <span class="ident">pubkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">PublicKey</span>::<span class="ident">from_str</span>(
1239 <span class="string">&quot;03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd&quot;</span>,
1240 )
1241 .<span class="ident">unwrap</span>();
1242 <span class="ident">check</span>(
1243 <span class="ident">P2PKH</span>(<span class="ident">pubkey</span>).<span class="ident">build</span>(),
1244 <span class="bool-val">false</span>,
1245 <span class="bool-val">true</span>,
1246 <span class="kw-2">&amp;</span>[<span class="string">&quot;muZpTpBYhxmRFuCjLc7C6BBDF32C8XVJUi&quot;</span>],
1247 );
1248 }
1249
1250 <span class="comment">// P2WPKH-P2SH `sh(wpkh(key))`</span>
1251 <span class="attribute">#[<span class="ident">test</span>]</span>
1252 <span class="kw">fn</span> <span class="ident">test_p2wphp2sh_template</span>() {
1253 <span class="kw">let</span> <span class="ident">prvkey</span> <span class="op">=</span>
1254 <span class="ident">bitcoin</span>::<span class="ident">PrivateKey</span>::<span class="ident">from_wif</span>(<span class="string">&quot;cTc4vURSzdx6QE6KVynWGomDbLaA75dNALMNyfjh3p8DRRar84Um&quot;</span>)
1255 .<span class="ident">unwrap</span>();
1256 <span class="ident">check</span>(
1257 <span class="ident">P2WPKH_P2SH</span>(<span class="ident">prvkey</span>).<span class="ident">build</span>(),
1258 <span class="bool-val">true</span>,
1259 <span class="bool-val">true</span>,
1260 <span class="kw-2">&amp;</span>[<span class="string">&quot;2NB4ox5VDRw1ecUv6SnT3VQHPXveYztRqk5&quot;</span>],
1261 );
1262
1263 <span class="kw">let</span> <span class="ident">pubkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">PublicKey</span>::<span class="ident">from_str</span>(
1264 <span class="string">&quot;03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd&quot;</span>,
1265 )
1266 .<span class="ident">unwrap</span>();
1267 <span class="ident">check</span>(
1268 <span class="ident">P2WPKH_P2SH</span>(<span class="ident">pubkey</span>).<span class="ident">build</span>(),
1269 <span class="bool-val">true</span>,
1270 <span class="bool-val">true</span>,
1271 <span class="kw-2">&amp;</span>[<span class="string">&quot;2N5LiC3CqzxDamRTPG1kiNv1FpNJQ7x28sb&quot;</span>],
1272 );
1273 }
1274
1275 <span class="comment">// P2WPKH `wpkh(key)`</span>
1276 <span class="attribute">#[<span class="ident">test</span>]</span>
1277 <span class="kw">fn</span> <span class="ident">test_p2wph_template</span>() {
1278 <span class="kw">let</span> <span class="ident">prvkey</span> <span class="op">=</span>
1279 <span class="ident">bitcoin</span>::<span class="ident">PrivateKey</span>::<span class="ident">from_wif</span>(<span class="string">&quot;cTc4vURSzdx6QE6KVynWGomDbLaA75dNALMNyfjh3p8DRRar84Um&quot;</span>)
1280 .<span class="ident">unwrap</span>();
1281 <span class="ident">check</span>(
1282 <span class="ident">P2WPKH</span>(<span class="ident">prvkey</span>).<span class="ident">build</span>(),
1283 <span class="bool-val">true</span>,
1284 <span class="bool-val">true</span>,
1285 <span class="kw-2">&amp;</span>[<span class="string">&quot;bcrt1q4525hmgw265tl3drrl8jjta7ayffu6jfcwxx9y&quot;</span>],
1286 );
1287
1288 <span class="kw">let</span> <span class="ident">pubkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">PublicKey</span>::<span class="ident">from_str</span>(
1289 <span class="string">&quot;03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd&quot;</span>,
1290 )
1291 .<span class="ident">unwrap</span>();
1292 <span class="ident">check</span>(
1293 <span class="ident">P2WPKH</span>(<span class="ident">pubkey</span>).<span class="ident">build</span>(),
1294 <span class="bool-val">true</span>,
1295 <span class="bool-val">true</span>,
1296 <span class="kw-2">&amp;</span>[<span class="string">&quot;bcrt1qngw83fg8dz0k749cg7k3emc7v98wy0c7azaa6h&quot;</span>],
1297 );
1298 }
1299
1300 <span class="comment">// BIP44 `pkh(key/44&#39;/0&#39;/0&#39;/{0,1}/*)`</span>
1301 <span class="attribute">#[<span class="ident">test</span>]</span>
1302 <span class="kw">fn</span> <span class="ident">test_bip44_template</span>() {
1303 <span class="kw">let</span> <span class="ident">prvkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ExtendedPrivKey</span>::<span class="ident">from_str</span>(<span class="string">&quot;tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy&quot;</span>).<span class="ident">unwrap</span>();
1304 <span class="ident">check</span>(
1305 <span class="ident">BIP44</span>(<span class="ident">prvkey</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>).<span class="ident">build</span>(),
1306 <span class="bool-val">false</span>,
1307 <span class="bool-val">false</span>,
1308 <span class="kw-2">&amp;</span>[
1309 <span class="string">&quot;n453VtnjDHPyDt2fDstKSu7A3YCJoHZ5g5&quot;</span>,
1310 <span class="string">&quot;mvfrrumXgTtwFPWDNUecBBgzuMXhYM7KRP&quot;</span>,
1311 <span class="string">&quot;mzYvhRAuQqbdSKMVVzXNYyqihgNdRadAUQ&quot;</span>,
1312 ],
1313 );
1314 <span class="ident">check</span>(
1315 <span class="ident">BIP44</span>(<span class="ident">prvkey</span>, <span class="ident">KeychainKind</span>::<span class="ident">Internal</span>).<span class="ident">build</span>(),
1316 <span class="bool-val">false</span>,
1317 <span class="bool-val">false</span>,
1318 <span class="kw-2">&amp;</span>[
1319 <span class="string">&quot;muHF98X9KxEzdKrnFAX85KeHv96eXopaip&quot;</span>,
1320 <span class="string">&quot;n4hpyLJE5ub6B5Bymv4eqFxS5KjrewSmYR&quot;</span>,
1321 <span class="string">&quot;mgvkdv1ffmsXd2B1sRKQ5dByK3SzpG42rA&quot;</span>,
1322 ],
1323 );
1324 }
1325
1326 <span class="comment">// BIP44 public `pkh(key/{0,1}/*)`</span>
1327 <span class="attribute">#[<span class="ident">test</span>]</span>
1328 <span class="kw">fn</span> <span class="ident">test_bip44_public_template</span>() {
1329 <span class="kw">let</span> <span class="ident">pubkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ExtendedPubKey</span>::<span class="ident">from_str</span>(<span class="string">&quot;tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU&quot;</span>).<span class="ident">unwrap</span>();
1330 <span class="kw">let</span> <span class="ident">fingerprint</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">Fingerprint</span>::<span class="ident">from_str</span>(<span class="string">&quot;c55b303f&quot;</span>).<span class="ident">unwrap</span>();
1331 <span class="ident">check</span>(
1332 <span class="ident">BIP44Public</span>(<span class="ident">pubkey</span>, <span class="ident">fingerprint</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>).<span class="ident">build</span>(),
1333 <span class="bool-val">false</span>,
1334 <span class="bool-val">false</span>,
1335 <span class="kw-2">&amp;</span>[
1336 <span class="string">&quot;miNG7dJTzJqNbFS19svRdTCisC65dsubtR&quot;</span>,
1337 <span class="string">&quot;n2UqaDbCjWSFJvpC84m3FjUk5UaeibCzYg&quot;</span>,
1338 <span class="string">&quot;muCPpS6Ue7nkzeJMWDViw7Lkwr92Yc4K8g&quot;</span>,
1339 ],
1340 );
1341 <span class="ident">check</span>(
1342 <span class="ident">BIP44Public</span>(<span class="ident">pubkey</span>, <span class="ident">fingerprint</span>, <span class="ident">KeychainKind</span>::<span class="ident">Internal</span>).<span class="ident">build</span>(),
1343 <span class="bool-val">false</span>,
1344 <span class="bool-val">false</span>,
1345 <span class="kw-2">&amp;</span>[
1346 <span class="string">&quot;moDr3vJ8wpt5nNxSK55MPq797nXJb2Ru9H&quot;</span>,
1347 <span class="string">&quot;ms7A1Yt4uTezT2XkefW12AvLoko8WfNJMG&quot;</span>,
1348 <span class="string">&quot;mhYiyat2rtEnV77cFfQsW32y1m2ceCGHPo&quot;</span>,
1349 ],
1350 );
1351 }
1352
1353 <span class="comment">// BIP49 `sh(wpkh(key/49&#39;/0&#39;/0&#39;/{0,1}/*))`</span>
1354 <span class="attribute">#[<span class="ident">test</span>]</span>
1355 <span class="kw">fn</span> <span class="ident">test_bip49_template</span>() {
1356 <span class="kw">let</span> <span class="ident">prvkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ExtendedPrivKey</span>::<span class="ident">from_str</span>(<span class="string">&quot;tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy&quot;</span>).<span class="ident">unwrap</span>();
1357 <span class="ident">check</span>(
1358 <span class="ident">BIP49</span>(<span class="ident">prvkey</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>).<span class="ident">build</span>(),
1359 <span class="bool-val">true</span>,
1360 <span class="bool-val">false</span>,
1361 <span class="kw-2">&amp;</span>[
1362 <span class="string">&quot;2N9bCAJXGm168MjVwpkBdNt6ucka3PKVoUV&quot;</span>,
1363 <span class="string">&quot;2NDckYkqrYyDMtttEav5hB3Bfw9EGAW5HtS&quot;</span>,
1364 <span class="string">&quot;2NAFTVtksF9T4a97M7nyCjwUBD24QevZ5Z4&quot;</span>,
1365 ],
1366 );
1367 <span class="ident">check</span>(
1368 <span class="ident">BIP49</span>(<span class="ident">prvkey</span>, <span class="ident">KeychainKind</span>::<span class="ident">Internal</span>).<span class="ident">build</span>(),
1369 <span class="bool-val">true</span>,
1370 <span class="bool-val">false</span>,
1371 <span class="kw-2">&amp;</span>[
1372 <span class="string">&quot;2NB3pA8PnzJLGV8YEKNDFpbViZv3Bm1K6CG&quot;</span>,
1373 <span class="string">&quot;2NBiX2Wzxngb5rPiWpUiJQ2uLVB4HBjFD4p&quot;</span>,
1374 <span class="string">&quot;2NA8ek4CdQ6aMkveYF6AYuEYNrftB47QGTn&quot;</span>,
1375 ],
1376 );
1377 }
1378
1379 <span class="comment">// BIP49 public `sh(wpkh(key/{0,1}/*))`</span>
1380 <span class="attribute">#[<span class="ident">test</span>]</span>
1381 <span class="kw">fn</span> <span class="ident">test_bip49_public_template</span>() {
1382 <span class="kw">let</span> <span class="ident">pubkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ExtendedPubKey</span>::<span class="ident">from_str</span>(<span class="string">&quot;tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L&quot;</span>).<span class="ident">unwrap</span>();
1383 <span class="kw">let</span> <span class="ident">fingerprint</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">Fingerprint</span>::<span class="ident">from_str</span>(<span class="string">&quot;c55b303f&quot;</span>).<span class="ident">unwrap</span>();
1384 <span class="ident">check</span>(
1385 <span class="ident">BIP49Public</span>(<span class="ident">pubkey</span>, <span class="ident">fingerprint</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>).<span class="ident">build</span>(),
1386 <span class="bool-val">true</span>,
1387 <span class="bool-val">false</span>,
1388 <span class="kw-2">&amp;</span>[
1389 <span class="string">&quot;2N3K4xbVAHoiTQSwxkZjWDfKoNC27pLkYnt&quot;</span>,
1390 <span class="string">&quot;2NCTQfJ1sZa3wQ3pPseYRHbaNEpC3AquEfX&quot;</span>,
1391 <span class="string">&quot;2MveFxAuC8BYPzTybx7FxSzW8HSd8ATT4z7&quot;</span>,
1392 ],
1393 );
1394 <span class="ident">check</span>(
1395 <span class="ident">BIP49Public</span>(<span class="ident">pubkey</span>, <span class="ident">fingerprint</span>, <span class="ident">KeychainKind</span>::<span class="ident">Internal</span>).<span class="ident">build</span>(),
1396 <span class="bool-val">true</span>,
1397 <span class="bool-val">false</span>,
1398 <span class="kw-2">&amp;</span>[
1399 <span class="string">&quot;2NF2vttKibwyxigxtx95Zw8K7JhDbo5zPVJ&quot;</span>,
1400 <span class="string">&quot;2Mtmyd8taksxNVWCJ4wVvaiss7QPZGcAJuH&quot;</span>,
1401 <span class="string">&quot;2NBs3CTVYPr1HCzjB4YFsnWCPCtNg8uMEfp&quot;</span>,
1402 ],
1403 );
1404 }
1405
1406 <span class="comment">// BIP84 `wpkh(key/84&#39;/0&#39;/0&#39;/{0,1}/*)`</span>
1407 <span class="attribute">#[<span class="ident">test</span>]</span>
1408 <span class="kw">fn</span> <span class="ident">test_bip84_template</span>() {
1409 <span class="kw">let</span> <span class="ident">prvkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ExtendedPrivKey</span>::<span class="ident">from_str</span>(<span class="string">&quot;tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy&quot;</span>).<span class="ident">unwrap</span>();
1410 <span class="ident">check</span>(
1411 <span class="ident">BIP84</span>(<span class="ident">prvkey</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>).<span class="ident">build</span>(),
1412 <span class="bool-val">true</span>,
1413 <span class="bool-val">false</span>,
1414 <span class="kw-2">&amp;</span>[
1415 <span class="string">&quot;bcrt1qkmvk2nadgplmd57ztld8nf8v2yxkzmdvwtjf8s&quot;</span>,
1416 <span class="string">&quot;bcrt1qx0v6zgfwe50m4kqc58cqzcyem7ay2sfl3gvqhp&quot;</span>,
1417 <span class="string">&quot;bcrt1q4h7fq9zhxst6e69p3n882nfj649l7w9g3zccfp&quot;</span>,
1418 ],
1419 );
1420 <span class="ident">check</span>(
1421 <span class="ident">BIP84</span>(<span class="ident">prvkey</span>, <span class="ident">KeychainKind</span>::<span class="ident">Internal</span>).<span class="ident">build</span>(),
1422 <span class="bool-val">true</span>,
1423 <span class="bool-val">false</span>,
1424 <span class="kw-2">&amp;</span>[
1425 <span class="string">&quot;bcrt1qtrwtz00wxl69e5xex7amy4xzlxkaefg3gfdkxa&quot;</span>,
1426 <span class="string">&quot;bcrt1qqqasfhxpkkf7zrxqnkr2sfhn74dgsrc3e3ky45&quot;</span>,
1427 <span class="string">&quot;bcrt1qpks7n0gq74hsgsz3phn5vuazjjq0f5eqhsgyce&quot;</span>,
1428 ],
1429 );
1430 }
1431
1432 <span class="comment">// BIP84 public `wpkh(key/{0,1}/*)`</span>
1433 <span class="attribute">#[<span class="ident">test</span>]</span>
1434 <span class="kw">fn</span> <span class="ident">test_bip84_public_template</span>() {
1435 <span class="kw">let</span> <span class="ident">pubkey</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">ExtendedPubKey</span>::<span class="ident">from_str</span>(<span class="string">&quot;tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q&quot;</span>).<span class="ident">unwrap</span>();
1436 <span class="kw">let</span> <span class="ident">fingerprint</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">bip32</span>::<span class="ident">Fingerprint</span>::<span class="ident">from_str</span>(<span class="string">&quot;c55b303f&quot;</span>).<span class="ident">unwrap</span>();
1437 <span class="ident">check</span>(
1438 <span class="ident">BIP84Public</span>(<span class="ident">pubkey</span>, <span class="ident">fingerprint</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>).<span class="ident">build</span>(),
1439 <span class="bool-val">true</span>,
1440 <span class="bool-val">false</span>,
1441 <span class="kw-2">&amp;</span>[
1442 <span class="string">&quot;bcrt1qedg9fdlf8cnnqfd5mks6uz5w4kgpk2prcdvd0h&quot;</span>,
1443 <span class="string">&quot;bcrt1q3lncdlwq3lgcaaeyruynjnlccr0ve0kakh6ana&quot;</span>,
1444 <span class="string">&quot;bcrt1qt9800y6xl3922jy3uyl0z33jh5wfpycyhcylr9&quot;</span>,
1445 ],
1446 );
1447 <span class="ident">check</span>(
1448 <span class="ident">BIP84Public</span>(<span class="ident">pubkey</span>, <span class="ident">fingerprint</span>, <span class="ident">KeychainKind</span>::<span class="ident">Internal</span>).<span class="ident">build</span>(),
1449 <span class="bool-val">true</span>,
1450 <span class="bool-val">false</span>,
1451 <span class="kw-2">&amp;</span>[
1452 <span class="string">&quot;bcrt1qm6wqukenh7guu792lj2njgw9n78cmwsy8xy3z2&quot;</span>,
1453 <span class="string">&quot;bcrt1q694twxtjn4nnrvnyvra769j0a23rllj5c6cgwp&quot;</span>,
1454 <span class="string">&quot;bcrt1qhlac3c5ranv5w5emlnqs7wxhkxt8maelylcarp&quot;</span>,
1455 ],
1456 );
1457 }
1458 }
1459 </pre></div>
1460 </section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../";window.currentCrate = "bdk";</script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>