├── README.mediawiki ├── elip-0001.mediawiki ├── elip-0002.mediawiki ├── elip-0100.mediawiki ├── elip-0101.mediawiki ├── elip-0102.mediawiki ├── elip-0150.mediawiki ├── elip-0151.mediawiki ├── elip-0200.mediawiki └── elip-0201.mediawiki /README.mediawiki: -------------------------------------------------------------------------------- 1 | This repository contains Elements Improvement Proposals, or ELIPs. The ELIP approval process is largely modeled after the Bitcoin BIP process: we will be liberal in accepting ELIPs, provided that they are documented clearly and completely. Approval of an ELIP, including assignment of a number, does not constitute approval on technical grounds by any Elements Project developer or anyone else; it only indicates that the proposal is clearly written and some consensus has been achieved on what it does. 2 | 3 | People wishing to submit ELIPs by do so simply by opening a PR to this repo; discussion may happen in the comments. We do not have a mailing list on which to have discussion prior to opening a PR. 4 | 5 | Having an ELIP here does not make it a formally accepted standard until its status becomes Final or Active. 6 | 7 | {| class="wikitable sortable" style="width: auto; text-align: center; font-size: smaller; table-layout: fixed;" 8 | !Number 9 | !Layer 10 | !Title 11 | !Owner 12 | !Type 13 | !Status 14 | |- style="background-color: #ffcfcf" 15 | | [[elip-0001.mediawiki|1]] 16 | | 17 | | ELIP Purpose and Guidelines 18 | | Andrew Poelstra 19 | | Process 20 | | Active 21 | |- style="background-color: #ffcfcf" 22 | | [[elip-0002.mediawiki|2]] 23 | | 24 | | ELIP Purpose and Guidelines 25 | | Marco Argentieri 26 | | Protocol 27 | | Draft 28 | |- style="background-color: #ffcfcf" 29 | | [[elip-0100.mediawiki|100]] 30 | | Applications 31 | | Hardware Wallet Extensions for Partially Signed Elements Transaction Format 32 | | Mikhail Tolkachev 33 | | Standards Track 34 | | Draft 35 | |- style="background-color: #ffcfcf" 36 | | [[elip-0101.mediawiki|101]] 37 | | Applications 38 | | Genesis Blockhash for Partially Signed Elements Transaction Format 39 | | Jon Griffiths 40 | | Standards Track 41 | | Draft 42 | |- style="background-color: #ffcfcf" 43 | | [[elip-0102.mediawiki|102]] 44 | | Applications 45 | | LiquiDEX extensions for Partially Signed Elements Transaction Format 46 | | Leonardo Comandini 47 | | Standards Track 48 | | Draft 49 | |- style="background-color: #ffcfcf" 50 | | [[elip-0150.mediawiki|150]] 51 | | Wallet 52 | | CT Descriptors for Elements 53 | | Andrew Poelstra, Tim Ruffing 54 | | Standards Track 55 | | Draft 56 | |- style="background-color: #ffcfcf" 57 | | [[elip-0151.mediawiki|151]] 58 | | Wallet 59 | | Deterministic Descriptor Blinding Keys 60 | | Leonardo Comandini 61 | | Standards Track 62 | | Draft 63 | |- style="background-color: #ffcfcf" 64 | | [[elip-0200.mediawiki|200]] 65 | | Wallet 66 | | Discounted fees for Confidential Transactions 67 | | Byron Hambly 68 | | Standards Track 69 | | Active 70 | |- style="background-color: #ffcfcf" 71 | | [[elip-0201.mediawiki|201]] 72 | | Wallet 73 | | Reduce Elements default dust relay feerate to match min relay feerate 74 | | Kilian Rausch 75 | | Standards Track 76 | | Active 77 | |} 78 | 79 | 80 | -------------------------------------------------------------------------------- /elip-0001.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 1
  3 |   Title: ELIP Purpose and Guidelines
  4 |   Author: Andrew Poelstra 
  5 |   Status: Active
  6 |   Type: Process
  7 |   Created: 2022-10-06
  8 |   Comments-Summary: No comments yet.
  9 |   Comments-URI: https://github.com/ElementsProject/elips/wiki/Comments:ELIP-0001
 10 |   License: BSD-2-Clause
 11 |            GNU-All-Permissive
 12 | 
13 | 14 | This document is almost entirely a copy of [https://github.com/bitcoin/bips/blob/master/bip-0002.mediawiki Bitcoin BIP 2], with Bitcoin replaced by Elements where appropriate, as well as removing references to the mailing list. 15 | 16 | ==Abstract== 17 | 18 | A Elements Improvement Proposal (ELIP) is a design document providing information to the Elements community, or describing a new feature for Elements or its processes or environment. The ELIP should provide a concise technical specification of the feature and a rationale for the feature. 19 | 20 | We intend ELIPs to be the primary mechanisms for proposing new features, for collecting community input on an issue, and for documenting the design decisions that have gone into Elements. The ELIP author is responsible for building consensus within the community and documenting dissenting opinions. 21 | 22 | Because the ELIPs are maintained as text files in a versioned repository, their revision history is the historical record of the feature proposal. 23 | 24 | ==Copyright== 25 | 26 | This ELIP is dual-licensed under the Open Publication License and BSD 2-clause license. 27 | 28 | ==ELIP workflow== 29 | 30 | The ELIP process begins with a new idea for Elements. Each potential ELIP must have a champion -- someone who writes the ELIP using the style and format described below, shepherds the discussions in the appropriate forums, and attempts to build community consensus around the idea. The ELIP champion (a.k.a. Author) should first attempt to ascertain whether the idea is ELIP-able. 31 | Small enhancements or patches to a particular piece of software often don't require standardisation between multiple projects; these don't need a ELIP and should be injected into the relevant project-specific development workflow with a patch submission to the applicable issue tracker. 32 | Additionally, many ideas have been brought forward for changing Elements that have been rejected for various reasons. 33 | 34 | Vetting an idea publicly before going as far as writing a ELIP is meant to save both the potential author and the wider community time. 35 | Asking the Elements community first if an idea is original helps prevent too much time being spent on something that is guaranteed to be rejected based on prior discussions (searching the internet does not always do the trick). 36 | It also helps to make sure the idea is applicable to the entire community and not just the author. Just because an idea sounds good to the author does not mean it will work for most people in most areas where Elements is used. 37 | 38 | Following a discussion, the proposal should be submitted to the [https://github.com/ElementsProject/elips ELIPs git repository] as a pull request. 39 | This draft must be written in ELIP style as described below, and named with an alias such as "bip-johndoe-infinitebitcoins" until an editor has assigned it a ELIP number (authors MUST NOT self-assign ELIP numbers). 40 | 41 | ELIP authors are responsible for collecting community feedback on both the initial idea and the ELIP before submitting it for review. However, wherever possible, long open-ended discussions on public mailing lists should be avoided. Strategies to keep the discussions efficient include: setting up a separate SIG mailing list for the topic, having the ELIP author accept private comments in the early design phases, setting up a wiki page or git repository, etc. ELIP authors should use their discretion here. 42 | 43 | It is highly recommended that a single ELIP contain a single key proposal or new idea. The more focused the ELIP, the more successful it tends to be. If in doubt, split your ELIP into several well-focused ones. 44 | 45 | When the ELIP draft is complete, a ELIP editor will assign the ELIP a number, label it as Standards Track, Informational, or Process, and merge the pull request to the ELIPs git repository. 46 | The ELIP editors will not unreasonably reject a ELIP. 47 | Reasons for rejecting ELIPs include duplication of effort, disregard for formatting rules, being too unfocused or too broad, being technically unsound, not providing proper motivation or addressing backwards compatibility, or not in keeping with the Elements philosophy. 48 | For a ELIP to be accepted it must meet certain minimum criteria. 49 | It must be a clear and complete description of the proposed enhancement. 50 | The enhancement must represent a net improvement. 51 | The proposed implementation, if applicable, must be solid and must not complicate the protocol unduly. 52 | 53 | The ELIP author may update the draft as necessary in the git repository. Updates to drafts should also be submitted by the author as pull requests. 54 | 55 | ===Transferring ELIP Ownership=== 56 | 57 | It occasionally becomes necessary to transfer ownership of ELIPs to a new champion. In general, we'd like to retain the original author as a co-author of the transferred ELIP, but that's really up to the original author. A good reason to transfer ownership is because the original author no longer has the time or interest in updating it or following through with the ELIP process, or has fallen off the face of the 'net (i.e. is unreachable or not responding to email). A bad reason to transfer ownership is because you don't agree with the direction of the ELIP. We try to build consensus around a ELIP, but if that's not possible, you can always submit a competing ELIP. 58 | 59 | If you are interested in assuming ownership of a ELIP, send a message asking to take over, addressed to both the original author and the ELIP editors. If the original author doesn't respond to email in a timely manner, the ELIP editors will make a unilateral decision (it's not like such decisions can't be reversed :). 60 | 61 | ===ELIP Editors=== 62 | 63 | The current ELIP editors are: 64 | 65 | * Andrew Poelstra ([[mailto:apoelstra@blockstream.com|apoelstra@blockstream.com]]) 66 | * Andrea Bonel ([[mailto:abonel@blockstream.com|abonel@blockstream.com]]) 67 | 68 | ===ELIP Editor Responsibilities & Workflow=== 69 | 70 | For each new ELIP that comes in an editor does the following: 71 | 72 | * Read the ELIP to check if it is ready: sound and complete. The ideas must make technical sense, even if they don't seem likely to be accepted. 73 | * The title should accurately describe the content. 74 | * Motivation and backward compatibility (when applicable) must be addressed. 75 | * The defined Layer header must be correctly assigned for the given specification. 76 | * Licensing terms must be acceptable for ELIPs. 77 | 78 | If the ELIP isn't ready, the editor will send it back to the author for revision, with specific instructions. 79 | 80 | Once the ELIP is ready for the repository it should be submitted as a "pull request" to the [https://github.com/ElementsProject/ELIPs ELIPs git repository] where it may get further feedback. 81 | 82 | The ELIP editor will: 83 | 84 | * Assign a ELIP number in the pull request. 85 | 86 | * Merge the pull request when it is ready. 87 | 88 | * List the ELIP in [[README.mediawiki]] 89 | 90 | The ELIP editors are intended to fulfill administrative and editorial responsibilities. The ELIP editors monitor ELIP changes, and update ELIP headers as appropriate. 91 | 92 | ==ELIP format and structure== 93 | 94 | ===Specification=== 95 | 96 | ELIPs should be written in mediawiki format. 97 | 98 | Each ELIP should have the following parts: 99 | 100 | * Preamble -- Headers containing metadata about the ELIP ([[#ELIP header preamble|see below]]). 101 | 102 | * Abstract -- A short (~200 word) description of the technical issue being addressed. 103 | 104 | * Copyright -- The ELIP must be explicitly licensed under acceptable copyright terms ([[#ELIP licensing|see below]]). 105 | 106 | * Specification -- The technical specification should describe the syntax and semantics of any new feature. The specification should be detailed enough to allow competing, interoperable implementations for any of the current Elements platforms. 107 | 108 | * Motivation -- The motivation is critical for ELIPs that want to change the Elements protocol. It should clearly explain why the existing protocol is inadequate to address the problem that the ELIP solves. 109 | 110 | * Rationale -- The rationale fleshes out the specification by describing what motivated the design and why particular design decisions were made. It should describe alternate designs that were considered and related work. The rationale should provide evidence of consensus within the community and discuss important objections or concerns raised during discussion. 111 | 112 | * Backwards compatibility -- All ELIPs that introduce backwards incompatibilities must include a section describing these incompatibilities and their severity. The ELIP must explain how the author proposes to deal with these incompatibilities. 113 | 114 | * Reference implementation -- The reference implementation must be completed before any ELIP is given status "Final", but it need not be completed before the ELIP is accepted. It is better to finish the specification and rationale first and reach consensus on it before writing code. The final implementation must include test code and documentation appropriate for the Elements protocol. 115 | 116 | ====ELIP header preamble==== 117 | 118 | Each ELIP must begin with an RFC 822 style header preamble. The headers must appear in the following order. Headers marked with "*" are optional and are described below. All other headers are required. 119 | 120 |
121 |   ELIP: 
122 | * Layer: 
123 |   Title: 
124 |   Author: 
125 | * Discussions-To: 
126 | * Comments-Summary: 
127 |   Comments-URI: 
128 |   Status: 
130 |   Type: 
131 |   Created: 
132 |   License: 
133 | * License-Code: 
134 | * Post-History: 
135 | * Requires: 
136 | * Replaces: 
137 | * Superseded-By: 
138 | 
139 | 140 | The Layer header (only for Standards Track ELIPs) documents which layer of Elements the ELIP applies to. 141 | See [[bip-0123.mediawiki|BIP 123]] for definitions of the various ELIP layers, which are identical for BIPs and ELIPs. 142 | 143 | The Author header lists the names and email addresses of all the authors/owners of the ELIP. 144 | The format of the Author header value must be 145 | 146 | Random J. User 147 | 148 | If there are multiple authors, each should be on a separate line following RFC 2822 continuation line conventions. 149 | 150 | While a ELIP is in private discussions (usually during the initial Draft phase), a Discussions-To header will indicate the mailing list or URL where the ELIP is being discussed. No Discussions-To header is necessary if the ELIP is being discussed privately with the author, or on any email mailing lists. 151 | 152 | The Type header specifies the type of ELIP: Standards Track, Informational, or Process. 153 | 154 | The Created header records the date that the ELIP was assigned a number, while Post-History is used to record when new versions of the ELIP are posted to any mailing lists. 155 | Dates should be in yyyy-mm-dd format, e.g. 2001-08-14. 156 | Post-History is permitted to be a link to a specific thread in a mailing list archive. 157 | 158 | ELIPs may have a Requires header, indicating the ELIP numbers that this ELIP depends on. 159 | 160 | ELIPs may also have a Superseded-By header indicating that a ELIP has been rendered obsolete by a later document; the value is the number of the ELIP that replaces the current document. The newer ELIP must have a Replaces header containing the number of the ELIP that it rendered obsolete. 161 | 162 | ====Auxiliary Files==== 163 | 164 | ELIPs may include auxiliary files such as diagrams. Auxiliary files should be included in a subdirectory for that ELIP, or must be named ELIP-XXXX-Y.ext, where "XXXX" is the ELIP number, "Y" is a serial number (starting at 1), and "ext" is replaced by the actual file extension (e.g. "png"). 165 | 166 | ==ELIP types== 167 | 168 | There are three kinds of ELIP: 169 | 170 | * A Standards Track ELIP describes any change that affects most or all Bitcoin implementations, such as a change to the network protocol, a change in block or transaction validity rules, or any change or addition that affects the interoperability of applications using Bitcoin. Standards Track ELIPs consist of two parts, a design document and a reference implementation. 171 | * An Informational ELIP describes a Bitcoin design issue, or provides general guidelines or information to the Bitcoin community, but does not propose a new feature. Informational ELIPs do not necessarily represent a Bitcoin community consensus or recommendation, so users and implementors are free to ignore Informational ELIPs or follow their advice. 172 | * A Process ELIP describes a process surrounding Bitcoin, or proposes a change to (or an event in) a process. Process ELIPs are like Standards Track ELIPs but apply to areas other than the Bitcoin protocol itself. They may propose an implementation, but not to Bitcoin's codebase; they often require community consensus; unlike Informational ELIPs, they are more than recommendations, and users are typically not free to ignore them. Examples include procedures, guidelines, changes to the decision-making process, and changes to the tools or environment used in Bitcoin development. Any meta-ELIP is also considered a Process ELIP. 173 | 174 | ==ELIP status field== 175 | 176 | ===Specification=== 177 | 178 | The typical paths of the status of ELIPs are as follows: 179 | 180 | 181 | 182 | Champions of a ELIP may decide on their own to change the status between Draft, Deferred, or Withdrawn. 183 | A ELIP editor may also change the status to Deferred when no progress is being made on the ELIP. 184 | 185 | A ELIP may only change status from Draft (or Rejected) to Proposed, when the author deems it is complete, has a working implementation (where applicable), and has community plans to progress it to the Final status. 186 | 187 | ELIPs should be changed from Draft or Proposed status, to Rejected status, upon request by any person, if they have not made progress in three years. Such a ELIP may be changed to Draft status if the champion provides revisions that meaningfully address public criticism of the proposal, or to Proposed status if it meets the criteria required as described in the previous paragraph. 188 | 189 | A Proposed ELIP may progress to Final only when specific criteria reflecting real-world adoption has occurred. This is different for each ELIP depending on the nature of its proposed changes, which will be expanded on below. Evaluation of this status change should be objectively verifiable, and/or be discussed on the development mailing list. 190 | 191 | When a Final ELIP is no longer relevant, its status may be changed to Replaced or Obsolete (which is equivalent to Replaced). This change must also be objectively verifiable and/or discussed. 192 | 193 | A process ELIP may change status from Draft to Active when it achieves rough consensus on this repository. Such a proposal is said to have rough consensus if it has been open to discussion on this repository for at least one month, and no person maintains any unaddressed substantiated objections to it. Addressed or obstructive objections may be ignored/overruled by general agreement that they have been sufficiently addressed, but clear reasoning must be given in such circumstances. 194 | 195 | ====Progression to Final status==== 196 | 197 | A soft-fork ELIP strictly requires a clear miner majority expressed by blockchain voting (eg, using ELIP 9). In addition, if the economy seems willing to make a "no confidence" hard-fork (such as a change in proof-of-work algorithm), the soft-fork does not become Final for as long as such a hard-fork might have majority support, or at most three months. Soft-fork ELIPs may also set additional requirements for their adoption. Because of the possibility of changes to miner dynamics, especially in light of delegated voting (mining pools), it is highly recommended that a supermajority vote around 95% be required by the ELIP itself, unless rationale is given for a lower threshold. 198 | 199 | A hard-fork ELIP will require adoption from the entire economy surrounding any chain that implements it. Acceptance into this repository does not consitute approval or consent from anybody, nor does it guarantee implementation on any specific chain. 200 | 201 | Peer services ELIPs should be observed to be adopted by at least 1% of public listening nodes for one month. 202 | 203 | API/RPC and application layer ELIPs must be implemented by at least two independent and compatible software applications. 204 | 205 | Software authors are encouraged to publish summaries of what ELIPs their software supports to aid in verification of status changes. Good examples of this at the time of writing this ELIP, can be observed in [https://github.com/bitcoin/bitcoin/blob/master/doc/bips.md Bitcoin Core's doc/bips.md file] as well as [https://github.com/bitcoin-wallet/bitcoin-wallet/blob/master/wallet/README.specs.md Bitcoin Wallet for Android's wallet/README.specs.md file]. 206 | 207 | These criteria are considered objective ways to observe the de facto adoption of the ELIP, and are not to be used as reasons to oppose or reject a ELIP. Should a ELIP become actually and unambiguously adopted despite not meeting the criteria outlined here, it should still be updated to Final status. 208 | 209 | ===Rationale=== 210 | 211 | While Elements is not a single blockchain like Bitcoin, has a smaller set of stakeholders, and any specific implementation may have a small closed set of block creators (who have the technical ability to implement a softfork with no agreement except among themselves), for the sake of consistency and transparency throughout the Elements community, it is good to have a common set of standards. 212 | 213 | This includes consensus-layer changes such as soft-forks, which may be relevant only to validators of specific Elements chains, as well as issues such as address types, which are relevant to wallet authors and may be relevant across all Elements chains. 214 | 215 | ==ELIP comments== 216 | 217 | ===Specification=== 218 | 219 | Each ELIP should, in its preamble, link to a public wiki page with a summary tone of the comments on that page. 220 | Reviewers of the ELIP who consider themselves qualified, should post their own comments on this wiki page. 221 | The comments page should generally only be used to post final comments for a completed ELIP. 222 | If a ELIP is not yet completed, reviewers should instead post on the applicable development mailing list thread to allow the ELIP author(s) to address any concerns or problems pointed out by the review. 223 | 224 | Some ELIPs receive exposure outside the development community prior to completion, and other ELIPs might not be completed at all. To avoid a situation where critical ELIP reviews may go unnoticed during this period, reviewers may, at their option, still post their review on the comments page, provided they first post it to the mailing list and plan to later remove or revise it as applicable based on the completed version. Such revisions should be made by editing the previous review and updating the timestamp. Reviews made prior to the complete version may be removed if they are no longer applicable and have not been updated in a timely manner (eg, within one month). 225 | 226 | Pages must be named after the full ELIP number (eg, "ELIP 0001") and placed in the "Comments" namespace. 227 | For example, the link for ELIP 1 will be https://github.com/ElementsProject/elips/wiki/Comments:ELIP-0001 . 228 | 229 | Comments posted to this wiki should use the following format: 230 | 231 | --, 232 | 233 | ELIPs may also choose to list a second forum for ELIP comments, in addition to the ELIPs wiki. 234 | In this case, the second forum's URI should be listed below the primary wiki's URI. 235 | 236 | After some time, the ELIP itself may be updated with a summary tone of the comments. 237 | Summary tones may be chosen from the following, but this ELIP does not intend to cover all possible nuances and other summaries may be used as needed: 238 | 239 | * No comments yet. 240 | * Unanimously Recommended for implementation 241 | * Unanimously Discourage for implementation 242 | * Mostly Recommended for implementation, with some Discouragement 243 | * Mostly Discouraged for implementation, with some Recommendation 244 | 245 | For example, see the preamble to this ELIP. 246 | 247 | These fields must follow the "Discussions-To" header defined in ELIP 1 (if that header is not present, it should follow the position where it would be present; generally this is immediately above the Status header). 248 | 249 | To avoid doubt: comments and status are unrelated metrics to judge a ELIP, and neither should be directly influencing the other. 250 | 251 | ===Rationale=== 252 | 253 | What is the purpose of ELIP comments? 254 | 255 | * Various ELIPs have been adopted (the criteria required for "Final" Status) despite being considered generally inadvisable. Some presently regard ELIPs as a "good idea" simply by virtue of them being assigned a ELIP number. Due to the low barrier of entry for submission of new ELIPs, it seems advisable for a way for reviewers to express their opinions on them in a way that is consumable to the public without needing to review the entire development discussion. 256 | 257 | Will ELIP comments be censored or limited to particular participants/"experts"? 258 | 259 | * Participants should freely refrain from commenting outside of their area of knowledge or expertise. However, comments should not be censored, and participation should be open to the public. 260 | 261 | ==ELIP licensing== 262 | 263 | ===Specification=== 264 | 265 | New ELIPs may be accepted with the following licenses. Each new ELIP must identify at least one acceptable license in its preamble. The License header in the preamble must be placed after the Created header. Each license must be referenced by their respective abbreviation given below. 266 | 267 | For example, a preamble might include the following License header: 268 | 269 | License: BSD-2-Clause 270 | GNU-All-Permissive 271 | 272 | In this case, the ELIP text is fully licensed under both the OSI-approved BSD 2-clause license as well as the GNU All-Permissive License, and anyone may modify and redistribute the text provided they comply with the terms of *either* license. In other words, the license list is an "OR choice", not an "AND also" requirement. 273 | 274 | It is also possible to license source code differently from the ELIP text. An optional License-Code header is placed after the License header. Again, each license must be referenced by their respective abbreviation given below. 275 | 276 | For example, a preamble specifying the optional License-Code header might look like: 277 | 278 | License: BSD-2-Clause 279 | GNU-All-Permissive 280 | License-Code: GPL-2.0+ 281 | 282 | In this case, the code in the ELIP is not available under the BSD or All-Permissive licenses, but only under the terms of the GNU General Public License (GPL), version 2 or newer. 283 | If the code were to be available under *only* version 2 exactly, the "+" symbol should be removed from the license abbreviation. 284 | For a later version (eg, GPL 3.0), you would increase the version number (and retain or remove the "+" depending on intent). 285 | 286 | License-Code: GPL-2.0 # This refers to GPL v2.0 *only*, no later license versions are acceptable. 287 | License-Code: GPL-2.0+ # This refers to GPL v2.0 *or later*. 288 | License-Code: GPL-3.0 # This refers to GPL v3.0 *only*, no later license versions are acceptable. 289 | License-Code: GPL-3.0+ # This refers to GPL v3.0 *or later*. 290 | 291 | In the event that the licensing for the text or code is too complicated to express with a simple list of alternatives, the list should instead be replaced with the single term "Complex". In all cases, details of the licensing terms must be provided in the Copyright section of the ELIP. 292 | 293 | ELIPs are not required to be *exclusively* licensed under approved terms, and may also be licensed under unacceptable licenses *in addition to* at least one acceptable license. 294 | In this case, only the acceptable license(s) should be listed in the License and License-Code headers. 295 | 296 | ====Recommended licenses==== 297 | 298 | * BSD-2-Clause: [https://opensource.org/licenses/BSD-2-Clause OSI-approved BSD 2-clause license] 299 | * BSD-3-Clause: [https://opensource.org/licenses/BSD-3-Clause OSI-approved BSD 3-clause license] 300 | * CC0-1.0: [https://creativecommons.org/publicdomain/zero/1.0/ Creative Commons CC0 1.0 Universal] 301 | * GNU-All-Permissive: [http://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html GNU All-Permissive License] 302 | 303 | In addition, it is recommended that literal code included in the ELIP be dual-licensed under the same license terms as the project it modifies. For example, literal code intended for Elements Core would ideally be dual-licensed under the MIT license terms as well as one of the above with the rest of the ELIP text. 304 | 305 | ====Not recommended, but acceptable licenses==== 306 | 307 | * Apache-2.0: [http://www.apache.org/licenses/LICENSE-2.0 Apache License, version 2.0] 308 | * BSL-1.0: [http://www.boost.org/LICENSE_1_0.txt Boost Software License, version 1.0] 309 | * CC-BY-4.0: [https://creativecommons.org/licenses/by/4.0/ Creative Commons Attribution 4.0 International] 310 | * CC-BY-SA-4.0: [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International] 311 | * MIT: [https://opensource.org/licenses/MIT Expat/MIT/X11 license] 312 | * AGPL-3.0+: [http://www.gnu.org/licenses/agpl-3.0.en.html GNU Affero General Public License (AGPL), version 3 or newer] 313 | * FDL-1.3: [http://www.gnu.org/licenses/fdl-1.3.en.html GNU Free Documentation License, version 1.3] 314 | * GPL-2.0+: [http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html GNU General Public License (GPL), version 2 or newer] 315 | * LGPL-2.1+: [http://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html GNU Lesser General Public License (LGPL), version 2.1 or newer] 316 | 317 | ====Not acceptable licenses==== 318 | 319 | All licenses not explicitly included in the above lists are not acceptable terms for a Elements Improvement Proposal unless a later ELIP extends this one to add them. 320 | However, ELIPs predating the acceptance of this ELIP were allowed under other terms, and should use these abbreviation when no other license is granted: 321 | 322 | * OPL: [http://opencontent.org/openpub/ Open Publication License, version 1.0] 323 | * PD: Released into the public domain 324 | 325 | ===Rationale=== 326 | 327 | BIP 1 allowed the Open Publication License or releasing into the public domain; was this insufficient? 328 | 329 | * The OPL is generally regarded as obsolete, and not a license suitable for new publications. 330 | * Many are unfamiliar with the OPL terms, and may just prefer to use the public domain rather than license under uncertain terms. 331 | * The OPL license terms allowed for the author to prevent publication and derived works, which was widely considered inappropriate for Elements standards. 332 | * Public domain is not universally recognised as a legitimate action, thus it is inadvisable. 333 | 334 | Why are there software licenses included? 335 | 336 | * Some ELIPs, especially consensus layer, may include literal code in the ELIP itself which may not be available under the exact license terms of the ELIP. 337 | * Despite this, not all software licenses would be acceptable for content included in ELIPs. 338 | 339 | Why is Public Domain no longer acceptable for new ELIPs? 340 | 341 | * In some jurisdictions, public domain is not recognised as a legitimate legal action, leaving the ELIP simply copyrighted with no redistribution or modification allowed at all. 342 | 343 | ==See Also== 344 | 345 | * [https://github.com/bitcoin/bips/blob/master/bip-0001.mediawiki BIP 1: BIP Purpose and Guidelines] 346 | * [https://github.com/bitcoin/bips/blob/master/bip-0002.mediawiki BIP 2: BIP Purpose and Guidelines] 347 | * [https://github.com/bitcoin/bips/blob/master/bip-0123.mediawiki BIP 123: BIP Classification] 348 | * [https://tools.ietf.org/html/rfc7282 RFC 7282: On Consensus and Humming in the IETF] 349 | -------------------------------------------------------------------------------- /elip-0002.mediawiki: -------------------------------------------------------------------------------- 1 | 
  2 |   ELIP: 2
  3 |   Title: ELIP Purpose and Guidelines
  4 |   Author: Marco Argentieri 
  5 |   Comments-Summary: No comments yet.
  6 |   Comments-URI: TBD
  7 |   Status: Draft
  8 |   Type: Protocol
  9 |   Created: 2022-05-06
 10 |   Superseded-By: 
 11 | 
12 | 13 | 14 | ==What is an ELIP?== 15 | 16 | 17 | ELIP stands for ELements Improvement Proposal. An ELIP is a design document providing information to the Elements community, or describing a new feature for Elements or its processes or environment. The ELIP should provide a concise technical specification of the feature and a rationale for the feature. 18 | 19 | 20 | We intend ELIPs to be the primary mechanisms for proposing new features, for collecting community input on an issue, and for documenting the design decisions that have gone into Elements. The ELIP author is responsible for building consensus within the community and documenting dissenting opinions. 21 | 22 | 23 | Because the ELIPs are maintained as text files in a versioned repository, their revision history is the historical record of the feature proposal. 24 | 25 | 26 | ==ELIP Types== 27 | 28 | 29 | There are two kinds of ELIP: 30 | 31 | 32 | * A protocol ELIP describes any change that affects most or all Elements implementations, such as a change to the network protocol, a change in block or transaction validity rules, or any change or addition that affects the interoperability of applications using Elements. 33 | * An application ELIP describes a feature addition proposal or design improvement on the application layer of Elements. Proposals do not necessarily represent an Elements community consensus or recommendation, so users and implementers are free to ignore Informational ELIPs or follow their advice. 34 | 35 | 36 | ==ELIP Work Flow== 37 | 38 | 39 | The ELIP process begins with a new idea for Elements. Each potential ELIP must have a champion -- someone who writes the ELIP using the style and format described below, shepherds the discussions in the appropriate forums, and attempts to build community consensus around the idea. The ELIP champion (a.k.a. Author) should first attempt to ascertain whether the idea is ELIP-able. Posting to the elements-dev@googlegroups.com mailing list is the best way to go about this. 40 | 41 | 42 | Vetting an idea publicly before going as far as writing an ELIP is meant to save both the potential author and the wider community time. Asking the Elements community first if an idea is original helps prevent too much time being spent on something that is guaranteed to be rejected based on prior discussions (searching the internet does not always do the trick). It also helps to make sure the idea is applicable to the entire community and not just the author. Just because an idea sounds good to the author does not mean it will work for most people in most areas where Elements is used. Small enhancements or patches often don't need standardization between multiple projects; these don't need an ELIP and should be injected into the relevant Elements development work flow with a patch submission to the applicable Elements issue tracker. 43 | 44 | 45 | Once the champion has confirmed the Elements community as to whether an idea has any chance of acceptance, a draft ELIP should be presented to the elements-dev@googlegroups.com mailing list. This gives the author a chance to flesh out the draft ELIP to make it properly formatted, of high quality, and to address additional concerns about the proposal. Following a discussion, the proposal should be sent to the elements-dev list and the ELIP editor with the draft ELIP. This draft must be written in ELIP style as described below, else it will be sent back without further regard until proper formatting rules are followed. 46 | 47 | 48 | ELIP authors are responsible for collecting community feedback on both the initial idea and the ELIP before submitting it for review. However, wherever possible, long open-ended discussions on public mailing lists should be avoided. 49 | 50 | 51 | It is highly recommended that a single ELIP contain a single key proposal or new idea. The more focused the ELIP, the more successful it tends to be. If in doubt, split your ELIP into several well-focused ones. 52 | 53 | 54 | The ELIP editors assign ELIP numbers and change their status. Please send all ELIP-related email to the ELIP editor, which is listed under [[#ELIP_Editors|ELIP Editors]] below. Also see [[#ELIP_Editor_Responsibilities__Workflow|ELIP Editor Responsibilities & Workflow]]. The ELIP editor reserves the right to reject ELIP proposals if they appear too unfocused or too broad. 55 | 56 | 57 | Authors MUST NOT self assign ELIP numbers, but should use an alias such as "elip-johndoe-infinitelquidbitcoins" which includes the author's name/nick and the ELIP subject. 58 | 59 | 60 | If the ELIP editor approves, he will assign the ELIP a number, label it as protocol or application, give it status "Draft", and add it to the ELIPs git repository. The ELIP editor will not unreasonably deny an ELIP. Reasons for denying ELIP status include duplication of effort, disregard for formatting rules, being too unfocused or too broad, being technically unsound, not providing proper motivation or addressing backwards compatibility, or not in keeping with the Elements philosophy. For an ELIP to be accepted it must meet certain minimum criteria. It must be a clear and complete description of the proposed enhancement. The enhancement must represent a net improvement. The proposed implementation, if applicable, must be solid and must not complicate the protocol unduly. 61 | 62 | 63 | The ELIP author may update the Draft as necessary in the git repository. Updates to drafts may also be submitted by the author as pull requests. 64 | 65 | 66 | Protocol and application ELIPs consist of two parts, a design document and a reference implementation. The ELIP should be reviewed and accepted before a reference implementation is begun, unless a reference implementation will aid people in studying the ELIP. Standards Track ELIPs must include an implementation -- in the form of code, a patch, or a URL to same -- before it can be considered Final. 67 | 68 | 69 | Once an ELIP has been accepted, the reference implementation must be completed. When the reference implementation is complete and accepted by the community, the status will be changed to "Final". 70 | 71 | 72 | An ELIP can also be assigned status "Deferred". The ELIP author or editor can assign the ELIP this status when no progress is being made on the ELIP. Once an ELIP is deferred, the ELIP editor can re-assign it to draft status. 73 | 74 | 75 | An ELIP can also be "Rejected". Perhaps after all is said and done it was not a good idea. It is still important to have a record of this fact. 76 | 77 | 78 | ELIPs can also be superseded by a different ELIP, rendering the original obsolete. This is intended for Informational ELIPs, where version 2 of an API can replace version 1. 79 | 80 | 81 | The possible paths of the status of ELIPs are as follows: 82 | 83 | 84 | 85 | 86 | 87 | Some Informational and Process ELIPs may also have a status of "Active" if they are never meant to be completed. E.g. ELIP 1 (this ELIP). 88 | 89 | 90 | ==What belongs in a successful ELIP?== 91 | 92 | 93 | Each ELIP should have the following parts: 94 | 95 | 96 | * Preamble -- RFC 822 style headers containing meta-data about the ELIP, including the ELIP number, a short descriptive title (limited to a maximum of 44 characters), the names, and optionally the contact info for each author, etc. 97 | 98 | 99 | * Abstract -- a short (~200 word) description of the technical issue being addressed. 100 | 101 | 102 | * Copyright/public domain -- Each ELIP must either be explicitly labeled as placed in the public domain (see this ELIP as an example) or licensed under the Open Publication License. 103 | 104 | 105 | * Specification -- The technical specification should describe the syntax and semantics of any new feature. The specification should be detailed enough to allow competing, interoperable implementations for any of the current Elements platforms. 106 | 107 | 108 | * Motivation -- The motivation is critical for ELIPs that want to change the Elements protocol. It should clearly explain why the existing protocol specification is inadequate to address the problem that the ELIP solves. ELIP submissions without sufficient motivation may be rejected outright. 109 | 110 | 111 | * Rationale -- The rationale fleshes out the specification by describing what motivated the design and why particular design decisions were made. It should describe alternate designs that were considered and related work, e.g. how the feature is supported in other languages. 112 | 113 | 114 | * The rationale should provide evidence of consensus within the community and discuss important objections or concerns raised during discussion. 115 | 116 | 117 | * Backwards Compatibility -- All ELIPs that introduces backwards incompatibilities must include a section describing these incompatibilities and their severity. The ELIP must explain how the author proposes to deal with these incompatibilities. ELIP submissions without a sufficient backwards compatibility treatise may be rejected outright. 118 | 119 | 120 | * Reference Implementation -- The reference implementation must be completed before any ELIP is given status "Final", but it need not be completed before the ELIP is accepted. It is better to finish the specification and rationale first and reach consensus on it before writing code. 121 | 122 | 123 | * The final implementation must include test code and documentation appropriate for the Elements protocol. 124 | 125 | 126 | ==ELIP Formats and Templates== 127 | 128 | 129 | ELIPs should be written in mediawiki or markdown format. 130 | 131 | 132 | ===ELIP Header Preamble=== 133 | 134 | 135 | Each ELIP must begin with an RFC 822 style header preamble. The headers must appear in the following order. Headers marked with "*" are optional and are described below. All other headers are required. 136 | 137 | 138 |
139 |   ELIP: 
140 |   Title: 
141 |   Author: 
142 | * Discussions-To: 
143 |   Status: 
145 |   Type: 
146 |   Created: 
147 | * Post-History: 
148 | * Replaces: 
149 | * Superseded-By: 
150 | * Resolution: 
151 | 
152 | 153 | 154 | The Author header lists the names, and optionally the email addresses of all the authors/owners of the ELIP. The format of the Author header value must be 155 | 156 | 157 | Random J. User 158 | 159 | 160 | if the email address is included, and just 161 | 162 | 163 | Random J. User 164 | 165 | 166 | if the address is not given. 167 | 168 | 169 | If there are multiple authors, each should be on a separate line following RFC 2822 continuation line conventions. 170 | 171 | 172 | ===Auxiliary Files=== 173 | 174 | 175 | ELIPs may include auxiliary files such as diagrams. Image files should be included in a subdirectory for that ELIP. Auxiliary files must be named ELIP-XXXX-Y.ext, where "XXXX" is the ELIP number, "Y" is a serial number (starting at 1), and "ext" is replaced by the actual file extension (e.g. "png"). 176 | 177 | 178 | ==Transferring ELIP Ownership== 179 | 180 | 181 | It occasionally becomes necessary to transfer ownership of ELIPs to a new champion. In general, we'd like to retain the original author as a co-author of the transferred ELIP, but that's really up to the original author. A good reason to transfer ownership is because the original author no longer has the time or interest in updating it or following through with the ELIP process, or has fallen off the face of the 'net (i.e. is unreachable or not responding to email). A bad reason to transfer ownership is because you don't agree with the direction of the ELIP. We try to build consensus around an ELIP, but if that's not possible, you can always submit a competing ELIP. 182 | 183 | 184 | If you are interested in assuming ownership of an ELIP, send a message asking to take over, addressed to both the original author and the ELIP editor. If the original author doesn't respond to email in a timely manner, the ELIP editor will make a unilateral decision (it's not like such decisions can't be reversed :). 185 | 186 | 187 | ==ELIP Editors== 188 | 189 | 190 | The current ELIP editor is Marco Argentieri who can be contacted at marco@vulpem.com 191 | 192 | 193 | ==ELIP Editor Responsibilities & Workflow== 194 | 195 | 196 | The ELIP editor subscribes to the Elements development mailing list. All ELIP-related correspondence should be sent (or CC'd) to marco@vulpem.com 197 | 198 | 199 | For each new ELIP that comes in an editor does the following: 200 | 201 | 202 | * Read the ELIP to check if it is ready: sound and complete. The ideas must make technical sense, even if they don't seem likely to be accepted. 203 | * The title should accurately describe the content. 204 | * Edit the ELIP for language (spelling, grammar, sentence structure, etc.), markup, code style. 205 | 206 | 207 | If the ELIP isn't ready, the editor will send it back to the author for revision, with specific instructions. 208 | 209 | 210 | Once the ELIP is ready for the repository it should be submitted as a "pull request" to the https://github.com/ElementsProject/elips repository on GitHub where it may get further feedback. 211 | 212 | 213 | The ELIP editor will: 214 | 215 | 216 | * Assign an ELIP number (almost always just the next available number, but sometimes it's a special/joke number, like 666 or 3141) in the pull request comments. 217 | 218 | 219 | * Merge the pull request when the author is ready (allowing some time for further peer review). 220 | 221 | 222 | * List the ELIP in [[README.mediawiki]] 223 | 224 | 225 | * Send email back to the ELIP author with next steps (post to elements-dev mailing list). 226 | 227 | 228 | The ELIP editors are intended to fulfill administrative and editorial responsibilities. The ELIP editors monitor ELIP changes, and correct any structure, grammar, spelling, or markup mistakes we see. 229 | 230 | 231 | ==History== 232 | 233 | 234 | This document was derived heavily from Bitcoin's BIP-0001. In many places text was simply copied and modified. Authors of BIP-0001 are not responsible for its use in the Elements Improvement Process, and should not be bothered with technical questions specific to Elements or the ELIP process. Please direct all comments to the ELIP editors or the Elements development mailing list. -------------------------------------------------------------------------------- /elip-0100.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 100
  3 |   Layer: Applications
  4 |   Title: Hardware Wallet Extensions for Partially Signed Elements Transaction Format
  5 |   Author: Mikhail Tolkachev 
  6 |   Comments-Summary: No comments yet.
  7 |   Status: Draft
  8 |   Type: Standards Track
  9 |   Created: 2022-12-01
 10 |   License: BSD-2-Clause
 11 | 
12 | 13 | ==Introduction== 14 | 15 | ===Abstract=== 16 | 17 | This document describes proprietary extensions to the BIP 370 PSBT Version 2. 18 | These extensions are for use in Elements Sidechains to hold the information necessary for interaction with hardware wallets and other offline signer applications having no network access. It is assumed that the lifecycle of the proposed fields is limited to a communication session between the host software and an offline device. 19 | 20 | ===Copyright=== 21 | 22 | This ELIP is licensed under the 2-clause BSD license. 23 | 24 | ==Specification== 25 | 26 | The Hardware Wallet Extensions complement the Partially Signed Elements Transaction (PSET) format, which extends the BIP 370 PSBT format. The changes are new proprietary type fields. This specification inherits a magic sequence, roles, and additional constraints from the main PSET specification (Partially Signed Elements Transaction Format). To avoid duplication of information, basic definitions from the PSET specification are not included in this ELIP. At the time of writing, PSET specification had not been issued as an ELIP and is available at: 27 | 28 | https://github.com/ElementsProject/elements/blob/master/doc/pset.mediawiki 29 | 30 | To avoid possible collisions with PSET fields from the main specification, a distinct proprietary field prefix "pset_hww" is used for the fields belonging to Hardware Wallet Extensions. For example, identifier of PSBT_ELEMENTS_HWW_GLOBAL_ASSET_METADATA is a sequence of 11 bytes 0xfc08707365745f68777700. 31 | 32 | The new global proprietary types specific to Hardware Wallet Extensions are as follows: 33 | 34 | {| 35 | ! Name 36 | ! 37 | ! 38 | ! Description 39 | ! 40 | ! Description 41 | ! Versions Requiring Inclusion 42 | ! Versions Requiring Exclusion 43 | ! Versions Allowing Inclusion 44 | |- 45 | | Asset Metadata 46 | | PSBT_ELEMENTS_HWW_GLOBAL_ASSET_METADATA = 0x00 47 | | <32 byte asset tag> 48 | | A 32-byte asset tag which corresponds to this metadata. 49 | | <32-byte prevoutTxid><32-bit little endian uint prevoutIndex> 50 | | A compact size unsigned integer representing size of the contract in bytes, contractLen, is followed with the contract itself as a JSON document, canonicalized to have its keys sorted lexicographically. The input of an asset issuance transaction is represented as prevoutTxid - a 32-byte previous transaction hash, and prevoutIndex - a 32-bit little endian unsigned integer containing a zero-based index of the previous transaction's output. 51 | | 52 | | 0 53 | | 2 54 | |- 55 | | Reissuance Token Definition 56 | | PSBT_ELEMENTS_HWW_GLOBAL_REISSUANCE_TOKEN = 0x01 57 | | <32 byte token tag> 58 | | A 32-byte asset tag of a reissuance token. 59 | | <1 byte boolean issuanceBlinded><32-byte asset tag> 60 | | A boolean flag issuanceBlinded indicates a non-blinded issuance if set to 0x00, and a blinded issuance if set to 0x01. A 32-byte tag that follows it corresponds to an asset to which this reissuance token belongs. 61 | | 62 | | 0 63 | | 2 64 | |} 65 | 66 | ===Handling Duplicated Keys=== 67 | 68 | For all Elements PSBT proprietary fields, PSETs cannot be combined when there are duplicate fields except in the case where those fields are identical. 69 | 70 | ==Roles== 71 | 72 | Using the transaction format involves many different responsibilities. Multiple responsibilities can be handled by a single entity, but each responsibility is specialized in what it should be capable of doing. 73 | This specification relies on definition of roles in the main PSET standard. The following statements describe specifics of handling Hardware Wallet Extensions for some of the roles for which it is applicable. 74 | 75 | ===Updater=== 76 | 77 | Besides the responsibilities defined in PSET specification, Updater should add asset metadata for each asset referenced in any inputs or issuance outputs. This information is typically queried from the global asset registry, but cached or pre-defined information could be used as well. For each asset, the Updater adds a separate field using asset tag as keydata. The Updater is responsible to make a reasonable number of checks for the asset metadata before it is injected into a PSET intended for offline signing. These checks must include verification of the metadata source. It is also critical for the Updater to perform best effort checking to detect bogus assets impersonating legitimate assets through visually or semantically similar names and tickers. 78 | 79 | For the transactions involving asset reissuance tokens, Updater should also include the PSET reissuance token definition field for each of the tokens in use. Such transactions include asset issuance, asset reissuance, reissuance token transfer, and reissuance token burn. If an Updater adds a definition for some reissuance token, it's obligatory to include a metadata field for the asset to which this reissuance token belongs. A PSET with a reissuance token definition missing associated asset metadata is considered invalid. However, it's allowed for an asset metadata field to not have a corresponding reissuance token definition if the reissuance token is unknown or irrelevant to the transaction. 80 | 81 | As a single entity is likely to be both a Creator and Updater, and thus it makes possible to fill-in asset metadata and reissuance token definition on PSET creation step. 82 | 83 | WARNING: PSET containing the fields belonging to Hardware Wallet Extensions is not supposed to be transmitted to other parties, to avoid encouraging them to trust this information. Updater must remove all asset metadata and reissuance token definition records after completing the signature process involving an offline entity. 84 | 85 | ===Signer=== 86 | 87 | In addition to the Signer behavior defined in BIP 370 PSBT and the main PSET standard, the Signer should be responsible for properly handling fields belonging to Hardware Wallet Extensions. Within the scope of this specification, it is assumed that the Signer role is implemented by a hardware wallet or any application running on an airgapped device with similar concept. 88 | 89 | Asset metadata fields, PSBT_ELEMENTS_HWW_GLOBAL_ASSET_METADATA are fully optional, meaning that the Signer should not assume their presence for all or some of the assets referenced in the transaction. But if any of the asset metadata fields is present, the Signer must verify it by re-computing the asset tag from the given contract and issuance transaction's input. This field is provided to the Signer for displaying rich asset information to the user. For security reasons, it is highly recommended that externally provided asset metadata is displayed along with the full asset tag in hexadecimal form, if it is within technical capabilities of the HWW. This is because the asset metadata may be valid, but contain, e.g., a ticker that mimics another asset. If only the ticker is shown, the users signing the transaction may be tricked into signing an asset that they did not intend. Since a hardware wallet typically does not have access to the network, PSET fields may be the only source of metadata for this category of Signer implementation, except for its internal asset database. 90 | 91 | Reissuance token definition fields PSBT_ELEMENTS_HWW_GLOBAL_REISSUANCE_TOKEN are supplementary fields for the corresponding asset metadata fields. Their presence in PSET is optional; however, if present, every reissuance token definition must have an associated asset metadata field. The Signer should not assume the presence of a reissuance token definition for every asset metadata field included in PSET. If any of the reissuance token definition fields are present, the Signer must perform the verification of these fields by computing the reissuance token's tag. This is done by using the information stored in the associated asset metadata fields and the value of issuanceBlinded flag. Verification is considered successful if the computed tag matches the one included in keydata. It is supposed that a Signer uses definitions of reissuance tokens to display textual information on them, like a ticker of the associated asset wrapped with a comment unambiguously denoting this token as a reissuance token. 92 | 93 | ===Transaction Extractor=== 94 | 95 | The Transaction Extractor should normally ignore the fields belonging to Hardware Wallet Extensions as none of these fields affects the produced transaction. 96 | 97 | ==Test Vectors== 98 | 99 | Valid asset metadata record in PSET composed of the listed below values: 100 | 101 | Source values: 102 | Asset tag : 48f835622f34e8fdc313c90d4a8659aa4afe993e32dcb03ae6ec9ccdc6fcbe18 103 | Reissuance token : d739234098f77172cb22f0de8affd6826d6b9d23d97e04575764786a5b0056e1 104 | Contract. : {"entity":{"domain":"example.com"},"issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","name":"Testcoin","precision":2,"ticker":"TEST","version":0} 105 | prevoutTxid : 3514a07cf4812272c24a898c482f587a51126beef8c9b76a9e30bf41b0cbe53c 106 | prevoutIndex : 1 107 | issuance : blinded 108 | 109 | Resulting asset metadata record: 110 | key : fc08707365745f6877770018befcc6cd9cece63ab0dc323e99fe4aaa59864a0dc913c3fde8342f6235f848 111 | value : b47b22656e74697479223a7b22646f6d61696e223a226578616d706c652e636f6d227d2c226973737565725f7075626b6579223a22303334353565653763656463393762306261343335623830303636666339326339363361333463363030333137393831643133353333306334656534336163376133222c226e616d65223a2254657374636f696e222c22707265636973696f6e223a322c227469636b6572223a2254455354222c2276657273696f6e223a307d3ce5cbb041bf309e6ab7c9f8ee6b12517a582f488c894ac2722281f47ca0143501000000 112 | 113 | Resulting reissuance token definition record: 114 | key : fc08707365745f68777701e156005b6a78645757047ed9239d6b6d82d6ff8adef022cb7271f798402339d7 115 | value : 0118befcc6cd9cece63ab0dc323e99fe4aaa59864a0dc913c3fde8342f6235f848 116 | 117 | Invalid contracts that should be detected by contract parser: 118 | 119 | * Missing ticker:
{"entity":{"domain":"example.com"},"issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","name":"Testcoin","precision":2,"version":0}
120 | * Missing precision:
{"entity":{"domain":"example.com"},"issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","name":"Testcoin","ticker":"TEST","version":0}
121 | * Ticker is too long:
{"entity":{"domain":"example.com"},"issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","name":"Testcoin","precision":2,"ticker":"1234567890123456789012345","version":0}
122 | * Forbidden whitespace:
{"entity":{"domain":"example.com"}, "issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","name":"Testcoin","precision":2,"ticker":"TEST","version":0}
123 | * Duplicate key (name):
{"entity":{"domain":"example.com"},"issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","name":"Testcoin","name":"Othercoin","precision":2,"ticker":"TEST","version":0}
124 | * Non-sorted keys:
{"name":"Testcoin","entity":{"domain":"example.com"},"issuer_pubkey":"03455ee7cedc97b0ba435b80066fc92c963a34c600317981d135330c4ee43ac7a3","precision":2,"ticker":"TEST","version":0}
125 | 126 | ==Rationale== 127 | 128 | 129 | 130 | ==Backwards Compatibility== 131 | 132 | PSETs containing Hardware Wallet Extensions are considered backwards compatible with both the mainstream PSET format and the BIP 370 PSBT Version 2 format, on which PSET is based. 133 | 134 | Existing implementations, following the policy specified in the initial BIP 174 PSBT specification, ignore all unknown fields, and thus should not be affected by the presence of the new fields belonging to Hardware Wallet Extensions. Since none of the new fields affect produced signatures nor the network format transaction, inability to process these new fields has no functional consequences. 135 | 136 | New implementations taking advantage of the Hardware Wallet Extensions should not rely on the presence of these new fields. For example, a hardware wallet application discovering the absence of the expected asset metadata must fall back to displaying hexadecimal asset identifier instead of ticker. 137 | 138 | ==Reference implementation== 139 | 140 | TBD 141 | -------------------------------------------------------------------------------- /elip-0101.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 101
  3 |   Layer: Applications
  4 |   Title: Genesis Blockhash for Partially Signed Elements Transaction Format
  5 |   Author: Jon Griffiths 
  6 |   Comments-Summary: No comments yet.
  7 |   Status: Draft
  8 |   Type: Standards Track
  9 |   Created: 2025-02-04
 10 |   License: BSD-2-Clause
 11 | 
12 | 13 | ==Introduction== 14 | 15 | ===Abstract=== 16 | 17 | This document describes a new, conditionally optional global field for the Partially Signed Elements Transaction (PSET) format, which contains the genesis blockhash of the chain the transaction is intended to be signed for. 18 | 19 | A genesis blockhash uniquely identifies an instance of an Elements chain. Elements Segwit v1 taproot support takes advantage of this fact by including the genesis blockhash in the data used to sign a transaction. This ensures that signatures are different between chain instances and can be used to ensure that the expectations of transaction creators and signers are aligned. 20 | 21 | Code/hardware that performs signing may operate either with or without the context of the current chain. For example, Elements nodes are configured to run on a specific chain and thus when signing always know the chain they are signing for. In contrast, libraries or utilities that provide PSET signing may run in multiple contexts, and may not have a global state representing the current chain. In this latter case, the chain must be provided to the signer in the form of the new field this ELIP proposes. 22 | 23 | In the following text, "context available" refers to code having an understanding of the current chain as in the Elements example above. 24 | 25 | While this field must be included if the PSET contains taproot inputs, it may optionally be included when no taproot inputs are present. This allows signers with context available to reject signing transactions that are not intended for their configured chain. 26 | 27 | ===Copyright=== 28 | 29 | This ELIP is licensed under the 2-clause BSD license. 30 | 31 | ==Specification== 32 | 33 | The Partially Signed Elements Transaction (PSET) format extends the BIP 370 PSBT format and is defined at https://github.com/ElementsProject/elements/blob/master/doc/pset.mediawiki. This document extends the PSET format directly, and as such the document above should be updated if and when this ELIP is approved. 34 | 35 | The new global field is defined as follows: 36 | 37 | {| 38 | ! Name 39 | ! 40 | ! 41 | ! Description 42 | ! 43 | ! Description 44 | ! Versions Requiring Inclusion 45 | ! Versions Requiring Exclusion 46 | ! Versions Allowing Inclusion 47 | |- 48 | | Genesis Blockhash 49 | | PSBT_ELEMENTS_GLOBAL_GENESIS_HASH = 0x02 50 | | None 51 | | No key data 52 | | 53 | | The 32 byte genesis hash of the Elements chain this transaction is for. 54 | | 2(*) 55 | | - 56 | | 2 57 | |} 58 | 59 | (*) Note that required inclusion is conditional as described below. 60 | 61 | ===Handling Duplicated Keys=== 62 | 63 | Duplicate or repeated values of the new field are not allowed. When merging multiple PSETs, if any input PSET has this field, the resulting PSET must also. If more than one value for this field is present or would result, merging must fail. These are the standard rules for existing fields and should not require special handling. 64 | 65 | Logically, a PSET must either explicitly belong to a given chain (the field is present), or not explicitly belong to any chain (the field is absent). 66 | 67 | ==Roles== 68 | 69 | For all roles, when a PSET is received and the field is present, it should be validated if context is available. If the genesis hash does not match the current context, the operation must fail. 70 | 71 | The field must not ever be removed, even after finalization, since it can be used to prevent further processing or broadcast on the wrong chain. 72 | 73 | Otherwise, the PSET Roles are updated as follows: 74 | 75 | ===Creator/Updater=== 76 | 77 | May add the field to any PSET they process, if context is available. 78 | 79 | If taproot inputs are added, they must add the field. 80 | 81 | If the PSET already contains taproot inputs and the field is not present, an updater should add it if context is available. 82 | 83 | ===Signer=== 84 | 85 | If present, the field must be validated if context is available. 86 | 87 | If not present, signers may sign taproot inputs with their current chain if context is available. 88 | 89 | If any inputs of any type are signed the field should be added, and must be added if taproot inputs are present (whether signed or not). 90 | 91 | 92 | 93 | 94 | ==Backwards Compatibility== 95 | 96 | The new field is backwards compatible due to the ignore/round trip behavior for new fields inherited from the PSBT specification. Conforming implementations are expected to carry through the new field and its contents even if they do not support this ELIP. 97 | 98 | ==Reference implementation== 99 | 100 | Implemented in libwally-core v1.4.0: https://github.com/ElementsProject/libwally-core/releases/tag/release_1.4.0 101 | -------------------------------------------------------------------------------- /elip-0102.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 102
  3 |   Layer: Applications
  4 |   Title: LiquiDEX extensions for Partially Signed Elements Transaction Format
  5 |   Author: Leonardo Comandini 
  6 |   Comments-Summary: No comments yet.
  7 |   Status: Draft
  8 |   Type: Standards Track
  9 |   Created: 2024-07-17
 10 |   License: BSD-2-Clause
 11 | 
12 | 13 | ==Introduction== 14 | 15 | ===Abstract=== 16 | 17 | This document describes extensions to the Partially Signed Elements Transaction (PSET) format for [https://leocomandini.github.io/2021/06/15/liquidex.html LiquiDEX] swaps. 18 | 19 | In LiquiDEX swaps, transactions are (partially) blinded collectively, thus some extra information must be shared to make blinding possible, this ELIP describes how to encode the necessary extra data (asset blinding factors) in a PSET. 20 | 21 | ===Copyright=== 22 | 23 | This ELIP is licensed under the 2-clause BSD license. 24 | 25 | ==Specification== 26 | 27 | To avoid possible collisions with PSET fields from the main specification (available at https://github.com/ElementsProject/elements/blob/master/doc/pset.mediawiki), a distinct proprietary field prefix "pset_liquidex" is used for the fields described in this ELIP. 28 | For example, identifier of PSBT_ELEMENTS_LIQUIDEX_IN_ABF is a sequence of 11 bytes fc0d707365745f6c6971756964657800. 29 | 30 | This additional per-input proprietary type element is defined: 31 | 32 | {| 33 | ! Name 34 | ! 35 | ! 36 | ! Description 37 | ! 38 | ! Description 39 | ! Versions Requiring Inclusion 40 | ! Versions Requiring Exclusion 41 | ! Versions Allowing Inclusion 42 | |- 43 | | Asset Blinding Factor 44 | | PSBT_ELEMENTS_LIQUIDEX_IN_ABF = 0x00 45 | | None 46 | | No key data 47 | | <256 bit uint> 48 | | The 32 byte asset blinding factor for the input being spent. 49 | | 50 | | 0 51 | | 2 52 | |} 53 | 54 | And this additional per-output proprietary type element is defined: 55 | 56 | {| 57 | ! Name 58 | ! 59 | ! 60 | ! Description 61 | ! 62 | ! Description 63 | ! Versions Requiring Inclusion 64 | ! Versions Requiring Exclusion 65 | ! Versions Allowing Inclusion 66 | |- 67 | | Asset Blinding Factor 68 | | PSBT_ELEMENTS_LIQUIDEX_OUT_ABF = 0x00 69 | | None 70 | | No key data 71 | | <256 bit uint> 72 | | The 32 byte asset blinding factor of this output. 73 | | 74 | | 0 75 | | 2 76 | |} 77 | 78 | ==Rationale== 79 | 80 | In some protocols where blinding is done by different parties, the asset surjection proof for some output might be created by: 81 | 82 | * someone who does not own an input with the same asset, or 83 | * someone who does not know the asset blinding factor corresponding to the output asset commitment 84 | 85 | This, in general, is the case of [https://leocomandini.github.io/2022/10/27/liquidexv1.html LiquiDEX v1], e.g. 86 | 87 | * Alice wants to swap x of asset A for y of asset B 88 | * Alice owns a utxo with x of asset A 89 | * Alice creates a spending that utxo and receiving an output with y of asset B 90 | * Alice draws at random the asset and value blinding factors for the output, sets the corresponding asset and value commitment. Sets the nonce commitment. Computes and sets the rangeproof 91 | * Alice computes the scalar offset contribution of the input and output (combined) 92 | * Alice computes the value blind proofs for the input and output 93 | * Alice creates the LiquiDEX proposal using the data obtained above: 94 |
 95 | {
 96 |   "version": 1,
 97 |   "tx": "...",
 98 |   "inputs": [{
 99 |     "asset": "aa...",
100 |     "satoshi": x,
101 |     "assetblinder": "...",
102 |     "value_blind_proof": "...",
103 |   }],
104 |   "outputs": [{
105 |     "asset": "bb...",
106 |     "satoshi": y,
107 |     "assetblinder": "...",
108 |     "value_blind_proof": "...",
109 |   }],
110 |   "scalars": ["..."],
111 | }
112 | 
113 | * Alice shares the proposal with Bob 114 | * Bob adds more inputs for the asset B and fees 115 | * Bob adds more outputs for the asset A, B and fees 116 | * Bob blinds the transaction, i.e.: 117 | ** draws at random abf and vbf for each new output, apart from the last one for which he uses the new inputs contribution and the scalar offset from the proposal to balance the tx 118 | ** creates rangeproofs for each new output 119 | ** creates surjection proofs for each (blinded) fee output 120 | ** creates surjection proofs for each A output, note that in general the input asset blinding factor is needed. 121 | ** creates surjection proofs for each B output, including the one from Alice, which requires the output blinding factor. Note that Alice could not have created the surjection proof since she did not know any B input when she created the tx 122 | 123 | This example shows why sharing the asset blinding factors for input and outputs is necessary under some specific circumstances. 124 | 125 | Adding input and output asset blinding factors, allows to convert LiquiDEX v1 proposal in PSETs, so that wallets can only deal with PSETs. 126 | 127 | However, in most cases, setting the asset blinding factors in a PSET is not necessary, and in such cases these elements should not be set. 128 | 129 | ==Test Vectors== 130 | 131 | Valid Asset Blinding Factor, which can be set both on inputs or outputs: 132 | 133 | Source values: 134 | abf: 3311111111111111111111111111111111111111111111111111111111111111 135 | 136 | Resulting record: 137 | key: fc0d707365745f6c6971756964657800 138 | value: 3311111111111111111111111111111111111111111111111111111111111111 139 | 140 | ==Reference Implementation== 141 | 142 | * [https://github.com/ElementsProject/rust-elements/pull/207 rust-elements] 143 | -------------------------------------------------------------------------------- /elip-0150.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 150
  3 |   Layer: Wallet
  4 |   Title: CT Descriptors for Elements
  5 |   Author: Andrew Poelstra 
  6 |           Tim Ruffing 
  7 |   Comments-Summary: No comments yet.
  8 |   Comments-URI: https://github.com/ElementsProject/elips/wiki/Comments:ELIP-0150
  9 |   Status: Draft
 10 |   Type: Standards Track
 11 |   Created: 2022-10-06
 12 |   License: BSD-3-Clause
 13 | 
14 | 15 | ==Introduction== 16 | 17 | ===Abstract=== 18 | 19 | This document proposes a new wrapper around existing and future Elements descriptor types, which allows attaching a confidential blinding key to an ordinary output script descriptor. It introduces new syntax to support both existing SLIP77-style confidential keys as well as a new, more flexible style. 20 | 21 | ===Copyright=== 22 | 23 | This document is licensed under the 3-clause BSD license. 24 | 25 | ===Motivation=== 26 | 27 | Confidential Transactions involve the use of uniformly random "blinding factors" associated to every confidential output. 28 | These random values are secret, but must be known by the sender (in order to construct a transaction) as well as recipient (in order to recognize the received assets and amounts, and to spend the outputs). 29 | This means they must be chosen by the sender of a transaction and somehow securely communicated to the recipient. 30 | 31 | The way this is done is that confidential addresses contain the public key of an extra "blinding key" pair created by the recipient. 32 | When blinding, the sender chooses a fresh EC Diffie-Hellman (ECDH) private key, encodes the corresponding public key in the "nonce" field of the transaction, derives an ECDH secret between the fresh private key and the public blinding key, uses the ECDH secret to encrypt the blinding factors for the output, and encodes the encrypted result in the rangeproof. 33 | The recipient, when recognizing a scriptPubKey corresponding to the ordinary part of her confidential address, uses the private blinding key for that address in conjunction with the nonce field of the txout to re-derive the ECDH secret and decrypt the blinding factors. 34 | 35 | This document defines a standard way for the recipient's wallet to compute blinding key pairs. There are a number of requirements: 36 | 37 | * Confidential addresses, including their attached blinding key, should be derivable from a single descriptor without extra data 38 | * Wallets should be able to choose the granularity of their blinding keys, so that the revelation of private blinding keys may unblind one, a subset, or all, of its blinded outputs 39 | * In multiparty settings, each wallet should be able to restrict this granularity 40 | * It should be possible somehow to do public derivation of CT addresses, given only a descriptor containing (extended) public keys 41 | 42 | The current most popular scheme, [https://github.com/satoshilabs/slips/blob/master/slip-0077.md SLIP-77], does not satisfy any of these criteria, which limits its usefulness as we move toward a descriptor-centric setting in which multiparty addresses are common. 43 | 44 | ==Design== 45 | 46 | ===Overview=== 47 | We propose a new ct descriptor which wraps any other descriptor type in the form ct(, ). 48 | Here DESCRIPTOR refers to any existing descriptor, e.g. elwsh(...) or eltr(...) and BLINDING_KEY is a new expression which must be one of 49 | * slip77(<64-character hex>) which indicates that blinding keys for these addresses are derived via SLIP77; or 50 | * which is a key expression as described in BIP 380, with the exception that uncompressed and x-only keys are not allowed, moreover single private keys are encoded hex instead of WIF; the blinding key is derived by a Taproot-style tweak of the key with the data of . 51 | 52 | In the expression, all key(s) must be compressed; x-only and uncompressed keys are invalid. 53 | 54 | It is permissible, and likely to be common, for a key to be a private key (e.g. an xprv) even if the keys in the actual descriptor are public keys. 55 | Such a descriptor is termed a '''view descriptor''', and the blinding private key a '''view key'''. 56 | 57 | Later extensions to this ELIP may specify alternate expressions for `KEY`, for example to allow MuSig-combining keys from multiple participants. 58 | 59 | ===Drawbacks=== 60 | 61 | * Because there is no sensible way to do multiparty unblinding, the blinding key must be a single key whose private half is known to all participants. 62 | * The use of "view descriptors" which are nominally public but contain secret key data, may lead to user confusion; though we argue it has similar privacy properties to the chaincode value included in xpubs. 63 | * Any party who has a copy of an addresses' view descriptor is able to see the blinding key and unblind coins sent to that address, or *any* derived address in the case of a descriptor containing wildcards. 64 | 65 | The latter point is the intended use of view descriptors, and is listed as a drawback only because it may be surprising. 66 | 67 | ===Specification=== 68 | 69 | First, the ct descriptor is defined as above: its string serialization is given by ct(, ) where DESCRIPTOR is the string serialization of an ordinary descriptor. 70 | The scriptPubKey corresponding to a ct descriptor is that corresponding to the embedded DESCRIPTOR. The encoding and semantics of BLINDING_KEY are given below. 71 | 72 | BLINDING_KEY expressions are one of 73 | * '''slip77''', encoded as slip77(<64-characters hex>), whose semantics are that the 64 hex characters are interpreted as the 32-byte master_blinding_key in SLIP77; the scriptPubKey for SLIP77 is computed as normal from the ordinary descriptor. 74 | ** These 32 bytes are the same for both public and private descriptors; they have no "public" equivalent. 75 | ** This mode is not recommended because there is no way to express this descriptor without revealing the SLIP77 key, which can be used to unblind every single output received by the wallet. 76 | * '''bare key''', which simply encodes a single key in the same way as the keys in are encoded. The blinding key is derived from the address by taking the public key ''K'' and tweaking it to form a new key ''Kblind'' as follows: 77 | ** ''Kblind = K + Htag(K, scriptPubKey)G'', where 78 | ** ''Htag'' is a [https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#Design BIP-340 tagged hash] with tag CT-Blinding-Key/1.0; 79 | ** the comma indicates concatenation; 80 | ** scriptPubKey is the scriptPubKey of the output, consensus-encoded including its length prefix; 81 | ** and ''Htag(K, scriptPubKey)G'' is the public key corresponding to the result of the tagged hash interpreted as a scalar or private key. 82 | 83 | Because the scriptPubKey is revealed on the blockchain, its role in the tagged hash is merely to ensure that blinding keys are not reused across multiple outputs, unless they are identical (in which case the reuse amounts to ordinary address reuse). 84 | Privacy and security are provided by the untweaked key ''K'', which is never revealed on-chain. 85 | 86 | In some circumstances, it may make sense for ''K'' to be derived deterministically from the descriptor data, rather than being chosen and specified separately. 87 | This reduces implementation complexity and the need to store additional keys, at the cost of turning the descriptor unconditionally into a view descriptor. 88 | In other words, users of this variant will be unable to provide external parties the ability to derive addresses without ''also'' providing them the ability to unblind coins. 89 | 90 | In a future ELIP we will specify a standard deterministic key generation scheme for this case. 91 | 92 | ==Backwards Compatibility== 93 | 94 | Using the ct(slip77(<64-byte hex>), ) construction, any wallet should be able to express its existing confidential addresses using this new scheme. 95 | 96 | ==Test Vectors== 97 | 98 | The following CT descriptors should be parseable and generate the given addresses: 99 | 100 | * Valid Descriptor 1: ct(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,elpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#y0lg3d5y 101 | ** Descriptor blinding public key: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL 102 | ** Confidential address: VTpvZZYdbhbyVF3Wa99eMjgXhfvu4LS26dR2FwMfNXq7FDX73HZEsZr3VvgH9EDgQnYK7sP6ACKSuMGw 103 | ** Unconfidential address: Q5WHLVd78iAspUNvzuULvi2F8u693pzAqe 104 | * Valid Descriptor 2: ct(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,elwpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#kt4e25qt 105 | ** Descriptor blinding public key: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL 106 | ** Confidential address: lq1qqg5s7xj7upzl7h4q2k2wj4vq63nvaktn0egqu09nqcr6d44p4evaqknpl78t02k2xqgdh9ltmfmpy9ssk7qfvghdsfr4mvr9c 107 | ** Unconfidential address: ex1qtfsllr4h4t9rqyxmjl4a5asjzcgt0qyktcafre 108 | * Valid Descriptor 3: ct(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,elsh(wpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH)))#xg9r4jej 109 | ** Descriptor blinding public key: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL 110 | ** Confidential address: VJL8znN4XjXEUKzDaYsqdzRASGLY2KHxC4N6g5b5QvrNjXfeKp83Ci9AW2a8QzbZjpEffoy4PEywpLAZ 111 | ** Unconfidential address: Gq6kpy2HiNgsyQVpBsuBKAPRFiir23qKro 112 | * Valid Descriptor 4: ct(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL,eltr(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#c0pjjxyw 113 | ** Descriptor blinding public key: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL 114 | ** Confidential address: lq1pq0nsl8du3gsuk7r90sgm78259mmv6mt9d4yvj30zr3u052ufs5meuc2tuvwx7k7g9kvhhpux07vqpm3qjj8uwdj94650265ustv0xy8zrdxdfgp8g9pl 115 | ** Unconfidential address: ex1pv997x8r0t0yzmxtms7r8lxqqacsffr78xez6a284d2wg9k8nzr3qxa9kvf 116 | * Valid Descriptor 5: ct(slip77(b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04),elpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#hw2glz99 117 | ** SLIP77 master blinding key: b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04 118 | ** Confidential address: VTq585ahVjWarEwg2nKQ9yYirmYs5F5j74CeYYA9cq1EZD9obm7hwpx6xqq3J1AY9YRaSavEMzYfr6t7 119 | ** Unconfidential address: Q5WHLVd78iAspUNvzuULvi2F8u693pzAqe 120 | * Valid Descriptor 6: ct(slip77(b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04),elwpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#545pl285 121 | ** SLIP77 master blinding key: b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04 122 | ** Confidential address: lq1qqdx5wnttttzulcs6ujlg9pfts6mp3r4sdwg5ekdej566n5wxzk88vknpl78t02k2xqgdh9ltmfmpy9ssk7qfvr33xa22hpw23 123 | ** Unconfidential address: ex1qtfsllr4h4t9rqyxmjl4a5asjzcgt0qyktcafre 124 | * Valid Descriptor 7: ct(slip77(b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04),elsh(wpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH)))#m30vswxr 125 | ** SLIP77 master blinding key: b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04 126 | ** Confidential address: VJLFGQ17aGa3WSVEVyxzDktD9SFixJjfSmqVq8xaWmR9X6gFbiF95KFwKA41PBhu3jNTxJFKTUphHL8J 127 | ** Unconfidential address: Gq6kpy2HiNgsyQVpBsuBKAPRFiir23qKro 128 | * Valid Descriptor 8: ct(slip77(b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04),eltr(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#n3v4t5cs 129 | ** SLIP77 master blinding key: b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04 130 | ** Confidential address: lq1pq26fndnz8ef6umlz6e2755sm6j5jwxv3tdt2295mr4mx6ux0uf8vcc2tuvwx7k7g9kvhhpux07vqpm3qjj8uwdj94650265ustv0xy8z8wfacw9e5a5t 131 | ** Unconfidential address: ex1pv997x8r0t0yzmxtms7r8lxqqacsffr78xez6a284d2wg9k8nzr3qxa9kvf 132 | * Valid Descriptor 9: ct(02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623,elwpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4))#h5e0p6m9 133 | ** Blinding key: 02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623 134 | ** Confidential address: 135 | ** Unconfidential address: ex1qpasxxt9vv6tgfnvgzuuy9e3j9lryg6hawrval4 136 | * Valid Descriptor 10: ct(02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623,elwpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#x6sc2de2 137 | ** Blinding public key: 02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623 138 | ** Confidential address: lq1qqwkeuelr466ue5u8e0lz3a27q4yk93qnupry5h3q4h9pjpf8vrrzvknpl78t02k2xqgdh9ltmfmpy9ssk7qfvwt93dvuvssha 139 | ** Unconfidential address: ex1qtfsllr4h4t9rqyxmjl4a5asjzcgt0qyktcafre 140 | 141 | This one is a "view descriptor" which has a private blinding key but otherwise public keys: 142 | 143 | * View Descriptor: ct(xprv9s21ZrQH143K28NgQ7bHCF61hy9VzwquBZvpzTwXLsbmQLRJ6iV9k2hUBRt5qzmBaSpeMj5LdcsHaXJvM7iFEivPryRcL8irN7Na9p65UUb,elwpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#j95xktq7 144 | ** Descriptor blinding private key: xprv9s21ZrQH143K28NgQ7bHCF61hy9VzwquBZvpzTwXLsbmQLRJ6iV9k2hUBRt5qzmBaSpeMj5LdcsHaXJvM7iFEivPryRcL8irN7Na9p65UUb 145 | ** Confidential address: lq1qq2r0pdvcknjpwev96qu9975alzqs78cvsut5ju82t7tv8d645dgmwknpl78t02k2xqgdh9ltmfmpy9ssk7qfvtk83xqzx62q4 146 | ** Unconfidential address: ex1qtfsllr4h4t9rqyxmjl4a5asjzcgt0qyktcafre 147 | * Non-view Descriptor: ct(xpub661MyMwAqRbcEcT9W98HZP2kFzyzQQZkYnrRnrM8uD8kH8kSeFoQHq1x2iihLgC6PXGy5LrjCL66uSNhJ8pwjfx2rMUTLWuRMns2EG9xnjs,elwpkh(xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#elmfpmp9 148 | ** Descriptor blinding public key: xpub661MyMwAqRbcEcT9W98HZP2kFzyzQQZkYnrRnrM8uD8kH8kSeFoQHq1x2iihLgC6PXGy5LrjCL66uSNhJ8pwjfx2rMUTLWuRMns2EG9xnjs 149 | ** Confidential address: lq1qq2r0pdvcknjpwev96qu9975alzqs78cvsut5ju82t7tv8d645dgmwknpl78t02k2xqgdh9ltmfmpy9ssk7qfvtk83xqzx62q4 150 | ** Unconfidential address: ex1qtfsllr4h4t9rqyxmjl4a5asjzcgt0qyktcafre 151 | 152 | The non-view descriptor is the same as the view descriptor except that its private blinding key has been replaced with a public key. Notice that the generated addresses are the same in both cases. 153 | 154 | This one is a "view descriptor" using ordinary keys rather than extended ones: 155 | 156 | * View Descriptor 2: ct(c25deb86fa11e49d651d7eae27c220ef930fbd86ea023eebfa73e54875647963,elwpkh(021a8fb6bd5a653b021b98a2a785725b8ddacfe3687bc043aa7f4d25d3a48d40b5))#c2kx9zll 157 | ** Descriptor blinding private key: c25deb86fa11e49d651d7eae27c220ef930fbd86ea023eebfa73e54875647963 158 | ** Confidential address: lq1qq265u4g3k3m3qpyxjwpdrtnm293wuxgvs9xzmzcs2ck0mv5rx23w4d7xfsednsmmxrszfe7s9rs0c6cvf3dfytxax3utlmm46 159 | ** Unconfidential address: ex1qklrycvkecdanpcpyulgz3c8udvxyck5jvsv4j5 160 | 161 | * Non-view Descriptor 2: ct(0286fc9a38e765d955e9b0bcc18fa9ae81b0c893e2dd1ef5542a9c73780a086b90,elwpkh(021a8fb6bd5a653b021b98a2a785725b8ddacfe3687bc043aa7f4d25d3a48d40b5))#m5mvyh29 162 | ** Descriptor blinding public key: 0286fc9a38e765d955e9b0bcc18fa9ae81b0c893e2dd1ef5542a9c73780a086b90 163 | ** Confidential address: lq1qq265u4g3k3m3qpyxjwpdrtnm293wuxgvs9xzmzcs2ck0mv5rx23w4d7xfsednsmmxrszfe7s9rs0c6cvf3dfytxax3utlmm46 164 | ** Unconfidential address: ex1qklrycvkecdanpcpyulgz3c8udvxyck5jvsv4j5 165 | 166 | Finally, the following are invalid test vectors that should not be parseable: 167 | 168 | * Invalid Descriptor 1 169 | ** ct(slip77(b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04),elsh(wpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4)))#xxxxxxxx 170 | ** Reason: Invalid checksum 'xxxxxxxx', expected 'qgjmm4as' 171 | * Invalid Descriptor 2 172 | ** ct(slip77(b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04,b2396b3ee20509cdb64fe24180a14a72dbd671728eaa49bac69d2bdecb5f5a04),elsh(wpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4)))#qs64ccxw 173 | ** Reason: slip77() must have exactly one argument, not 2 174 | * Invalid Descriptor 3 175 | ** ct(slip77,elsh(wpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4)))#8p3zmumf 176 | ** Reason: slip77() must have exactly one argument, not 0 177 | * Invalid Descriptor 4 178 | ** ct(elsh(wpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4)))#u9cwz9f3 179 | ** Reason: CT descriptor had 1 arguments rather than 2 (no blinding key) 180 | * Invalid Descriptor 5 181 | ** ct(02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623,02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623,elwpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4))#cnsp2qsc 182 | ** Reason: CT descriptor had 3 arguments rather than 2 (extra data) 183 | * Invalid Descriptor 6 184 | ** ct(pk(02dce16018bbbb8e36de7b394df5b5166e9adb7498be7d881a85a09aeecf76b623),elwpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4))#nvax6rau 185 | ** Reason: first argument is a pk descriptor, not a blinding key 186 | * Invalid Descriptor 7 187 | ** ct(L3jXxwef3fpB7hcrFozcWgHeJCPSAFiZ1Ji2YJMPxceaGvy3PC1q,elwpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4))#gcy6hcfz 188 | ** Reason: single private key is WIF, not hex 189 | 190 | ==Acknowledgements== 191 | 192 | We would like to thank Leo Comandini for describing practical requirements by wallet authors, and to Jonas Nick for providing feedback on the cryptographic design. 193 | -------------------------------------------------------------------------------- /elip-0151.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 151
  3 |   Layer: Wallet
  4 |   Title: Deterministic Descriptor Blinding Keys
  5 |   Author: Leonardo Comandini 
  6 |   Comments-Summary: No comments yet.
  7 |   Comments-URI: https://github.com/ElementsProject/elips/wiki/Comments:ELIP-????
  8 |   Status: Draft
  9 |   Type: Standards Track
 10 |   Created: 2023-11-08
 11 |   License: BSD-3-Clause
 12 | 
13 | 14 | ==Introduction== 15 | 16 | ===Abstract=== 17 | 18 | This document proposes a standard way to deterministically derive the descriptor blinding key in view descriptors. 19 | 20 | ===Copyright=== 21 | 22 | This document is licensed under the 3-clause BSD license. 23 | 24 | ===Motivation=== 25 | 26 | CT descriptors as defined in [https://github.com/ElementsProject/ELIPs/blob/main/elip-0150.mediawiki ELIP-150] consist of a descriptor blinding key and an ordinary descriptor. 27 | 28 | Descriptor blinding keys can be chosen arbitrarily. 29 | This however increases the amount of data that the user needs to back up. 30 | 31 | Otherwise they can be deterministically derived from a BIP32 seed following [https://github.com/satoshilabs/slips/blob/master/slip-0077.md SLIP-77]. 32 | This works for singlesig wallets, 33 | since the only backup that the user needs is the BIP32 seed (or BIP39 mnemonic). 34 | However this does not apply to multisig wallets 35 | which usually consist of multiple xpubs, 36 | and thus multiple BIP32 seeds from which a descriptor blinding key could be derived. 37 | SLIP77 also does not work well when there are multiple BIP44 accounts, 38 | as they will have the same master blinding key. 39 | 40 | This document defines a standard way to deterministically derive a descriptor blinding key from an ordinary descriptor. 41 | 42 | Deriving the descriptor blinding key from the ordinary descriptor means that multisig participants can avoid needing a key construction and sharing protocol. 43 | 44 | ==Design== 45 | 46 | ===Overview=== 47 | We propose a new possible value for the descriptor blinding key 48 | 49 |
 50 | ct(elip151,)
 51 | 
52 | 53 | Which indicates that descriptor blinding key to be used is a '''view key''' deterministically derived from the ordinary descriptor DESCRIPTOR 54 | 55 | ===Drawbacks=== 56 | If a wallet uses this standard to derive its descriptor blinding key, anyone knowing the ordinary descriptor will be able to unblind all the corresponding outputs. 57 | 58 | Potential adopters of this standard should consider whether this behavior is acceptable. 59 | 60 | ===Specification=== 61 | The following descriptor: 62 | 63 |
 64 | ct(elip151,)
 65 | 
66 | 67 | Is equivalent to: 68 | 69 |
 70 | ct(,)
 71 | 
72 | 73 | Where KEY is a ELIP-150 view blinding key derived as follows: 74 | * If the top-level script expression is combo, fail. 75 | * If the descriptor does not have wildcards, fail. 76 | * Future extensions that support multiple descriptors other than multi-path are not supported. 77 | * If DESCRIPTOR is multi-path, expand to every single descriptor following BIP-389 rules 78 | Multi-path with mismatching length are disallowed, multi-path are derived in parallel. 79 | 80 | * For each single descriptor: 81 | ** Get the definite descriptor at index 231-1 82 | We want to use a scriptPubKey that will not be used in a transaction. 83 | Otherwise it can be used directly by anyone to derive the descriptor blinding key. 84 | Wallets use scriptPubKeys starting from index 0, 85 | thus we choose the last non-hardened index, 86 | which in practice will never be used in a transaction. 87 | 88 | ** Derive the scriptPubKey from the definite descriptor 89 | Here we use the scriptPubKey because descriptors have fields that might change without affecting the spending conditions. 90 | For instance changing the fingerprint of one xpub yields the same scriptPubKeys. 91 | Using the scriptPubKey allows us to treat such descriptors as equivalent. 92 | 93 | ** Encode OP_INVALIDOPCODE following the consensus encoding, i.e. prefixed with its length. 94 | ** Encode the scriptPubKey following the consensus encoding. 95 | ** Concatenate these two values; for instance for scriptpubkey 0014aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, the encoding is 01ff160014aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa. 96 | * Concatenate all values computed before, obtaining scriptPubKeys. 97 | * Let ''Htag'' be a [https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#Design BIP-340 tagged hash] with tag Deterministic-View-Key/1.0 98 | A tagged hash is used to make sure hashes used in this context can't be reinterpreted in another one. 99 | 100 | * The descriptor blinding key is the tagged hash of the concatenated prefixed scriptPubKeys, ''KEY = Htag(scriptPubKeys) mod n'', converted to hex format. 101 | 102 | ==Test Vectors== 103 | 104 | The following ordinary descriptors yield to the given descriptor blinding keys: 105 | 106 | * Test vector 1 107 | ** Ordinary descriptor: elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*)#lg37z46y 108 | ** Derived descriptor blinding key: b3baf94d60cf8423cd257283575997a2c00664ced3e8de00f8726703142b1989 109 | ** Derived confidential descriptor: ct(b3baf94d60cf8423cd257283575997a2c00664ced3e8de00f8726703142b1989,elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*))#tu4ggqlv 110 | ** Derived confidential descriptor (equivalent version): ct(elip151,elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*))#m47kvl05 111 | ** First address: lq1qqt33kuqusp3amjam96zxg27wvg2ewvl69h3equtck8lk8349vrxt28w2wqel8nstvtmefmexkn9zg5hhku2u7kr9k068fk338 112 | * Test vector 2 113 | ** Ordinary descriptor: elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/*)#xshkmp3l 114 | ** Derived descriptor blinding key: de9c5fb624154624146a8aea0489b30f05c720eed6b493b1f3ab63405a11bf37 115 | ** Derived confidential descriptor: ct(de9c5fb624154624146a8aea0489b30f05c720eed6b493b1f3ab63405a11bf37,elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/*))#34lpke0s 116 | ** Derived confidential descriptor (equivalent version): ct(elip151,elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/*))#y0su9u33 117 | ** First address: lq1qqwv7x220qlm8kwjewuwcdl2c88n202jx4ug7fhjdj3xt25my2zq0w8w2wqel8nstvtmefmexkn9zg5hhku2u7gc263jye380e 118 | * Test vector 3 119 | ** Ordinary descriptor: elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<0;1>/*))#fmdhs428 120 | ** Derived descriptor blinding key: 7fcc1b9a20bbf611d157016192a7d28e353033cfa6a4885b3c48fa5ff9ce1881 121 | ** Derived confidential descriptor: ct(7fcc1b9a20bbf611d157016192a7d28e353033cfa6a4885b3c48fa5ff9ce1881,elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<0;1>/*)))#95nx0s57 122 | ** Derived confidential descriptor (equivalent version): ct(elip151,elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<0;1>/*)))#r5qqsf3v 123 | ** First address: lq1qqgf45fhn528h6ermjvlfu38mquw64y8n9pklwww7nzrv280rjd6uat46xe03nxat42fqavhf5edmmhy7yk0e4hvrs4eackgkyjw8su877ktyl57pnjfu 124 | * Test vector 4 125 | ** Ordinary descriptor: elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<1;2>/*))#cagw3lzd 126 | ** Derived descriptor blinding key: ff0a08050417f0ca95fb6ef7df979ae464739cb79b8c8f4b05408e0ac681a527 127 | ** Derived confidential descriptor: ct(ff0a08050417f0ca95fb6ef7df979ae464739cb79b8c8f4b05408e0ac681a527,elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<1;2>/*)))#5ym2hpzd 128 | ** Derived confidential descriptor (equivalent version): ct(elip151,elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<1;2>/*)))#ft7v5az2 129 | ** First address: lq1qq0ccdus59lma7pyqjc0gfcgnc9pwlwmlg23el8zame3evv0mslzes04l80049f6jdn4ml26n7c4aq5gqslfzx263zeww6nsrtu3udnm4nclecdvua9v5 130 | 131 | The "first" address specified above is the address at index 0 from the first single descriptor (if multipath). 132 | 133 | The following descriptors are not supported: 134 | 135 | * Invalid Test vector 1 136 | ** Ordinary descriptor: elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8)#5putv8ts 137 | ** Invalid confidential descriptor: ct(elip151,elwpkh(xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8))#hf047rv6 138 | * Invalid Test vector 2 139 | ** Ordinary descriptor: elwpkh(03d902f35f560e0470c63313c7369168d9d7df2d49bf295fd9fb7cb109ccee0494)#f9x8raer 140 | ** Invalid confidential descriptor: ct(elip151,elwpkh(03d902f35f560e0470c63313c7369168d9d7df2d49bf295fd9fb7cb109ccee0494))#3fcvdxu3 141 | * Invalid Test vector 3 142 | ** Ordinary descriptor: elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<0;1;2>/*))#dvazw5jp 143 | ** Invalid confidential descriptor: ct(elip151,elwsh(multi(2,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/<0;1>/*,xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8/0/<0;1;2>/*)))#gkrp8f5z 144 | 145 | ==Footnotes== 146 | 147 | 148 | 149 | ==Acknowledgments== 150 | 151 | We would like to thank Jon Griffiths for suggesting the idea of deriving descriptor blinding key from the ordinary descriptor. 152 | -------------------------------------------------------------------------------- /elip-0200.mediawiki: -------------------------------------------------------------------------------- 1 |
  2 |   ELIP: 200
  3 |   Layer: Applications
  4 |   Title: Discounted fees for Confidential Transactions
  5 |   Author: Byron Hambly 
  6 |   Comments-Summary: No comments yet.
  7 |   Comments-URI: https://github.com/ElementsProject/elips/wiki/Comments:ELIP-0200
  8 |   Status: Draft
  9 |   Type: Standards Track
 10 |   Created: 2024-06-19
 11 |   License: BSD-3-Clause
 12 | 
13 | 14 | ==Introduction== 15 | 16 | ===Abstract=== 17 | 18 | This document proposes a method of reducing fees for Confidential Transactions. 19 | It specifies the calculation that wallets can use to determine the discounted fee, as well 20 | as changes necessary to the Elements node for relaying and mining these discounted transactions. 21 | 22 | ===Copyright=== 23 | 24 | This document is licensed under the 3-clause BSD license. 25 | 26 | ===Motivation=== 27 | 28 | In Elements, Confidential Transactions (CT) are approximately ten times larger than ordinary explicit transactions. 29 | Output amounts are replaced with Pedersen commitments, and they include an additional asset commitment and an ECDH ephemeral key. 30 | Outputs also have additional witness data: a Range Proof that the amount value is in a valid range, and a Surjection Proof 31 | that the output asset matches an input asset. 32 | 33 | Since they are larger, CT require an order of magnitude higher transaction fee than explicit transactions. 34 | This means there may be some incentive for a fee-minimizing actor to prefer explicit transactions over the privacy gains from CT. 35 | In order to incentivize CT, this ELIP proposes a policy change in Elements that would accept and relay CT at a discounted fee rate. 36 | With this discount, fees for CT are in the same order of magnitude as explicit transactions, and there is less incentive to use explicit transactions. 37 | 38 | ==Design== 39 | 40 | ===Overview=== 41 | 42 | A new calculation for "discount virtual size" (discountvsize) is proposed. 43 | In explicit transactions, this is precisely the same as the transaction's vsize. In CT, for each confidential output in the transaction, 44 | the transaction weight is reduced before the virtual transaction size calculation. 45 | 46 | For wallets, this discount calculation is used during transaction creation for fee estimation, presuming that the connected Elements 47 | node has the respective setting to accept and relay such discounted CT. 48 | 49 | For nodes, this discount calculation is used during mempool 50 | acceptance validation and during peer messaging when determining which transactions to relay. 51 | 52 | ===Drawbacks=== 53 | 54 | By using the discountvsize for fee calculation, discounted CT have a lower ''real'' fee rate than the fee rate specified during 55 | transaction creation. Currently, the block assembler first selects transaction packages with the highest ancestor fee rates. 56 | This means discounted CT will only be selected after explicit transactions and undiscounted CT at the same nominal fee rates. 57 | The proposed solution is to change transaction ordering in the block assembler to fee rate according to the discounted virtual 58 | size. This means the block template no longer maximizes fees, which is considered an acceptable trade-off for prioritizing CT 59 | privacy with reduced fees. 60 | 61 | ===Specification=== 62 | 63 | ====Wallet==== 64 | 65 | Wallets can construct their transactions as normal, with a placeholder amount in a fee output. After filling in dummy signatures, 66 | the transaction weight should be calculated according to BIP-0141BIP-0141: https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#Transaction_size_calculations: 67 | 68 | Weight = Base transaction size * 3 + Total transaction size 69 | 70 | Where: 71 | 72 | Base transaction size is the size of the transaction serialized with the witness data stripped. 73 | 74 | Total transaction size is the transaction size in bytes serialized as described in BIP-0144BIP-0144: https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki#user-content-Serialization, including base data and witness data. 75 | 76 | To calculate the discount weight, for each output: 77 | 78 | * subtract the weight of the output witness if any, leaving 2 weight units that encode an empty witness 79 | * subtract 96 (24 * 4) weight units if the amount is a commitment. This is the difference between commitment (33 bytes) and explicit amount (9 bytes), multiplied by 4 since this is non-witness data 80 | * subtract 128 (32 * 4) weight units if the nonce is a commitment. This is the difference between commitment (33 bytes) and no nonce (1 byte), multiplied by 4 since this is non-witness data 81 | 82 | Then calculate discountvsize as (discount weight + 3) / 4, and set the fee output amount to chosen fee rate * discountvsize. 83 | 84 | Fee outputs can be ignored for the purposes of the discount calculation, since they have no witness or nonce, and the amount is explicit. 85 | 86 | =====Example calculation===== 87 | 88 | Transaction from LiquidV1https://blockstream.info/liquid/tx/221c8a8bb81d1e33f3b6556ec9eb10815469ff02fd4bb4dd5127442eaa16d988: 89 | 90 | This transaction has 2 confidential outputs and 1 fee output. 91 | 92 | Weight: 10536 WU 93 | 94 | * Subtract first output witness (4277) - 2: 10536 - 4275 = 6261 95 | * Subtract 96 for amount commitment: 6261 - 96 = 6165 96 | * Subtract 128 for nonce commitment: 6165 - 128 = 6037 97 | * Subtract second output witness (4277) - 2: 6037 - 4275 = 1762 98 | * Subtract 96 for amount commitment: 1762 - 96 = 1666 99 | * Subtract 128 for nonce commitment: 1666 - 128 = 1538 100 | 101 | Discount Weight: 1538 WU 102 | 103 | Discount Virtual Size: (1538 + 3) / 4 = 385 vB 104 | 105 | ====Node==== 106 | 107 | Nodes should add a new configuration option to define whether they accept and relay these discounted CT. 108 | In the reference implementation this is called "accept_discount_ct". 109 | When this configuration option is enabled, the node must use the discountvsize instead of vsize when calculating the 110 | fee rate for acceptance to its mempool, and for responding to inventory messages at its peers' given filter fee rates. 111 | 112 | In the block template assembler, ordering by ancestor fee rate should also be changed to use fee per discountvsize instead of fee per vsize. 113 | 114 | ==Backwards Compatibility== 115 | 116 | Transactions at any fee rate, or even without a fee output, are consensus valid on LiquidV1 and can be included in blocks 117 | by default in Elements. At the current default minimum fee rate in Elements (0.1 sats/vb), discounted CT as specified above will 118 | not meet the minimum fee rate to be relayed by un-upgraded nodes. As long as the discounted CT can be relayed via upgraded 119 | nodes to a block miner (or signer) node, then it can be included in a block. This becomes easier as more nodes upgrade to 120 | accept discount CT. 121 | 122 | The following table outlines if the different transaction types will be relayed by un-upgraded nodes, and upgraded nodes configured 123 | to accept discount CT: 124 | 125 | {| class="wikitable" style="margin:auto" 126 | |- 127 | ! Transaction Type !! Un-upgraded Node !! Upgraded node 128 | |- 129 | | Explicit || Yes || Yes 130 | |- 131 | | Normal CT || Yes || Yes 132 | |- 133 | | Discount CT || No || Yes 134 | |} 135 | 136 | ==Reference Implementation== 137 | 138 | https://github.com/ElementsProject/elements/pull/1317 139 | 140 | ==Alternate Implementation== 141 | 142 | https://github.com/ElementsProject/rust-elements/pull/204 143 | 144 | ==Test Vectors== 145 | 146 | * Transaction with 1 input and 2 outputs:
0200000001017b85545c658d507ff56f315c77f910dd19cc9ceb7d5e1e4d3a3f8be4a91fe7440000000000fdffffff020bb6478c61c8f5f024ded219c967314685257f0ded894eaf626a00843a6ab80412091ee78237e38fb36c8be564ecd76e65f743065522f38f838367680ed7287b459103aabd97d4c8f3eac9555edfd2a709370b802335da478b6578501f72a4d100482716001455f4f701eec6059f956a40335e317a96a5e87ab5016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000000e00000000000000000347304402205d62bc013832eb6a631fe0285c49b7e27846e03189a245bec8f86346382282a702206c6e839b4b1d79d74662e432b724671402a6cfa2287911677c7061a3a32abe34012042c6504afda18a302bbf935f1dc646f71872a9a2fb5ed9e0cffb64588fd0d0a865a9141243397ee5e188bdcd17c9529c1382c7f8bc0fe987632102a3cd0d865794542994737e776dc3827a046c02ea2693f1d1f64315b3557bbb8b670395f72bb17521034a2e0343a515cf7d4a583d05bec3ee9fc16758cae791c10064fa92d65672d1fe68ac004301000177ce2a14a4f9e556fc846219827e1bc584caf9ef35e761dbf1f961a89b8285bde8fbe242c6984dd28719a792cd2e63535287db9a3b1fc4e4c5ae28cc5e8973d0fd4e10603300000000000000014cf45a01f0036bec883cdd4d5d8de1d7b3f2ec125733ce2e123ef3ff0085c50fd1b8cd3101c24fd8fff0bab803cda813aad9645ca6714ce768da75da09b58851585551c425e729d6faf4186a6659ea107f4ef35cc458dae565f1337af46cde218563eb3a756dc5d532717cc775fc0d04fbf4492070eb3cd9943a12fd07939d69a71090871e1ddf8fe716e2bc3f3364783cdb1d6a704325ca6c4334171563ae7bfcc9766ab848a65f47973753b2758b4404f17e54527080cfb980d1227f70cc0e77212d06aea909c7f2ac38f4a75c387464f8b70e33061f017a6fbbccf0673d08aebae2a1ce6cf9dd8c98791b1f4d653788b2ed6dd65cf9795eac568744e386d68c89d973ca079298f8d292b6bee71fad94a0f83aaf070ccfeb6c6de20baf8c6f1083dcdd539fae6ed74832100ea7c07296c0af2201523c3abf8b784ca8a235556d5bae668f17d9a353fd49dbae623ca44830a8fc4963419e49a9dc99bf87ea0414be3b43a6eab8ce54695d66887b261c08252a501d0c78d30be1ae3fc10f557f4d228ef38da496b22c5fa79d92e2c190b9d31f286dc0e3c8489fcb8e0603f8b93a6eb1ec726a7e0015e70407da186d85b290b054747276a8928443e1108cb67738d156787d20553c39fa0449f95addbf42170fdab8107d1f93fcd841964b6e6c4c140d0c4ed1463835e603f5012a4aafd5b038ceb9b4a5b7e2688cfd8c4f2bfafaf0bb5bb1aa7a7f13bd47ff3da57c4c88b741fd9ff97abc23d4047f690d59c4c67494f47125fe0f626ad409a92d72907ad0b1762b5271f474fa552d9139fcb1103db24f7a29726a5e41a6dbc43590c14a62eb1b2aa0f160134c42c6c87c696e7c42546bb72f9f531729555d01c529570553aeec70709c3a4f9aacf810d5018f776af48b93eff8e120242105c06a32e64bfc825fde488c99d5845adba2cf349717f64e488852cca73cc5813b7872f7e89d24b4bfafdf75faa368375d5bfdd8b8a7ad641703cbff131616c77e79d8f78c5fe63810781db44fb1fa5cc9387cf0de6807d1a3d5e3d8f9ec7418bbb1d4e10b1fcdb300abd8625b4e24842f1f4c4e567fe9f8c6e9d314757d4568889bccc740fb36f0270804cc11c0044093ab9586ed034cd1eb70bacdedd573750794f0286dfb91c91308e507147ea8e8534c655b931f4e68543e93c57cf2f2159e021739943e40c0dbc8a68193218d40d71e0956b00b4a01fa9c06e67ea55e0213fab48a8dfcf3a047e8c438e7c94fc195026cec82ad532e2aa5970a9fe6c03d9088d0ab45e0b9c7bf9597bd2db93ef7d7f139c291f59e03cda1a5f9a793eb7ec6d50fa9482b712500b5e5a780319769836f7053e3c5a3276a7d65467578a7fbf9079fb5c6bb1b0558acbf3cd896644d42a7b0fd87b12b571b3d8122b1c254750bf9b097d0ec5ed31f9af7db9571f706f5909f0ef2fdcdb255a0795f5c28b70fd1d25b74eb2524ae8f47756875ff439a2b2769adc844312c4ac7bde16b561e62ee3069d25718bf6c2e11ffbb83c863a51c52ff4ead581dd6b1ff0913905163683b97ecbad003a1c71469050eed5ad79e9bb44179b90b8e6b0e6a61a0ed4e919cb96c2615b61cf93905adc3e6e2a127bd661f05e928a45bc1c0599c41450dea0182043b977fcfcf3620f765d3aab13cbe684028dc78a4bd02324427379735934ab4cb821623f49e3af05391c1b7acfe8be33c9201efeded50838ff216d6744d61e8d1d600260c8f7275a46764ac9392132f0b3661e5e92e9daa87b9329d9c89353f40a130bcf8611cce25335f9f1c1208ae1bdc47d96c3f83170a7d27367a043debdfd0e43776d330d1f7a806b32c4363d1dca14715dae4f4d1c99a92673954094e61387080353974097adfde15de4009caa28d42703fdb56fcdac47bd9c5e3bad2fbf90b4a3fab4d89a9933e445ba85f759cc149101f5045a6f3a6d741424318249d96277cea3dc0c4814763d727c72a1867618ac05e5ff103b985cc6f78829bae92794680a51c4b7f7f8b88e39ddd4471890914594f3f03ae668d501732ea77b3eb1fb38b5ad9efdac8775e0995c60a3949e84d2298ea3463aaa16d5ff633da654463e90004915ccc19663c87e006fcd05e904b85b71428d79913e3afdecb7ad51a66f7dcb738d028b62b307025d524320dbe064330da5cbd70467635cf492197c7be3513363b4000bf176827011b2894d33dc9d806b2526a6e91cc1cf0582c5330484b8d48be4855c1859a5b20cab6d08d95b42b57fc709dcb637ba9c6e70b72c473af88ebe8723fe94a0d5ee5d483f19c3b2aade19bafed774b786c0d24383fe0f71c085655f4bd78cb36da83b5429576576c0718b4549efe5b8f602c543c3a8e3d86f19b70d6be1fb39b7cbbac6fcf6d80d69c00ed44dbed1b8555593bd6dcf9ddd519f9325f6faa146d4b631cc6ee418ef9d07a0036fb26a792e7733ec0b58d9f0ebba9ea9493fa026bab62f70381e534c8c3b349be651e9fd5d472b3cbf8f7e912b7030a1992df35e17f4c5aa54f1632464a7c3b0dd133da8d436205bf45d8ded924e35b366803ee52a3d1c85d9f4f976785270dafb63d2cd5052328ed2e5381e9a6e9d8409675c2a9a43c74b07e8a3df8043b2b6d42832cabfcd495b8b30727346990fbc79e436d7ba4d7035603ab98532c5497ef493511e498b1b9c5ff413e919ab6f3cd6acc472f6a39ad0a8c9677ac9a5380a6bebbaaf13a114d097efbf140acad7edecc758bb070fa0b88bb0646d3bed911414a3f10b12bf8372d66f4525f9a8a66d7bf2b5d364119a687e5f416511c27659cf70969863ed7f80e80a4f2e55bf25721e1ab415305b66bfc25b9630a265b553d3e806807f23ec1e2a5f657dbd73a4a36e95e6616faa6aefc5143ca29b0e4bc9eb1042d99c74115d96a2eec5e7fb8c3f598d4df8fa8953e96689651a705dd3f385cd27e0173baca570ce53001cdb002e4476e6af47b9a891f84f7c1c472cce3cd4a70a40c298819f6d75e6adac193798c740c9f5f57fee4df5d140cce8ee4152c17784899003dc000cd2e7c7f23e74da085b254e0843d97d147e44ab3ba12e308925fc6ab0460c7ceb107b0900cef5ff939bc3fe5640f0bb11597c561be275fc8b5b85f5e38a3c12ea26b5b7b32e407685db70d16a3ce51043d4009a647fd3656a54adcbd4d1baa6d89881973fe32faf071123de1712e85db628bdd987566b362845d0c5f818547ec2d1f7c668cae44f0bec74c6663134dd0273c3363f31901903e4e976a447af96f6f521059fb6b892a0599cf7aae457df3aed72f1f55e145332c91430a2f8184bb917d317f8d9c4b6769b9a3a0ac5baea88b39b8f7662ecc16585e7166f61a948f48e6d30c2cfd82820cccdf5e722db2156bd848ea4d13c92544d1d9064414a305215a8271631ffebf08cdf0bcbbbd939f78eafec0d7238bdb90f211d6c44589187d1a501eef7d0b6118e028afcf76ffda95a43e2211206d9d50d34c3e33a6c991952ccd73e722802a14227692f037bba585e73cb9a6cd7556f9ec2158f197a51e3884afb8e59eaa8e7ac3568d88b27b2a5ab8cd72648193ff6068e4d481c58c117e2adda564d5a49f6b992ff6f938acb283e7baf704c71861d60b263f6c6684d7544878b7aca942af8b3a70ae0def309b68fac2aed2b11ba753d7b47f7369805e5b3b9b41d22196e2cc098ece59bdf5231b03fba8adae08fee227a582490b0db34c115620c72afb6fcb507397d1333ea19e7969b729bc2733e6546d2d9f3edb08f9c74201f9ed4e3fcb446cc3fd688b1345e97b32492c9173fa71df2772bd825506ddd6447e9f9e8ece0ffb860e1c755bcf2400deef094219795d4ee84acc34dedc9a3b3adf7fc81733bc511b8edcb54769400940b53471d8e82cb82d9967a97297bdd87f165968ea046291234da176efd20889aa4c07179df83cb500b40bdb96b0c27f2bfa57353268b776740432d29f1761fee77755c7b219def785a42b683e1f70240ec45cdf660e894d4fb541d0511547c9a2c503cf605d72ea7f2abaee4e8adc222a82f4b86c34ad8b25e2932df02f0090d2dbf8817c44659b1245d5579277ad406c538914f90dbaefdd110c5ca0d63a24706cd51096ec19f819c446c9fcb55b777ae633f0257dc4d1b293e6ef68ea7867d852058212a0a9ace9442422a638f73dfb14cc4354b6481ee6591037e7287e962037d963b38a7e4ec12b30e0f6e0ee4d8c30d288e99e22e43b4c795c51d66cc4225c5cab3685b1b3a6fd3a82dfc355634b347cc4f4e55413728fb67fb9f34d3f7e4ecce3254ea843ab361b0f652faa9e54470e3e414c1bb2593e36d88109c36dfab505a16c19152fe021de608c6b3d924c981231ea9cf1cf8c93e53f0df78033e81fdb578a45b7dc4f3f0f68feedc78ec7c347f91a0464bccd58aa2fc11016e88cbaddfb22112edad752792af12fa550be3e6f15d69a6a9d547ab5381b93c58c12753b8085d9e17ed1f2519cc5cb756e3777ea9f8e49a6141460f8f6ced8d12d13d950691479e1207ed35ab71554122beb215a0fb6b34b90784f4be6bd6fbf93daf9d3bc4640bc52a662e750ce361c12c1bfa2ca4e2c784cbf70c406587b2ebd69faa7a891aca63d600247ad7dde426c1ef4e3b22a072ff8eb69c1b1cb30c605112786546c48cf1c4821b5bc0d0bd44ba83b05656b6e19a3d1a76931d983dd39efcc64298e892858e847e99519c1fa25b1998839788c5852b94202d803639d69058604374f76769670a60269dbc0688cea2d9d8672212b93ca501fbf6f7dfefad058e4bd0e0da1cff41b2f408c980f29a49b03efa9e3edef091d7df7529b6b5e8f7d43d103681cd7c38d02a431b15d539e9a3cf44dc71621664e756ad6404ba185b5e20c82760c488fde4253fb52ab850484a082e7ca275f475012be9c8d16d6b4a2c9d863440d5e113d18bbf42f128462764a99ca90af4fde890aee138fe4cbb45658eacd9d38c8a1fb4499c043cc25af87e6a650f38149ab018cc49f50bbd085e2a0ba3eeecde5764f7997748a660593191977792d7176e4c2ff0113d67b9abe8fbc10f364c6fa68e52a455aa56ff15099c6efb6b5812972380d5b8e256b0feb1190835b7d076744c1b5b738c710a07a32676a15d96583e89e39eb4ff08cf02c6e2ad540c2b66299afe01bf2e50c81465a04d229a07c58ffd25a6cd9288110045526b376548d373273e6227d117d491020fd68e366ed697a0d30a5bdff25fa9a5800aa534a3669215dfa8f30960f142a8ae7ffcb654ca60aa7dc8a586670f9db37d05644ff5f934785c5433e605f3fbd0340e168511e209a0aedd8b18f3b948eb58051136d155f53b0e2e027361330e005f83f3a72dcc5d9161dd4b1e6abd16635dc0887dcc833a1fb59c10e0b8bea2536e7acd58d5e11179d13a24dc4292624c527266351b9a48893b956ffe545c8d2c1563805addef2a82134c9c686449d83471f22c1e14601895e854a5f854230e4fb4ed4f9a7ee22e83234be6c5bb19d200c16543468f186ae11cba84ae1aeda5136f7f5b380d02ddb9cbe2c5f5bb39138fa29b2ceb549d2e337eba10171fc237473351cf8e5989c193ef0100c75778ad0c05b64b614067c9a70680c818a566c4ba5e2991eedfe165199a55b0bef1333988f2add167e268db389c2d25bd85eedff9e6851e3df84c9e41128b5a76869c086fcf9275b1d51af02e4a92b66850785319dbf004a29594e32d12ca42da69fac69f886f963409ce1d4514d1ab9e915e071887e7f316b15014d083769afea374e0771f74f632db5ed7d7352546ed686e3ee161cd263dafc2acab74a67a5721f923f9b07c647c2a04f7d1c2f831d4319a60b16ed4c995e35ccbc291ff647a382976ba5a957547b0000
147 | 148 | ** Weight: 5330 149 | ** Virtual size: 1333 150 | ** Discount Weight: 863 151 | ** Discount Virtual size: 216 152 | 153 | * Transaction with 1 input and 3 outputs:
0200000001016714c80ba611a345e8b7e47bf44bedbba5df9636badb1fecf44d37918151231f00000000171600142a5ffa945facb956a0735754ef229f0a3dbc507cfeffffff030adac3008948f64d4861dd09f4a162471c147355e9207ea2a1b9d85888818ba544095808635fe317c5a2d3c8f4f4f55cc2e15bbc7412580286176b219a2423ff35f402f7b410f20603645b24853b11c92e4fc4d2fbc29538e07414f718b57a94fa7809220020ead057aea19872f24e7bc87a7c4de7801d263f61702be1b96492164937934dd80af9266dc7ba531df4900b6df9fc83520973e1f27599ce83f082d9f9e1922773d109afcffbcfeafee86caf0c03394c63deb86310219b9b1f6a91c2f34fbf984a6a50030df0e697a8436f4720bc94c31bd0ae2436a799345b86b9ef4980e4061d86aded17a91480d0f3a425716fb15f51ad2e90fd7d3a73f34b8c87016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f010000000000000105000000000000000002483045022100e9ac5c4a9ecacab3aeaa7066b4f6963130746cd44104590917d46b228fe3c5ce02201dedaaaea863dd5ec6a6ccc5730e319b31747d1931482d747e74a904652a35ee0121026c46c654b10e15a854ded29a6dd6f7b32273cadc4cc7492d5ef0a1115491abc60043010001a96741c758c602bc4068eb3164cb6589c4333b8d36d24f79c395311f1f881ac78f08884ba4a91bd7a8be574762074b1429f9eecdb1f1a07ac5b7547456de4a5efd4e106033000000000000000147df5d01a94c3f9b75091c2f44557ea253712e2b18c4817ab849090386719db2e485008f7c325a5281a405fad38ef2169a76b5567e58fb6d69a46372e51d9b6d73475e5505930687c65ed3dd0925ec05e64d19b9e482d359ddc9b559708a2dfc4a4820d8e9d2f9149fc8ba60769657d9bb0a6aca2a48bea530e22c4f92065f90d5c5ef811b7d79d031224add43d73d6c5c94cc3d45c21421537c090815a983dcd9b989c6caeb78e0b5f1fc526b68b5bd519873f85bd1c22a987681c43911c470ad817705eb8c308bba3e0c395eeff2a3aa85102b3b41fee94e34dd88f76d324e457e0e04ff9f7d00a14e67a9daac27bae3d2c8db35728249849022c5decf7c93093dc127bcc12430952d31bef6772b2817bb7f0b9ef77c06a9f5080d645c994df87b47e9c4c7d9794c2b9c5574e84be85be716bfcca298821ad1dbe794c2656b98b1326b29a2831cf99445caf48944bd6d728316817b5914653ec441ed4e4ecf5f5ec65fd2fbb4044541f9c719ad227c3b7705df1815f97003082a5374165b1e388073884c7e30da5ff40e88a84f9fc0aa678c896447ebf5ad3d7921d988184e66447951d9d9bfb182d2c36c7f02b65f8e265625bee3b0cc9e7208bb9605aec95e83b87e6a75ed7cee206cc323945c3979f74a317ce093b8284a22afa3bc612ad158c304daeb4d68fc9e08b83ea61ebdc49d47465756444f81e64b556833b433a9cd8c6e521aa2acd91e250b2b78f1bff1a9c246f4b8bd0a1c5af58ec877152fd7f5ca98150ea72c2e15f57fa0b80f472ab40b403e52ab5989f24288b968e808a07fd2942b1e1aba6e40ec8ca8ae8ebcf8d180cc481f8d563f6ec94b29e738b99ea9253c3e3aa4056647e0fdcd1dfbe22445044cfe4ac6c326d48dd440a35f4339b5b129fe40c2223afdc62f0aaa6bc9cc8f5a72e0c2ad94bcac54fd51f220c0352ab8fa56d54f49137c96437678dc1828ee5c0dd20ceb47d4637545b1665fb5b8382dabaf94a3a4e4103038fb06dd4bbc704f9a315800d07e93eeaecc0cfe13a0850e9de8c011c77b855dc7a35dd39c2ca1351607a36fe31451912ee0ce6b7d414de065b4353c333372fbf1682634e6c04e70996c4ffc12a471db9b81c948a16a79431fb5e3d9163e20cac91d0fa3f7d0a21ffbadf4cb5209b9e80e30d7da4b2ace05a3d12885c6e6d405fab48383a8fba96c58f9012b8aae42de29282b2fd05232d0c88646e3846d7c1281538dc67fe753483d6046ba966d03bc5dca62771117bd5a24fb5805dea7289069d823684fd238ff9ac8bfc88ad49e013ed3b368355ddd6b24c3028d9f0b27f90114c19c4c028d96c5ef9f364c077c629d02c7e19abab38e9b172f2524e436b826d22e91184420fd605aa17aa6076a411acd84f4f45766764af85741133e46610530b5a344e06ca8aae0530837dd1414cde35b49cdca86c9755363fabfe8a6b7ed213c5e1c237d6f50c7b5179c1f163bfed29235ba02312fe4390fbad2ac3db13051d957b86990747118d8ee82d29d6334658e534916389b448c1fe157704b30706a55f365347fefb8ff4240c1bfb26659e42dc92479256884479899573142c0f5fca3fc43ec5c8c437233a251ab735b815ea02d66e92dff42842e561e87e0f7265ccbd63e4e2854f7e3e796ed3d30410f259da52c39c0bd49dc3f0bb4d0af5a10d02c2128bbb9eb055646295b5391a3d3ae384d93f2d44827c60a98aac59afc15dd4b53c65d991207f32f102f553db1002123bb0ca73a7673a604eab9661932b687051d6873762083d1c520ee752d0eea972cb77077150dcb5cda905361ef5442b9f7f95380c42e9a69108f9ba4e761d596c2592587fd560e1232965e78ae004ee0a39d23d7535d60b1d426b34f010d8471816cad974af335a37cb738b1666aae00d5ff32c520726d989f7bcd8a66c6f2b8ebdb443e9082358fa9970bb8e599cebbf374c2daeb9dd966d98ffc930b1a58c812bafce12ce8674b3b5d28245060f53375f843b0dd0f4b559451e779bbae2f17348a9a53a4127da68180e72458a9534594f3470229b4b10dec83f17b389796f1e994842320faa41bde43e87b2448104e904ce9aaa8ae07a9101118f9fc6be12d475494e3e3b9d7bf29f38edc6b0ecc63c699bcf686eb89e1de501bd6687daeec6393993b7ace06a8cdbe2e0c70dcfcd793f407324111dd5b264229e6ebecb16a99ae41ae38154336cf2fd3f4f179d67accf0cd66f5a954746d86aca1ead9d2493bb18b0cf8f07b362e9fc1e8200ef7b2d26e1f37267589c0a4eda8e7613eb89c3d40789889bd8ef241ef3d0e971510768f0b99a31b4f1ba814dd633f5a046f214c0d87b93669165463593b2f7427ae2ca5f4acb77a35b881c2e18bf092607cd4e509cbb08e1a1704725c7d66cd2a80dfb8d28c9cde26d76b5ca4036a4083f0656a7f606978c2a1c9e92e67954cbceb9a61de421967589b1b2aaaf9ac6983d856fcaa4a38e468233194be9de495661fba53268acc8db686c6920e3e6a5b34528810bbdc786b1baca42b2d1c04263b5a46464810174aff683949597c63726f0d93a0809c122807f624f4b263a7e1dcc433db4c5a811b420f8882a026ec183fe3def024fad5fa159cca5a233284ac78045afe762c0d5fb520f384e0b59472195b5476922ab78b025aca0b31d0c5828bc9182e16fd977f2b23f8eecd2008369c567867053d0a33a3c2c8ea8bbf9aa6b2c0ec861c3141b8ee2d9064e3064d2daac2127149110bcec2e7477b391e049099bb2e3d334e1fce6f9b71f0f0292d8a5506a42e849a226d3b57f0677eea21ee104b3d346c023b8a13d144d6c88912b10cb954007cf564b29d7e126e50061450be650f94352f21e4fec787ea4d2f55fca13989caea2da7a1acc9419199a7c3a5db88ac1f0abf6b81efb5e5249a9905584193084ad42a2ab071831d0a5abf3c41f6cbbb7bdb20e3799857b1bd0b73db43c87a9ca7b331c2ee5ae8481d6709f879b91d4062e0f028ceedcae7dd13bd935eaf44a65c97a7bbbed7e04363ccd19ea2906992165c2611591764708c8d4386101bd53e4cc0197f678690d3291099db149fb58291280726731f0124d811a9d648486eb5d388ec1733b6c3a9b9ca9c22a77df1e606d59d083692cedbe8349ceb96b588b28d0f83c2c60066c08156796ffdab521763061a7c3bbfd9c1b4cf18a3bbe6e6b1120449ce9827642c820a3be2bd3f9d7b5a8fe466dcab42394e0efa387a7919baecfe7d260beeeb55c9b32fd9050cddb7214bc8f851a9d32b4f7ba91256ce4bdb596edad5276bb28162ed6d0ea62231b51b6977d3fc330570011b815b9953ecf61a49a5f0a1858d18ae2b069b548124733f4bdd20cf79afd33bf6083ce40745019a14605e24e67b27e35354e6557ce691610d3b5512a63405caf26a4eb59193900ab4a607f5970babd84acf9652002f14983e74c32c87377dd21da7854f044ffce21b3cfc2da2d3267db1f87051e873c7b68eb829af4a36f2d7822faab8779129dc5a813c38319d21b9bc7d6fb05b61f942fe9b08d26be4ac3f06da8b0e5bf1fdf8e18bbecc7810d2d9972b2f0e418b39ba3ddeece82d344da68e7bf78bb705fe34feda8337bc03258b20f01bff100adcadab12f5153c894b4642cd91749e692d7fe33250f369822cd427742c33b51001bc9bb80b3b2d2d920e8ba5bf3d42656bb65c23e9d918e67c1201e359797cf6eedeb91290b6a4fe8e70f88c8d0a478f2c7b0ea3d8391c288da0fc4f221ab4bf892dec3eb3c089970ea5a8e835721826dde07ac3af4288b35a6ae0255eb15c5b0f9e7d37edff6dbc47042cb8d62572eeafa5e9b56f2d8b73ff0f6fefbe1eafd99499f9dfabe0a127f95ff8439b1e0580be6a85ce65404c8dfb7cda89e8fa94070bed47e11fb8be0155e2d38b75745ef779137423374b0f0a0fd96d21952b9b20b2c63de8b8485be0aa08ef65c0fdd818ea74da982a85e8cbf845661ee6416d458a8c195978581d1de5fce070c10c0ced336212a30bf34d16945aab1b0068cdbaba40fc5cd26b9fa58098ee3966403c46fde00c2b07785d4bf85ecdb92ff3254944e775f8b185485d5407a8ca0811efb2ae4cdaa9509d850ea23f89106c0a901f4d6500c136694480356629a24f2cbe9a00b00a8df2187675f489df22c27c43e4484da560daedacbddf39aee457ca134bcf3e6b4b98ce1b613fe4261f3623d628f13804c55a40a38fc98d6f8febb361d56d9dead285b167a9acfec02c4ba9d4852da433a093cb54db17b1cc5965349278aaed8a6d06ca1a91d5cee0906a87eb37fe2fbc65820bf2426a712575ab943699204f10f37a40731e81538ca8b5472c164496a097c0abab1d108c4ce94b1f57f75582fb05248bc27e3fd883b6a8e4607fa20d857307c5b64f914c884355c36518e6ea2958470bd0f97e1bf1107d39c7ad22169349a84de024214d130af555ab3ab83c35d10787a405a31b5451b0d9fb6afd87620da7baa089d552185e164f44edde0555b0cdb31bc87dcae6236e34abf35729a930fcd48fe6aaa2fada35e62757e92e7a85b0938b1b994d498787a2cb2ca70224a64847d91d56ec17ef57750d3a859d4821639463327c09421c4fdbf18132e8eba8df31e8b9b4a01a43eddef90d87d5ae49bec54b0fd15ba861b7da008cbec064ba5a925b9086f12051bde436958878844841cb59eee9ba08ea5499de012895f298bef7d858fff8c1c58ce918f597b194dbb797e88b23d6d33b600d5a53adc59cb43624e37b40bdb7f13dbd94fa75518241ec27825ab977af108343d22217e4f19d319a97cfe2d0b2c9dfd28ff4f58e90ef8b79c33dd80c5fea5b4d8575c912c533aa866b4a84c6096534a99bc29a2bfc220d53d9c9b7541438c75ea563bb2af4494eaac363d543290a1d6f00d61302fc8eccb37bb942e0cff7c064db71d67cbfc8496be102cad007a7315ba6a6e1ab4a7125dceb0a781fa394e0d97bcfcc2e7f628f552084fa72a7957c4f4757efa8929c91e06b1252481bdc5dc6d5ac426d4ce8fbac6e390edaf289d46af2c1ee47eda7aa12312d94f8680c94a2b0c0da6cb4baf2e24c97e38568b3b611170181c4f7bd18ae92660897557cb0792552795150121ee4c69fadeeda7fdb6f34f171a5966b796371c9e77d888cb5624d7b8e736a16b3921e1a37f5dd5306ee6653731b6aed660f28d73bb0d07201fbcd20f78a867c42590ae86a435344a66309c2fc4915440b721c0a38c689e36f907d48cc3c7d9af57373b1087bf44ff2194ca1156ba1c97529849aec70c3bbbaf0b5c49fab7193fe15da3652675a8017d75c4d3bd12bf095d3444601eb564a9888433acdd893a42777cb3973d4874d4f2ac329c6373855ac7857ab1c683993c161f8be3269076ec4d4b1d434863a04807e1766d7c101c2593960508b4f5946b4b38ad05cc2b7f2194407349b46c2654c26cfb2116f81f873f65455ad0fed95bedc4297634663beefd5cb0fb666ba605d219abe226606cce518ab0f8cd8a703f3779127f8bce34bcc10410492245002f89426811a49752b653f3ca234aa2787114f6a107df312ee507e78e449ffd994d084e2413693fb48c95517ae7c16c393911c411d8f6b17f9805cab5947fdbbb0feeaa5dddcb005c74db03fcb52c726766028d509d135dc5bbecd0fdfe5f6bdaaf14f3af492c9686101c783fe8f2a82fd745a37e6939b2b54b0fcd6e80c9d178bbae73dead7efdf8f7e31367b36cb5b595faa62d3c057ec95aa92d5c7e943a527272f584fe1c4921db8e2740df6595647b6f986fee6ed0a30202fe24e65eb6a6b797fb222f2ebe878f7aa4378b119058006856c23e6856aba48b58460c30c0a5edab21a85041f10b552e3745143010001d7ce7cb6f8d1fc252b88732ef58d1df5413e7007d8713fc1c6b5039b8e0c8ff694089a9228b2552e47b8b187b84bf6242fe26b4107aadc2e049aefb8715bc95cfd4e1060330000000000000001f9bbbe010e89bb2c4dac2ebdebae56794540f76806ea1349aa76a66fd702a7f4b4b92cbd9f2e9bc62f2346c59af41242633c396830de1758d0e03939c1126c1dbeff9fe4a90157bd772a4ce87e1d8810c1e0f7ee4ff6d8d0ce6eb2a9d3b5e871e2f8176b4fe181d89098b707cbcf14d8a467258f50832db978be26e5135d14a22400b3b7277b9729be616be67be6cae4fad9849c22764f9d3a39c45ddb03a7e95f36d5a9d837c482ea32bc845ff8e1a807625e7b73e3bb38424c17ac501317936c4f3b809b6c5353ad397318b8f8400d4f208e2405d92dc77afe00d0a888f6a6b971aa430d9a11d706322c142cb325b09bd7f41182b05b661b8608dbff4ff5f4497ea856c5116964c364b0553b342fb9f0be2e996d815a0d16b9d0b3bf0bdfca3262753d85f88cf37c9b7cb86ed1d69251814441de5df1cf37741634c75a3132da99f8bf143028b05eddcdf2dffcf4f0627acdbbc138c388f79eb1f06e5f491b3ebbc7c289bd308d3bd623897e3e0ed49c1001c92b772a756d28733d7b28942bb9a41dd47614cc8497532f9b546e972babf9f579deefdc003254fd971bad54b9c87fb4fbaffee688b40ef4bc9742e24b9bb61e2084798e87f9e008aa7bcd9400e070293d7506a9185320617853c09149aee3d992d55255e1f1bcef765426f08008ae66921e791084df0721af1c45f69883a6689b4c5a98300df99972046b0007c462663fb57eb4ef64c5dd26621cf34b1e7618386b4c87153815781360870e5e1ca64f773f3f3aa9cd6d915b27654c373de5cb1cb4676dde04d73dd85a43f2f515912c82e42738a2be544a89fb24633998586972a7f530bca3ce898166dc6c28c80cfe2ad7d39a582265d252bfca25995ab3abaef335cc0c5f2487656974e34cddf7a9a6f1ede3ebd950c77fab95937db8fc1001b2e3f02fa82dca79d32f0257be92192c9f1ba8ca4fda92461c6c7263d464d5184c06069ba6db6b042b3b6402b56f22083fd6e128f41a44bf6f6e23261e876bf9673edf147d7759ff9a96e43e70a7f4c9cc60ccdc26bb8041b2c203e4a47131d72eb2ec50d1dfdcd980c0a51fdbff1d58034686aa233b3b3d69e242bd97da453aa02ffcfa294f49a4b8ced98bae0048198bc1aecd192b508fad423055941de337b0b6a82b4e4fcad6f8207d1387d591cd187c5cea2c56bdd3aec6133e64ae7466fac6b55f2e7e8cb607e52d792a88feb0ad8478d63a91326e9ac84492b8923730dcd0d8f992d070e38fa6de5ea93250319ca944bd8c5f20a49d346ac033487378d45ad4e33bae4f33cfc77b66dfac5511b48aafe5589cced44d38f10baca4336c94f58a17a4a73a6e2bf753079d6d455abda49e25537aad5f519677d76ba8ddb4543602688a366d27a1ed8f5e440acc43b760ebc41f9741fa5ac82e01938fe4adaa3ea701dbb20c2041ca64ce36e0df480563e79da59da60d78fb3cef8080ea70616356b8cf672d5733f553dc53081ca892da7199626f8f09c1454a3cb2adb118e3b5ca913a32772451e8e43a279842ea086ac2d6e357e3d015912d31131ffd2b1e6658729e0f35465c7a3a5ddca9123e7ca11938a666bbe020ae9c61b9f6f99f2a30ff0bca8005979937acd37c50ca92ae944b16ea1862347fa20654c3b4bb101dbad9017b933f74aba60de4197abcf3cb51ee25a9d7bab89fb0b960fb83a9daf92026cdca4eaecdefda20839d6bcbd189253d6723a771a803ff02657edfbe95eaf5296c1e769225f81d923bb2845dc3d88c9b1dbef0e32fca748f0163f3c479e24a8611733fd9cdc869802c65eb3a0e67d2a3d4edeb4ed0e589d6ddbfc4dabde817bcae78970d22a0ce406a980bbd8d79d0d124b64db7f6d5417cf07e830f1e077a2b1f472a7cf72a8319c96d6741ae439f17fd1ad2768c19fb63aa44fb04292389182d5647c45316e890826bda82662458b98b463da5877a216be043af6904220c4ec04ad6182bafe2b85df717b79ca1d8eb77b8789b3cf7ac88d0bfbe524d239da519fd089de92c2002ff5e1fb5ed60bce5768d8fc15e6eb1daa00285971103e0cb64b17a899a8092f2e4fba083807a48e8636be5b635ca6282e2cba851c1331b05e64be368321e4865ec1638a73d6ad4e80bd3479864624ba9228285ad5ff642b049b0a7c6ab89c2cad10ddd5bcd6e40261eb5267762358b862314cefcf6ed799f687d25b44a1465f3ae8e5e646bdb139db73bc542a4b72a9c11e841e59358de0aaeca7b4a2811dab0d6d8b3c507270d1c7cad2f89cbbe5a52bf1e72ce5d8a58550aa3b79c37b47986ac28f7da1fbb9048c30a96a2fa842e043999c9f756049e4e592367cd5f62b44161501b93282d8d10b2494958bbff98f4bbac18b9f0e6d11725dedb360565fc655c4d955fbf364a9ee0b5d771011bab931b0651900d18a16362377d75f1acdf8073913d5e841860d14820e99299cac4423a1bf6d592b95c6816d8ac55e6c191deb0a69dc1cfe54e188cfc4a1d258c2e88e644a91142c7f211adaa666c04ccbe58fac9d845b1a91453f066dab43695cf018bc4a6269c5428dc3e2e9514cd0b8c179bb21ed62496ea01f6003198d4ffd3ceef59b25ba462e3f0b782bddcad07c029eec707398b20853e695c99e69e7be96e3de4f771d2a3fcc4525ac6d5214fcc60939f8d6a6d7a8842aefecc064ac400c581a0d863655998b42260e52a00d3ee8faf34fadf0f9b7bfdca07c5d3f1e062007537cac635dd0360cab09fdd42ffb7329384989d70de128667e5ab54b61b302690661770149184c1f2c8897aa9e70185bccc9378d49c9b3b394d8239f01a60d0a7055cee64d4b284991d791ea691b7d57c68208920173da8965a9ee518267c8e2a287de61849af9e4752a7d9fdec144ed2cd0b2aa473b775b8ef7b66179248f1c96d48d58ab0f7cdd1a4654ce2086c35af5cf33f1f8b5c8f9e2bfbee0220bf9f0c168bfb0668e12b5dff52a7de766a139593e03ecc82245712965255dda69e0622fc66f84b503e96b0b0fada0fcd32b81cff21f0743ad7b345f20902c3c5832e7bd2333e6097eaef995006b580f5f94244b7f068296b4ec77e2c2fbdc0073afc8bd01c0148c6758347a2b67daee28d53ecd9b875ddffee7fa2d0dbf5ac4ca6e8ecdc64ac7a64b216fb0b7e4b484c8a08c6d19e37ec249478e2fa752505b6bb189ed56f75c49e679506f91dcbab0ee3b08abbd3cabee59dd2a401523674164fb78b4bdc6c73065b8989e18835566c8eb43b629a5b8ed9d416aa7441855caa42beec8e5f0222f6ad13a92e3f6f98256f2e4476db83051ae35a35cef1967d121ce15379be1565a647be720378d7c44c29c7dc112f31a35ade12e14b58784c6edfb5706cbd1d281c5a967a9084aaa23171ff2d41314fea8d1f719c075dac8ad4462f7c75249fed9d1cf58ad19c2e7a634e387f42c745ae2e86f312b6f07db552a3edd69e46506df9436364b30c7eefd550a72d6f0ad67d8d4591e534c205a6dae42bbaf175c6df74dbbda47e60d3bd86714cc8a9053161dde969d4718b4986ec4dc666a321955aa8578a05877c5e43a8c40e19563fc1eafad08bb1a81e1185a0acf3b42d7b737e2a91de6d529631503f9a32a57ae86577dee07f5d2c39861f84a6cd9413f6164dcf2d0928fe99634c7b1f5659228b40bfde2942c23b3b5e3c467251a86bb6b058b93f86e62bdd80fa5e47287e0ae4f4906050623a4a9eba16e8944c87a20da858466a23d7480204a65fd109309a7cd3dedfab4635d69e78b12276b4d9b8aa324a8d62a8e3ab7d8ff6157369400170b06dee6cb976a0205d689b13520d181432e375ddfcdcd5164ab42aa38f0405d113b8659b7fbbc8b2855123cfbfca8c1cf4bae5eaa90561ff852ed5516f7b809eae77ba69057fd395322cdd36b091fc877d17a0c7cf6d632bdec0bc3750ae7c931f2585824613876555246c9f2437c785c7b872e958f5642ec25715a8f42087bd89b17f80bdcfdc57ee07986b3562c46e85be2721af764815e4a95f9b9a8ddc69749d39fa0de94bc3a93a53c5350830b1c234353c8daa0bca7cb5de404ee8af71e733b13b7fb82e334499047c3ce78b367216c6979c1d1c9eea242bbbbd1d6916a5e839c6885424cf391abd1516237c4a63f93ef93af62fbdf898724f01f8434f3f2281b5b935e1225f0b4d4f76b0d1bab5dec50bc69d1087553e909f665a65202da3747d454fc709a26ada8b913dc539ae5171e65b42c2288f6f1d9d77073f21719b1847a0e8ff6b13955cab941a497a4921a803ca8b2d2c9e33b46c4b466a7f161ab93d08dc200600c4d21db8cea3b43feebeeb73ca40a3999603f9c9d3ad46d37f0fbe75a8da2d0b1a45d9de3bfc865cd54660609ceb61d5a06b3e4997618f140e170540856caedb34dd30819760ac2e67466716da08ef0a53e147021c4450d39b9e407cf2fc9d71e2b89808d726265872a9a9a1e0397f5999e4e0b31d3f061d729270af4f67590c983757239dbaa08cae43989f05d419884829d48a68924fc7dffab41d61b7f619fc8d41a25e3eac9b6f8412cec89bec9844d11787c6cc4a4728e7fabf781764d56efbe8827f88cf290b4f6c1ff9e363175eafd37aa25fdfd4af4d9cb045bfa059ad6479a44522cf77b8549f7a7ec357f4193a9f5dff887fc5615e9501fe50abd4eba59e45df7c56c794792db1cd56527e13846e3a0a38400ebe4ae2afe755a72b9efa766ebd9bd9d230f9f5568d778649768807047f69146fa45c357f2a99672a656b5ad456dee255ef0c439893f12cdbef2aced2f5d2aed8ab7dd3ba257f5bf338014b8189fcb5b16ddd4ac34f4f6066b1e53f6f78b85d2541d861327f6724126ec9b9c980a708ec55dc17256f390fa90472ecdea76fa4ee948dbb4431faf18b686a27f1e5f4fd84eb287403a30456bb3279c041914dbbe03568646d576088ba934ed6e207ceb86f33d91180980e41e5e89d6840b8d54111b623392a06fd8af5242dd0a886f1a94a2d5a0b8a6a503d34009de3a262478680d0103ec3865d11fae2ec78ca45a14c9d05d3628e031f003b4915af66e5e9118e64681cb9ecae5387379a30ddfadc7ee51c00aca83c17a89419c78cb28b542c70663ebcca10414c91f73958007083c7b8bd3139cd18158f663acd558ac93ebffe9c665eb08aa3c5fb9f4c9bd2d731529be346abdc2deb7aeff08dbe8745be03fdfa3aa94c99a7975d334ce6a1468271530d9654c39d66d51451d14a56fbb43f4fa9bc9e517e77a1e529ac970f01bef7e79b76ae1e277cac98b26e93a5cde84ba7b127d5c4408d0191cf3f0d9dafe342bfbadcc3466cadd23af71ae99d56b0990c8896773829c807482ee8428d34e703e77b49e37a1daf22a493a00bdd7d2ca8bbb137ce8c09f4199d031f6b65978bff8ca44ca332443d7463f813ac9ddfb326b9ee652c6036e64236e7228e759193ef0f5408ffdd0ffe480b7eeaa54396b0f13736f47a122684a7c0ec99ee5f079fe0cf0d2df4e2de764a444de4dda010818bfdc199b51a5b6161dcd2a2957ed3929d3b59f0f7ac3c40dc688a861841bca3636d055de3fc509781a065b7071ce817460ede7bf2927031fc32589b94e9cca1abf7f9c822b81b64d9ca420ff125c49f7482f4c9e03e7bddd3ab9db6f15f244a3b820ba041cf0f1d54e6aef3cb48e29a65a2b6d13c4e79e78da0cbad083f09780fa303fac904a1264f8b3056fc09e257e21093dfc19b7d1a19105737451dc46bbbd0e48dfffa169380a30490a36c0a7393018f10cc2069e29689ee6f915fcd2ba63b405154b644f07e621afffc82557fb93e42900f549c01c124f5f5f2dfa5d09a5723ebf7c1ccaf684637295f102bb515c56679fb08dc3e1064683c6861a6842b43310000
154 | 155 | ** Weight: 10107 156 | ** Virtual size: 2527 157 | ** Discount Weight: 1173 158 | ** Discount Virtual size: 294 159 | 160 | * Transaction with 2 inputs and 3 outputs:
02000000010217f9ab321eeb3d20b3b4b77eab7ec8f82d7d934fca10623ad196c0d83ebf60b101000000171600140ec5c2bf1b6634baf5b248914dc771e925880861feffffff7dfb36ded4ca0b60ae010fef55041eb509b8bc2fb51f07ce11c9b64496c083fc0100000017160014f8e14524ce60a8a99c81af3cb198d850e987348afeffffff030b152e0211ffe01e5b71dc5724478b08d445e6c829cf1c869990b3476325ee0fec0911b724d78f2574615f38907efa9c33fa67ceb4cafdf2758c814e9ea69d12ccd503b082f3a6142ff3511f864e6e642532bbe6c95aa625411d42353c68c57659385a2200204d0fee512268b43486d5272695c561e5167e69294adb7fe318aa0ebb1ca98cf90add47e23aebc7fcaee45037be66d78be437e32813ddddc36766a1f7124ed5c314097bfb90ebae90d09023665d18111f70340aa5140882d553950121fba0090ccdad03ed1978d03af6fae91fde04d8d059b9ab4e39759cd7aae98c7794255c8960128317a914adfafed6b72fa2f433ca8063e45405438b5db95387016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000010e0000000000000000024730440220676794814f2fdee485d9510d3ece5566121002324a78f51db01d9eedb6b00a6902205aa904208d446d1cb3b324a60e9e5b06e1ffaec95dfc0b4c895dacccdcc086400121033f676428bffbdee2e9873e63b70b25192347b46da1e2e180ae669070e612bb0d0000000247304402204515f6d25efb8c9ea7281ac05cd01b23a0f35bfa83f2a9e443d2a7f688c76c1602203d786eb3ab4660414d72f1a8c60e6d2647108083781123654e5e190a8a73c3ed012102ff0d4be4c160982a304d98d1291732fe4ea6e3c5b8c8a0749a4d96cc446609cd0063020003fb25acce8790284a99bb80b3b2d3c07c8da7e51507b3817e3ce096ef6fd1f2b2913c7eb8b8af213992b176761d45bae0649a1ac145642ff3eff2bca99b0350a0ae33dd1915034f623a854dd66af2c88b0829d4128c37d526029e1348d4b892a1fd4e1060330000000000000001be05e100436e95d933ad51f847bf5556a648ae350820f8b30bed804adf84b2daf20bdcff9085c236208307d852064178a29bc2b633d5abbb30f1bf7f090ded4ef8895a817cfefe89661025903a94ee81befeb2401031d55849e66246922fb87692f6d0b147486c5d5b5c9139422ce5ca91c1569174f1845023415f9f66fd50bfbc9ebaeac40d89c49acaa26099d69f56e947badd3136b73d1a93871fb2913abaf810336a4a5ab481f3c5f98fcb7e14c7ee76391644323948258b50bc755e0158c3e867946deb044230df9a432b3b10d4f927adf055b10f45244a585c57990db8478de9a1ff8523a7987f8f5ca06c4f5b2462dcda977f60ed43595da10bb68b2d1d85a41e13dcad7a30762074286bc171a48f819996bc191a053dfa218e231ab7b0aeb4a1650108dfb2d81fa92e7d4a0195bc4450af9c13891903552a516580e02be6d4b1843712556dd50197bacf0d747df57d98b74987a78269b6f66b0f21684f15fce000cddfaaea5f45a0b56b40c26d413c68c42f181ead3db800038dffcac0b09607678ccd4cef5c2074e1df6a132af37148400aa4223c37c90bb8913e52bb6d72a27f45e209cb25a1ae79373bbdc4ad2ec4ee37dbce708124a5a1c2b2fc1d184976e7d46aa34344bc9f1634d04b454f5dd12be747674ec2560a178db30705a72ee82877f9f911cf4d7a46f4cdac8f1735670897add82386400c02984dc55533041eb3983fcb89acb7c2f44c37f266135756df3e7edc24550a351ac51e95663a79af6043a5a7089beede61540331b8cf36149a076c6a5cc097ae3c535c52cafdb600a991bbfe5f560bd31b2cc274ccb52662cd5e0d1e03ef597d3d753875f7fdb493838603c88a44e1002689c7623a15bbfc9b8c7ecb6be1c524caebea69d3ad864667e5e70e1acf13bb18b7b02d4db294131c49e5296856e3549a141e738afe4945584378f34d95cbccff1b3b74ce9608be2bcfb24e7460d88de57be0ff5239554effd9e47c38bb7b58edca6ce7f8df68303f97473bf521aec54cf323fd7fc2086dd399356d49d4163e612ee4f2cb89a5967cb5fff0ba094b58b04004ceff2e673c92f77efdcb86c49c746d5651a5604b9f4ae4d7290d2268efb49eb836524dbc22405a5e93411a8e72f69337ee8e7bfea3f17e4cc91d3e0b8b9d3eedbdeb4f381954ce2f882995f3e999eedd666a0df1cf7026ed74844f211c5763124d9dcde085fe3ee83ca4d7954020a0ced700d52dc6fc7cb9642b8cca330d7f360a822361d03868fc83cf380d618b268d5b74a3845bc7ea1c526a4012ba133319d5c6f1ba26c12a6da04202f8cdc4131875453cae87b0cd57316b84b5ad7641a8146a6074a3b9427826436c7f0904c8c0dcfc87bfa384da2bc7ad8b96091eaa5ce7c6dba9cc665c53b376f7f42db2126df88e07d747606b7b8f31c7fb5a4fb480e4e7635e212efe0df716e2b3108ffc27e1c48a604e7c9bdc3d118cc15b3ad236def1fe5db5e0e4caf1cb3e92421cd8011ca7b81a9c302d0ab1fee9033cc9b1478d6a9cc9a85d5449215eeb5a74b137ac2aa32498a712aef4adbcac4c90979682ecd856d4a5b8a49c6e36f9098dac5b34884226b5a38c31166f300b5767c0c5f495c055958c4f7852d947597c56594ccb74c68f06a3fefb92d66b8be038b1de56c0fb0e171db4bec78236f4ca3107c7830db2c3c18363cc5a4007a869b937324ad7defbf851bc6f42c60503a6d5e6b1c505072a4b280c24b264ab91a477dfb3c240e39171e505c7b0b8ee7b8047a08e47fc190a8437e20273443888817139c35362545855a68302bb5c9707926bb20c1817c52def878d32f1aa66cf58829d0b499fa98ecf2a993b27e5405fc8491ec2aa12cdd48c2e292889c5c9f11b311556ee5bddb6b29d31b1bd3a8b644971e0e06a40402229d2fbb52181f2c7829068e53a6b79db03cf48cba1f1f4be27ece8f4a5c03721249f0515447e2fd1d3c75350ce130fba2fcea3f07e40cbdb8dd3ac73bc388997dbdb45febe162bed18bca79ee89464470016eac4a27d73cbb71c63dbe3d1b01396ecc64f1f366a4f81a443dd9357299630a2ccddcedd4d2baac65879bec9b7edacfc8bcab0e77ab84a6c4b7ff59edc4ad54b5ac12d7d3a7b6fdd46d178dd93c843b7256592f72451cbeaac4271b3a971ba1d36f460b7698d0fb3d005ad2ef380396e0f284887a96ea868b9de1eb1502e38a650d343944b17cb26928b03a44e5d1af76e99b57f9ac4fe64a60499844ea4abde87e2e245f17eac1ee0f1c8207cf4001418b1228171084f5e81f2ab29b622075b09e15c06ad6797c2e4db07b9e92821cbd3be27f9c7ec77976b28cdab7a2a6fb5ff1047e293377df93011f0afb6639742f953df61a8c83ca4ab5dd0c934d74548ae77c9d59fd5beceb9b3d09857b669ebc5080bfaa8a0c6065310330963c139dcf605caf506b3d1aaf0cc4ba51f458c4ae8e59e0b46b8e82ff5f30c6f68a0815b1dbba2c116c2a7a109bb34514cd1dfdf03f6b40ee9734444023d67c66672e62161e5fd33bc652b021d7d69712e13322dcd1af690e4229f549fbed1e700e84124636b9eb7cbce7e3e8558aa901387f7bee550e16615e0c851d8c01930855c05256d89ccf366966686eb8f33756e3b29a9fc831cba20bf6e2299cb81124504f971a9ba3a9bc5747266dbe24c8a9449cfeb44b4608f80bad7a95387e7dec0059133818bdc48fb59e7fd275d445168bef3e2400a4a63bb542fbd1f601aaf74317716e3abdb9eb5c309d6296afc42789363973ac4a60a77c10a23d27352fb2018f19e74b1fc6ffca667c7fafadf52145980f39965caea0da883aa7848e8feae047204bfffe271685bc87ef15793aa1b65b179874ca9d4851a36cddd77e54245a10df23813f4381d4d3f079e59a7697b3c64cc8160ee63c050487bb83a42ff62624ecf02d22f7e39c9f7996e446923c7a6b4490bde4e7788ef5b1566f2cd96330bdba53e156d123321d6675b93994882143751c4f4092bfa3086cff66945cbfa8e2cafb1079790635fb055179f65b5a7c704d4844dd7f0d98a4a6481be8575a20ee4868e4f152f1013344396068f1515e8ca0ea92af11ef2267a0b15c4f26722d80ca404f014b5eac9f9a54f697fe5315a6282039ce6f14834fe6d1b7f9f3ab00df9a255c97c4db76cecc4652f711e9fba9d4194837b0c7f6daac6ce08ecef21b1fed92e6e6774073d5dd03cc42be5e401282096c3e761a83e982b2341ab79d3594cefb8196b58e2c36adc3976366b9bdc95dce90d699fa28a892f0abadc7abd8641ff4f176bd5a1660934d1a5e61765c7cd5783e3f4778772de4e681144b38116bd5b7ab98dd61f16f52abd5dbdc00197c193f416091ab84f48fa1950f9b30dd8ecf8ceab076c5b9ffdd271da649a81a4fd04609dfebd35583010fe4308825dde651c6722a5fbe709c08032f50254f95ff6b75d9966bbbedbc47abd9a00ce5afed301f918657702f6f096a5d6eddce794c35b3c1ecc7c32e2cc99d33fc60b399459596b204f714d229e0b2f518282e1141bbc853471b7556daf30ead21dd6ddfa10ecf47a0ca8cbdfe8818e74b3006b8b076d167dd958d0f411b79872e285498a50524b2a3046312c1ef86cbd1e3c0bec0a5203567c7469b9e42b2ca000e0f875cbb8cbb1fcd5aeea25a57710ab1e9e03d02e1600a0479702b39ab88cc850ea7cd260ebd8df9911877708a70397eda2754a84e75ff2df8d3c7db615091d213a96ac55884892f0614ae6640e70eaaa446739183b2b7f7f8551550b1aef6f42d9cf5e484fae611c6e2b5343c29dd7c002e8859c11db0c2c661d66884c5076bce50ffece8419a50daa6407da833bfd770c43cc7082407bf67982c050a42799567f91745e4f170e4e44115e55470ed4918e65bc80eaaa83282b4956f537a451c170b3eb58dca8f3ee59175d8406c96d7884ace20f077715ef7f31f137dceeb1885e0b1e83d9ae63930b3437fa9645f1c1190469853a3a05416ae141de70f187d1b3acb5c2f5e46ace2a7743d0e5163dd1319250aa12fa33724c571df3f2875a34c9a63f52e1a5b79be51ed02742cc933ecbbfbb7e01c9b5c140a07dc19f1b649a85498083e41e9172920c151aa31d93030cf65f712baeabd7116ea57f278d06dcb85aa848b6e52c81c938333d00bf12c5e9f18551e6d3fad9a942990b3a1e23aa8079e657342ed3a894c388ac0f91d3e50ca6bb4abef215ad803d9dd8432cf4d34ae3df7ee6fdfd00243b25c096f2d7b3aa2bc3ec81977e5c7e6278175516e4aab826d7c2d0e6d2f9c0174036ede82e18d9304db6fc339242333bc0c3eaa61f18be891cbf8a7c14f45cba31dd07d28df5526e9d6ee9bb2aea510ec08cfbd088e7b935c6fcbb62741acfa46279b912779434f7c7253746ed066a7523bde7318c712af2c17eba187a91f6ad7c23d6653a9e30b054f079fa9fce5306c61647d96694ca7453572cc23bae2fe2120b83b4229c488e944694a892220ce4f9ee7a7d2ebd0003522753fd6bfd87c7a57eb7e7d05404d98b571100add7aa5f0d6267d84eee81ce48a6fb73acadf5663a9883c5d5959e588d6615c2f84cafc98da92a4b9b4901c3fdc420c0b1468a1f402e0c75cf1dcd0e502a69936b8d709b534072fc8b6d78e1a89d02840278e7c849deffb18bf95260edc0df171e629fe9b01144ae8ca2c75d96ce7efe6cc3b5617f99b21dc45554aac3f3e62f037539c07f97859a228098465cd59e5ccaf112946b509d53960b30924e1605514e9365d7db5df87dee0c53f5659241c61e263ac39a04e2bf2d7c281c6361e3b3a5fa703b404c160ca1f9a063d9f9d7170ae83d0b08ab722c7f59d8a444a7fdfb601269342c859c55ed21b4bb6c9dfc64a05d2e206345ccd43cd3e0db41ad390108b9aad3b1c882c4db35f7ab23d3baf6c50501d509c89cb17ee679d052f28e47484b40ea835f5d0705961b669c11ba82eaf5c45b1ca93ea9a03308d77125a21f6516ee8e531ba7f12741afe529a41a31ee14394a5b684babedaf15ed9954a19a777057deb024a15eddbc1db22c6222ad0613392aadf99a6ac8d10bc607d077439c740c716c1dc212d8a71d258e10b683707eac9c35f6145fc76612969b5e74dce3093ee857eccf5ee174edeb80e8b79b149499a1e97ffe459f8fd9449f6e96a60d6a081535719cc0951049966755ac364833e1491ad14eabc516101d865a142d9db87ab7ab0be6d62f777c1bccd33263b7059bb1f3b5a497dd838af509c8c7e0b8edb10201f67da1192726653e6b3c60199896f4686f5a44f83b574b6ea17689f9fe47422c5c9d7fc22d241fc6d8f3593a4f0fbcdb236a6b038eab7538a39f708f5024ffae49cac72fff57b5cb67ee352c53a19a5ba569a21c1ed60c8c221092313843206670c9abdebbae77e891c679657469677bf34a45e47e900d7b06df7fa6ae04dc7f4c34dbf9f325d5b3862e1cce01ba14ee6733cb3404a06dbd505afb00f32c293faf4b37f4100564bd3d22e51d9e935cc0ea90ee58b29ea99b21ab9bdaec5091fc9b683d022f73def85bbbcb84e2a59972a1827f5d9048e0b03f0612ec2406eccd20bb6b2690cbd498c7798c26b9fb84ca3356fd7b6fa7d8911f19206a8ad5f43251346102b5410dfd4f87b963f3b357e31bd9123986a757d4dc91a666e94e0df40be508adece71a5e48e20a46dcaa692060a82e61c586a5396a7680971ba5bab6cb1c9c66f191440d72cbebfbbf6e8c686b7e24abf10bc037daebc4c2066e1252e504306f64f8f2971a90abe718d8dd02630408532bffbf7cca339a29de5de9684fbc28f713ac8b14ec65bf45005a39a5ea5f1566114b189bb43fec3ea4868f4c01ac2f638348e9ac4e63020003b1a6dc2e2c1fef35eeaa979b66cabdbcf24e275f63f3e6e4a61dcb6932e5b5ef45ff240d36a4a1d0905293ce915264a5e9760949e06614db5e654075604b61bd67afd7df5370c45f6ddb647388ea904866190ad5bf1ffd7cf95bfeca5ddae0bcfd4e106033000000000000000136625300649c5060e0b8fe8927a670438f3f68820df7f498747e0491d7506d1f39926c8f5800d2967a140a8d966d27eb6db814367f0498b1d9267a445bd7d5785f5e1dc5b5f70510476f2b401458bbc38ef81b57e2732c5890307a652f4859bcce19b036e9806158220079b63489074745fea1dcdec39b2860f9a0c4e5ed331a667bc258fd195ec4b8293d11adb0ff146cb3fd79bd0699fc1a430c3c903456e126e999d3c9cc0ea3ea9d4a3d0f4e25657d75a6c567458284f2d1db93171f1771cdb669df320fb0407f4fedf691b1e8098dc4501a40428ea7a305fa19f0c65567cbea656d3bf6b779cf86084d8cc4a6717aff3555ca8ed44e40d17d855660c00026ade5cacb07ec0d6c7e97d2c739bf5cf9c594a10a2c64ba5203a15f461791d825f6be2fc7997b7f3d7c7a80e6dcac08d81bd4b8326bd53374a22e76e42e171b10079da41ee7377aef1857b533f6163776d998c12d4df172f4fb2495287950e8794da3fd83268f5631f41f0ef7444c893901188d9c6048f832659bf3751f9b59b6a6e95a54222afa634caf6677a61e5e86d8c1180bd4fc28e4417541a9f8fed5b94ce04f0a0987471b4aecff7f20aef7d916109ba1084a017d431ad876a67ff5dabba2180557cd5a82c3448a4642256947aa3f492102d1012008b0b29df67afa78dab6bbf873efb5263b8aa14232e69adde835d8e8739e6ef83fbb65b6a0253e2fb8e5f3d934237a804113a275b172b9add23bd0f5aef2c27452ac2e99450370a6f61ed9764a24d9cb0f251667ffe3af2f52765478c355e910671537d9696d9db8b6ef6fa3cea313572cf2ee2b642c8d5673fcbc0673778b0a444c15240d0d30c4f0811cbd50092b31bfa67a4fef5cfc84ce23561be186bdd1836be43a6e070e808860b944448b3eb7dfdc0346e10b23d3dbf4db3edc335dc257c76672a4a06f6158631c99daafd24dea85895942b5e19c7fec6c927b6b3c43f8ba26de9f982ba068c3d42c632366e48def26a2f18bcdb808e24a51cc6419b06f83b3daa79365d81d6818debb158998285909033f11ca878ff427501cfe0d6f1c704fec0e4fe6663d43985b11547313ac59dd467783a54aa46a5affdc1cb5b3b97b3383d132e20510a444e4f17f64c9b99521b8ace7b4eaaa38e5904a3dc2dda123c4084cd05ba45f42d0aacda68424fc9593eabd775e10ccec6f7479a1c846b99a8001c1c575dcdebf6ba6f57c01c924d63a09c4e26770fb0e49b268bb921481966bb765398ecbc8bca3ca0c83faffe5adfbccac2dd1d10f1ce10899ddd432e4fd151fc16dd6c55f426e5b9ee0c5dbc84ad1803657e9f02328c2f2249a9a4e8a26b28882d6e652803ead9305c81a234761b143ef93ac110c255b8d61a584c1f1214956307b5c30440b8601348a6f3cb71a9cd8d6fa02459496fed0f79c1f2d994a4c887c04eb683b327e50aea7111224355934dc2c413fec9023bfe5106fa642c3764f29b4cc5ff83960d1682acecde138f4804545c6db9942d0633f7d8ce028448d93f55da185018e78d74668fbb80cd71c97c066a7da6884bcd1dffaecd537cf121f1ca4a52f684c480e40e7e9758d24aff58faeff8cd74906077917d24138205c388a8d0c180ab0f857d676a9ca3b7a24ee4894c91ed14c0f5ea2eab5ba5cb726ec8d1085672fb0b9139eb9cbe5b431e7f60987fbb2458eb18c9dbe3a3fe060c569ccada26b0495d306195752ae5012917e98d616364273367916dd0218b464b2e1e0868417af70f10f01ec68073421db5988c0af2636144018135787356bc783566b0e20d90e9f0c721780e5e530af7932c437d53205cbfd8668f6151d2181b705e0917184b51d179de686bbcb9623f62cb94cb5d02dc3ecd2b4c37c4b92434e2809d98ff718edf41767bb088345373cd573add1ad2f6c1a1f343da31f91401270dfb33a735a4ddc6216d986818e6939a841a5c5def00edc808d33d67a932dc5d59707ae7d56cf9eb0c91dc5174bb6e7a176f29a0d63fcd06dc522559b868fd6b4b309370cab1e05aef5151d70110a081c5f5f35a34824cb53631912da6a9a0f4badc5424740e5acab119ee090b6e415eec6066ba97702754fc579300f79f1ea8dc0373ad9c2f4027a950646a97cc250f7af22f6970c932060d860b1fd0ba6e451c0443176bb3932ece7d8c4242ed330eca9b9cbbe9d18a973bc5ec46a7559fb60ef9190cdece5db54c3a42b7d60914f89211ae973aecc5450e85735e734a303d9a5d251382c29470ceb944d395e895560b471fac7efcc6b815664f2dbd206f7c5dcb661883ed335ac17212af20f6bb46db212d141e135d85aad063ebd070bfaaeb2f6bcff62a0430aa50dbba239ded76aee1d5e8e1535887837842528a2d0cf039861c7e89229d9bcb0c9e4a349090f70d1e904f6ab55ad6aa49cc3cd5771780a157f50833b4e790bcb7bda15e6e3984efc07f1ddf98a398668e296f870aad303e16fe37b0179d6b5c4062d3e5cca9f15825b0f74a0e3cff9c7406653ad6bc639159c8049ce62fd4760bd3b0381ff9732d68edc5040ef5e27f57ec5b41c4e0e5131f22dbcf6fa8f68312f388274a4af864850adfa43e454459f594c486d899054d193cdd05fbaa2a12a5c6f250a3bf992fd2efa6f6e81a81fa6a219be8d4bca51182f48856bc97a47c268842409b13a0b06c4d5fe00009e994b901aafb68bfd83e88d2754d7e6840ff4e248dcd266efbd1d20f09a4700818c032343189cd47ec23c0032410ddc26af031238a3e4fe1550b22a78b5d4224c88bf69e7b1b5f6090cd6a2f7a574e042c2c0d1af4c38a3f4a12ab9ec3744313bd3b69e1360a88d420bd23ca73e4c4a8868a15d02c293fae58f7fab9fe454e88b64013edf5ada816a8bc65be0752b23e200b95f3c11519cdb601e13eab5ac03f0607efcb87cf8d598afc5e8c96524d30ed4c76edc87c9fbd98497483dbd8e1bcfc8ff71e4ebbfdd784a73300f4345b91484138047f86f12e8ab06e22c24349a397cb2082d9f15172af0834f55f2d7749832cbf00cbe1d146824850bfa8f196cf4310a1b940e3b403f87ee045fa889aa4656c2fad5348df1777b15273707f98c8e3d8e2051497e5abda2cd239eba928d57f79cdc2f7d24a54a74c3febcea5ba8a82f5cb34e46f870587c23af8f19fa8c5e94840c579617bf83b234f04c04b8d86a68e48b2f1d5036edd62ebaa15e340c453f3a61d12bb21cef4b011ed074ad4afd57cb145fe61c06c6824e928b0a016c9618eeddba8166718af407170a576e446c90253043f379497096464086eb1aed23e829dc65b73c8c867f3d5bee41ac8070a771ff8e3870dd7f63c87a415e81f62483ccfc293b1a4e4ac2a218a37a6ba3077bf82cde7884fa2b6211de7ab26916f32017f0552d6185064482fb466b21d963ad068286e15e808575851cf559eb937d6943ffdeaab9d2f8376ebb7df96a8cb04939914173349627472a30a58fc07724757d61d9f2d290cc3a2723fb3506d5e3775e9da2e65b5631b00de85d6e237440d73a2662bcc5d90f6e401865b46ed42ccaa9535c9ced22881289ba2f7653617eddcbf5932f27676b08ab0c4252c65e20933f5d0b0244208d8a8bb815aa8f3e547394349bb51b08f3f175cd59c34a9df283ec29a652aa4c82c2187ab43a5ab2ca57833a65b7cd4329c2b15b717f01dcdd26d316651849209a738e289fb29a05afe2e0af2660f2e7f3cb42e573d4cbd32b89c44b5f32250aa5cecfa25ea8dca7c079d590dfd31d972842351df8f8c0504420950d6bacc82c7cb5271a8b6f498cc5fe7191d5c81c2de0ecfc9051a15e8de0e5d88444b35f9c7f87b856132a375111739a3886a849f0f2ec7e593fcf697dd9bab4578c9d68a3afdb9b2e90f9f2a517cb0410cfa4887aa28e6eff0308f237ed0c7a111421c4c0cc901b3c357c5001f0e901982b2bd352f51b4f5e40d01106b3e21da64a5b9f7abf28018cfb1694ad94b467d702f0b5dac73069c997d4ca12c3c2c58324cd5ef8a5ea5305134adbc4c8cf2c6a3927026ac39b776e7de74c4065fbefea7efb092b194c741f32e3664e39e9831e97aa0422f8276534613177b03ef9bd9497cd1ca733618a9d8764993a1675ed82d91c7c8dcb523b58276e85aafee8a54723d5e1d728ee8066c85d36b7fd1764b4488353c9f0a3c28d0116e2054b73dc6a45723114684d760db228f6a7f5b0e0b08694a4df5208ff023138e9d7428b7c952093319ee45fe2a5b6478f260cad0d3cc70f53f6c8f709f492aa575cb9920debc0bff013265e992bcedd17237f47c39dbabae3518f6baed228df6517a191d3d3bdd3a30b88830070ef70c091ff9f6bf7f0e86e32d3bdc2460c8cc1f14642bd227f77206471aa36c230a1d6502b89e49e8aee25850a9fb5097e8c1ed4e4ed621ac22d690ec5654af181e288fbb5dff3ada1c2bf41d1402afc0d5fdaf00bc1f3b1f4ac37551658183b6d35bb51a9711caa4d9b2de29ef0b34fa623e4597d96be59b924cb60b55d0e88e55a16cfe5b2795b60cedcef5b5de75a809a2657b90e0a506325726ac16a12b186612ea1641f054a09b6dab639bc278b1783631112992e21a24d17338aa32d9a49a6f5622b04e1b989b1e952415faf304053229a4dd19ff605c2b1697a45d77b588563451e17c639267f1385842cec1576cd46f404c19067d5ee254c85ee3594fa9b7c7666ad9ebb52e68441193dd912932414228dfa69d0dcfc1f5a0860b49d2ffd49e87452a811a7db2fea42e03e4cedb78ba9f144df174b7fb95dc5904b68be8fa7905a884ad7a525a6d22d9936ab32adafc4df09f07033825173376c8a4e0b5d62e0564f2b064175930490d1bfa4610aa264d265289c71078003d38c0d8d5dbf2b038bd27c8bc8b95901cf4338e257ff25a283b89ae24133b100eea633e734a177d44e92c4b6d1948b1b76a415b8a324664c73d7f4c70b618b20972a39be5fca6bf6f134c2519c6d3fc9d03085d194beeeaa239117d5b68913c3510cdaa9fa50f6fd6d97de5fa990036d9ca039176e2fb730dd2996464563cf7f69231f9fd006566b2d8caff520deebe836685b176b113ae00240b5195d98cb7f1e9643448310d6fc89ab27b6916eaf519e778b135e9d9a417e0f536ce49ff30f5250ca259b70e2ce0a520e692967fce131e7026fb6ffcf46364ced6c95f6688b1bf7e8335b5a493f4da9e6d0f8c4e0c07c9cfed271f1b2eabfec47dd506a8f9fee930b866a1a531a1f8996f0f19ff3373a2c35aed1efca59c3dfabea15168420ac0bf4a484d7abffd4d49df482aaa6236af4f0dd9d1d24c37f5a6b5c37df5bddc6b32869588ccb7311a8cf3f982b3e28e158cab67c9eaa472931213b6b07ef58c6aba07f3891f91be91fad62dd76747b42027af86a066b0bb6a926b6a30fd3b42cc9f6071f123208901b014277e4d021ff685cd74bd8c9f4bfe48519a93648deda3660c44fe3f10135bd4e0f6b19719b63f3ae99da7cb3efb66ef0d04a58f6adaa9861fd7817004cc83e9ef2afc0d269917066cf30231a2578e687c8312feee2fcc6f9a1040f4e6471c91a0d6e3b7787a7b553b24dbb7071341f6d9682dce9f38cf9ad79842c846c4c92f7a3e8d4ac118dd5f41590295285f04844c55d8fe4039d7757a088436dbf9ee1ba42c015401073bce076dcd130971d96fb74dad68d01a5a64e6c695bb1ed1f80ea4bc917198778384e6a39d93c0b8a3bd09e916be8f1d79e1d3c86a565c5be0d07eefd71174e6db604d04f579121460b2af6b092f454eeda4d4eaa5f07863bf01f140f1b51038a5652af001726ff11a629892e8ed86643b4e88a49eb4c1ad624952eb2e19b1e34b0c3581243dd4b9eef50069b5226ceb8f1f945b908d305d30000
161 | 162 | ** Weight: 10536 163 | ** Virtual size: 2634 164 | ** Discount Weight: 1538 165 | ** Discount Virtual size: 385 166 | 167 | * Transaction with 4 inputs and 3 outputs:
02000000010440d20e775327e47c7a3aaa0d62d2daa92d6593e825d4058fb83f02d2982787bb0100000017160014136af4d9d56195fb5cc45510db243f2c9ac549b0ffffffff5d3b095569d32203262113e114093bbe7ac2ed26e6c1eba94acf3d62e9479fd4010000001716001427c88e23665abc413e795078f07e0573bd4966a6ffffffff1f8d80edd1f8f600d0a67ad89535966d70ca89f267b84ade3a841d46b646d03a0000000000ffffffff60420f6b5047d74b73280a80b3c5a3b700d0edceee2d3c424c2e47b5ad7fa189010000001716001418d6f6cf51186fa55acea541252ef8642f539340ffffffff030a3903616f4fad0fde757dac8f368334c6326e80be2358948a74f4b96d2ea2e3b509266e8e780023d26ce454f762a63082125f3d591c5a80a40b3652f2df4f3e3be103955beff6bd21e9db19cbff6029b77c0f33fcc6d2fd38aa5d50b90bb9168a1bda16001434661a61e4b2ff2c61881cb4eaad3a691756a9f50b11d13d3cd766f1dba3690803d68d8cefc9e9a3bdcd6287bb646d9ebf0937ecc70850cae0c245577ce7f12487692d489291cae55ef61c8d57da4d1ae91cc58d099a03ee30d577a7a8aab53a448b0eb7968aa77e101c46049d1fc13564f84bc18a2cf417a914bee11153fd9e5ea38e517ac44cfdf18fadc7ca9987016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000011b00000000000000000247304402201ad36f422bc76f2f7f2eed881cc825a5f48342ddace0107a7bedd5e0452b90cc022058d32863bebba3965b4dee2dbe83cd4a9fb8a926dce8b3ac5b1d1830426eb9eb012103e32dc1faaef6d46590eaaae789a57ac4c16a58648891baa060679962c95c3ddb0000000247304402204555a3ec408b9904f09a192b696cfc6bacc224355053dad66b1ed1bf04d67ae60220056c2ba284d8f04c870dda677cb48415a2a0de6e41b30a1f822fb942abac7a8101210266e0063c0902c63ac8cd67d68c564cb6bb00dcb9a1f1a3f00975acec406e5a7200000002473044022057ec539a2a3069831556b700e3414c2c690e7ddbc2cd5521e541d1694e75728102206386cafbcfc0ea7a58447c506320b370cf1f990df38387e16915ad80044010b301210223b1920f70e92491512dbf4f266295315da535e66d18ba566fc13e71aa0a0fd9000000024730440220624d81f43ba0777b49296c51c0eb1ca56f78eb6c75996a9fb1202956a8d286e902202446ce430bdf63dcabc3bb70415ab0fddcdb685c35c76da4f7f098ff6039464e0121020013a3d0f30453adb05323aecebdbb0d9ab7203fddbc51a4177a593c46b499ff00830400078da5c4069708cf37799af32fd4186b7ddc0ab5b36d45e65811ebd5b357749e0b874079956c001ba37ab67889cf71aeacaf7121bb87af4d3fa62aab85b9644e86d456c7eb1c96e803fd733adee77575ca7bd8f9666c53c361dfb2881c1dcd8e362353918a2f4298dd72766e68372217042fb078dd607584de55c52a939e560093fd4e1060330000000000000001990d62006914e223b8fcc44384694c0f3de1182cbfb2223623b49f6c9a0ef432239a3fa618a891ea7c2b9ea9d74c1e9cd22838a79718d824f24967067457d0b9168aa1100b156a690c534ab01b76739b27d7d2e55e1d0688b217b44228a81f2b4a122dcfd544e6e7bb0db0ce48044a759372f4e3d15a16599db10c07e09c436c1c7712ea1671d18ef3914d128624a108282f1375e0c480f5b563e0f521f12003f91209792d7c036e6a6724ef7ca8d3186cbbae619f4e41122b2162c2fe8f44048866ebeac117c4c076b6949813d09a265c79f6f247d878a899c289e0a694371e21273e49223c13bbff3ca6a3921784f68a01ab3444cf7e92b1d115731294689037556363c1d53101fb53cbc19a54742762de2b61ee4d10e27ae887c95ba313290b7bdc4ca01d90c67029ffa6abb35dd3cb0c1aea44d96778f8fe4264b3894eae75d0471b7f3f53f99ce1aa9bd0007884c10a570c8ce4f279320c374041a92d320b8b012cc50836250848fc6299819b3049089c64215eb76684e4f1c79b7b0c243470b9e04391e252c43e96c85e0a243217c1fc4523ad98eeaf7e53d346932a362122fb77bb0b9341b4bc03aee9a3292cea480b2b89f1e10e15dd2f33515dd511479b8a243f81263fc0200000a57ebfddfe96a677ba053c2638d3bd6d3bda6a40a64f2be902fd9b0e84c9dffd3cefa116cae49513ee8616454adf6be38033fedae0e005aa3913faf76a667fc20b24003ff843f1b270fc007885265c4571adb85d9c1428318d96fc7bbd53dec4ba107c9c46141122d9dc388f39f2cd92a475886ab4a4f4f02a11ad331e32e7fdb5af9cd37876a7139b616ae5d12caec903ef33e78bc9f32d590fe4dbbd36220e8dc93bfec5c39d40ec64d2d7ab2780d110d70646e2fb23e5be59dbf1309d5f5f1ed0307ca579f0760a6755192bd4e82d4b9ac407bd2eb9436a6250a26887f3a5026fdd4bf9fdfa860e6e3c66459b52c22e3adeb39f5ee74d813ef52c67ded7862f42b3f41792d332117a4c9a79c9533e6340c4ac824f747f9ad696273e5c4f648e33eb331ff3b169200577456de347b909e00500b2cc38e75e74eed3213471eec258f8518d65ddd75bb79c8c357b4b5ed794fcc914f181b80fadb143ac371125e976358622f868a6643091b0f7b3e8a9d137a54cbd8bafd7e135c410640ca57032824fa87b5a69bfd5a1f8d92ca2420bab396c4e50a9dcd80baaa422e437e7255b861804c82a6c366645d8aeef188539542179fadb47318df8c1c71167dd3e8f5b47472316cd8845271af5e65989ea7ef1ed30b7f081e6d9dc75c1ddd6eb111f951957c28a3f43b3a45254c1e460caea639974b562be1f390a2d32218c240f1374306c049d0e1b20cdd021b824ad4e891389240aaeae626336b75f2efec67aeef754424056f654c83c3fc97fbe5c86863593dda2270ade4f8e9f110cacebfb5ef24758ee57df46c0e9745c42dbf70be6fe6f47e2521d59aea709cc66f4188cb6d0e72a2cad4f00f28cfe5d19208fd6316bc4bc97301590d9994df83f7b7df0cd8e0bee24173b0467595dd8077453dc71cec547c868b353d62e3fa8f1c35757e2913fd181a6080cb70dfef18b1a2be882179287e8ef14838edb6f9a8c1a78d6a3f10f2caaff2b18d2c3a42da4e813af6fbde121f1a75d62503ee444314fb77b385ff957c22bc9ab785aa83611a62e757523be245de8c4c72d3eed6f9b2ef8398d07a8439cabf2669f989bcd3dfeb19e2ca4c55184635edd7a3a113140d01594037245c0dc9fb38c556eb6e93c4d9c0a3b73b899dbfb1d42f270efd74b9ab2d2df9b20ef4488cc8e13e044dfdd543dd95637a3fb2af6016b19f3523e6f32001e0e4515a3edf11a71855fecee07391c29810474ec3adfe37c18542e4c5f4b31d6cb2e5bf446e31d09def5430199bd2cedb33fd7a0f6036328bdbca5960cf93d8f50c0a8e7606937c3e9229f2993b91d914d4d2ef689ec5970d1464d08f4e5c9720c8456a02c374b380ada8a3a5cb118550799f12b01d35c5b96e279d1fafda1f388de3a74f7659c39a3a5a8f04aa0616d419741b6f50e84cd056346ff37b429d17ae960209b6b6421bfd3073b2c163336e7c98a1ef8aa42305214b9c250d0736fd3216dc203c81b521c55cbfbbf092b0f22af61dadf24816688d7c1ee727d9d0f665fa2b47471e842cc5732ff80ab889537204f6f702c8d991a9fa315355ea2e81d43d2ef6b9eb970966b3f436f949900ae10bb770fbd5a0f39d6ed833071899ebb277b74d4f42dece3bd58b3eec4898e6db0ac631ebcff570c8b1d981075d22950fb8dbf998ea6b95de93e983f63bf1cc7cb6cfd284d150902d4b3d026fa83760be025d81e769a29501e6038d3c303d9dc0cec3fdf3cbb277ca190d1a0c6c6125573fc5028d4edb00315b458ca71ca097693b378011fc2d92d174b6cca8e1cbaa2649ed8d0e961446081741050a7af08607da2dee28355fbd876ad764545f5f1f97dec4a58e0b9bf7e4c6b6cc999d0fe5b0acaf89a5df71c2d823356a79202fc61291825c8b7427a324e3849c4011e97e04e0924c88d34f82d211a3e721e743fe718ad5b5847308aa1a4ccbde430ee3698b016926bd29e95904b7eb2407e88b4c8d5e92eac1da4efe562b43c004b36c65b1884537f553ef117a04cfd026626b19c859cecb1106cfc13affa027727438ea597ca98245acea167002c988c172c96cc8525a9a5d4580b84984eb52af7d4326089455e9ba540d7d2c866d4b7b0077c5bd76db2406db60f1f12974700d8d1efa968454c581e6a764ab95add5a885edb7d9632830984badd216f2482f234fde1a261fc37b4f8330d3b29a217dd327090f52565aee6d4ceb646b285df2a3b6591a832214356d29fd9ec381f4f9dbd9e85c1157d5d3fc8b5036fd281361be9cb2d9596d43a616d80f9e4ef40c62128f7156d3da4353355ce7b762f9da589041fe5c319c1e5d6f82133337a7f3520350fd1c663672c2224281057c92a6fe23e5e99fc28ef54824f6f885fd61e917161ab119ac4ffc946ec89d0df486bea1dfb58e4770abd0659039c1d3766f43b0c7f0c6eda893969c0fd0ddfad68a6b636c40d401f6ca8cfd3e98f5589aa25f52c17319cae03bfeb56e635ea91462d0f4b94c09d52497201b9428df0909b101a66b3dc732ccd4b7ba72a63b18bbb58acf3925278e70e6d3866c020b7c140d0bc577c969e26cfd8234adb17c2db54d861c37b253cb6d5da31c0b8150b3f4c7ec2813ff3fc50b7ff1d50dbc6601bbf83ab0220a58e2bce0b2861a7c68b1d1839543caeb0bf008fdfc6bc72b46c11837dbd5ec06642710e1bf98075210e531762fa880ad09ad97653fc18195b67b23ef7a61f8788a9db77d88ae182a796bfcefba5625c714198dada2afcbefc7c1c045cc2f087974259a3b70f4da0ef05844d7caf2e9508e56e35086782166134863dfaf474d48ab23cde2273f31c084f237aebcaefdaed06e6e80821f3a3172d0f911cae8471c12a56d4a6c147db3a2f0f200f96aaf349471a06f3903b204c7f7313b3fe43c2c692115b6ccc5c52d7a9b806e2933f3008ae6a7d7a94d12b24da72f63b8c131f0f802c714a4e17fb6aecd5ba607af6ca8113e13355d4fc4c1ae3d80dd3aeeabb034f616f44c9b74bf11533526f9bcf4ac12b26e925c3a8b4c3dedce7b34865732e521542c289a92bc367692250204514bbce51c345418bb921574cf0f370208fde81fde03161b2e40a83d8be4d2d3e3850b50dc97ae89e0242f0211bf63e80536cc8f09e299ac08fb07b3076e30f845d3d2bee951575c3ceae30f6a623116a37ee09f6f7a1ee79d94f44d661d36c069cbf7b1cfef71f227a0d3b60074d2c0d26e29bd4e038d08a230fe1a084a973a730b3595ccf39a6bd3d32dd580ef7864384b8974f60483efe43a9172d4891941977254cc91878d8d9d05dea2d9272b132874e9fc0a112af0ac8807d93ff626061a197485e445f332a3b60af3f3bf778cbec73e1dade37e18117a879bac424ba5897177ea03c9f2350816118f154e9e7da69e0f42bfd04dbc211f6d30664c616a135d157df16d40d7bf59036700f903067e91dec547d90616c5751fff3a1af5ff78bba674137056fc6540d91d809367d3f528dd97088b762a05156225ef7fdfc4917b62f8ffd95be3a61a16853a1e8fd4a81a1ea1b5147f9d02d1769f4525a40855e82080eadbb857d182830f77d21e81a1373ac86303b4c897dd3bcb4d3ae9c46a0ff962ec8a3feb34d799c7669bc99d7355936c539adc3a1948db1f8751c09427b7951e39f612bc28c658c95ac318ce93ac273add7c85211e676fe85faa318e4af874fe6f6b8409d99c887679d671a086f17d5c42ae470edcaa88972493aa943f121f24ca6c24669c926dfd70d9caa99342b60fa45ae39695879390e088d342ab598fe74726dc0b7805d65da1ed845951560f6f38121303e682cbfdb7e5d93844a186bc1b3248e81689aa7a7a96c41fd411c31057a54008baa5e5e60bc4fe15be5b7b04a8561f0cb330fd9caafd50ad37baef36f0998bec9541cb858e27c00e754ee753f72f917f5dbb8c2752dc727b30305c332e2eb12f3b5e5970cadc14d5db40509e8a1eb88f9f90a93366d644376bb278ac75ae8b5be7c86e95e7c580de7cc15001961b9cde2d3b5f8311d61e762cf2e226767f2f5da58859341e80cdf0a9e4b19b44e4d88be7cd9ee6b5ffb09d84d3b8b8d8d03d3782e0eca0f0bdf09709e89d873b07660ba2c830ec644bc86f2a0179b720f178619e53524d29a15847e8e5b3c2d09b1a67e359eca24fe2b4699fb3cc0400968a525a3083308c342e623f22753a10d98edbe509cbb313994e75a843e95a77f7410c39ecfa1ace928257ff78bebf72faeb9c7a84f55cf4e54a231e7db7a57c1f4ffa8c1409b4e25dcbf86a8a7002eca8bf69a4bf948bdda18670d62bc8fbd687a4e003c0feff293327ab2960359cdd947eb6d7f4c1b3e51da954bc139ae8bbba22d16dd44567ec3416ef2028c03f7dd22a398247e380ac359c0aaf62a335d3d63d820f7dcee62234a16c33cce3d68a78b56114cff93b84bdbd347924416502a75820582807ba55a1d52c6bbc5441d709cc7dd90308c541d1ce9cd4e63ee9a3204b2c2e5da2f49db7e0c293ae7367dfefc168c8bb7b577f70fdad642ef65f86a1de9847c3cd81c4d3453645b2f0127102f586ccb7c4998a3c860292eaf4be3cfba03ce2d11d0899fd60f33002394c761dfecdb9a624caad7c364598442f3d8ff268a7871007e3101d064231ab3aa700d40b6dd9e3c1339f3b309b3761625a2893b6ddc0202ad76d387fd97f5bb0965feb84876e3a81fef95df78855e1dce7286ad1fdd66d6160cb04bc3a3ed147b427aabf7958812b06cd5b0edad1f66bae114802e22e88e69592564c10a09daad4d797751cbef21a0a219f6dffdb502eff52f83a09c7de1dde3201bd4b7cd912fe280bdcd7225ea92492028bdeecb798fb011a866929cd9c44f12c0d00f32de3045f940f0eff60eea0d95131486410c9824d286740e3db5ad41a649ad8f42029ca553c581bb3772b0821b33282120e74d3a2a40e44428be2fd84b0a244090c70c88673f30ddc1a1c8d424b666585f31d36bffb266c09bcc2ee4212dbfa2c665a75aef1c22a42599c5d31939d5d8238754d463f896a0906bcb37bc5b4a7983e0ccb99c99cac292bdd6fbf41a522919d9ab03063f08fdda5aa5336bfe3f7829405b8b993f9dce9d3562ad6e9e8210693ed00f7aec88692a220cdac775818a62bf78b9cfd62a8e6326b4fd8c9164a5b280a1d088b0c1650a156c09a64ae94490d931c1fe105e1a16747cd71c5550cd3d1e0b57a6f3ea1f0680f1e98304000bf11b47003d960b272bdff380144f26b8038ec733c4e7ffe9b54ffe5fe2cf8e3655854f2e2062afbfb24bfaab7f2ae1fe343dac5355dce3ab675ac1c8cee8adfa1f91fc87b6b5f1e4afb067212cb4bc7e241b06a56dc3e72ee9a08d98e046f69386788d159ef17677fc362ad98ebb7b87b82f7e8674d0f1dd356b8312f6692480fd4e1060330000000000000001589e4200804759c6a15741acbfe337fdd7276a45fc233274663b54c9d7841b41e700a1166c537909f1dfc8ffa669cfcf9e7cd8bda75c94bd69fc2e331c2000225c140e8c42cbe187d4539dbfad5795e8db6555d63d9500c781b38ba0192db522b53ea587fae735ec8e8e66f4aa015dff234067f957641299e60f6a600ca54942b42e3243c038997802cfe3c9f7601ec29a9cc5e1a9524a930179afe38b31a80bc19902e836fdc15a11dbccd7e628034bd6dca93e7ae9ccb396ea150a6f677f434d7f85bf010798e0e6536fe8495f09c9e6e4251c97cbc2632cab92e18b379c777e2ec95b620312de9ab4bc634cd8170de350a7d263f693f7ebc5cdc52359d5abbb6de56227ef7bedb21e1746fb59d0c2a836b5922473a9544c268264a425b6f1e818ba4c8f76c846e2db0ea21fd7e0e0aa2cc247546a15193070972100c5ae3ba0a9a1030e6386e3a04d6d8a97a86e3df1a67c919a4d223c8ff809e10a0ae458c537cb2f5c8d20542511dfee62352b800b5c980b553c07f51ef98a72989dc1250ca2c7c3594948f107c6b3591f916621e0fd1c1e37cd9e11fdeb881e15f62c4cbb33c525b592bc1976207e7215037ba5f2c5323f4884d475bf3249652cab440989264ba7987295216a9c965b4d5da29185002abbf389c9a8fa40a4e2705127f1da29e9ac139666e37f4dda0efb08195efc2e970ae4ce0987b976c9bb79184f246e6a7099121db50c4bbf8e65f6a7b7b4ca44cdf70d946ee13ab62f4a4c81da0f392c5236c622357ebae756464e5fc28229ec00a4d5a727891933321e1e88fa76e61109c1e1cd6550e8b9c86b4188764ee4b6be8835fe013c41475c51e89acb71f77a5cc79a75a78bd0f198aa9a8ea6022bd3a6bb59e2309930326eba451ed932247b635d3fcb7aa6bf80d6da088c1d9fe53553bf25f1b0426dad5ab8e87853fff0483aaa5350a0357e8d382619b516442b360631332a71a7ed8143e5dec6a3ca0d2320fbbd09d5f2cbd6bca3481a3edda93653cbbcb698e67400484faed0c2133f8a66253cf493815ca27011dabc73294aac14707ee4e068ffe6f58939ca3e54e13aed06dd0a466a3b9bf58f10f09c9b5e90069de5f7fd85e3614db6ea13829985d60e503e133a8d13d6e74f858ce80f61f2fa935bd4a3033cca9e622cc5f272f825a04b7503bfd79cb590776fd042d514b2e75bd6cbc7f7d113db4e0c9235402712d5cef1d7fa410d754f07cb1496688f12b1fd39a7d15eaffe81d57e9d834e873bf1d6162101536461b43572003dc7ab720f444740e48e038d21e083734783cdd05239bd36261566bf6c98ea1d25deb29ad190ed02cfde601b53a9fe8407332ba87d8f657b74fb14c1c6fa80af1d304618436ef1db96923e075c7efada68bc21ccbfae05d7c778dad45cc519b443270544b333a90c0d6c9a0bc1105022e04749736e524235b140d6570b2a6ab2cf37d753e530f12c053e24c4086e70cb9137e717bfbf0fd3d9f8dd29118a8648ab45e5f976b45bbf5acdeea8ca54d489166e8011dd9a681c5ffeb78abd9b37d809f5a0e9b167ac64dd07c1b348670452c0c42bb13746617ac06bc0fdd373a90a63df88fa50a229353185fdfbb808d7a602b573c43f285ffa72489ef832eab6a115dd819c2bbf1f703bf0ed06e8ca89066360708694170a5dc1485b33b1914aa39051a70a10748d8491186a6a23a8f67409fdf575d416eb3842e751168887c3b50d18f6ff2a1341ac5eb5dfd2f61a656c6737217debd40bd4bc312173f1d5777a50d39858664af0c33e0566ea5783faaa809e3a2b087034f7fa05c769fc3488252eb0171446fb480b27531e707a825b6800c601cb79ab92ef9d1737b8dbd5f71451383ee15eeea6bc09f83dc66f7e5129ed3c37d3d0d176c64920594d90af9ebb39a040194a97c0bbdf65a7a45ef0f2cb1b6b99c1d22748de18e50e01f1ad1ba9cb7147f02ca0c080ad4ed5b707057b483214dd4bec6771c65b57d61760649fd1f899db9a473e7e21a2d0de110c70e7699d54a6957b6d702d3244567e27f244fb6ed88417ce5393f3b0973286c38298ffe14cc47a7797aa25c15dae6a4cd43603553d21fc0eb3b930725ec79674383aa974ec3742d095de6277ed276e9c6f9ce7d0703e1eea10cb5187b45af7e3848ec49f5c363ec0a1f93c03dd49ed3124b3def798c89094f5e84ff3b157780c1dac7f0c7d334a164f06cfe1e9943b9e1b7e36b0e145c1e900121fa0dceac549bc37e268c380acd6505e17e55322b371d95d859cc1f4a696426fe5a3bbbd84672e4fa1ce588b026f370737af89561ab31d7d8ac922c0310ea26a0bee9d3450906973b402f0227ae427f796e51907d10ee65d4bbffee7ef59b888d9149abe971cd2ae6c48980a4064f046b5469aa1bbadd3b41eefe71b64cd4026f2d9d6636b4c47999260e45eef3bae7197d189df038299786f42bf3bba900ded09e9231801a813674ba8b934669febbd2d5a181ddca948b904cded2115d3682740c6e28df3c939ed2f30a26fe84b10c841f68431a02312bb29d6cf168d3ebbc2ffd0bdca251ed2174d73dd3dbb2c3bb5bb549b75ead8936ba4b11ad431dbf6ff5b7af12bab9edc5df593670a3de8381a0303b596d67cf124a168ae0e61b50f7a053fde968517380681147bdcafcd06b225968e7518220b779603c8fa9dd422e6fdfd06adec0f2adf6314f888666ce4fe2ba6c68195a334a73c6358fed67c1c114f3c4c3e47ef75bdd2697de14f73ec63ecfecd8608bf60979eb921d3414372b8a9674a63455e1278b4f5edc1a215fb57088af01e948b23685a93fa199d646581e243a795e8d273824acdedc77ce4659e13b58e7066dfa5fb9facea32b8cb99563311ef6bfda29ba137978908002f9eafa8e71c5aff58b6de3520b43e48d7316091c2d25d73784c44b039313c0f12bd0db7421101c34cb65424edf2eeddd0aed220f28c02c6dbc476d3d1dc470be91f3b5f4eaaf790abd569e6f2793ea52c8d4ee1cba4bff7e0058a7ea289a428a2a3f965addc79a5a30a464db0d9ec79fe72157a28be888880ce35d492ae884dbc70d9267c9054551cc443685fe3df06f1713d10127e58982b12f81ebdb39c97ba0f8e7a9c84777ff4d32ae4dc75449b5027eee7c3ae4eb9b475089d992991d27c40702a7989da54180f40b658a940c411070f17ed6dfbe9a5351af0441abf229f45bd0f998e1287e703a7856fe14c380a7fd861306ccee36b728040c07338353a4ec1623edc8e2ff6978d310cf73f8da713423ae3a21088501f4cc2a7180a373f1b7555f89001a112e37375a33586effaacede453c583f4824a9aa8d589c8458ba85030162d8d9f12e4b8185ee634de5813dd228f7fc9240d7c3a19d77a6a489c8a1849e59df426f6bceb7b4baa910e0a1051476f9fad549bd30d6d67305a0669a1b0358cdf8c3260998a69570d42d9f48827d6aa0482a2377bfefe2bee99205b8297be4c6f2887a9d88663f31b3912c04e08096601337dfe2bfb345caf15a1856a85ea7dc05dbb1144511f175615d6a4664ea9fd3e318f6e788cb66f39926027e7242548b9ab64d6b53001aaf620661820fa77338f7d86a357f95e7f507609ddf03d51316b676b9b50b3dff042db8e841487b61fd80970e3afb08d3cd9fdccde2fb992d34c6603fc4cdea8c362b28242fae3b75b5645c0608b23796960ccd8d59633b4d70f33f76217e5984af7e2e139c6b6c7b11ee392e64ffd20d079bf499761f29a5af56b84a7644e69aeb22aca5beea493fa37cf098365f7b50f1ac7ab9981d25c2af29288a873ac3a6493dd96797d755618947dc18f48a4010e43cd1de7562d358a665bfc86aa757f7bf156f0bf01f24916716ef23d9f796e9931c4eecfa79fcad87b5ceec5e8b63a484c78918551569f3049380c740c9f18dc3b78853b183f177026317c3ac9142aaebd4faea56861bf47ded98797327ab621f89f87b65ce8faf20ed3866249aa57128d60c206bb522a60719568035a4bf4fef0e2a687d6e5bfa9001d155989d61880ccc6c065d407101d91a4ffafdc4fa1f486eb1d617fd710873cf29d5ef131a6e7eff94ca52b83d669cf57fcf2e79116a5069f90fc04993ccd06fcbf02ddf951510fb4f0b0847bb950db8dc19c573df4d21ee4dbbab23cc907ff422908566d9f7fca44d97f588f9aab138b0cdb495ced352f143bfa92b3fde6ed3cbb237fdb06c2cbdbb4b9a3b030503901571a121a3dff64960c24535391d886b728a9e3ec9349be16081df593d5ed700d1440047f2de2fd5c6521f10faaf511bb181ee15b1e7ac01348dc26732d1acf440c1eee63b5dfdbc303a68ffcbfecde67017e6fc29356c6fc53d40ff495018351cafbfd6b383b777ad813d2b54decf10bc1412d9e887ca69c995c2879e8796749b884c28ae358803ed4567a49b8968cd41735d392ab08845629c0e2f6d6f396a746b1c28014fc1a8145a6bb3bf2f8636b1d5b5265c302f545bece5ad54ec51d3f3250ecb6cc1fbec8856dea56ec388a7de9fcc439f42fc2787a778bd16c335c66080b3863407694ed0158db6dd77ebd8c8efcff57bedabf9ba9d7f3625e83edf3ade3330c28049c9f8566e5c59595fdf2e85cde9589ccd48d1d98d87dcd2d2c9df4183c2653861dabeaa82adfc837ac171cbbaf62911e636cc97e81a5274b0d1f262106d5aecaec35160e79390310508e84fedd735902469f4565eb8fdf0727c13620e19ed70a461769c73c3b46c90477fa25947ad8ef0ca1b93728f188ae6e41f157c007f3fdca859ddcc008b3a135107104beb8497d03998ffd80d81e197f904c48efc717c82c5f2e6d3018329a7cd00c84f8ed6f26ac10ecf398ad6d8c0e7e2d1715e7392f2fee327a6ff331c81e4d62c658141a6bed241cc9ebf840940c161885ded0f6b934bc2630844787487db548b62f0906c31bd42f6f3f9488d091431db1699a24b0ce25b1e13a74851d97416f111faff01b7b5452cfa497d9e78343fd11324804ce055c68851bae055c9d6c5a5bfa052826a55bfae1a7624cac71b992372381c189792aeded6ca5bfaa3bbb2027ea64dce64ff62dd404b565fb35617cefae16aea67341a04e0ce148bf950fe5197164c4377580488a7da1a4d95ce2c568448a9c01fc43b961bdfc62b12233d65754b4e591b1021a9b1dea87d9fcdaeac91e08ece818cad218cf53568fd99e9d9679d23df916719e3521f75bea2189ae8795d3796eb842231d5d0038fdd84148f5b83421c2ed1dbea795285656530f336bf8b5645353b621fdae159d114524112a8bb7a56b026e3ab5f0c2b16c581edf6bb38c25dd331bb4792915359e5f6a059e720256d93319af96e469f26b0b2d849baeda96b16f9364b30b92b1389b6e97600a34c6621064fd826319076cb1d5c5203d36e6cbfba5d9b80dc1643abe9c002cc92051689f93e12cf207aeddfa1bcb8d1f22d3699fb775a1e1113f16fd08e42da31d2821555b80c752721d9ac209415370f04059c63cb26fa41d0096ef68cabb7b543592b54150fce70669b2643660968c04cc7d2ed66e468d87f68dda8be5109f2519535af9e0b5fb62cf95b282c389e9856fd54a6444cdb9d72fec929b3196b3f5ea9bbab9614e2cc78bf2a53227e4f3974c368c8b7fa481501978e98379e14062dc0edbf05a8f98edb4a5a22480f62642610930b1abfed3900548b6b445d7d8ced351af5b594f64dfb17d2afa6ddc9c1593cb57aee4713c82a90643ca72fa0716bd0c0ea98461bb0f6436525d47ad4745f28924c8bb967e351ce7ba970be55cebf6620ee52aadf6e8ff2a58901cd0cedca36bfab79285d7d91ff17b92c7d1ac67ad8b46ff69c6717b61334efc06566eb74ecae0c302039c0000
168 | 169 | ** Weight: 11192 170 | ** Virtual size: 2798 171 | ** Discount Weight: 2130 172 | ** Discount Virtual size: 533 173 | 174 | * Transaction with 2 inputs and 4 outputs:
02000000010265c1a5c421e567eac3408b86002ec2cac34cb11f6c6f0344b53fdb8a2fe5d74200000000171600145b5e93bd6d3db526c212c1001591ffa426f3c8e2feffffffa426ace5b8c930247cf8d5eb770e220185b55e9b8ddd9009b92527d6c36082760100000017160014e0f4711c07626a8d15f78503d47ea13708c82f28feffffff040b85401de91c3f424934652c15b00c87cf64163d8eeca4063f4d5eebb05e6a3e2e098392af4d760ebd5bae99e5f75c6a4e03f867e6a71896d930e209475817e3393b03cd899ea46a41a2a6f60e191531af662920d468c590f62fcacb83ef40fac9586717a914663036ac1af89a04569bee85017a7d0e0bf92332870a88155dace95bcd23494f3535d7a4cfe4c72f6bd382f53074a5f0d61821d6aaa108f4c3bf6e149ddd2a49682ec5fb30acd2eb152104f52cded967f9478cbdb87af603ed9f16cb3306c159c3319fc39b06ddac69822de3c93558dd9f2d6b291767acdb17a91425a191fd044922742b497c097d5288e1c92acb8e870be1436610f55673220ed543f5967d5359ad9f9ff3cfe80391df1ec2d5b742f240095f363836349c5012b7cc6c04dbee67d1f62e057eabe3c93943ea6775f6b470c5032a7078c6eabd65dab31487d6581a742fdfdb88df7119b3f70109ac28e3567dd717a9141b657d7c7b77763dc834fde13cbb8e350739619f87016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f01000000000000018400009def2b0000000247304402202e7f8a862c5420c55d9cb0ff91bac91e2153178b1c2d412e0acbed5943a802b00220480afaee1a779059141d923bb772ddc2eede0ee4324af86cb2d78c02edb0c045012102084fb12be92676625adc3319b43e1c5292b622ed8e4156a2f14d95dfc8d1e3ea0000000247304402207fac08a34ea8564c44a00367098a07b47b4a0e2f3f0e134d523bfe231e0ab2e10220541d7159571860f2a7996ddbdc4da44bca186091f6a4a513113fd74a52ce7a7c0121038c417286b254c7da2a4b37d13df7ec35c80de8562c64bd08ff21d1598999c1900063020003dda58f718c7f8ed87468cc71771d2763fb31860af6f18ea1c9a7f9b7420fb9ebc6c54676e79d9f77ba5d5f6fa5747d2e560deb927b0de9e8f65977cff567d33391d65aca5b570b5e6c83ec961b81b59b8c78059f4a18cca2aee563cd60208bd9fd4e10603300000000000000019f3afa01366905c9b0eecb5c39bbf271c29bb7ff91e3bb8dd34aa0b3cc27f40473ffa7885da6da0062ce87f57459f2af09788f5cbc520032cddbeb71206e45ab85bc4325f6753b5bbbc9b7313d6c2b400b37fe635b71476737e398e89d2e8e27190015708e4b676a91dbcc8e9572e4da3308b8615231f4320aa90110e5a9cba4c3e3aff22cf6a152acdd81ac520468154fea739f0635c40dc5a95ff49f316a60bd978d76b5390b8f9294e5d0fa2b40e51e4ea2c9d7a402b1a6590ff38d611dd671399bd91f4d0a93ff23b97c24fd088b99211060c43a237293f75f93f6d2ce40e5a94bc6603a28fe358f2bd7c79fcd4df0ca9146ba071e380b1f179d19e08b7a4c845eb7c19a38f6db94a7b89073bd7bed874f767b6719e4300b94545f817e9bacd8c2eefdd626ca633fe8dec35c1def9a59aa618e0bbd7183c7c20bc7a5a5c564659f3d29a72a6ea68b735963e2d25540cc49d6b67b0ce015dd10b083d202fe84b0b368b27a08806bd8044f0460c1e6d0fdfb5bc05a72de7f2d03318759dcb4ae61b8f861ce4b4d3d7c4985d737385e2f171d484a41f7183f51e700f420820eb6789042b74728ec44b4e05cccc92f4cc59b2abc8c3eb35b28111758d93b08f8b94c4c961b203b7305f3e4e59c71cf6ede9898908ee0902df5324482597e75fb7165df7295da777e042f2b5ac67637f24be0e0e3234662fb4a2de6fc72e9ffabafc6f9593f3f0ed47fd412e2346a4ae8dc3538f768e97bd594d2cd07abdb7efebda3a3a802f7571976592041d298b6d8e80a5cd0013854896866f1f2f61e6fa270e4a77a5cdbdb77f39a351743b83168fffa71783b456aea359fd6d442014b0df9a784ad3a78cf67809c4700d52f0bc0c83860f2733683bc0bf691d59747044055517e901135bdbb88a1f6e4db57b96820d2f0d76fcac2e0ed7da046cfa11773d6955a419c6080b09320196c4319ee1073dd007ffef828efd87c7345423e3015f13edf51debb05591eb8c954e8f3dee615cf831c1666c6992d0997f0184b086711ddf98eb97417655076122229983eb780a7d607d1c42df1cd1fbbb893cda25ed0def925548f97db8b97899218f11ba5d8f8856f3b6f695b84860ece94fab3969fcdaffc52034bef70461aa39cec4a6cd3f4c37a72aa01116d0494f1b6d6604f240585a1fa064479de86133e44369bc102616410c58c67b86b767c6192c4db3f0a8e1260d9ea979d63e80320b998a5ee32e564f7e945eb6819931c46741f9f8ebd20c683b3454336a073beb843d70c8f7ef22aa08584e6a7723df645710dd246296ef761417abcb561c93709af650b5eb41a31d8fb8e17ca8dcd024539d0c9adbef5c2d7b907ba91b46422c25f5ab8fdaf23d735b219e6ea602eaf7bd5bbfd8dfbc77db3e2105070ed3d9377b5a7e679f1ea5c92ec81816cbb35fff7c3b26289d25cd1d59411da40a7dbf3dbda1e0eb5e53b5c462d28b4a197dd852c27e4bd470dfbf46d62cf0a699f04f482951ffa15c2160579139e4c8b22b124fbe87ba5b727361127c1bd48818fc193cb89e32aaa1010d56b73f15160c332dca9327b5eea4562528d606e218ce035592e25143a1c16cb516b22d3dd01cd26cb5fd355898268f0c3712f1f070c1ac93f64a2b0006203b893ff4b53dca0974bb783571c7d7ce7f1a2805d50ebddcc7814142935e50939d0eb401718622a0280632d9157e84d77f2102f8fd9b97af8cbe848b5f6acb7af6a16a8377eb7cf505f8c31918c1a2e917bbe93cea7c3dc54e17fb2eef2771706955dc815d5355ee7eb3e81ee795052a2026609067d5d37087b2f5cbe3ff87b176e7722cbb58a1f9a58ffcceb394a2bd0b6f3f276aebd2d2b9b85a510dde7755fc8f4fa17e4f63395c631f350ab948516eb8c1f481a1eaf3d57bf7dc002003eacddb68acb13d5de234f5964a6d69b16382fb080c0c572ce1d826085bc3bc27231a3a1e7e1f190e215be228dbc42ff51cca328476e45188b92761dc298d1600782027eca3dccb741a9942c7d045ba288243bf3cb33717639921881e38f297c70ecb0aefed97caf8b663206e637e5c3f0800307f05b679ab7ac6833a5c2b719b03f93894e2dbebf4d4800d89bc790f2e3edd3d4e06086b1efb35ea542bfb6e96e85ba54d6c780978c95948a84c94df2c05ba70682dc63b067fd7b0d56ed45b13850225726b82cd741050ad0b7e555e650d2880142e0f2144e6faa214c9ce285ead0d443d93e9ae113fe4ac25333580eb1420b0dc68f298d3158b69d386385483c7567190837ffb8fed85a6ac57d7949e9470be95bfdccaafafaab752442df010d9cc502a5ee63c7ef3ea10fe8e1cb6a0a12e3633bb38319f2392d926119c9f93ab91e7e660d491235585cc58cd363ba0f9cb86becff14532ec769faf0296c636f2a21ed5dfff26f588bf1a0af5c4378441a8e5eb5cf87d9e7a137cbbe8246a1bbe28b2eea6579d718ab9a53f8bb51baac1ee5923d047742659e14cafec8186359fdf4faebad2562aa70f4ecccd93040a86486cfe1c46052635d71a64ea179bea31b1c2e0a2e644a91bdc01c97e9ebe0b191bd6d7ff555bb9d277839b2c79e4e80c46c9921e9de5b08963897565e3e0923bf6d483815b789a9a1418f71c59c82b6918037a1d4c30ba91fa9157701f51c32506fe27c40fb0744a978722c0ebaeeeb68d176c63925a0094fb60103c306a2d3f018b6668b93d80538052b6b0e20fdd16c63f4eea39a3b2c6a809bba259c60245ec62fb91daf946dae4f943fdf5a4c5e5581a86ec83ca3e37eddc2f05b21e25d8f20a9e78c07e2effe66cd60ebd19d16e88dd9464cebb48948b699fd442b5827b0e1641a47413c99f13bbe5913c45e2da3ce80ef17ef7e0baddd8ac10770e4515f16f1cd3a335bdc5065cf298d0dfd6a3de4ff62eeda79abf551da4d7e916c3a5c5f009021610be64754c92b4d3034c82f81829e863d85e3be23c9a18a1dac57795e189bb07cb27a356623321475dd5d9c41617a1206e0d5eb0e7e89c0d61ea12d0bdb2f3a08a6cd9c185e8abc3381375c4a39ffca40d94253b1f773cacc295cf135a042ee5c4ce5bc6e363ab7269392b4c68e66f67c3218949ba027c0e68eff65bd2f668ea7bf2443327c057379dd22584919be5aae8f17eab5f4e567d1d9beab1335cd4b8202c75405e6e15aa936e6911caa54371ba971149fcd1beb6011f003f780a2ac0b771155a3e834e20b2e7df746543ac6b8450344b7db63aa0b40605256071618ddc9d73fd6902cf97fb4c636afaa1bd02c70ebc15fc309ee6845e3e8bb23f7dfebbda85b893bc34c285c09d2ced9afad3fc59cd192f77d568269e9068aaa702e9b2cc3faf6941bb01e8917467ee54d99b9220f4260b58e84cd65c7997b8741b724c805f9a08b1ef6b6388ab4a912f13144d4f1b47c21f29038fbf3af98f2bfd6294d1c450d3a66a18f1f3c12026fde8b923b86d52dc5bb0532a93440861822bf176ba6c53adeb42d2644e4affb374583e8a800ef65160889f6b453f3081ca48d27c96ca1b0bb97d190fe8c4b44089fca0efba3e84963aa53ac40ada2d1bad3c4aae376e68ac4a10f3ae4af04b875f57ebb034da2fe757ebb0f8e4b102c8c5da83629933007b9c2c64714be5e3b8a9c45ae7a00e72a943bb1931159aa2066164a07d4acfb0017849aee73eff1d37a92d11eb9e27ad21ada31408b6e04a1175e8aa46acd3432aa3114f0fb10e34c1bf5348d693cdc91dff58f13d916177d72a7c242afe17130f217de0dbe04ca5d34e98cf0ff47bc791d6deab0a391699bc0d8458dfe1ab35b0eada324e10cbef68c2873d2e9d064d01258099b81a9e657adb8bb53184c639887463eabc4410e4de02191a46dae8b4db7cd831e76eaa4575cce1ad03239544b4deeaa38e3c9937172bfa1f13189364af23250963f80c3f3fe49a4c987715c335aa63b49e89f0be09a0062694f1ccc856838fcd067a3b6394823c67a55f352f301cb2849ec7a7633eb3c0858f93daff879cc341929f7fa988b379ec04c86c2b71f5d967c09f14e4271d06f6f9e6674595b5deca77ed39b038c4c0a04503a103dda6dc3b6f444ef9d03c1329f97ce35d5c36c2a800230065ad4370ca814a23051e0bfbd295117749a856f5dbac80d9063ed84977ada3a662b0f3854fb95d219104719614f20917e1455e9372e3003e5482621760512587f15ce89feb8a33c116bf7c31bdb33eb6db54e90cb4e0719883f193a489b89972f4881bb05205f6efd08e80b640ef1d4acc9497564ea9e4f00ef66c2bb2ce8ea5e843af866d6433a9f3db1b951876fa649763ba250f91027d8d1f2d9a9a3fe6470f67478723beb0456e1ce7b4ee453b5e023ad21d7757fb7a940ef281e23b3607f6e6ce63d8a40cadaf5c307c5094d3b228c440865e46bbcf046902bdfd75a7a00675ff685a118a6a59179ce32019d068aa000c1a6ee190537f4b9fd98b498722141d1690e1638554dd57e141d4835d7b535248bf6178d66916a0e65d9b46ee9b056b10cf55cb84df1414f6ced488b9f0be8a5cfcddb0b000a61b84fb3d391e6c38c1af57cdbccebee5e1775702a1b050ff461c00518b6c3450488baeba9a7dbfb92910afde9201383e33badbb78096a807e71ec551b25f2099d5933ab43b50f7d82c4be342b17cb65ace747c840f14db27639d90abc2278b38983b0dbc83fe2d4650a7095051d2a1d09f68bbc439da2859f5414e19b1612c8aae119152a10acebdd6677049954dee0575aaabf2880fd1b861eae7e332a3673d6cd0a74321096e56f65746f82b7522c531c58612505bd387415c91fe4c1c41af1ed601f8dae21a3e6b3e1523cc671d0160cdf524da1b07cbfcc114d18f64ed9589b29f87029e11bb82e738e83c43bdde5fca12ecbc85ce272264437376cab6ecbf25f141a5ce137517d6fb0e905884582e26074f447a451a8d9a7005ed4ab0b22cc851c882b074c3b865278865518bbe1436fee52d5406ed0274f4c8001c98e814a785e865efa72d66acbcfc2aa3205fbe5a9dffe5e7bd5ffb5fdc3a3deb1a1d216698a7b477e0fd970698507b63a7a05954e9d4cb0b15043bd39be489df69fe348f6e052ad5d3f00627be33f503a2b3d40b7420e453466f7cdf747526176d521154eab4da53b4c509c8084e584dc335ffe5601725d40eaa4e48562c9a9e347e4fa49858f245930f3b9bca074ca704a9dddbd0a503ee68dda376791345e2ed6f283e644f703b66f771b9b0d7ae4e2d81be80df9935e9523a3858dde77c8ac905c902c6534f987c26bf6ecd87f8e4bfe3f234c7c1d49b175641264c3e7ce74344bae05c79fc9fefac2f5b89ea1fb12e6b330ce97d9aeaa5942c43a587acd4089db6c69fa25face0e600e6e06b32ac26b05035fa39f50d8e9e995125ad90885e249e49412fe6d8fb669673e54f0e245f9213d30c89332569da7f1afc8efadd7486089c6f87c44612bc4111a2964b324652acd4998a18625134cea25f93a09c34ba0a66b84786ad8d8e30732860f6352166322e6501c76fc9099450670ac95c098a9d1e17e3d83cefa3092888b4e691d936bee0484b1137505754f2b44a70a0d8744fa64f9e14b491b1988928d5a4b2a1e700cd7ee215239a090c5ce6276e29df8d5c980623ad44f83f3615f8c5040d282cfc91f8cebd24e18ecbf93e1dcf56b1ed924aaaed1aa137b3669ecd2696e1bcdc06bd0e104110d3810834c74ebf38281de1c1f87f70cc0d4a61824840332c446cfbda7f37c92e69ec5629cc59b5e158a1107b627ade5edbef0b665106b39811470f0c070890ef664885d92500ff474251f56eac69106a1467599c79840320a6dc56932086644c33011503f9a397beb110ececeb20a00ca0e226077630200036fac08273b4f492e87e9813de67f3a16540de56796e229d34486b44e772512e9a2ad83bcfd4aae0ded409f3167399a5a25aeb86b569647e8111d067ac50bef976afaa1729b7d0bdc43aa315bb91f999d26255a18fd7a80fa821546136442fec4fd4e1060330000000000000001f073e00013bfa5f82f45d0024c0809caece86ad257aff66143bd881fb2dfbbc6cc359c4ab16e8c4b4300f61972e27ae6b2cb9c06dce90be90cbf7bb189444341e8c4ece299a43cee6d7ccce5104713dffc7e95ed6ec1fa12c76a6969e20c698f7bf1e844459ebf661c6f74e66563be40d10642ea08570d1e97d8726369375da2721090ded210f4e56188d089c6de1122f29b868245a8b763e431d3dc5f959ac9d84b3f269a616a7e7deff256d1eaee8f12e40f10dae482a49fa5c8f62094b74dc48b828d81f119482c896e3551ec7139b2ac20c510de8c95c7eb94c8d84434b6e320f6c2df8132fc2c04264cd9cdb99f40a39cf763415020298ac98e8d1f83ce834394f2f1cbbca580a30b5dcf37087f5a109e97bfdc900b39a2e9d5d6abc26444239d45a3478ac49670672fcecfb58deb9eed24383e638611a0462c2a5523bd7c9111e040fa0e7ad20d3d51cc5c71268d93da82760551d45943ef8228ca5782a0e0cbbe8c9c75861891eefe956cddee8bb4755a867f491dc43fb57381bb8a092f8efef40813fff591ced33ebecc09c68f6d547a15ccf2e9b331e6e211d63dbc139f36f5678ca362c84906075e353baf1beb01768d52473cb29299fe3d954cc30180a1e548a3e08d261c51235ee4072fc508d7dca458fafea8297e5382bcc1cfdb64ccd1fbbdab56cff4a0891c3e5a61356c286acc21d86b7978842a399f6c2d30abe9e3952bea58bd80f66a6f97a2dda11340bcc41a519edd56b05e1807ee980587c3266582d799c05caeef28aff1dbf9fc409111eb3a28829177617d53c7a53ab7de20c430cfe5c6b143fc8bfd7475f801a9690d1ac3c1074e97ec2336dedeef7294351253b9842eefb531efe47e53d154abfbc98ec848d24eae30ca90809e62841bb3ec11173fdbbbb880192c667399a0eb3259ab08c30369184198476618a4f3928d50ee72f93e5345f8ad2eb93f7dd58886e253d35b1811b6bee2f71eaf3880d4ba2bded739b6ca87819f7e01fd03d586efac80b61fbc2095a54b0685d9ac38659c34b54a5ec3ec24ddf4d56153e2ffe57862120cfa6605ac4cb556c76e0a9c35395baf765811087d4610fb3179ee2ef9fab7c3a90d97b7b6b2492ef532aae62922852706ffc5452d989544ded09a5e72237728e7df9d92a77fe2e0dcf56bf46b29608d2fcac37df13bfdeb13e74d9c20dd38f391139e8c0c83143dac39b6c64cb8fad3de62d611f28978b2885ced749f2659e9c431e55c2525f2df6d17a08c046a68c2eb0383461d96dc322e745053378610f66cdd91a905fca646bb3cd60cb165e926483fc8d130819984a2f92cbc88b5f6230a5923a0c803b4705122e4e776fa529366b27fcf366750807301d29809f99e1b513bd367bffd349d93bf7ba8cf31f89b7c808d1fb4904218efcd41adf4bab934a1630b83610aa6f17c7523d6e35cb55d4916465e579831b5f06d4f1ac8ee16506c2c30540c1b0c1ff594bbe44b34a17a0aba972dc9515a9315637c2412c84575c65fda1cfe53ea283c7014a16729b26539e9139247fd5359236d419451ded76c7a77c23a0fa6bfbe728414c792e265cc38908c418c800e8117cc96e8a36813db7f1167fff02abdbb5ca6b7597b3249c3d5fab614ae71cc7c1c2f5ea57159495d174326f7c98bf22a216d6229f65cf19ef47182b90ad87669a794ab955ec5ab40e6f4d54433a31aa557a3f2f651ff474c08abeb289dff5e4b66a0449ce0bfea576568c4fd3fa7b316f003188304749a880b9ef40de13c2898c72190318e6b1c2361c1168b02ee293f3056a8732637ed2169e799bc7c3bcf2e44a95a4a8c773bed1111d4c18ace7c88d28f737efa36de840ae2ed4884f918d88b02904fb72f3e91630f046e83b94a159ae193d97ca922048fad6b9837a9624f7adc9cbbc01343b33a0a2e361e7fde52e9ea8ee541f2a723ab4c96d4716af2abb503215dc91312172ac09e2b41ee78a63efa2807a9fb31d1bf200e531c0fe990452568c4f9bb354e7fd58ca086ef3ef5993fcd015b123587d7debd8907a3d6b44242805b31bb3929120db2f1b644e19654fdd72e15e0a38f275a1c027b7933411d626ba76146100094203f33484790d964e02dfdf8778206124c9289461df5046d49f2c5466c31eecf1c25c08780bd54c74edc05b93b3520556c8225094d3d5aec362ace3d85d525b03390b01ad65c7202cf8f92c1211f89c8561b412f1f0f84966f8747e06a4375cd769ff6c5f38fc3be12cb0ea1c0a86de66ed2016413e9360229d05a52f6980814eb172665464941be91b164a175e1a8b38121fe12095943dbed37a514fe2454f74c6002cbdb52049a24fc7b747cfcf7d0a0b8a545fcc8f2eb38568dccf457782565144b3ef610c38de74d42de6a1059ae7a45570dace2aca6ef07fcc0be1a1ac5aa93e5a3923ad4b30c6bcc727eeb97c7f54c1a98d0ef3b82f0ba9a832abd9a0e176acc08b663fbc477af4d1a561080c88f9089d4e518a366ee26721e5e9b5e955790ef26dbd150b7e891fb8eec265fe20d05cc3bd4dcc1b79b31830ffcd30fd75d3f1b8220beb5f8332b355d6833c2842903f956037533d787d2a5f6aa454b097e797cadf197ada9da2eafbbc76cb74c3c9d262043bbb483c7f5f63f74e86c9a1faecce89e7e00c52ad1c91c50aee63bb0249fa05c89175a706a4772459d30f017f5a9e74842b5135b9e0ddd733147713841b9b8be1195e4c5414c0353ea1460faba592a405af5f1686c31a9892bbee810656f9cdf45641602566312294e260580b96e183819740922c2a39f1ccca81e539b3dcc88f4ad30000a27d01ef1f23455a7c075d5012d853c080431f2dce9a17aab3cd75349f80a22e7d97318679c3ec59327e07cc654ca374ba9497d0c590a7b1d10200e944510ea41b457196106584a5ecd2811f61b9fc14cb2940548a50af810f0d359d24d19d1c0ab9c3495cb2722ef982351cad33561f3c58e3d9f39bc9290fc7f6214a51814b170633de797157f06a39e90f7d8552e7c098f74847ab4000cf2213165c320049aea984bef0bd5e7f632d33f0a7070590f5caf5825e6d1ef98806079b95f520d8c85439d52d57d7b34aa72103bb02ac03c24e809e0e401d4412bcd880f5fc92e31274e3043e36cedfae5b48ba6f8853de2a668af5f9fde0aab320d57a795ace4859d9e8a572f4608b89e796a9b595b007b6517b09d1dd5afe25eff09ba36a4b0d8b161c2b16670e360b49e772cd23743548d695d6178459fa7d195f18726cd2e59c9892a5d6304644528cfb06367e6b55920277526c88a825d0a52c7437fed3a16e04dfe3de9d0c108f35de708f031a16669961da01565b101542a18513db92f6cb7f1efcb96a16f03bc90b30914fb8f09ab78595266f9c485163645022f217f738e2348a4dbd46e42ba8c106f0051cfccb9ea9e593b5a7029f00a62572b850456ebafc73bd8529f279f2f49a476a79b72dda8e3ab47385369444264b91430b95a346259905a9246eb4098f3fccacce752dbe1c02f60304c252cc31e557356b249b20075b01056c71b99371ff3917eae4fb29c00c39f13f78cfb96ac8e2763ce736232218c88b07c151afb226a8b3a99f21256fc8d832717b6c8d18221fb65b7ceab75329a3260b489ca78ae2eae0c01b68231a8b8786a413ea395611fe4d67f1746c53e56cd98badbf976dd86ee6ccf28249b5e3c4b589b166082a3e785a65973b92881147ca3c8cfbeb54913e6a2fd427b6fbb553bb5ac8721264d486e1a58cb867918dc5810b1b22fa944a74ad8b7038846cf63890c2eeef860f28a5be1d46f84ca5d24d1390ff563621f4d7c0717665cf67fc350ce2e7f4d6e239ac11891a8bfccfd57d48bf3c116b9dfda18f2240a43df0fd37587357eb91c2a5aa8b09a3634b59a85e4f040bf342ac0ff9d516c30ca6416e97aa654b9b73a73eca004e4228a4ab445217c9ebac84b34c3bb9945c81bcaaf17d0ff8da3dc8aef1bb268408a82edf874a31015330c59eac12d8c5125e3b41327f26da6f28f869e2864e88dcbfad39abe569d86460e42d48d95fb887b4f7544a91f50967ab3d6e771ccc75cb3ea8d4fb08d7eb0f5fbb69dcb7ece6fea781a056ce23a4b737257f574a2cbed81c2de7f1abe493609e1dbf591106ed13d3d5d12c5c692759f0b03d86f7b3c7234704be8055bd87cacf0088aee502f8afdf0e8b48e85154fde3f3185b2c56830bb3aa8ac1ef060628997e4e947b60a7416065a16365fbc64813d4e8d68c85b2cef37e529de8291cf0a54dedcfad5ed0f8a2677e98919666a1cac5bf2f23c3142f65e49bea3c4f93398717f80c01d1e1b593842a226193b57c9a6f6cdb0f5750e41db77b4b936056a3e2f93b9d52a8030767c7fbca1a9c4cc088e5104097c7146ed3ba6c2366a7cae345f338feb01086a3693432dcb82d7d92cfb6ef9a4b1434777eb0bed8f901ea86d765293a05fd0420ebc21a78e60479da86c4e43c2717f8fb963b32483869ebd697a8c3c513c382744eca1264a4e3801d35003cc103e13c572ac4fbe2fa2a4260dbc88c60af9eed72e84bad57749bf3a7638f9fc8ee3c17c92e7a3c72c3df99f70ab674ecf9859fa30331cc05932eaec0a2ed952829255029779eacfe33c429c44667cf253b838521da5317faf2fff0bbc60968877024f4bf74aef668173300c49d039bcd89777990864b5249d0c4f9aec9b540e9296c0ceccc85d96d2c8a9851c4eae381af7eea511cb448bc98a47794f07fd78a012e6a78ec65d81584d22647f5c2bff98e5e0d3aa9aef8eea7c4a8dd985f9b683beb5df9081e71303c669288b18c9a19a5b17015fcff77c3a574155fcabf7d598a1808f50ba49301eb36b1a6adc8fde22b425bafd86b061af4b1425f1077bcd15c5cb3b3a452e6e1ad6a8c97d59ac55cebea70b4d9ab8ceda5ccbff25eac4e6e79ca92533b39eae081f02f492f92a768b6986baaeb293287b52915e7e48389a494d36c4e05e82d8268487c950dcf37fa6a17d611c7a9f4465e3ec13791f17cdd7774bdfa4bf550f49a9c1b1bdcf71849ae0235991803f72fc701b394892ab9e423bda93e2d4d1a2374c2b7e394ab00e7f9670d909c5558a5dce677eacb22bb308a4aa2842c29e3f0c2d0947731d39f8420f7bd5677844facc3cfd96ff017ccbf6d4b3f4fc833894879dc34738e8becc91e23166e415609942ea3e361a90a2795cbef1b1a117f097d01f89d0e40cebcc528c1234ea0663b81242018fea202d12d8f5bf12feb4c9e810584e39c7f6808d49c03a29307051549ca17429c16fc11de0c274e2a1b09858943ecdb5cd98a716bab838210fa2ad1918db7527cacee9e6ad5c590f06a10a3c664e59b4bbd06edf459f951ed4a743b16b2a315d9f413d8494d7bd17ba45be16368a2ba283d93461b4b20d423a927b1467632a4214b1ddef218a5823b82096be7c70acd6c644f5f8a17a449f9ba4a662f29e232c5b1d96e562e4b6acafef54698ab2753ae6b044d4582eb425cf0a2bca4b2790968f4aafbf60f7738d1e1373f0946737d8f9edab34b813db03703e4d09e33448953a86ceb932717cbf7a442d2f87f362b8a9b46f0e87101bb802d9db82c3c5de51f8afa9e6c3a558cef0bc9a6609f766d09ce3e02d911e06808019a16df768cd50107d3b37c8cc29dc0f6377d785547217fd0b94aafaf910d02f4f25a26db1d657878eff526d9c571e2ddde39540847640a26246641dd6052ecdec204f64c2408fc9280635e7dcb7ce23ec4c2b9fce07ebcf8d92d6ed3e3441ec04fe6940c528fd0fe7b4a92e3d1055dc954a97fbf2bf1a3c07338534156aa5568a79fe6b4624c0afa36135a9ad07bd1e1a2bb12a79b9ebfede1c0c47f0d33dbc77acf463020003733f9eb34d9a2f404115ef8a7bbdc254a0b8c133b8321b7aaedf1a5c8d34aa25061156d773659446a9f00a72026d08ddb27a331b0a087a7b5a149b7d005d48b6ebd64620fcc9be0c8129224b4c3ed123c38704cfa2fe4e2d8d3346eb51c835f0fd4e106033000000000000000152d26300c08877cb70b78e608110615490fa7768d9b3ea10e663cf38ae183a405858b01431acca946d289109f5408aa2c1114a8fed2620d5aa36d37d8b09ac2c659e7f65fa06b491c6fd2fb8d16e55b6df2bc4b04ec48c07ea88894318c0b5c9f9480bb86185c0d2ccd4e561cb8430ec2d50bcd000ca6665fa037caa56fad5b4111197ec7fbd9ea78a5f42e9e6d93fa3be33cb14e142f75891e516d2ddfb877c39c657470ba7bea9e91d653224226a673a596f2e859221fbc604fa76211e9f470a50e6b6e45b7dbe7689cf9f66103e43dc0debf0c3bf32ae4371bfb4972cd0c8fa33b0a926ca87cca2330d7340a5df548aae5e2b57ce7f6e0b28b569e704708ef6678087119cded40af2c2787509b2680f356679d4e374e7209fc96393b9a127eac72b4154e09d0d09421e0cee230ae39c4d4c730c08382742871541c433c9d55b04962850f0ec74af6702b8377ec28e0ed97f323f803b37058ec2c8d7f12884cfdd2fe27e745486c618c18d6e9a80a897e06c41901028f7a5a1fee44cdde2d48d091f793215f4a78b85874bbb952f02bacdd9234bbec86e2cad13686a35dcf40fadf899ad1d510b73f483b03252d432a7fae38e53bee977abb11ab09dd237f9c9d8e866f59deab0a1f1af69b3ecc6c753d8a84ca9c78c14981633e3e325147b85c0257b286dbb40aa00e7164d0c56c11209f390ec3eab5c78efc9d4c874d808c83e3faabfefd8fe63f834deeedb27894977a9b37ade1b65383e785d339f45a834c56a8d0392ad31273d802eab931bc9e59b7000c8e5813d4f30bbb902192f7d9b39c5c6c8b6c5804507cec262d656c418cd384b85825beea9862ac235fc00b12c1000cbc07ee57d4343080dbe4adb63da361ea2a9e105ae7ee0177e7614c7ef77a652f5a1d60ee7a72bb52cf46b8f56cc4994fcc4204f5b8c1832d8a21b7a69545dc31c194bf144e17ec99bb0faac75771b4296f9d6f00afb8fad0230a91f1c6abf469aa2d0cca8237d48d320c9330ba4fd3dd483289d521469ac02d195ef78f185d3a28c9cd8cf26fee7296566140563738bad57d697f00b53b001d67463ed084fd702010f50f472e820aeb794771c7fa5e9a0cee324cfb8555602826faf116732fca49898ea6f55d191e4d79af7c813f4e69d8d74f6e450f48df3eb9c167c5ff22bcde86930c39a5481a60c139228e285a778d080ac9f807e6d8de752c656fa83b10afd893939c9928d90346271cdc4d0251b4d0ad9c2dc7cd69f3541647c969bac4589ccf5636c9473a46b7a47a8edb148cdbf4b45d793552fff0eaad0d9c15d5bb8c8b5a17bbf0a1e56de1e5236364cd67f1fd503e62d505fb953a55930c64935a3f4e372a5ac5e0577381ecd641837f74264679b6e26e44bb3e035e0697af7696a4b7c925e59cfcfa5065c9c412d295bc51811aa342d4f7941e3eb3764632999701ad1753c6083d571d34272af7ec401b0b62d4ba8aa14b37c7681610ad57878f5f358f2940b5086a78ba48741ca0777315771d2448be59cd08231f61a6cf73a8cdc831a1e829ff23e46987a97622a12839d8c9ef1af20a7560e761284cffdca5c34b09df94e387c069dae24d52db1207814745e98db8330ae66759e4b059a623ccb59b286b187b81b7daf35d7f24c7861693920f1cfabab01eaa0db46ceca5999950fe2741894da966ab0252078672e9f78bcd0a773974d5b8ca367af86b1a33089256a5d29bb84f8f36178b05fa9c2d2022e2aca66af6e5505626ef38ba03111045b37f97657dc6e8b2ec448ff20a831cc3a4e678413efb63621d888239634b6cfe7b3192290d1b49d734ac0dedbe8e6f26bbd8d5afeb8422834b834e705d8af68537b34c9e167e62670dc6c0f5a87d312c4208921877da36d7c20ea2006dac8bc54b9b66457543d5214f1d05d9a4ee2af2db08dda5d0bf95528986f74ec6a1aa7c4a6810690781f78e70f6484ee14494757f03fa8b504ba610137085bd3c7df15ad4681b7f2090320ef6db06bda06f12c660d459d18aabf0bbcce05e89266b82f5d86b372bde0fa652d291146e8899a1e0e06feed4bcfa949514276ef3a8d27c43ee5f29d8bff4b68c9a18e98da3357bbaaf4c4ecc4518d949eeb7da8d93f053430fd8d3aae3b2fbd5333da080fb4c522a6647bbd6e3a7836ab890c380fa599131b627968240d26a48ec320809fba455b0d83931548edd0a712b6f23dac6ac6c7071977864f6d9a454b41c03f1ccf3c5431ed59829ff3488bc6765ecac5ff3ce8da37ed262dc4cf82edc6377a37930d766c350811baeff0181682d0ea1bfe05897b976690122edb13fca19fe9e202b8d93f04cf3dffa8a5d65c5e3ce4adcdcbd35fb16b29b1ceceb6ed40a0ee6e210466381837a2ac86bf2c3ac84b828fba6abf7f3dd638eaafefa63d0ee01b3c0baed62253be7092715de9143599cc3876e88ab804b70d326df8cd01271510bab2109f093c5db8a6557a71c0e6583fd9bf94d6f42119e9ff998b5c217be87ee1102ae472a87172679e3b52033f5696f0782b962faf0d65274155e7ff4aa6093a042d85b3a63eb33ee5c09bb591f0e937fd9f3cf895b93c895270eda8b0d13bf7c31d4664c087386d51747dee7d6aecc40c8fdec03fdfb728ad10741d5519b4656953ba5aa0a37958fdb95281111bf8543f40810e8c65e0451fb105514510e1dfcb7fba4140d2dccf998c42a18eb34eeac72bb9cfde8c92b082085548d372214dfe82471307d59013e3e3e7b17ccc8f3a6caa907af23c6689c997da08780ceee5e619c2a8777bb17656d2fb2e22fc4ef2e28366d57411bb7b9247d92cf28d08f0054957731ab095429da4c7bbd84edf3b1d5f1b28d616c04e711e2d745e4f7ffe436a9c451db9f186461ac893a1f3de4fe98cb4c62cebaa03f1edbc8cb7ed1eecb30b7a3715469c9ec0102ef5d94dfda77b105bb05818ff9fc5f5b08fbfa89d7f2b4c04ee45dbc43bdc8a29f669eccb186ccf165c8b2478eea3ec97f87c2f09b9859b2a14aebf8e2e3539daf6adbc443806ff16c0b487ca6ba7bef673251577854bf73cd9cd6188a2b79b0fad8c926008774aa4bec32a733e8acc6e0547feac456ac1c58d9e33e8a8b951bf6f8518ab47fd9f3a74db6e63065aaa220ca238f3204460457932a80ca02bb9377a42a742d80222eb74c2a9a3cb7a41faadc4abc30b034bac83cd290a4a195c8cc0646c571feb215f2b7ed42f6ae4bd80d126f55853ca04bd8cd69f9c2df9450ab998996c9f26838a9e753a1c49f8535621a1f58a1b1155459b1550aac450165104ea37fb0b0fe3883f6e522b518a10550451609763666b17f05484cfde75bdf7ddaba5951177b7c8b73362cec76da2702307bbbee68b3f7bd45cbbf591c1490c2c1a3f9ffd05cf44eba242745137382d5f55fdac29cee2ba31aca327aecacd575a1261d9896f7d5989dcbb31a2b71d586e2f32bf0794debe4f6d912d3a6323cb1711f69c98ecd950f2c5f7a736b7fd462f00d04e6748423c3e4868585ecc06d11cd61707e1314054c7cb1cf414eed96812ca9b53110296e3cc70fe99618c411c83ff938c13b425aaf11edf4916df79ecd93d2dc55e772aab4d565ecb05a28447e61cbac5120bfc034996bda9a7a1ef0d32db42f5b87a14604949e692213a406ad187d03e4e9bc48b05b377db77255ae6a88d1419fdedca975706d015d03b9e1ffb4842bfe20d4476c5ae1443c98ff8d6c0e06e0ed378f1e3cbb6863a33c64bba731436c1f1891f9b24b1a6ce623abeecd021d663c22357d833c91f4d26dbffc62fea9042ca4e3abef2dd1ffd499f8cafbab5904a5b26de4d61d2552fa080741dbeacc0a8d4f8ae8d8f291ad02ab947d24550d96a5a66dfeb75bb65e4e61d52c6f182b9dd79c5957a783dabe93bd3c80de17e611db68c47abbeecdc369635493bac45ab95fcf648f1a60bb7772c7c5e08f0ba4413c3fd10121a9761babea2b94d4279697430865778931c2c99b69f97670d019fee3653bb17ec19eebc27feb9b73d802b57681684186819a6ff494e58f1ef553dada9291da5890dabef1314e38f316b5fd02134423bb652f8d6946e30680545454788e7a21e4a95057c5e7fcc8e5c8da4ec5e9164fd29f2d8fda77fc7c573c00a9c0c4608b4f466f3f34bf4a3eed2989d740589a1e58d9817b2af1279bf0cfa1dceada907b1327704cef6ffa9b8d488dfc0af7d095ec281c924fd07a6e8b07c913b736c54eeae4382f796c086d683b79f720d3b6424d4a062d1c5377e6eeb5ffd31003bbbf8544e084091d747d3debc0cf868e4447ce9cf0154cc96a4568735002b17707ca835f09be9359dae6d370db3be28c9ca8756aca094f8eb8f53d92aed941d87875ff32c3ae73951fdeb826fd1f0da41e6c2d9955d26812ebf2feb54310066ae3b006a4dc00c479238c6799c9763f02321d2de18cfc43ea30009acafae17733e200fe8d438e092945f23cb21d5b58145f9c94b0181d9de2c6e4c8f2305fabe9cbe4f1a091aee08d86cc81a86698da27e9a41e7bcaf1d0f12692a52b42e3fbc3a425d161074209e80c913135dde51e88ad98181586ebaa580d14fd9d990ac45a82a151539f32bf2d687ba9320167ff41c17471a83f51bef0428d4ac170de897d996c3560c4a0403ce9102a714fbbb82de265291a78817348ab11719ac4522b3b431e5482859537c98d716ca29f3b8c5447ce61bc518aff74e4ba63246ad6e15afb088c7339c3bf6ad034e616168586df24c426936ddb4ff2f7ca5d3bb500c82b5bc9e40416be14256532d6d2af8ec74018a1edef32672e6dcab301eed35725431eef904313307e402ec6c22f4c920cbf5b7f2b13ecb9b38e070d690de95e8889afac5be965ff0bfa8cc94850f163e918cec73f976e724ebd250b6bf090b3401cac1c4b03110a1f333ba14c1d18d4163b317fcbb1e504ac7f5bb4157da03d8d558e2e28ed39b1746543a9de70ad1dc22db5dd30d6fc9105f41835f7ab62f6385d7d6d1c7dabe700343ebb2f3c1bbe3b495d6787304d0054506027ea9bfdab80614bf811212e5afbde6f1b65620d6b8944845ac9558a64a1913269930b6bc157f277eefb1074dc15d82036d4968801facf0d2e7719c8b121790663ffaede7a91a1f4bdb2a83d7336271ee7e996d6721673b18afb4d2472ed31da440b7fd452b1a5b24007dbdf780f9f130fa3b73baca86f2a4be1229ef5d83e8ad3582794ba182553a3566392eec9f7cfcda8c6ddae331fc63e519e273383460edc9e83061a7f70ffe367384c6f54952d0c551e39c321861e3b925fb3ad7c0d2df20874e649aa642a8f9604c2c227a3879e1859e1e238dad258117c2cddf963c7b4831d7564c66a2e30bd6286cc7295da97c5680ef22156e4dee2ca43ac1a1a12a065bbc82838cd81f48c7ba19780225810be3496067fb1e3df473951979a68a5386fb956aca68e2b8f121fe47282d564a6bffafaac66c155e0af643e73abcb7c61467c9f832a2680343ac58760156fcfa0db2f540a221b9d9cc864f53d432521a54f4cb9708bb127c85022078a86a5849f8c5dd2a6fae46980fdbaacb0fb41941fdcb9900ecac65545d286c14e22d5f89fef97dd2133bc20649cb8b68ab81504ab7fa61bf544f94ce7f03f2fb28102e7f7f47fa36368bf1c17fac2c5737eabd07998c923d8970ae3312d5da12a3b46ded0bfc2415020246041e162dde05b14888b536b5b870e109438ae2571f73671cf3b971d5e3145c50813a416a6f6e91c7f93d294af8fd37061f126a6404f98f2fa1dba62716bbebe6fd4b527964b49e2b26581af30836ba8a6a28af460d29d815498f571f63e1643f9806085056c338c6c0ce01caa00a344d0dd6afd946bfa397813196c9992bff90b10000
175 | 176 | ** Weight: 15261 177 | ** Virtual size: 3816 178 | ** Discount Weight: 1764 179 | ** Discount Virtual size: 441 180 | 181 | * Transaction with 2 inputs and 5 outputs:
020000000102ab976c6e4c2bbf73afcb1c4fc1b43b4f5773f82bfd178097ce1b4820d3995d810000000017160014ae3d88abe6df555587401ddffd10796d3e178ab0feffffff74ca98d2b5395790ab91b6067134057a3a02d70987051d36370f1791f8088b5d02000000171600143dc23050c59588f9620545e8b757e4da656f8960ffffffff050ad6e9bb5e976223d5202ba077aa7a5a24dda275e94c8912d893398131399cf0f40866ae91721f063e8bc3b2c313e5648ec645aa0de5e7411ccf202808fbb47338810394221b6913ccd26cf3f7286057d59cf36849c88da453c26c2341c4b689d09a6817a914e068abe572a132f57955f66825a8ca980f25464b870a48cbc3c36cafbba89092fed6da0dae74b72e7874b91ffcf11b4797e2d4948158091de50e3c8a35bd82969a399473f9e2bdc353cb5eda1964193a462d9080022d850249398ba9ab44bed25fc5136dd92b8e6e70156a7df1f3e011ff9bd46c21d6b2fb17a9145cccf7691fddf4dbd2d8c2204576a9d59202f7e5870afa190e8b73f8c7c047a9af4259875692c8d56bac7a56eccafd4f25b9e74de29908a2c5e90fe2a08241f7a0de26fe72cc132137da315810e74fafedb925340247a003fe22ab8fa8d382da43fca85faad75ab8bbf8cd87c4e264846bb7cf7022b9e87417a914f93ca781627fe5c7895eae88d7dc202d7da9a080870b44629faf6801146a3b8bfc0c167d4618d80471d566e2bb282d117fa66fd54b870874975c5ddeb9784331db10be3fe7b6bbf093086bf50e22cde490e8a464384557034355ac6df9c313389d17a658ed00bde74747262ae4d97903244f75fe8690c91717a914efbd9f0851e68d5413bedab5fa8e8c1683eec68c87016d521c38ec1ea15734ae22b7c46064412829c0d0579f0a713d1c04ede979026f0100000000000001f90000a3f12b00000002473044022012f46b718d225e6c72fb81e40ac8d1cd51a625169d68948899e5f83842ee7d9c022064fd2b4c93069e50ea4b3bbfcf027afc89658b204f20001757c8b21a9e67544c832103a644e3646f143153bc52dcc816764283fe67ff9d34ae9103e218e15e9f1e27680000000247304402203c01fb4c469b99a53e163e3d423b9a1c1f2d8bfc8573cf0f71adf0c80dc1af4f02207e3371d745b2a53e60c8bb8337fd8fae7e0d4d06a1b0056ab871c5ae9a6919b9012103beed4731641c564d8e4330ad3e1037f0f3c183fc70c0547663736eacaceb4ce80063020003131378eb2d79019106afdf1b53713efdf654f77556bdd71fd3b4c36f5fae3c5e6b4bcaecc8a99e4fb4fc22b25d52371180990ec601e8243841fc7790898f57349f08675e6c6e4ed61dce40a09cf352cf3b834a8175351372a9946125825a03e8fd4e1060330000000000000001acdb12015330547e27ff5b3e46c21fb47d6e204b168dc81034da199cbf192ae778db22143d316109054c5e3f93191b777daae791bc6a49604c8d1b04a599fa4396fc97634ea3b6eb38b00b6705c14becfa12d3e4c6ee789e653423612dd0f10334afb0818e5ec33e7ccc745118c9f45af6fefde1e645c849f7c50e013c85492fee376afb7f7a19d4db64e1b7c073b10365925adeabf03d319036665ad834acd5d77bbf30fa9e9cb28ce9e069bd22851f9a2612a79ccb209d8e406a553338b47c445cf535fcac43cb6b866328fcbdca7570f9d95216c6c708822d5e163b7d9c4a8459c4897105f20764cfa709e12d3e5013609dec0cbca55da1b07ae57795a7b25968664503dffa63c92af1e272a6c0fd7944cc6d5b2d619268f3dae022f1cef7cf26b3b69e24d8fc537a5fe378a3784ad6ff36562b01457dafd90a8ece8393fec37e3fd880aae7b90056e11309c30160fc9bc8c511467b27f4b66035e92985a77082216b18ae1579011c166c3acb60de4bc39f631adc2839eb8ebcf1c418b1061fff3d7f061c209dd4910632c6ca77cd7c2713c778a7fe77d188fdfc66a640b81a6496cd334fe08266df8e597876802c2ec22d7fd2170d42a39e0c794411858b382f2e92390261b8cd92533d085ff9956b7bffe056a2f32079179e76931944820ab61f81e9d3daf588846a3a0b82581383896d701c5169d9bbb07567cf5ba4bd10ea62234291fd37c67427aafa5ee17cc272a81e30d9677dbfa1731efd575c0488ec62afb4a84d1dc2b45eaee15b13ef7f306e7a5f8af9b028b499fd23e0f3de2b1608bac26d222edcce8cf1649f69f7024496a9e8ae8fc2b99d0402a9269bc2853efca8c8e5d91d5404f0d62686481e47e6b42f9181f9e68393bd2bb2e01ade29e3385ece0c5a16b0732e5d95bb5bf869a565ea8fec0cda97ac175596d9cd6c984799772ba931d1a5bb21fef90d8007243ea9b99c5c1237f34b6670034decd4d4361bc6076de9f706de6f9991085f429e42ca0ed5b1f066252272fea3bf04e4b35519d913d016e5ebb1ce00d9c7ad7a25f7045e3e31ff7afa55cbfe5c4528249c8c4c7c48e73828be519a84cc8ec2fb9e52731910efab2e527ab7e81afd0be3e6d29e002e145e3fe4af210461f1872144a1624b42a34efab592867f50d7f49a572b95d333d9ce6eb5375fb3fe32e3ae2423d73bdfcbad92a81ff847c71068393ae74d51e369ce59b860c59d990b06c41fb1ff0a0edaf9fd4471da379a80d916bc6dcc95af77c004ad97d0b86f19aa5563598c495f2182e606bb117036509b977fdf30b62cec0e73c33928fadbe5431e0e84b70fbb549fbed55d52112426b5b339d77bf95c492fe0918c793302818fc741d89a2e94e320ac6dcdb5f9cbc0fe08430558ba1490789bf88d72ccc5ae23265b8ee040bc790a59cb47b497f8996d1dd07d917fa0dec09331ee1bbec5d3fd34fc6789082e8cce251d9bf51c7f7d4c740b869f2b5fe46eb32157709b9c3edf93d44c5de58fab161a176ecf32bd07098d1f6b0111ebdbd0701a333e06c4a59eeda98b8431dfd6086a49b67633ac097c4fa846a635268aa27f19d588258de1ca5b94f62b0bf5bb703ae6cea9fd530cb28c470a2ab1a825e280621b7ef06020fa62673fe3c24d70a12b91c0909bb213286dae3718a381f5c2ded80c8aa4243a6b27352aab4dc709da31f26d5ea126280e093bb0e8e8c0c3e179e506b69fef140be05b5c7bc1c46fb575c0880eb5588d764307beb5c806648f42242dfa60f388f6cb7564e386e93d46e9dbebe4db9138b39b47ea382b1ccd0ce0c08a7d4efd0decfab6061ee5bf516567488d2abae6e466bcbbb9470d2340c48388bf9c0705746aa2ad913e41901d79bc342584a658e65fd01c386fa73fd65443d36b28e8e3df391073f5a60b4bd56ff6ee3463dc1817d0fa3ea843be41019eb4e4827a7119f9bcd3d932f6e6684c9559273c68feb85c10c2ab93f036ae20af896827f81c4be0a2b49f8f668a9b1345a25b9956e47010cc3783be09f82b825ed64f254ea9799438d0804f40e4db387534966b83d160fabb0f4afd9b098673ad71ba77953eb7a4fa01adf33be08b77914f296e1c4df5421d6449626ee42d76d826730a0cd965805d5abd13e0aae9756a2bc676a76addda5cfafa7da46b43a264dc1571feb9b4ba9c1b68554131f76e3e03316fe6c58ed5a8a91dc0cc56b98f7467b7e6ffbf5b74e926d4265fb4cf67a34110847bc051789b9a78e5976cc24b4843ce693cb76ccf557e9790ca726d2fe54caebb9f79ef1de03adb97f2ac8a6f5b38508e222d0807f68660bf8f0578181f3b3f54f71cc64badd9e5dbbdede7e026a1143450a10feb04a2637fd32030f84959f7b9cac0b4d4c75188dada232b457e29c5ae1e683fda8379bbd2ef06c6b63104042a43c3461c7ed85fccfc7698d959509342b6ce5c96539a995aa0bf1db4d85a315c216fa44f8b364aca031047fecd15f9ae7abd55f5b7442c31ba42bdeb90360645abf11303fd332bb6e1abeb76b49c435fabf51ee378755a40dbe7bee27ecf3a02b7a0afc018e5245c3c2a7163ec65e948341f9d49c9037d5e1d3c49e8222d9a278672603344f5028498f71dee2ec4b8603c5fccb444b02b4b51b19114e3b9b55015fa5c3dd58244ba2fb37a00a58cd8975241ea117040dcefcf63fcb6657515ef979fba766c507975fae2918adeba5499bafb5e7566fedcaa568e115b777c941240cf0935909f04bcf6181c8d2a56e4fd7d4e724d8635bcabc42da317dddd2630d0231983958ecd3752fa57fb28ca18836927c8ad6ccf27f38c5e61780f9d39458fcf00c5211564b10cb47b795dff71d38f976ea6dd4943f5f7b65cec3de4eee3337ba08008502165c34dda346cba53514ff8e65a7b6d3a034e426e3f20c6369715f93650d51827999085f3722667bd67c024b273a5ade9ef71cf49f123733d620d710b978455f9b34beac468d54a089e19f2efd1dd985dfff7e4c812d4b6cecbf6e68ee170e5182bcc316bc5123e9a7708f20f56983378d8368402b2d983b981052f09b72fad2da65afe117e0bee4cf10a5a2c198aa11f93900cbb5aefc5169dc172252668ca1fa1213199613fb7250b4f2cb12b393fb3f5360947ecf2c5869d6d47ef2d3d57aa2b08863acea3402b02b40ab55e7e528049c471bd78ba56de7bc640876f4d819474eeef05ac0d6cfcdf3299b2efe07a3bc21a2d4164b4a47cfe110d5f78f24827d56d9fffd03182f5c17ecc46eccf2a83098a8149178089247432a25490b5d4a7560de0279bc7087a31db63183f43624759936f78f04001872cdb0e5b9cd7e8d2f74310b4f71b655d2a2dfb1e984ac9a8d078f3ff130fef02e89dea50f23329dcf3d2f31bb1dff2e3f02508208a44e495ce022a8872e01df9211d6974a06df5ee8e061477178f5787bb281336b626bb4b59db0d9825e3821aa4a6667ca6ca5e41f2f76bb775279268ab73d3dae30ea712e26cca4b17199e198d1033125d58903c0ab67881d43c1807e0ee6b3da6258f96029f14badcf1c9f3c55b269a752d91fc42492ba2493c4f1331c49f9cd471310a11c624353eeb7b58dba7f9c5ab9d15bd8398048f9f7a19c73b68df77fe00070899bba94c70710347fc068895e045fa4273a43e868b86b829cdb57d2939922e19a9a4d037467690637dbda796c627f7a98d8db014843cb98df050df7bd4bff6b3b6b1770f83554e8a568c6bf9a66648bdaf6877d9a744998968a9c3cf3ac9344c860ba42fb935f7d2ae7401404a56663d5a3cc331e074391331343df8107b2007d2715e326ba9a34e2eee745f20c8379fd0f6f3367480bee9faf0c73a7d52df5338409fcc408b6f5a68d6fb8bc1fb7bb010c1271a16cc5613d7f35a530057c7dfb155d66793e546e61e4f82a0fc6cfb317673218bdc3dbe762c357edaefa34bc1901f4a91722339e065cc0c6e7ef16a7e61e2385b13330b5f3303a277d6495aeda5676a51501c0be28f60a36e71ebf2b702eff9e5d5ef5a862870e8fa2afa833245a2af3b3c3ea16a79d085d3d2cc52e91f3ea92a145007f212dc16bd516b66e0da365bb72f4c96d517526eb08b4a8c58006cf6fc83de23b17afeb32ff31b261ca0febd4a13af1ee270955e8c3032be719dc5f47e068c3f7755c2861db8c77d231d68e02720a3d36eeb0f0bf53dd81519aa9b733f3f51e4a7f29d0fc73b3641e0669fc74c9603324c249d0b9ac9f00da89f3b6fb88e5a639d016f4111981586494cdf2db3718a19fa4f68dfb3787c98db541438dc3bb4126681fa9593e40befb07746a7a7a8148724c6ba57037110e44a2798651e63d895659bc6b461cffba68d445eb2bef67f3ead6e52ae3562dca19fedc4edaf67a3240648de95e289e485c13ed97be9ba648ba1042a90133b87742c6892ac50e5bf7d8c3123c894fa6fca5443ea3516b52808abbd65ada9425cd6a5b393152a2ba84cc9ba876fbc3eba031e4fe611f9b7ba662cb6b46c218ebebaf55a6dcb68947f9269bd551f2f1aa564f22a68fa8eeba7e797cd172c35eaa0ea8e246be2cc102fb31d9421b0cb53a3d95bbdf1764743b7d4f0f78dbba9e67369edfcd2019fa70ea27da20eb0993c723c5d6fc23a4b0da4bc79eb64702e8eb7d19543364eac3c60bc318c17fdba028ec1aea11e370eb6c05303a021326b20b16d057402cc5e51d76fae7276f80226344f61e902a858b2ad0a91f391ff674d104f0be3329c0f15d7d777bb2678bc8b268d4c252ba167472cb44693a2a9084db2eb1bbd1155603a8c62b45f6a152f7da8a8d310d79c57e36ec43f450ac114f698e88d9a21766be7b5cf0f84265d55575adbbb2b7204514d228145135428b40f86eafdd61d849bbbab69f6e7ebe9768f748b76adfd4adc52bada2a1d9a209562467554eb8add00524b183ae24206f1768a4c2c3770b8bde16a3a62da89e89e07ad97f57ef6a63e4e6fe6a205811ae90f66fb1c50875366a9c48ca3bc285d9bc103f4169b2c5bd279b8436655ee76a022aefb902e1231e4c413d271195b49470d87ff3bb3e516b24e1fd0b1a8f1c0158d3275a9d1f62603aa2f73d8fb6a1176e85d55a803924b6306e37f1c40657035f04cbabe02fe095f4eb86966027c389f7af43bc8902fd13088d897e92fc7f038a5ce4ade6a1c3c3f8385dcfcb2fe32f032fe706362f7ff0ccc26f9c55bbf6ea5bf294b24d2a52b35d6e8e5682cb97358eec778aba351966808601fe2f3eb7fffea3acb74644148e5e328c646b5a727ca845bd661f7b6caefe53ad9e83f3e090a4f54f846f3abdd60254c1ed21a4ac7f581c27cfe81b6841a7227733f20bdef249e9c0efec82529e4954a6a69d69cff1e3ea27f9c856f664e2a55ef44ede8540eac8274253f0834d0dc0187e5f1276d968d709b66f4b78f089910eee3573ce8a9c83e098a61b5476756a488d4513a84187746f13931975f67d60123a29c083dfd4c02ca84bb686ada72a873e325803c087de3762fb56efd20b89726baf8e78c7adaca6c88b15bbe3f885cd2964bf68dfe35ef116a3bc2bf0abfcc1b3f623efdaac3462383b27a5485046421b49ec9c9e67757bb012d4d6e477f8c7977ee58a31d8d3e6b6188106b6c895446ebef7372666c620dd0adc598a712f4466962c66dcae7b70395288be1a4a7a6a0b1ec3f8fb61354e2b0e6c178a2692d34083a31ee4dec66eef8fd0b2b2f33fd972229c8eea3efdba6ef11584be3fc0f38770521a8e9308153e8ab2a24696f52aa687395cd9a0f91558a82b6321ca3732908d4accf78104a90c2ac49ccef693db5da420b1cc3b83c16cb7c9d65244f06ab4c7aa4c57776b09f7902c35bb6d9e58c7f02811b09b7f7feed63fe7963020003c6eed479511be281d319a5a044814d47fa6ebc34e11d61255cc572e419d57d07d313d2990b06aae88ee3cc93cfddd9c058d86407b7fef99afbc7e234be134a9c3147c5cbcd565daa2ba3163562bc241ec8a40a4d8bccbafea54a8d146ca23c22fd4e1060330000000000000001ef8d9700e10759fbdb67cfaead65c7edecec3a3e93c5d4dca786e9777542c189a442fd10c4829f4edba3cdddc6154f031e3b40088f3686ac1e36ec8a43fcb4ab85be1852d3dbde312c5972a49198d9d53112255a7650cbca7db0eda3186755a7d911fdef5cda4c4ac7f0e582b2699cfe4f73588beda67c2de3f1c86962b7196ded05ab22584689ecd3629832f1134ad454e0522df48cd596e9e56bfe588ac5b05f500ff586601c4fb4ce7b0f9b7cbafeb392e7882cd74077d1abc6e363061d50deb1d7b3aa70749157c53c4e3a87d032d9f032f4c4968eeb2e12a217f156ee80ff775491d7a1fa08447728e00f46a618e343130853d819b42ba5d6e5547d82d19a815b3171fc59970dee04a902d5469fcfa0c42f1e51cbaa53ef15110b8849b44931ed15b03c993f4eed1096fa86594dfb4b3c338ee3edc356812df940d0d3e9d801ab3eb69da1bdb78af86d83c08c7b04a20f030bf8aa478872e78383defeb3d07a5b61bad3262d9170f679485742642b7c877e67df1193e96ef857c48c1abd532ae96bcd3c0131c5706e46301e13310ec83f90722bd5db804b7e23d1b042401171ab5dcbe22d39d979bcca996d088e2cfe2998cfdf294ffab0021212005993c7cd74d868f8eca9a43596b2516160e6290e9929edac9d51f3cb4b02d31c0e9b2cba6d389903c401e313e7f15ab6c93361fade62e7a44c54125b59908060f019beefa2f11c936d54d8883e79ec2f0851270336b74a4abd45b61e70521a5b7c7340f7980ae8be0c59f6ecc2e2037d583e5a62107d4ac633a6b11eee3507a24aa838b873dcb82dae8ecabc87e61664de9e7c5c39edf56f918068c2077d06a0c197f8624bc1621a503e3c26689f3139dd52818506a9b998c5da7220caa0c5d87e502b1488b6123f7e2c0e79852bafc3590e4eb8480c1b11723fff908b2f139bfd666d9dd0662a18c42ea16d525897abc0313b9482c8c8b6407112145b5c1d085260aae6684692b64ea4219d16abd8ebfbd4a2619fce52d737db99e2b16eb44af4c8415c7eca0da53b7eb67d80d08668f334fee5a6147724d837d92f1891c2a6b9f3dd1d6054502585bd6d0f9790cb3a9e79b1befd52a7f440deac77c148c732e7bc43f0b85bc34946d89628f070e514ca11dd182cac222ae284a36a84907e12f9cd22be33594e79170201f415602ca388e43f3c193244eaf314cd9cba0032299761690ce7e8d3a953b7fc4538ff6823eea5290fb5c8ca20778d8394b09cce8b1b5deb7b330566d2cdb50f5f4920d026e954867ba6d498ac3153bfd3621daff51edbd1beab0e9e8d9e496bec8d9d5809b37b3dae396d29b8ac1fe7e6ba5646ab4b3b65bc47a4e90ec68e0f263c33343ec2735e6b8bb480614e07aef9a4d31c1b15a169ec2b00def13c5cae2fa1dcce9ee112ccecbea5a7a2ab722c7031b3562a829d78c09979d6a7cfd65b529fcbac6a819788746b4ca8d55a05915cac934f6aed14760e4bf6fdd1739698d52298badde1e9cb0e430f32236c00b996e7c6c692af02c7b6d5519e8f60ef29616b2b4e977ae2c922a3ee5910ad41f1deda9daba8e2a0ea698f81dee8741cee1842cf9682e56aaa96c7c89e8ddbf3e48b198206106263ca3f8485a7fa5e73a5a7d86f44b327e7ce93bfdc87d254534d10c59a6f0b5c55d17af4053457f57770731032d494e99f6c11920d37272cb7a6022621bcecc6ffeffefa440bac7aaac11e04edcca59424235f9f7fad3eeb95ae3f6befcd8f01e7db60a2429f52a7a5e0131c4c4fab2f4eafcac33e4d91adf9bf75ca72f7864d0dd03760dc940f347c9dcbcad535929580350a73c89a88313ab145a497bc0fd41144a8af0e1a21bf578cc69a164757412a2e2bb8964a3962ca4d4c92616c9a0dee338346d7d5a871c2eff7683b3ecc482f14d5cd76c01db1967b3ff1f1aae33c5f677ccc249b90bd354a86457529105944c12de1097ff49498f704941f4860bceb4c95c07b6da2e55106cc480d988ab94f1721b6a744e968355b68a392654b43de75843d827f17290ce4bd03c0dd1f2b72e7cbe6e569a3bf675645a3cdf04e6d8eedab197050fb809fd385bc10af84fd4cf8bec449a2eee4d6030c1c2ff518c6c2d852baa06f18e926add939f69c1d7cd038dc3a348b957092b51da49e027ee77593c9d2e4440b2300ccba82d8dac76be8482dd81bc5a69ffe27876d6a8899d41b49d9e71c4d74b061ef2caeff7bcc05588434469535c5586096767af2bcde19880e8daf14061d991b5b50708cb62ceb2c67b71c70ef9c7aa72f7e35f221ca510136e51cbecf2e55b99b61ae66f1d3d495c899c814a25f847debd30b06c19c8e4ee530b3e44fe3c8763a99e77cbfdf2e225a08bc25c9be3b39c6dc8a9c0db0a9ee0286896f2e36a67715f13ba8010613bbe22c4cfab5e0e8a9141def61a687a7d550d271f20c58e1841429fc6d9d42c28bdfb4c179b128f6b696a124187e8b1be128151cb1121b378d34923223b52a6483c757aedc023427068cef20d347eb5ec15761c68e175b0e97cb77414a70b2da690fc23202f1054cee718b8a7ab9e4dccdcd62a2776ae704116b232d42b5fe071748dd946b8da637b1654edacdbb4ea7087d1156cd7499b4454a1891ddbf7c4d943022668da24ac7ffdfb61c97f5728ca2592f8f5aa6738a1f27cfb430e528292b8ee3fca9bee53ea473b002f71cba1ebf80d7a610c472a1a40b6d5624ab1366e6cb3962f898d45c886164221eb68584aa302aeed53025fbbce0705d620033b7521e4a14f8310b3719e60024044140528b1b660845d1dbf88a73e92eb1e703667390fc02d24c5cb7546c57ff20924715ffa443746a7bbe010c4c22a9b7adec6c8a208fa7ef080f5e1b4250c5d7137dd1c171c6dca718d38ec421168919f7d1d32e0caeb2617d760e5315338bb92e89388e2f8ffd59796a260539dea8c0b4044c7d0557e85e4b5d94781802249d714ece7417f03fd553515376a5e557d4eb12d5f6e3e50b26f63d39af3a0d40deab57a97944f5ed39e2f26906c18b4bcb7442f363a85162f3ba84fcf8cb884f3b744add81539c83c238138db90105a7d55a8ed180076946fdb9041ca9d49f11498a9d6ba47eec1ec12922d045985d3ad9c221c5bfa00c13a3b9c4724978e6cf0293dcc5096e88d6a6dc05ee7446d3faa428938ea127279b88cfcede2d0f1d372a2dd4e42ea3b3c2c6cc02acb28829c9a6d04f7ca35e5d43eec6e5a6d37d0c518d8036cff343c8d02ceb6708f7b017bafe15eb7eeff147dd7b80cb5c53e9211337d6b1e0b81ac432f18be34101bf3b973d577ecd3dbcfa1add174c49dc1f5cb0b3e6157c68aa446ad34662918419e4fd7e188bee6103195e3731c54b6e86896ea4420faa9768cc838055a3e5894d5b7a068cf064a8fe5002c998ab9ce325159d692f294b89ec826ef69874226d06c8eefc8b8f114deffd065acbcbdee9c63780a1228afb1b7194ff1c1e2c6531aa710f6daf8bcb2d86a92ffc84aa66c069966dd0e7aed5077333862dc4ff744b86d67d34cdbd16c5f9e0168d388a22f5ca1d35439ba46650fef8e2023fa494d9f16065be9528d60f78c70483396ab20acaa0e01824849ae7471da87cb34b5a3e8621a632be00a0d46c10b2321cfdc81dc07f05d50e433a6cf63804bc5bb685eaa1d3b4f74f11c4766ac587bc419688724ccfdabade070c77ad5062e8d6f02954939137ee7c9ea91536cb61ecb4fa4af1e0b963d7ac273c1337c449fbdb433c620bb4bafae754205d3bd31d439007a01a0a4b14f3ed758d84f0196010839f851a03e7d93ae1ee1d6deefee5000c88c027293f893a4235abf28082fc474a385853ac16ffb4b9bbb6dee965357c9a6e8a444f26d08898404f0e237caf0762b939fcbd149f4f93d5066302b067b66a6a5167089ef76b080af5f149874492f94dc25cd4e8e86194e29556c240824347f9a8a0a2379c6e2b695d6922dfa7b9147f99558253f25fb76ad288f957d950312a96fddc0177083d3a0d4f05c93f534f183757b57a91d6fd6b7713b713356ae97c40bb048a6a6e3476d98ce38a140aefd42d10f66439425421b18c06bb39b4ed5b548254ac26e5aedc7acd5d7cb717bec6a26579e71950523fc630294f051b852fe2dc17aa6ccf80f90efe353ffe22f9ce0e0968f6dba8325e609d2280ec31cd452366a7faee2df981b24aa025e1b1ee86cc638cb7c11b6f62079d5c30c9044560f839143d11e8cfb525bf3957b14df79d8ee9e669ba77f4cebea65d4ff10487a673b581be273be031dbee4eda67d272bf2a6a63023d5e1db08e974c2c1bab887bb2c59ca99d0634f75f349095772620056439d21c79dbec4e011e18d1aebe61a5715ffa677c789a59fa05be6919adf1cd7635a2c0bfd58e67f07b983cbc9d0a534b6e8802a88e927e7e934af20159447979462d01d8216c5b97ecca3e47aaac340d1910a1090c2db3a436dec160cc0a5c3a62c83b9849dceabe32086d9ea3c4f2dad93d7dcd4bf15503ca1f450f8b4536190395a2a492c02d82c80a50681967be1e2206808df4818c720954418ee91c126eaabe86c9f7d9c5a3dc49cbdfa9750da9c8fa0105601e6bed190f60f15e0e1fff0e9bb41d1fea36ab46144017f9bdf146a11283dc34a464e47f2e7519f1711e1d56dab7794f6d74c659525ec0787afbdc65e065170db1c40c693aea7e7624dea9bf3bc2223646a59d2f18d6f7e6b6d2d69654430ef73f48a598458862bdef577668c5171dd371a66c8a163ba587a46bc8fd8de4edcd493cc1dd77fd2a3ccdabc001d2a8d59244db8435093876649f8e05b326d0e85d301d10f99e551d494da853f7bb6d463dc8d181cc8f3f5c77a33184fec2f6b974624f76b26926e2af6423370d71c5d52e19d1b9af2ef0b9a79a28fffc22471a50139f94f4d64d3b3d157458f668801879f1031196882c4e985d804d060322dff0e9a359ada3958871b712e5b496393fd101d0f2ab6873084b19703e516412dca0e1f8724d29fe4f5b8d32b840d7b7b56ced8c65051ed65b533ee138e1c012673831aa096de90cba77c58977357ef84e159b8141784a6ae59b7024e2a87a0ca15b8e0d8546193c517fc65eea9debd4615caf03beab72edcd2bef6df437f50b56f61b3fdf47d065cce7999794a1d5c955dc26e1c3d2b52c0b62729a45f0410ffa439bd8c8f439b49c1c96037280e837fc4f32796dc8381cb37d5a174e1ff89d4515609eb42ed7d64e64cea08ed57c494f9d6ce1c0c5802ddaa58f10ed29f6f8f674955f0cdb9f89499580bb188985a29c4c32a8f136622561fe82faa101adbe4e025fcffa7928b59e0ab7ebb24082218f35229315bad63c3ff4fe22c9ac2693bf924b769f5507f1a91b8645049dc26602201dc9c631ee36b28075f5bb8045d951899c97a1850edaa7ea9e44975d7dcc796a3c416d4ba00b746eb61c71e738b181a9054e6c2a6ba55c1c9bf8c1965f898b8d2cdef199f3332e5d5ea849306d948cbbb9ba89961baeafd5b46ace002866b881678582b2bc4b0da6e0b5cb0fa4cc723c9db2c2198dc2620083f9877830c35b3ac64678b9d613f6c394a66f9f5b91b35694a1b4f0f243aff3ee60f4dd1bf7e84c8a2024ef3232fb171457970dc8417c78072aa6ca4842e41dfd4c6a1fd8a201d15d62ee4e29f086058cce86603625cda4eb201e58f5673e9a24ca754128609b430a1bd69dacec02b1e6db42d795f25c4e1e5b95dba01d6c7b3352e08dc153e1da42ee204dc01d9c35cf04bdfd296c8e643802f0216554028ba327887b047202210d551a3c9e4f78dcd4d4c9d81cc7d65ea43f464d2d258bc2e1d8fbc9e92b8f6095d3f68490fcfc2e564a7c7afd9d51188b71bb65a3f8906d63020003cdacf592fbf987be58586d8c2d23876b58ee1718ce6547fa75a130e6c3f34db82896851c27c88b1619049eb59731e55437ace3fcd83cc54e5a8f1d76175776a64fc29af577f02d92ca6e980e0c040b84492acc566fe89db98231426130269c7efd4e1060330000000000000001fb073500c9fe31fa0c4ace9304cb6779eb1853f9950967c81de8f0c8840a88fc719d758aac93972ae5abed1df8e11bcf51eb4991ed8526ca7767c4dc2545a9cb0f610da226b052f26299692f5144f4e3262c78654a3da6cff85cfb7f9e19afe73780bc89b320ae2c78135db5fd4913715b41fcbf8f44d09bc739a898f6495fc1cd596e1ca269e95ac7fccbd9dd5c660b1a97bcff3e37fa7db00661ef242a9ee338d64a5ef107fb72bab71856d977c8848a95d1ef33c68340fbf8681bb51041fafc1170cac8b10150c29303ce45dbc826c765b1b6d59c15b1daa8f63c6fe1e3506cdd325d98b3e355d558731fe957bed841494c1d353bb887d48a397122142771f4b1e30199d3d39e2ff8d4f802063504febbc7f8e402046231b0de413e74d9efbae177463e871eedc94f6a8ce53f3d8843387be07d134baeecd2f88cc76de8cf68735654aabc79074f62f6c50b5319edb65e0b82fab69cdec320208bbcefdbc03a0682569cfbbff83a370b97c66e81ab53a2de076c5ac34ce4979a1c2fc6c1cf5c04925f8834e0211edbb95d3cc4d04fca2d317bc28e77969f69b23a666ca90aa2e689b26f57457bd0a766b43baacb92d769661d3bc42f302e055567228a0a3c317faca54ff0bcf2bf8f71d1834f1a86d4f9dd56f67d90c38fc9cbd7b34971973916ae561e7778da80352b907da75ff89b49565dc04a7bde79efe37fc816df99019332b9b23a0fc1c9c39dbe8459a5140ea48b59e23e4ebe2f9d070cf7fe9618acf8953d174a95284ff9189652a8f7d934ab7f3406fc47715da2a4511ec04d4dcf292259bffbd219a60a4535bcbed852970fd047d975ba23a6bcef1cb56b8ab0ad66ec31781e7ea97dcd8b1d52ccf6c3145ff0629d8ae48b984eff7636000217cf387c5ad59c57546603c76b46a12e32aadc9ad68ecd22882031696126230c5d85071be3bb4e7ca434c4c0dfb4e0916f5f48185624e1124ceddf2740869de0bccc3a1e3ed7120eff453bead4fd5eeb00e7b4e8f400796e31e355659c446a2e542ece4adea4054818c66273da512ebf7caaedaa2aa8f349354662bf240aa567565c406bba94182003193fd4d4f6df0892340d3564a4d4e7c429aab19d24b46dc7eee6cdcd8e80c590f840aa451e14562a20c778fe105eb7c66ff65b828c985e86f42ceb9363e273700804b58bc5ffc7d1208e8662b0568a743a0305d862b90c25bfc424c7eb4b3067bfbd2f2f05c895f1d0e3dda636453018f3e5e6d1078ca6582ddf27ad717a8fa0476e03d8bb37235f5a68288b262137b8bdd34a227a5ae3b69265f7a365746287d04df71933ff868890c06118aa7798003ccb8578e705cf22d596c3569a79ae1a8d3962c910e490c2cf10163e2daa1695a52e0fed56e59554f058689b1366741453bbac4132e75c1849d0bef0e7272398b87519837647f30a2b02f0062f2cf3178e73cdbc1705532a3112ca28f80ca54fe671e20c907d91ac1008e562ae31ebe190fb4bcd590906a740c68037350ce00ecad104a6f21da72a94ae01f1f681743ff0760892ffad70c29f53b41c945989d8b008bc7bd26fefddcae34341b1add85bdd32104eb58fcac6c1abfeb02d5b6d05ddaf991c421396a81bca41a311563ed1bcbbcc47aae5f2850a56f0bf8217ba46700e80a1b62b30d422268166199b264ffa847cc290568145731b5d4b411c71fb6b97a157502af8b05034275381a0544406dfcd3bd4bffd09acf2ae2736dac3d1e8126c9c537cd66ada4bc4dac9f193e09be6bd01bd3ac6d17b227e87bf15cda6086c9815ab89148843c89af6bfa95a218b1e997c8af52de2e0b0e201d11ed032693ab826d7c57029fecadb53ad18778166fece38d7e152d35d81d922aa375a2b56dd5a57f9f0ad235a027be5bdae76004c453ecf91eba7dedaba4b698d8a13f3c1df3792b434e5f0f736bd22f57d7f5b69c4880ca79a4b3304332779e873ad0ebe146529a5b7eb7105675de01177c571e04548ddae418ec50ea0eb5cfa853030ae60e47fc8a94d543272d64956b55806447fbd5276506b0aa3369647cc9a28693a3f8148c2ec061dcf180c6f9fdb253687733ec938821eb8c95c22ac54506e41dc63d70120f405f6305f5196ba1f666f29aa561f217d98043ab06fdf05c24e001e7988980fb2e08d44d39bd06e571ae08f36697a6f79375b350a9978d780bee2c8e54d46c1e6109d977c4151875c277939428110dfa0001e71d84b94ac19a0015eabf23a47091d54488dd174ff86d154e96b6721ccbd47c5bb4cc0bcfc4a222bea8f9399f69aa8a40c51b2ca9d87634e8d96a7fff5a024863cb8fbd02eeda47cf0932b18d6b7f4e5b02294ca31b0b60576f9c279d3c914b4770dd05cd7cba9180d56ec9f8c0009f13296ab2678b0ce74f94e82ce803422813f0d2b750cde9e4f743946be569606bc860bed0e1108ce9863e86b86eac97b5c06bb1f9cb81dbfdadb280d56d5540949171d92333c7d14794fee9a24baedd9869c480dcbd841de1036508285f5415b32a21af6fc5a412533a39d081290ea411f960faee4f3b1ecc6745f5bf983755b13a89a8f4e25baa18511ce2907e189a5d495f0564408daf89c7274756f64120f8b3a45b7279d18ff42bd8d4b545c34214866ae7e4d1d9cd5c6de6bd9a96fc55815816a79b0519272f41791375cc8659ad9ed8e68161570eb56676538305eaf6f4b8222d561d5311743972a030ed630ae8c56c795b25a5307b5899283d9ced7ab65d837fddefb5e7ee23e0c3f3e400fa79c0c853c86ca98a6ab6e3a241d3c228e69c82f96eef38d547550596d89923165fb9fcce71f98cc8d5f1936ec83de6f4f1af36874a8ccfdc4e1aafe64e202243432f11dd269b5bfec128410c640504a40a91252df7ef250df2b5062f57041e987f4f7ebc64c82fad47d5bd5bec10962a4fd3ebf73022a8b143d24e06df729911255f4944d1901c71f891a47d6622a4b3660905cdabc57a41e8cf684c239acd9c0f402d11163389e6cd7fcd0a400d02fa0ed0d3e415162b47b6bcfe6b6bb4c8aea97f82c940b479e1dd83f24eb6a11d0ddd219f8afc7521bf4aec1a704b15a81c7009bc7523c8da6f191c7adf44a130a9d1014f6ebc358c165019b62b9b873d99b055fa6b8c2d204c7749fe8a9779af04ebbc5bf54d72ad6a706325c464ea7d3de89909f7d839d6cd944845f5a9b57d33b606a1e73a621c4ad33ade4c2c9e43265f8f87ca43f460c95ec7f12becbb4b5c84deebe2f2bf539f8b4d804c01645e8d6264c81531fadc38679ccc32a36b028128463075c1ce220a21fce4a2b1353b6c7850c5214f16960df553193b2fa2598af07fe9dedcdea9cb88a0af48fa2daa913a64f844006749f90b012d718d0381ef1a90f1a3f31120436fc18b2d7b4920386b1682e16e0b2a824727cd1311626521bca457fad207be13421441b0514ddc16681792650a4086d5b12c3e1c3862506d45055f94afdc8361318d32e0d445c5aa9fb6efe293bb0b6e12ce137cd8a3f2ef6a9ec9c2bdf2de637cb2d4a5137e65f3043d2f0cd6ce23e4eb5c12bea20fd84ed30fe1dd5966d3bf0a9012ce3abbe4aa23f92fed44f3ab4d1f152645b781ca5712ba95f7e4dc6df46176123c6d3fd3f5b47f95b71e348fa03814f5f4acf6a5db891ca66f84ae412cc2a2445f3cc82e73e8ef90ba3b88edb08a26d8e156541c22a1544583ae6a93e5ca82d4fa4a977064df6fda691d51d7a66a74db7369c2bf24a19b62f86d8fa6c06effad9b0bfea563a58b273025cb8e6fbe8b9fac67047ba1f4c30a01fa195b70cd1219f33d434ecd3527d4e9c59478ec546fb3c4bff72d1497b26b48485582b6ded8142cd262c8e81ca10cb7cd98ceb410e3f36f95dce4ea0662b552f51f2a22d17650d4a8e7b3c9d33a026977661e31678994889d7949e80213306df30cf5de6410afacdbde09f1805831cbf153e696db44f7916b939383d0bb696663f711018443a09078761ac313b4324f913c308646af1e3092ce337122869528f53fbf214e4645ad22f5099277f6ed0ed4db6b59f2f913ef3dd106ac8f12ec0c3f736fcf6488aa5a668f7f573d3e847e626035447d7228bf057dbba94a49c4eefda2675e52931b9d374e5cc014dc0361a830ea0911bd804129ba66bfea8cb631ecbf9cad725631211e2c2682e8457f5e3944dd852c0972e9462ad167134f7bb6aa7d4b2af902956bd6223e0da1c25f053bbfb07e72047073a206f28e47e01b1afa51fdf19226bd817ca0ffde19e412f642a8a481d5ba73af89bedadb4e3f5536dad83a81666f6e9f4d8bb7929d7ba8f8b588acfbbfadd1dfeeb95cc063f4759908356b767ed19723dc344bcdd5f358c8edb6f11fc278c1d945d5df9eba14e47ff6964459549d7e8f8ab51f6cb975a2ca890e73d4a062978cc31f80d9b7e0a625acaef629110967e427177a26b38f2746f5a3fec73d663c9b007340bf51ba5e62a178b50b78ef4456671efa4a0fe3ba9e2a197271b4a0764b11a0bc6dbb1f93d52b93c16757032a4f963e21abfb8da248fa5c3f02949a2f01bf77fc41cb75943e876950fd625d591e2024c2c4b35ed86fbf11d862d92ebcacd947b0574777a3dca838595a85e88d52db124ca5b841fdf768ee5e2125aae1b674c11251c1b1a5122d89550df0fe542a0e1fbd65045f26d2eedd40a0478d6afcb1df564a2768ecd1773b0b391c7d88bd9ad8aff1eaf03620135dbd00a1853d5637c43c44af054b0f427b4782a744d51df89cbcae55cb2d0f77a6a01486d66556fd64cb51a54f60f79ee5a29514ec6ff0b93e4f1ae5d8207d985e2ff4097299c6fb09974b6afe23b775daa8561c34a79b588c2e312fdaa9c6159bba1800c7ad55beac282b8fa0e81d596d660fce61f2014d4402c653219c6effeb53cdc91ca529aaf1c6c9cd661b2ca85e6e529f1016ef2b8f4c969c893a0b8c285a1fa20e6203679d218cd35891d80cffb2f54979299a48c7c89b1ee1621fc335dbe8ada4bfb01d074437bd7f9b24e082aeffee4a884098ed976ea1ac542787689318249b53bf8ad29aca50f4be50d9820eba0dcde7dddc7ae54be09c006e9b8e1b5c14b42770d154d7afc3f2c297a086fa7392cd386362bcfe056b4310fc02788aee567eeafd762edc9ad438d41076dc3a668805922d04701141394a0857b0e3b0ed2aa40e5612070a307c1e5430811ff1007704379569f0273a049f4968b6ed6aada867ecfc64f346b710e9827b821fad5de73401c26d8f185f81e86abd2a55b4210e0eda37634cf720d1f4011b9881a4c6374b1e50b968e9a654c6cadff9a6dc3a9e0c0b2a5d2753832c19a12792d9d3e3ad301e10df0bc053559c561462859ae932b715bf8d808089d69363e492fdbee2931a81d5bdc64b2139dd3f562806c2fdd782f4188f040c814f9c3c338a1873af4485584f406200b199083ea392d1e00014fc61ce0da340f7699769c32c9b95760a7b200bd06b1cdbafdb20e1947b5aa75c43a38ae0c9d8ac81eba8eeeec1188e18b375e063a4c1b2251f5a68f20c7d8ba9e1b185a4505856764d16351a35665fbcdb8f8c504751d8148507ae57a5103ae04967a497c6bcda901094fa1f8b666f88030579d897e8dffa70407691599aac1dd87a8d045f5ad839c59e13619595ba3f352bde5b296ff41544d87546d26c01f40978ae720d19ddc8f3a039a5d9bfe61e9bd91d50b865dc1832b83e9172f3204d40ae530ae1a00da9e9174e1227df05df286baf638f90d914319d8df868c3a27432c99d24fb1de8f3e9c21b05f718095e51779ad3674290fd3e834f9c390289614e3af5089674af83df5a36d3148745a023e651b837180d04fae008286d7a571c35d44c54f0368de49c2aed76663020003d6151062e39b8485767531b523bc05144766379fed2e941263182f5b166242c6140c31543b12471576283472285e64f78757e93053ddb228e9abc0fd2a6dc563cdc6a17e4b1a56c0d15c283bfecc4383d342b8b6b9aa4890682c71a86c8b05fdfd4e106033000000000000000157c94a01098d8970345a431f324f55565abfd19cdfdbec3767cd489bda706f663d2671d3177a0f96b0515aaa0707a1276b22ad068c8de9b3fbdc92bb05f6bbb4e55c5f566c2d8a458cf75cb54c1a59e2c24f41888dcb847636b6e63e0ada90ff62e18f5425c48d9f181bea2ef9e59db4dc95378b4e75cfa383c41fe33401a6bb714ca6f8360dd76e4053c16f0631ba2077d610cfc20aa1044890e73204f0445ea8a3ca8643f7b4f9dece3b5743724494d297acf1dc75279cc23b325cfcb2686fe7a5fcd6808867e0b4896e0e96a1d6ac533c57c616f542e11510d2014b4479286455d96cd873d54113be745d0ed042636f3c7b0f3f846eaead668fba2d80e7e266d1382196f7e8e41c4aa1632f5f70b8c01d787e355d13feba8d2fc81070a6836f5ba6353b77e377520a9ade3528ef73f89f7172a992498c18870fe6e3b629cfb76923d94e06217ef45764349513a07042d8072647aa4fd1388ccfd646c49fea61781941c2333d7d2011cf1692062ea30f39c3b191620127aebf1c37675b625a273f903c8b6cee5ee9b921832caea9e72174aa17edae8f5def03a4bd9006cf85d1a48b3b35c49804eb326da93ab7a55c378baf44b25ab3d2dffbe366abf01132e326ebcc4905d1cf6c91f5e19c0196ca7bbd56210eca0993871db0eb9a134f729d5d38a092b480ae3430d1a3b4cd56b620e0d49a6844722ebdb6abbb9cc33c74ce2baeb94c7e08f8d5dfb40f982f7413aef40889f3e695f28019d92bad7a5c02b8226a076a44b33b99fca66f2b1030772d2f896f47871832e51ecd4194f29d78c79cb66f5f74e06f72dd76c27bdb48cc78d845991595a7cf6163b7b81565f6607764add94c8670b8ea4674ba3b8bb4c0c25c5f4ad00d3af021a3f9937301ccb6cc116e33d67dcb5f67a761691a3995aebda2f8ebac5fd6fe27d1a76993a77f0f05b0ad5766acc4b8c7a85d62e41674de3d92b9328ab07b47f670e75702d49a806e97fa114c43838d6d01c41fa2767782cf163dad48920197e1c1dc0bd5b4f438fd2e5f9ae423766e543c2e73ad34a5e1a5482f7bd359235c89ed465e39d92a3523b6486e383495a87a4dbdcc770e7081c541f7df292ce3d09be22be1da61e674d7123d115761628137633be39dd1d6c279dbf73c0b5a3a016158eeb89283fcc2607223944fb228a373c12f32bf41e119fe79a7dd5a2c7b25f2529afb3d56ff0c92dc07f7ca30aed14988cf0ba08563c01493a2be2d1f5f970e0464b8d476238aab0265f801bf4cdf57197a095159b761a21cc9cb753310e8b69de9eed677b7d7ad76a017ceab1ff03faa16b6e8fc85c9ca01ebfd9118cd5da7b2ca71b929d332b969e91a3c1c3c91ab2558589237e9249537dd3347fc8216befe04a8a4868ed9ebd083d0a529b0099d7831aa5468dfcd6963eb83343777b4019b50e91c0ede66f9291a71c61a7a945fa7078e9cf6e91c2cca2b3a491e758a608b53f47fbe6c571781f434e7776a493150f02d5856d38803e3cd535ecb01c9b980d6516f23b9ebfac82bc2555e384835ebb8de0a69b76d92c75f059f0a735cd047bafe81dc40fa48bbeb39ae06da02978e21835825f931b4caf60a41a285ddd141bdf81ee2490865fdbcd5f411a134902a25c174171f8d2da4acf3105d70e7de85f36d3ea03f103f4951dc6640af45b8037f0871668be828a9f6ce93629629902c30e5a506240c642c2108077a60a4f7cf655dd3ffcc5c25231300d496b1991cf4b4a4b51a870d81ed98f9b79f1d19c48c453dbe16ed8beb36478f56dbc03aecd8848473ed2ab6cedd8d91cb4ee040d5704b2b95c8d53120e043d6f64036954e60e435d88c901b79020583b21cf8062478e893fd72f5f676b3ea36671210a81ec36ea7518deffc516f137da1d90d429b1bfc49a0714b4eb1f6c54f99ca1ebb271e69a8d3490c89d41f94838630397f6bd992f72a5ce0fcc7487a46ff9c414316dbcd5b91d4959d2567a1c1892150482b48846990ac96716dbee8fff8964f8466f8b7c53ebcce86e09fa4613a3517da783e1ee7422087aef23c3834dfd77a034b5ac75852e91f6275d8624b3ede2ef99019ac70513adf685996d7069086221eea6034bcb036fb737905227b35346839beecf4688b1f4d248523872196965e77dc080c5cc8101c9e3c700fef7c056e2d9ec788e7faa153eb3ce2268910eb4de957059ee792a4a56f8e82ed3975135bb987a00ffc99201f671b88ab26204272198985d280a6447f48412b0f12a5a0b49f79d5d383681fa9a7306aa3f3d3a23f0e72bdbbbf9705b1afc96c1cc9bc0c5efdbe41418ef4f02f7d887048cdabc17c25bd26f54f694130349f741224a6bef8c6d8f90d46da79f69dd5615b7ea7c5a67574d5e48aec06c5869f660538dc8307a2846566a0b1bda7c629a378c42588086bfc09906077ba1cc2386414d436f88fc9afac84cbffa8e3786fca7d141d584764c95b7039bfb472e5ebda1a071381d36600ef1f2fb082b81b3effd7eda8340c1e384afe26170a2d1c351f8264f765b31d0e44670dd065d4e863e54f7b3d3e61d133e99a8d8c0f8818d413d3220344c159baf14a1c31f78caa8e7d3550667d4d31ec3d20bb0854a0b5431c9515b2645ef4f6b31e5d5e75c6428fe3a76e2b31d88cf2613e01a838cdd4d13938b1f8d29f4860872c831938b7eddf52af1f3d6a8cdcdb2d425637b6765d2c90f0429c20f391f8f6a5605130e65848084d2bfb3635b410c21d86b3f8cc1c9345ab9f84ecbcdbe71de1161ade26c9fbd1d5cb83a01d3cf7b19d853fff861b6120b0ffa8275177ff99ee2c8e61003464f5c45d5524fae64b74eae4ac984698a54b0921f31971b45f9e57583066e301f4044c24b79642e1b402ff1964f89042b5de36845e29c2363820ebab3da1a81b8f0092caf1cb1093acdd10a5123d9c801e7fcbe29cae96ddfd99842d195293460663db1813ef73de7cd917cbee3a2bbb876e933bb408cefe17b3b1c3fa1589ed7ad9b18967f252e7cb92b0d7ebbf0ba5f32ecdb1d93cf87e471d1fdda74323351f07d4f895d00118ff44bca34e79c60a09eccd5cbc4fec8a476593318fff1d035da297a6b40baf2b31a2ea41bb1201483e4132cc932c0669c2cb5563f5b7af9bea2099c4bfe1238fd1c2f4c59795a8361a9f90009262391c176be61c79eff872ccd854e054dba541acf9219b280243a366a60fc95e7915feb71e06f9644651930e66e5cd387f64154fd3f3641cf280fb93affd38baea735bfdd99499befeebcd2635649eb378f41a69d28700aee52996ca0c4e22b7a0359079d951befa1214f65ca3be800db9ca3dc88b43fe53a8c8ba69ce6dd58d12f9ebd6f4313827639e57006332256cf09add7d47a167ff1c9b975182e06cd6f9023d71d56a2201e8ac77de90ec9b259a16e3fb13e8d7a670b6d72ae0d27264acc9e198cb7851390dab5f0863f1b2005c4b0b6ac2a953dc33d05b93bdc9c879948519fb938e0dccb76b4f39460978c3caf7041fa6801bb3a114b045e148a1d3b2a2db9cea0b5c07c4c40c7f98be6032a6dd0c2b962b6c28d719fc98435466c7b225f5f13519fac921296c5c8b3f66ef4c7af628788a1cf819d27bcfb2e0b56b9c2f78df59ab34d05f8fd9b95bc8027abb52f1546fc9af6c39c5c65a683fdcfe71367f399a796436384daa51feed6d3e96a2d159e22d316e4f0c48c9f4e1f907b842a7bf1562a24293f062bf09fa9b7433ce603f3065df66b474148432e905dd7251974598d654a04223a8680eb69fca114783ac98d0c71c66817cc9aa9ee2bc97b1e7cb77a2e6c40d09508484a0d3e8fb3ef139ff42e8a5ca8965cf01c67f43676053e5cca2e66d9b22f5928fc2de699603a25b17d9c34827c31df30bc1f04e616ff5a0e74b1bbed1ecaef51d9190c4a4fc771ee03afe14c6a7eefef90cb5bc5d065e549ad2441dd4a7bb3b6ccd6e0225377707ad4a389b90c78ad8284d93a87496344ee547679dec94624cc6d627c7198ddef5feb9d97f7e39f0c44146e0820349b6fb055b44e1da546d1d042f46a874c8f0ac8999068bc22e4eeb55891f9b03efce407c0331810380e6b3d7666bdf52a4405d2d651607ebd5610ada0452de9aa846035b1b5f2ff1b620ca62c84b26232c8850e4b0c324b7074470f09146f6f84c50247c895351ca99d8c86bedfb04ed1a1ec7458131eda6578c7b23b2769405ae11692db2de171ef6d9fd275936a6d5d133837dab719b2581bc22ca6a4dcaf9b1d897c0c9eac5521290e2da7f456b4f3df31dc5885982b78eec8b065807262b446bb25f5ec9afe98a90f761a518993466cdd4b1fb7a4833d0da615fb858d3b7a466938d3dcc69625659bd044d3dff7ba275c4e9b6608f03857be3b15ba7094e08d724d62c38f498a1fb7e4d9ac68b6d4b3659e1fb645c218553e84d46c57c6ebb2229386e35ab88335893eadbda97f3ec307ecc9889628c11fdc3fc79707d02ce38ceac47639ee7c3737cf50e24069a1031bfcbab875b8b6f7ab64a595153e61483015c4ffb54c05d347830349e52dd66fd7c65097d7d41c3d26669154aac3863aaf16276e2354d87cdfadad6d4e979605e51dfb943c9f00341efc499859f44f384d2500b355243ac004b8ed4f6d3de7210fa3cc6b87288482e460f13ee0e567f18b2c74eec6e19cc24948bf3c8b374844b8bdfd594c74b274e725f20b1cdec23de8cc951ac1cb045e285c99fc11cca3ffaaf4ceec460b3fb77efb863fb75ada6acb5e99f18d6eaf48de04038ff5e04ee67f7559e4de23e21e07f2c4c218bb1000898aeacf3d7203f5095fdb10cf426dd81a556b8bc482373ab70e98b61398dd0750ca11579bb6c7eaa01390de475e2e3fbe6de0bbefcdba51e3b7a4b161ecac76e9fa13ce7c2ff35dc355c4474c15650282d2678381ca70cd16415463137f22732141fe204d00e7372467285f22e3bab6a52cb972db64eef232e82e5e1494d3b401fe6df03cefa56334f120e68df5ba3ef5081e9ad227199754272bfa9ba0400e521fed620221fe510f54f0745ac7e1bed9edccc566fd42b410bdc83f61f9247a3f0e7a6cbfb3438e2562edc9fc7d538810d187e1d7082a036ee625f0797ce140cdb4864127acee6a3c00ffc9cec89145a54df8c7a36adec9e00eaa1c9c1cbf548a07c9cd288bbd8855512dc000c51bbbda0c1da141e230c20fe0ab5286e126c5493689074dc4e5960160c9e2075ffc67c33c13bc776d446db065b2b6632cb292efb720b16de0e8235b10e11783215754cb7a518d76fac6646e7d20a217f7c22be31835419626fb3e0d547cfa8897cf0fde6c07c3706e0653007e3129351e3e966d7915a22c413381cb62a5f4e442ce635df38c9e5fe4cdde500ce34251881a1614713b015e6ad5cd8b9b1ab8013849ff13834187cc23fa45ef265e4d5c3d6fdf6f492a81681cf79dbc9c4efce4fcb770f1fd41a8268e9f73eb0cc692d1fc518c31b29e020050ae33c5e7c5b23321c4131207e3c4cf061efbb7453c9c85aefbe3ea3534cb186eb7ab66b6ef21fca5f000fe965bea303dcddf31ec958c288fa1801187e2840eb47f105fd68c26a9dcb88a2beaf638431f1e04b19a8345815f33fc0e0ba935bbfabcf75c1287e62fb735ef7d12225378e2651ec781992cc73d2a5444ec3bcc1c023c5ae0cbce5f55458a934bd8a4cd80e0975f809db97eeb39c8743e74b64ec28b24aa5a49a7a0de86cf824ad6b5143382de1579cde7301c21fea149e8ade1e4e8bfc0d6a6dec5acf88e78f1a88af5481e65650e37f0f495e728795668eb8b89c4bc5d9402e44bf7e3e4af771cf30ec273321e39659fb131f57c43b8e56eb19ac1dc6ff81a324347450bcf787f069af11cec34833e333c80000
182 | 183 | ** Weight: 20030 184 | ** Virtual size: 5008 185 | ** Discount Weight: 2034 186 | ** Discount Virtual size: 509 187 | 188 | ==References== 189 | 190 | 191 | -------------------------------------------------------------------------------- /elip-0201.mediawiki: -------------------------------------------------------------------------------- 1 |
 2 |   ELIP: 201
 3 |   Layer: Wallets
 4 |   Title: Reduce Elements default dust relay feerate to match min relay feerate
 5 |   Author: Kilian Rausch  and Byron Hambly 
 6 |   Comments-Summary: No comments yet.
 7 |   Comments-URI: TBD
 8 |   Status: Draft
 9 |   Type: Standards Track
10 |   Created: 2025-03-07
11 |   License: BSD-3-Clause
12 | 
13 | 14 | ==Introduction== 15 | 16 | ===Abstract=== 17 | 18 | This document proposes to reduce the default dust relay feerate in Elements to match the default minimum relay feerate. 19 | 20 | ===Copyright=== 21 | 22 | This document is licensed under the 3-clause BSD license. 23 | 24 | ===Motivation=== 25 | 26 | Elements has inherited the default values for the minimum relay feerate and dust relay feerate from the upstream Bitcoin Core software fork. The minimum relay feerate was reduced to 100 sats/kvB [https://github.com/ElementsProject/elements/pull/684/files#diff-d3c243938494b10666b44404a27af7d84b44a72b85a27431e0c89e181462ca6eR58 ElementsProject/elements#684], while the inherited dust relay feerate remains at 3000 sats/kvB. 27 | 28 | Since Elements has confidential transaction amounts, it is already possible for wallets to create "dust" outputs. We propose that the default dust relay feerate should match the minimum relay feerate for consistency, and allow a default Elements wallet to create smaller value outputs without manually setting the dustrelayfee. 29 | 30 | ==Design== 31 | 32 | The "dust threshold" for output types is node policy and unrelated to consensus of the network. 33 | 34 | The default dustrelayfee rate is 3 sats/vb (3000 sats/kvb) [https://github.com/ElementsProject/elements/blob/master/src/policy/policy.h#L58 DUST_RELAY_TX_FEE]. 35 | 36 | In testing, a confidential WPKH output has a base size of 98 bytes. The function GetDustThreshold then adds a further 67.75 witness bytes, giving a floored total of 165 bytes. At the default dustrelayfee of 3 sat/vb this gives a dust threshold of 495 sats. 37 | 38 | By reducing the dustrelayfee to 0.1 sats/vb (100 sats/kvb), Elements RPCs can create confidential WPKH outputs with amounts as low as 17 sats ( 165 vb * 0.1 sats/vb rounded up to the next integer). 39 | 40 | There is an IsDust check in IsStandardTx [https://github.com/ElementsProject/elements/blob/master/src/policy/policy.cpp#L149 IsStandardTx policy check], but this can only be checked for unblinded transactions. 41 | 42 | Reducing the default dust relay fee to match the minimum relay fee results in a more consistent order of magnitude expectation for output values, and allows a default Elements wallet to create smaller value outputs without setting dustrelayfee configuration manually. 43 | 44 | As already noted, this policy can be already be reduced by individual nodes, and other Liquid wallets can trivially create blinded outputs below any dust threshold. 45 | 46 | ==Reference Implementation== 47 | 48 | https://github.com/ElementsProject/elements/pull/1433 49 | 50 | ==References== 51 | 52 | 53 | --------------------------------------------------------------------------------