var searchIndex = JSON.parse('{\
-"bdk":{"doc":"A modern, lightweight, descriptor-based wallet library …","i":[[0,"blockchain","bdk","Blockchain backends",null,null],[0,"any","bdk::blockchain","Runtime-checked blockchain types",null,null],[4,"AnyBlockchain","bdk::blockchain::any","Type that can contain any of the [<code>Blockchain</code>] types …",null,null],[13,"Electrum","","Electrum client",0,null],[13,"Esplora","","Esplora client",0,null],[13,"CompactFilters","","Compact filters client",0,null],[4,"AnyBlockchainConfig","","Type that can contain any of the blockchain …",null,null],[13,"Electrum","","Electrum client",1,null],[13,"Esplora","","Esplora client",1,null],[13,"CompactFilters","","Compact filters client",1,null],[0,"electrum","bdk::blockchain","Electrum",null,null],[3,"ElectrumBlockchain","bdk::blockchain::electrum","Wrapper over an Electrum Client that implements the …",null,null],[3,"ElectrumBlockchainConfig","","Configuration for an [<code>ElectrumBlockchain</code>]",null,null],[12,"url","","URL of the Electrum server (such as ElectrumX, Esplora, …",2,null],[12,"socks5","","URL of the socks5 proxy server or a Tor service",2,null],[12,"retry","","Request retry count",2,null],[12,"timeout","","Request timeout (seconds)",2,null],[0,"esplora","bdk::blockchain","Esplora",null,null],[3,"EsploraBlockchain","bdk::blockchain::esplora","Structure that implements the logic to sync with Esplora",null,null],[11,"new","","Create a new instance of the client from a base URL",3,[[["option",4]]]],[3,"EsploraBlockchainConfig","","Configuration for an [<code>EsploraBlockchain</code>]",null,null],[12,"base_url","","Base URL of the esplora service",4,null],[12,"concurrency","","Number of parallel requests sent to the esplora service …",4,null],[4,"EsploraError","","Errors that can happen during a sync with […",null,null],[13,"Reqwest","","Error with the HTTP call",5,null],[13,"Parsing","","Invalid number returned",5,null],[13,"BitcoinEncoding","","Invalid Bitcoin data returned",5,null],[13,"Hex","","Invalid Hex data returned",5,null],[13,"TransactionNotFound","","Transaction not found",5,null],[13,"HeaderHeightNotFound","","Header height not found",5,null],[13,"HeaderHashNotFound","","Header hash not found",5,null],[0,"compact_filters","bdk::blockchain","Compact Filters",null,null],[3,"Mempool","bdk::blockchain::compact_filters","Container for unconfirmed, but valid Bitcoin transactions",null,null],[3,"Peer","","A Bitcoin peer",null,null],[3,"CompactFiltersBlockchain","","Structure implementing the required blockchain traits",null,null],[11,"new","","Construct a new instance given a list of peers, a path to …",6,[[["peer",3],["path",3],["asref",8],["option",4],["vec",3]],[["compactfilterserror",4],["result",4]]]],[3,"BitcoinPeerConfig","","Data to connect to a Bitcoin P2P peer",null,null],[12,"address","","Peer address such as 127.0.0.1:18333",7,null],[12,"socks5","","Optional socks5 proxy",7,null],[12,"socks5_credentials","","Optional socks5 proxy credentials",7,null],[3,"CompactFiltersBlockchainConfig","","Configuration for a [<code>CompactFiltersBlockchain</code>]",null,null],[12,"peers","","List of peers to try to connect to for asking headers and …",8,null],[12,"network","","Network used",8,null],[12,"storage_dir","","Storage dir to save partially downloaded headers and full …",8,null],[12,"skip_blocks","","Optionally skip initial <code>skip_blocks</code> blocks (default: 0)",8,null],[4,"CompactFiltersError","","An error that can occur during sync with a […",null,null],[13,"InvalidResponse","","A peer sent an invalid or unexpected response",9,null],[13,"InvalidHeaders","","The headers returned are invalid",9,null],[13,"InvalidFilterHeader","","The compact filter headers returned are invalid",9,null],[13,"InvalidFilter","","The compact filter returned is invalid",9,null],[13,"MissingBlock","","The peer is missing a block in the valid chain",9,null],[13,"DataCorruption","","The data stored in the block filters storage are corrupted",9,null],[13,"NotConnected","","A peer is not connected",9,null],[13,"Timeout","","A peer took too long to reply to one of our messages",9,null],[13,"NoPeers","","No peers have been specified",9,null],[13,"DB","","Internal database error",9,null],[13,"IO","","Internal I/O error",9,null],[13,"BIP158","","Invalid BIP158 filter",9,null],[13,"Time","","Internal system time error",9,null],[13,"Global","","Wrapper for [<code>crate::error::Error</code>]",9,null],[4,"Capability","bdk::blockchain","Capabilities that can be supported by a [<code>Blockchain</code>] …",null,null],[13,"FullHistory","","Can recover the full history of a wallet and not only the …",10,null],[13,"GetAnyTx","","Can fetch any historical transaction given its txid",10,null],[13,"AccurateFees","","Can compute accurate fees for the transactions found …",10,null],[8,"Blockchain","","Trait that defines the actions that must be supported by …",null,null],[10,"get_capabilities","","Return the set of [<code>Capability</code>] supported by this backend",11,[[],[["capability",4],["hashset",3]]]],[10,"setup","","Setup the backend and populate the internal database for …",11,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"sync","","Populate the internal database with transactions and UTXOs",11,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[10,"get_tx","","Fetch a transaction from the blockchain given its txid",11,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[10,"broadcast","","Broadcast a transaction",11,[[["transaction",3]],[["error",4],["result",4]]]],[10,"get_height","","Return the current height",11,[[],[["result",4],["error",4]]]],[10,"estimate_fee","","Estimate the fee rate required to confirm a transaction …",11,[[],[["feerate",3],["error",4],["result",4]]]],[8,"ConfigurableBlockchain","","Trait for [<code>Blockchain</code>] types that can be created given a …",null,null],[16,"Config","","Type that contains the configuration",12,null],[10,"from_config","","Create a new instance given a configuration",12,[[],[["error",4],["result",4]]]],[6,"ProgressData","","Data sent with a progress update over a [<code>channel</code>]",null,null],[8,"Progress","","Trait for types that can receive and process progress …",null,null],[10,"update","","Send a new progress update",13,[[["string",3],["option",4]],[["error",4],["result",4]]]],[5,"progress","","Shortcut to create a [<code>channel</code>] (pair of [<code>Sender</code>] and […",null,[[]]],[3,"NoopProgress","","Type that implements [<code>Progress</code>] and drops every update …",null,null],[5,"noop_progress","","Create a new instance of [<code>NoopProgress</code>]",null,[[],["noopprogress",3]]],[3,"LogProgress","","Type that implements [<code>Progress</code>] and logs at level <code>INFO</code> …",null,null],[5,"log_progress","","Create a nwe instance of [<code>LogProgress</code>]",null,[[],["logprogress",3]]],[0,"database","bdk","Database types",null,null],[0,"any","bdk::database","Runtime-checked database types",null,null],[4,"AnyDatabase","bdk::database::any","Type that can contain any of the [<code>Database</code>] types defined …",null,null],[13,"Memory","","In-memory ephemeral database",14,null],[13,"Sled","","Simple key-value embedded database based on [<code>sled</code>]",14,null],[4,"AnyBatch","","Type that contains any of the [<code>BatchDatabase::Batch</code>] …",null,null],[13,"Memory","","In-memory ephemeral database",15,null],[13,"Sled","","Simple key-value embedded database based on [<code>sled</code>]",15,null],[3,"SledDbConfiguration","","Configuration type for a [<code>sled::Tree</code>] database",null,null],[12,"path","","Main directory of the db",16,null],[12,"tree_name","","Name of the database tree, a separated namespace for the …",16,null],[4,"AnyDatabaseConfig","","Type that can contain any of the database configurations …",null,null],[13,"Memory","","Memory database has no config",17,null],[13,"Sled","","Simple key-value embedded database based on [<code>sled</code>]",17,null],[0,"memory","bdk::database","In-memory ephemeral database",null,null],[3,"MemoryDatabase","bdk::database::memory","In-memory ephemeral database",null,null],[11,"new","","Create a new empty database",18,[[]]],[8,"BatchOperations","bdk::database","Trait for operations that can be batched",null,null],[10,"set_script_pubkey","","Store a script_pubkey along with its keychain and child …",19,[[["script",3],["keychainkind",4]],[["error",4],["result",4]]]],[10,"set_utxo","","Store a [<code>UTXO</code>]",19,[[["utxo",3]],[["error",4],["result",4]]]],[10,"set_raw_tx","","Store a raw transaction",19,[[["transaction",3]],[["error",4],["result",4]]]],[10,"set_tx","","Store the metadata of a transaction",19,[[["transactiondetails",3]],[["error",4],["result",4]]]],[10,"set_last_index","","Store the last derivation index for a given keychain.",19,[[["keychainkind",4]],[["error",4],["result",4]]]],[10,"del_script_pubkey_from_path","","Delete a script_pubkey given the keychain and its child …",19,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[10,"del_path_from_script_pubkey","","Delete the data related to a specific script_pubkey, …",19,[[["script",3]],[["error",4],["option",4],["result",4]]]],[10,"del_utxo","","Delete a [<code>UTXO</code>] given its [<code>OutPoint</code>]",19,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[10,"del_raw_tx","","Delete a raw transaction given its [<code>Txid</code>]",19,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[10,"del_tx","","Delete the metadata of a transaction and optionally the …",19,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[10,"del_last_index","","Delete the last derivation index for a keychain.",19,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[8,"Database","","Trait for reading data from a database",null,null],[10,"check_descriptor_checksum","","Read and checks the descriptor checksum for a given …",20,[[["asref",8],["keychainkind",4]],[["error",4],["result",4]]]],[10,"iter_script_pubkeys","","Return the list of script_pubkeys",20,[[["option",4],["keychainkind",4]],[["result",4],["vec",3],["error",4]]]],[10,"iter_utxos","","Return the list of [<code>UTXO</code>]s",20,[[],[["vec",3],["result",4],["error",4]]]],[10,"iter_raw_txs","","Return the list of raw transactions",20,[[],[["result",4],["vec",3],["error",4]]]],[10,"iter_txs","","Return the list of transactions metadata",20,[[],[["result",4],["vec",3],["error",4]]]],[10,"get_script_pubkey_from_path","","Fetch a script_pubkey given the child number of a …",20,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[10,"get_path_from_script_pubkey","","Fetch the keychain and child number of a given …",20,[[["script",3]],[["error",4],["option",4],["result",4]]]],[10,"get_utxo","","Fetch a [<code>UTXO</code>] given its [<code>OutPoint</code>]",20,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[10,"get_raw_tx","","Fetch a raw transaction given its [<code>Txid</code>]",20,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[10,"get_tx","","Fetch the transaction metadata and optionally also the …",20,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[10,"get_last_index","","Return the last defivation index for a keychain.",20,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[10,"increment_last_index","","Increment the last derivation index for a keychain and …",20,[[["keychainkind",4]],[["result",4],["error",4]]]],[8,"BatchDatabase","","Trait for a database that supports batch operations",null,null],[16,"Batch","","Container for the operations",21,null],[10,"begin_batch","","Create a new batch container",21,[[]]],[10,"commit_batch","","Consume and apply a batch of operations",21,[[],[["error",4],["result",4]]]],[8,"ConfigurableDatabase","","Trait for [<code>Database</code>] types that can be created given a …",null,null],[16,"Config","","Type that contains the configuration",22,null],[10,"from_config","","Create a new instance given a configuration",22,[[],[["error",4],["result",4]]]],[0,"descriptor","bdk","Descriptors",null,null],[0,"checksum","bdk::descriptor","Descriptor checksum",null,null],[5,"get_checksum","bdk::descriptor::checksum","Compute the checksum of a descriptor",null,[[],[["string",3],["descriptorerror",4],["result",4]]]],[0,"error","bdk::descriptor","Descriptor errors",null,null],[4,"Error","bdk::descriptor::error","Errors related to the parsing and usage of descriptors",null,null],[13,"InvalidHDKeyPath","","Invalid HD Key path, such as having a wildcard but a …",23,null],[13,"InvalidDescriptorChecksum","","The provided descriptor doesn\'t match its checksum",23,null],[13,"Key","","Error thrown while working with <code>keys</code>",23,null],[13,"Policy","","Error while extracting and manipulating policies",23,null],[13,"InvalidDescriptorCharacter","","Invalid character found in the descriptor checksum",23,null],[13,"BIP32","","BIP32 error",23,null],[13,"Base58","","Error during base58 decoding",23,null],[13,"PK","","Key-related error",23,null],[13,"Miniscript","","Miniscript error",23,null],[13,"Hex","","Hex decoding error",23,null],[0,"policy","bdk::descriptor","Descriptor policy",null,null],[3,"PKOrF","bdk::descriptor::policy","Raw public key or extended key fingerprint",null,null],[4,"SatisfiableItem","","An item that needs to be satisfied",null,null],[13,"Signature","","Signature for a raw public key",24,null],[13,"SignatureKey","","Signature for an extended key fingerprint",24,null],[13,"SHA256Preimage","","SHA256 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",25,null],[13,"HASH256Preimage","bdk::descriptor::policy","Double SHA256 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",26,null],[13,"RIPEMD160Preimage","bdk::descriptor::policy","RIPEMD160 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",27,null],[13,"HASH160Preimage","bdk::descriptor::policy","SHA256 then RIPEMD160 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",28,null],[13,"AbsoluteTimelock","bdk::descriptor::policy","Absolute timeclock timestamp",24,null],[12,"value","bdk::descriptor::policy::SatisfiableItem","The timestamp value",29,null],[13,"RelativeTimelock","bdk::descriptor::policy","Relative timelock locktime",24,null],[12,"value","bdk::descriptor::policy::SatisfiableItem","The locktime value",30,null],[13,"Multisig","bdk::descriptor::policy","Multi-signature public keys with threshold count",24,null],[12,"keys","bdk::descriptor::policy::SatisfiableItem","The raw public key or extended key fingerprint",31,null],[12,"threshold","","The required threshold count",31,null],[13,"Thresh","bdk::descriptor::policy","Threshold items with threshold count",24,null],[12,"items","bdk::descriptor::policy::SatisfiableItem","The policy items",32,null],[12,"threshold","","The required threshold count",32,null],[11,"is_leaf","bdk::descriptor::policy","Returns whether the [<code>SatisfiableItem</code>] is a leaf item",24,[[]]],[11,"id","","Returns a unique id for the [<code>SatisfiableItem</code>]",24,[[],["string",3]]],[6,"ConditionMap","","Type for a map of sets of [<code>Condition</code>] items keyed by each …",null,null],[6,"FoldedConditionMap","","Type for a map of folded sets of [<code>Condition</code>] items keyed …",null,null],[4,"Satisfaction","","Represent if and how much a policy item is satisfied by …",null,null],[13,"Partial","","Only a partial satisfaction of some kind of threshold …",33,null],[12,"n","bdk::descriptor::policy::Satisfaction","Total number of items",34,null],[12,"m","","Threshold",34,null],[12,"items","","The items that can be satisfied by the descriptor",34,null],[12,"sorted","","Whether the items are sorted in lexicographic order (used …",34,null],[12,"conditions","","Extra conditions that also need to be satisfied",34,null],[13,"PartialComplete","bdk::descriptor::policy","Can reach the threshold of some kind of threshold policy",33,null],[12,"n","bdk::descriptor::policy::Satisfaction","Total number of items",35,null],[12,"m","","Threshold",35,null],[12,"items","","The items that can be satisfied by the descriptor",35,null],[12,"sorted","","Whether the items are sorted in lexicographic order (used …",35,null],[12,"conditions","","Extra conditions that also need to be satisfied",35,null],[13,"Complete","bdk::descriptor::policy","Can satisfy the policy item",33,null],[12,"condition","bdk::descriptor::policy::Satisfaction","Extra conditions that also need to be satisfied",36,null],[13,"None","bdk::descriptor::policy","Cannot satisfy or contribute to the policy item",33,null],[11,"is_leaf","","Returns whether the [<code>Satisfaction</code>] is a leaf item",33,[[]]],[3,"Policy","","Descriptor spending policy",null,null],[12,"id","","Identifier for this policy node",37,null],[12,"item","","Type of this policy node",37,null],[12,"satisfaction","","How a much given PSBT already satisfies this polcy node <strong>…",37,null],[12,"contribution","","How the wallet\'s descriptor can satisfy this policy node",37,null],[3,"Condition","","An extra condition that must be satisfied but that is out …",null,null],[12,"csv","","Optional CheckSequenceVerify condition",38,null],[12,"timelock","","Optional timelock condition",38,null],[11,"is_null","","Returns <code>true</code> if there are no extra conditions to verify",38,[[]]],[4,"PolicyError","","Errors that can happen while extracting and manipulating …",null,null],[13,"NotEnoughItemsSelected","","Not enough items are selected to satisfy a […",39,null],[13,"TooManyItemsSelected","","Too many items are selected to satisfy a […",39,null],[13,"IndexOutOfRange","","Index out of range for an item to satisfy a […",39,null],[13,"AddOnLeaf","","Can not add to an item that is [<code>Satisfaction::None</code>] or […",39,null],[13,"AddOnPartialComplete","","Can not add to an item that is […",39,null],[13,"MixedTimelockUnits","","Can not merge CSV or timelock values unless both are less …",39,null],[13,"IncompatibleConditions","","Incompatible conditions (not currently used)",39,null],[11,"requires_path","","Return whether or not a specific path in the policy tree …",37,[[]]],[11,"get_condition","","Return the conditions that are set by the spending policy …",37,[[["btreemap",3]],[["result",4],["condition",3],["policyerror",4]]]],[0,"template","bdk::descriptor","Descriptor templates",null,null],[6,"DescriptorTemplateOut","bdk::descriptor::template","Type alias for the return type of [<code>DescriptorTemplate</code>], …",null,null],[8,"DescriptorTemplate","","Trait for descriptor templates that can be built into a …",null,null],[10,"build","","Build the complete descriptor",40,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[3,"P2PKH","","P2PKH template. Expands to a descriptor <code>pkh(key)</code>",null,null],[12,"0","","",41,null],[3,"P2WPKH_P2SH","","P2WPKH-P2SH template. Expands to a descriptor …",null,null],[12,"0","","",42,null],[3,"P2WPKH","","P2WPKH template. Expands to a descriptor <code>wpkh(key)</code>",null,null],[12,"0","","",43,null],[3,"BIP44","","BIP44 template. Expands to <code>pkh(key/44\'/0\'/0\'/{0,1}/*)</code>",null,null],[12,"0","","",44,null],[12,"1","","",44,null],[3,"BIP44Public","","BIP44 public template. Expands to <code>pkh(key/{0,1}/*)</code>",null,null],[12,"0","","",45,null],[12,"1","","",45,null],[12,"2","","",45,null],[3,"BIP49","","BIP49 template. Expands to <code>sh(wpkh(key/49\'/0\'/0\'/{0,1}/*))</code>",null,null],[12,"0","","",46,null],[12,"1","","",46,null],[3,"BIP49Public","","BIP49 public template. Expands to <code>sh(wpkh(key/{0,1}/*))</code>",null,null],[12,"0","","",47,null],[12,"1","","",47,null],[12,"2","","",47,null],[3,"BIP84","","BIP84 template. Expands to <code>wpkh(key/84\'/0\'/0\'/{0,1}/*)</code>",null,null],[12,"0","","",48,null],[12,"1","","",48,null],[3,"BIP84Public","","BIP84 public template. Expands to <code>wpkh(key/{0,1}/*)</code>",null,null],[12,"0","","",49,null],[12,"1","","",49,null],[12,"2","","",49,null],[6,"KeyMap","bdk::descriptor","Alias type for a map of public key to secret key",null,null],[4,"Descriptor","","Script descriptor",null,null],[13,"Bare","","A raw scriptpubkey (including pay-to-pubkey) under Legacy …",50,null],[13,"Pk","","Pay-to-Pubkey",50,null],[13,"Pkh","","Pay-to-PubKey-Hash",50,null],[13,"Wpkh","","Pay-to-Witness-PubKey-Hash",50,null],[13,"ShWpkh","","Pay-to-Witness-PubKey-Hash inside P2SH",50,null],[13,"Sh","","Pay-to-ScriptHash with Legacy context",50,null],[13,"Wsh","","Pay-to-Witness-ScriptHash with Segwitv0 context",50,null],[13,"ShWsh","","P2SH-P2WSH with Segwitv0 context",50,null],[13,"ShSortedMulti","","Sortedmulti under P2SH",50,null],[13,"WshSortedMulti","","Sortedmulti under P2WSH",50,null],[13,"ShWshSortedMulti","","Sortedmulti under P2SH-P2WSH",50,null],[4,"Legacy","","Legacy ScriptContext To be used as P2SH scripts For …",null,null],[3,"Miniscript","","Top-level script AST type",null,null],[12,"node","","A node in the Abstract Syntax Tree(",51,null],[12,"ty","","The correctness and malleability type information for the …",51,null],[12,"ext","","Additional information helpful for extra analysis.",51,null],[8,"MiniscriptKey","","Public key trait which can be converted to Hash type",null,null],[11,"is_uncompressed","","Check if the publicKey is uncompressed. The default …",52,[[]]],[16,"Hash","","The associated Hash type with the publicKey",52,null],[10,"to_pubkeyhash","","Converts an object to PublicHash",52,[[]]],[8,"ScriptContext","","The ScriptContext for Miniscript. Additional type …",null,null],[10,"check_terminal_non_malleable","","Depending on ScriptContext, fragments can be malleable. …",53,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","Check whether the given satisfaction is valid under the …",53,[[],[["result",4],["scriptcontexterror",4]]]],[10,"max_satisfaction_size","","Depending on script context, the size of a satifaction …",53,[[["miniscript",3]],["option",4]]],[11,"check_global_consensus_validity","","Depending on script Context, some of the Terminals might …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_policy_validity","","Depending on script Context, some of the script resource …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","Consensus rules at the Miniscript satisfaction time. It …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","Policy rules at the Miniscript satisfaction time. It is …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_validity","","Check the consensus + policy(if not disabled) rules that …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_validity","","Check the consensus + policy(if not disabled) rules …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"top_level_type_check","","Check whether the top-level is type B",53,[[["miniscript",3]],[["error",4],["result",4]]]],[11,"other_top_level_checks","","Other top level checks that are context specific",53,[[["miniscript",3]],[["error",4],["result",4]]]],[11,"top_level_checks","","Check top level consensus rules.",53,[[["miniscript",3]],[["error",4],["result",4]]]],[4,"Segwitv0","","Segwitv0 ScriptContext",null,null],[4,"Terminal","","All AST elements",null,null],[13,"True","","<code>1</code>",54,null],[13,"False","","<code>0</code>",54,null],[13,"PkK","","<code><key></code>",54,null],[13,"PkH","","<code>DUP HASH160 <keyhash> EQUALVERIFY</code>",54,null],[13,"After","","<code>n CHECKLOCKTIMEVERIFY</code>",54,null],[13,"Older","","<code>n CHECKSEQUENCEVERIFY</code>",54,null],[13,"Sha256","","<code>SIZE 32 EQUALVERIFY SHA256 <hash> EQUAL</code>",54,null],[13,"Hash256","","<code>SIZE 32 EQUALVERIFY HASH256 <hash> EQUAL</code>",54,null],[13,"Ripemd160","","<code>SIZE 32 EQUALVERIFY RIPEMD160 <hash> EQUAL</code>",54,null],[13,"Hash160","","<code>SIZE 32 EQUALVERIFY HASH160 <hash> EQUAL</code>",54,null],[13,"Alt","","<code>TOALTSTACK [E] FROMALTSTACK</code>",54,null],[13,"Swap","","<code>SWAP [E1]</code>",54,null],[13,"Check","","<code>[Kt]/[Ke] CHECKSIG</code>",54,null],[13,"DupIf","","<code>DUP IF [V] ENDIF</code>",54,null],[13,"Verify","","[T] VERIFY",54,null],[13,"NonZero","","SIZE 0NOTEQUAL IF [Fn] ENDIF",54,null],[13,"ZeroNotEqual","","[X] 0NOTEQUAL",54,null],[13,"AndV","","[V] [T]/[V]/[F]/[Kt]",54,null],[13,"AndB","","[E] [W] BOOLAND",54,null],[13,"AndOr","","[various] NOTIF [various] ELSE [various] ENDIF",54,null],[13,"OrB","","[E] [W] BOOLOR",54,null],[13,"OrD","","[E] IFDUP NOTIF [T]/[E] ENDIF",54,null],[13,"OrC","","[E] NOTIF [V] ENDIF",54,null],[13,"OrI","","IF [various] ELSE [various] ENDIF",54,null],[13,"Thresh","","[E] ([W] ADD)* k EQUAL",54,null],[13,"Multi","","k ()* n CHECKMULTISIG",54,null],[8,"ToPublicKey","","Trait describing public key types which can be converted …",null,null],[10,"to_public_key","","Converts an object to a public key C represents …",55,[[],["publickey",3]]],[11,"serialized_len","","Computes the size of a public key when serialized in a …",55,[[]]],[10,"hash_to_hash160","","Converts a hashed version of the public key to a <code>hash160</code> …",55,[[],["hash",3]]],[6,"ExtendedDescriptor","","Alias for a [<code>Descriptor</code>] that can contain extended keys …",null,null],[6,"HDKeyPaths","","Alias for the type of maps that represent derivation …",null,null],[8,"ToWalletDescriptor","","Trait for types which can be converted into an […",null,null],[10,"to_wallet_descriptor","","Convert to wallet descriptor",56,[[["network",4]],[["descriptorerror",4],["result",4]]]],[8,"ExtractPolicy","","Trait implemented on [<code>Descriptor</code>]s to add a method to …",null,null],[10,"extract_policy","","Extract the spending [<code>policy</code>]",57,[[["signerscontainer",3],["secp256k1",3]],[["result",4],["option",4],["descriptorerror",4]]]],[0,"keys","bdk","Key formats",null,null],[0,"bip39","bdk::keys","BIP-0039",null,null],[6,"MnemonicWithPassphrase","bdk::keys::bip39","Type for a BIP39 mnemonic with an optional passphrase",null,null],[4,"DescriptorPublicKey","bdk::keys","The MiniscriptKey corresponding to Descriptors. This can …",null,null],[13,"SinglePub","","Single Public Key",58,null],[13,"XPub","","Xpub",58,null],[4,"DescriptorSecretKey","","A Secret Key that can be either a single key or an Xprv",null,null],[13,"SinglePriv","","Single Secret Key",59,null],[13,"XPrv","","Xprv",59,null],[3,"DescriptorSinglePriv","","A Single Descriptor Secret Key with optional origin …",null,null],[12,"origin","","Origin information",60,null],[12,"key","","The key",60,null],[3,"DescriptorSinglePub","","A Single Descriptor Key with optional origin information",null,null],[12,"origin","","Origin information",61,null],[12,"key","","The key",61,null],[3,"SortedMultiVec","","Contents of a \\\"sortedmulti\\\" descriptor",null,null],[12,"k","","signatures required",62,null],[12,"pks","","public keys inside sorted Multi",62,null],[8,"ScriptContext","","The ScriptContext for Miniscript. Additional type …",null,null],[10,"check_terminal_non_malleable","","Depending on ScriptContext, fragments can be malleable. …",53,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","Check whether the given satisfaction is valid under the …",53,[[],[["result",4],["scriptcontexterror",4]]]],[10,"max_satisfaction_size","","Depending on script context, the size of a satifaction …",53,[[["miniscript",3]],["option",4]]],[11,"check_global_consensus_validity","","Depending on script Context, some of the Terminals might …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_policy_validity","","Depending on script Context, some of the script resource …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","Consensus rules at the Miniscript satisfaction time. It …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","Policy rules at the Miniscript satisfaction time. It is …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_validity","","Check the consensus + policy(if not disabled) rules that …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_validity","","Check the consensus + policy(if not disabled) rules …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"top_level_type_check","","Check whether the top-level is type B",53,[[["miniscript",3]],[["error",4],["result",4]]]],[11,"other_top_level_checks","","Other top level checks that are context specific",53,[[["miniscript",3]],[["error",4],["result",4]]]],[11,"top_level_checks","","Check top level consensus rules.",53,[[["miniscript",3]],[["error",4],["result",4]]]],[6,"ValidNetworks","","Set of valid networks for a key",null,null],[5,"any_network","","Create a set containing mainnet, testnet and regtest",null,[[],["validnetworks",6]]],[5,"mainnet_network","","Create a set only containing mainnet",null,[[],["validnetworks",6]]],[5,"test_networks","","Create a set containing testnet and regtest",null,[[],["validnetworks",6]]],[5,"merge_networks","","Compute the intersection of two sets",null,[[["validnetworks",6]],["validnetworks",6]]],[4,"DescriptorKey","","Container for public or secret keys",null,null],[11,"from_public","","Create an instance given a public key and a set of valid …",63,[[["validnetworks",6],["descriptorpublickey",4]]]],[11,"from_secret","","Create an instance given a secret key and a set of valid …",63,[[["validnetworks",6],["descriptorsecretkey",4]]]],[11,"override_valid_networks","","Override the computed set of valid networks",63,[[["validnetworks",6]]]],[4,"ScriptContextEnum","","Enum representation of the known valid [<code>ScriptContext</code>]s",null,null],[13,"Legacy","","Legacy scripts",64,null],[13,"Segwitv0","","Segwitv0 scripts",64,null],[11,"is_legacy","","Returns whether the script context is […",64,[[]]],[11,"is_segwit_v0","","Returns whether the script context is […",64,[[]]],[8,"ExtScriptContext","","Trait that adds extra useful methods to [<code>ScriptContext</code>]s",null,null],[10,"as_enum","","Returns the [<code>ScriptContext</code>] as a [<code>ScriptContextEnum</code>]",65,[[],["scriptcontextenum",4]]],[11,"is_legacy","","Returns whether the script context is <code>Legacy</code>",65,[[]]],[11,"is_segwit_v0","","Returns whether the script context is <code>Segwitv0</code>",65,[[]]],[8,"ToDescriptorKey","","Trait for objects that can be turned into a public or …",null,null],[10,"to_descriptor_key","","Turn the key into a [<code>DescriptorKey</code>] within the requested […",66,[[],[["descriptorkey",4],["result",4],["keyerror",4]]]],[8,"DerivableKey","","Trait for keys that can be derived.",null,null],[10,"add_metadata","","Add a extra metadata, consume <code>self</code> and turn it into a […",67,[[["derivationpath",3],["option",4],["keysource",6]],[["descriptorkey",4],["result",4],["keyerror",4]]]],[3,"GeneratedKey","","Output of a [<code>GeneratableKey</code>] key generation",null,null],[11,"into_key","","Consumes <code>self</code> and returns the key",68,[[]]],[8,"GeneratableKey","","Trait for keys that can be generated",null,null],[16,"Entropy","","Type specifying the amount of entropy required e.g. …",69,null],[16,"Options","","Extra options required by the <code>generate_with_entropy</code>",69,null],[16,"Error","","Returned error in case of failure",69,null],[10,"generate_with_entropy","","Generate a key given the extra options and the entropy",69,[[],[["generatedkey",3],["result",4]]]],[11,"generate","","Generate a key given the options with a random entropy",69,[[],[["generatedkey",3],["result",4]]]],[8,"GeneratableDefaultOptions","","Trait that allows generating a key with the default …",null,null],[11,"generate_with_entropy_default","","Generate a key with the default options and a given …",70,[[],[["generatedkey",3],["result",4]]]],[11,"generate_default","","Generate a key with the default options and a random …",70,[[],[["generatedkey",3],["result",4]]]],[3,"PrivateKeyGenerateOptions","","Options for generating a [<code>PrivateKey</code>]",null,null],[12,"compressed","","Whether the generated key should be \\\"compressed\\\" or not",71,null],[4,"KeyError","","Errors thrown while working with <code>keys</code>",null,null],[13,"InvalidScriptContext","","The key cannot exist in the given script context",72,null],[13,"InvalidNetwork","","The key is not valid for the given network",72,null],[13,"InvalidChecksum","","The key has an invalid checksum",72,null],[13,"Message","","Custom error message",72,null],[13,"BIP32","","BIP32 error",72,null],[13,"Miniscript","","Miniscript error",72,null],[0,"wallet","bdk","Wallet",null,null],[0,"address_validator","bdk::wallet","Address validation callbacks",null,null],[4,"AddressValidatorError","bdk::wallet::address_validator","Errors that can be returned to fail the validation of an …",null,null],[13,"UserRejected","","User rejected the address",73,null],[13,"ConnectionError","","Network connection error",73,null],[13,"TimeoutError","","Network request timeout error",73,null],[13,"InvalidScript","","Invalid script",73,null],[13,"Message","","A custom error message",73,null],[8,"AddressValidator","","Trait to build address validators",null,null],[10,"validate","","Validate or inspect an address",74,[[["hdkeypaths",6],["script",3],["keychainkind",4]],[["result",4],["addressvalidatorerror",4]]]],[0,"coin_selection","bdk::wallet","Coin selection",null,null],[6,"DefaultCoinSelectionAlgorithm","bdk::wallet::coin_selection","Default coin selection algorithm used by <code>TxBuilder</code> if not …",null,null],[3,"CoinSelectionResult","","Result of a successful coin selection",null,null],[12,"selected","","List of outputs selected for use as inputs",75,null],[12,"selected_amount","","Sum of the selected inputs\' value",75,null],[12,"fee_amount","","Total fee amount in satoshi",75,null],[8,"CoinSelectionAlgorithm","","Trait for generalized coin selection algorithms",null,null],[10,"coin_select","","Perform the coin selection",76,[[["vec",3],["feerate",3]],[["result",4],["coinselectionresult",3],["error",4]]]],[3,"LargestFirstCoinSelection","","Simple and dumb coin selection",null,null],[3,"BranchAndBoundCoinSelection","","Branch and bound coin selection",null,null],[11,"new","","Create new instance with target size for change output",77,[[]]],[0,"export","bdk::wallet","Wallet export",null,null],[3,"WalletExport","bdk::wallet::export","Structure that contains the export of a wallet",null,null],[12,"blockheight","","Earliest block to rescan when looking for the wallet\'s …",78,null],[12,"label","","Arbitrary label for the wallet",78,null],[11,"export_wallet","","Export a wallet",78,[[["wallet",3]],["result",4]]],[11,"descriptor","","Return the external descriptor",78,[[],["string",3]]],[11,"change_descriptor","","Return the internal descriptor, if present",78,[[],[["string",3],["option",4]]]],[0,"signer","bdk::wallet","Generalized signers",null,null],[4,"SignerId","bdk::wallet::signer","Identifier of a signer in the <code>SignersContainers</code>. Used as …",null,null],[13,"PkHash","","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA …",79,null],[13,"Fingerprint","","The fingerprint of a BIP32 extended key",79,null],[13,"Dummy","","Dummy identifier",79,null],[4,"SignerError","","Signing error",null,null],[13,"MissingKey","","The private key is missing for the required public key",80,null],[13,"InvalidKey","","The private key in use has the right fingerprint but …",80,null],[13,"UserCanceled","","The user canceled the operation",80,null],[13,"InputIndexOutOfRange","","Input index is out of range",80,null],[13,"MissingNonWitnessUtxo","","The <code>non_witness_utxo</code> field of the transaction is required …",80,null],[13,"InvalidNonWitnessUtxo","","The <code>non_witness_utxo</code> specified is invalid",80,null],[13,"MissingWitnessUtxo","","The <code>witness_utxo</code> field of the transaction is required to …",80,null],[13,"MissingWitnessScript","","The <code>witness_script</code> field of the transaction is requied to …",80,null],[13,"MissingHDKeypath","","The fingerprint and derivation path are missing from the …",80,null],[8,"Signer","","Trait for signers",null,null],[10,"sign","","Sign a PSBT",81,[[["partiallysignedtransaction",3],["option",4],["secp256k1",3]],[["result",4],["signererror",4]]]],[10,"sign_whole_tx","","Return whether or not the signer signs the whole …",81,[[]]],[10,"id","","Return the [<code>SignerId</code>] for this signer",81,[[["secp256k1",3]],["signerid",4]]],[11,"descriptor_secret_key","","Return the secret key for the signer",81,[[],[["option",4],["descriptorsecretkey",4]]]],[3,"SignerOrdering","","Defines the order in which signers are called",null,null],[12,"0","","",82,null],[3,"SignersContainer","","Container for multiple signers",null,null],[11,"as_key_map","","Create a map of public keys to secret keys",83,[[["secp256k1",3]],["keymap",6]]],[11,"new","","Default constructor",83,[[]]],[11,"add_external","","Adds an external signer to the container for the …",83,[[["signerordering",3],["arc",3],["signer",8],["signerid",4]],[["arc",3],["option",4]]]],[11,"remove","","Removes a signer from the container and returns it",83,[[["signerordering",3],["signerid",4]],[["arc",3],["option",4]]]],[11,"ids","","Returns the list of identifiers of all the signers in the …",83,[[],[["vec",3],["signerid",4]]]],[11,"signers","","Returns the list of signers in the container, sorted by …",83,[[],[["arc",3],["vec",3]]]],[11,"find","","Finds the signer with lowest ordering for a given id in …",83,[[["signerid",4]],[["option",4],["arc",3]]]],[0,"time","bdk::wallet","Cross-platform time",null,null],[5,"get_timestamp","bdk::wallet::time","Return the current timestamp in seconds",null,[[]]],[0,"tx_builder","bdk::wallet","Transaction builder",null,null],[8,"TxBuilderContext","bdk::wallet::tx_builder","Context in which the [<code>TxBuilder</code>] is valid",null,null],[3,"CreateTx","","<code>Wallet::create_tx</code> context",null,null],[3,"BumpFee","","<code>Wallet::bump_fee</code> context",null,null],[3,"TxBuilder","","A transaction builder",null,null],[11,"new","","Create an empty builder",84,[[]]],[11,"fee_rate","","Set a custom fee rate",84,[[["feerate",3]]]],[11,"fee_absolute","","Set an absolute fee",84,[[]]],[11,"policy_path","","Set the policy path to use while creating the transaction …",84,[[["btreemap",3],["string",3],["vec",3],["keychainkind",4]]]],[11,"utxos","","Replace the internal list of utxos that <strong>must</strong> be spent …",84,[[["vec",3],["outpoint",3]]]],[11,"add_utxo","","Add a utxo to the internal list of utxos that <strong>must</strong> be …",84,[[["outpoint",3]]]],[11,"manually_selected_only","","Only spend utxos added by <code>add_utxo</code> and <code>utxos</code>.",84,[[]]],[11,"unspendable","","Replace the internal list of unspendable utxos with a new …",84,[[["vec",3],["outpoint",3]]]],[11,"add_unspendable","","Add a utxo to the internal list of unspendable utxos",84,[[["outpoint",3]]]],[11,"sighash","","Sign with a specific sig hash",84,[[["sighashtype",4]]]],[11,"ordering","","Choose the ordering for inputs and outputs of the …",84,[[["txordering",4]]]],[11,"nlocktime","","Use a specific nLockTime while creating the transaction",84,[[]]],[11,"version","","Build a transaction with a specific version",84,[[]]],[11,"do_not_spend_change","","Do not spend change outputs",84,[[]]],[11,"only_spend_change","","Only spend change outputs",84,[[]]],[11,"change_policy","","Set a specific [<code>ChangeSpendPolicy</code>]. See […",84,[[["changespendpolicy",4]]]],[11,"force_non_witness_utxo","","Fill-in the <code>psbt::Input::non_witness_utxo</code> field even if …",84,[[]]],[11,"include_output_redeem_witness_script","","Fill-in the <code>psbt::Output::redeem_script</code> and …",84,[[]]],[11,"add_global_xpubs","","Fill-in the <code>PSBT_GLOBAL_XPUB</code> field with the extended keys …",84,[[]]],[11,"drain_wallet","","Spend all the available inputs. This respects filters …",84,[[]]],[11,"coin_selection","","Choose the coin selection algorithm",84,[[["coinselectionalgorithm",8]],[["coinselectionalgorithm",8],["txbuilder",3]]]],[11,"with_recipients","","Create a builder starting from a list of recipients",84,[[["vec",3]]]],[11,"set_recipients","","Replace the recipients already added with a new list",84,[[["vec",3]]]],[11,"add_recipient","","Add a recipient to the internal list",84,[[["script",3]]]],[11,"set_single_recipient","","Set a single recipient that will get all the selected …",84,[[["script",3]]]],[11,"enable_rbf","","Enable signaling RBF",84,[[]]],[11,"enable_rbf_with_sequence","","Enable signaling RBF with a specific nSequence value",84,[[]]],[11,"maintain_single_recipient","","Bump the fees of a transaction made with …",84,[[]]],[4,"TxOrdering","","Ordering of the transaction\'s inputs and outputs",null,null],[13,"Shuffle","","Randomized (default)",85,null],[13,"Untouched","","Unchanged",85,null],[13,"BIP69Lexicographic","","BIP69 / Lexicographic",85,null],[11,"sort_tx","","Sort transaction inputs and outputs by [<code>TxOrdering</code>] …",85,[[["transaction",3]]]],[4,"ChangeSpendPolicy","","Policy regarding the use of change outputs when creating …",null,null],[13,"ChangeAllowed","","Use both change and non-change outputs (default)",86,null],[13,"OnlyChange","","Only use change outputs (see [<code>TxBuilder::only_spend_change</code>…",86,null],[13,"ChangeForbidden","","Only use non-change outputs (see […",86,null],[8,"IsDust","bdk::wallet","Trait to check if a value is below the dust limit",null,null],[10,"is_dust","","Check whether or not a value is below dust limit",87,[[]]],[3,"Wallet","","A Bitcoin wallet",null,null],[11,"new_offline","","Create a new \\\"offline\\\" wallet",88,[[["towalletdescriptor",8],["network",4],["option",4]],[["error",4],["result",4]]]],[11,"get_new_address","","Return a newly generated address using the external …",88,[[],[["result",4],["address",3],["error",4]]]],[11,"is_mine","","Return whether or not a <code>script</code> is part of this wallet …",88,[[["script",3]],[["result",4],["error",4]]]],[11,"list_unspent","","Return the list of unspent outputs of this wallet",88,[[],[["vec",3],["result",4],["error",4]]]],[11,"list_transactions","","Return the list of transactions made and received by the …",88,[[],[["result",4],["vec",3],["error",4]]]],[11,"get_balance","","Return the balance, meaning the sum of this wallet\'s …",88,[[],[["result",4],["error",4]]]],[11,"add_signer","","Add an external signer",88,[[["signerordering",3],["arc",3],["signer",8],["keychainkind",4]]]],[11,"add_address_validator","","Add an address validator",88,[[["arc",3],["addressvalidator",8]]]],[11,"create_tx","","Create a new transaction following the options specified …",88,[[["coinselectionalgorithm",8],["txbuilder",3],["createtx",3]],[["error",4],["result",4]]]],[11,"bump_fee","","Bump the fee of a transaction following the options …",88,[[["txid",3],["coinselectionalgorithm",8],["bumpfee",3],["txbuilder",3]],[["error",4],["result",4]]]],[11,"sign","","Sign a transaction with all the wallet\'s signers, in the …",88,[[["option",4],["psbt",3]],[["result",4],["error",4]]]],[11,"policies","","Return the spending policies for the wallet\'s descriptor",88,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[11,"public_descriptor","","Return the \\\"public\\\" version of the wallet\'s descriptor, …",88,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[11,"finalize_psbt","","Try to finalize a PSBT",88,[[["option",4],["psbt",3]],[["result",4],["error",4]]]],[11,"secp_ctx","","Return the secp256k1 context used for all signing …",88,[[],["secp256k1",3]]],[11,"new","","Create a new \\\"online\\\" wallet",88,[[["towalletdescriptor",8],["network",4],["option",4]],[["error",4],["result",4]]]],[11,"sync","","Sync the internal database with the blockchain",88,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"client","","Return a reference to the internal blockchain client",88,[[]]],[11,"network","","Get the Bitcoin network the wallet is using.",88,[[],["network",4]]],[11,"broadcast","","Broadcast a transaction to the network",88,[[["transaction",3]],[["result",4],["error",4],["txid",3]]]],[4,"Error","bdk","Errors that can be thrown by the <code>Wallet</code>",null,null],[13,"InvalidU32Bytes","","Wrong number of bytes found when trying to convert to u32",89,null],[13,"Generic","","Generic error",89,null],[13,"ScriptDoesntHaveAddressForm","","This error is thrown when trying to convert Bare and …",89,null],[13,"SingleRecipientMultipleOutputs","","Found multiple outputs when <code>single_recipient</code> option has …",89,null],[13,"SingleRecipientNoInputs","","<code>single_recipient</code> option is selected but neither …",89,null],[13,"NoRecipients","","Cannot build a tx without recipients",89,null],[13,"NoUtxosSelected","","<code>manually_selected_only</code> option is selected but no utxo has …",89,null],[13,"OutputBelowDustLimit","","Output created is under the dust limit, 546 satoshis",89,null],[13,"InsufficientFunds","","Wallet\'s UTXO set is not enough to cover recipient\'s …",89,null],[12,"needed","bdk::Error","Sats needed for some transaction",90,null],[12,"available","","Sats available for spending",90,null],[13,"BnBTotalTriesExceeded","bdk","Branch and bound coin selection possible attempts with …",89,null],[13,"BnBNoExactMatch","","Branch and bound coin selection tries to avoid needing a …",89,null],[13,"UnknownUTXO","","Happens when trying to spend an UTXO that is not in the …",89,null],[13,"TransactionNotFound","","Thrown when a tx is not found in the internal database",89,null],[13,"TransactionConfirmed","","Happens when trying to bump a transaction that is already …",89,null],[13,"IrreplaceableTransaction","","Trying to replace a tx that has a sequence >= <code>0xFFFFFFFE</code>",89,null],[13,"FeeRateTooLow","","When bumping a tx the fee rate requested is lower than …",89,null],[12,"required","bdk::Error","Required fee rate (satoshi/vbyte)",91,null],[13,"FeeTooLow","bdk","When bumping a tx the absolute fee requested is lower …",89,null],[12,"required","bdk::Error","Required fee absolute value (satoshi)",92,null],[13,"MissingKeyOrigin","bdk","In order to use the <code>TxBuilder::add_global_xpubs</code> option …",89,null],[13,"Key","","Error while working with <code>keys</code>",89,null],[13,"ChecksumMismatch","","Descriptor checksum mismatch",89,null],[13,"SpendingPolicyRequired","","Spending policy is not compatible with this <code>KeychainKind</code>",89,null],[13,"InvalidPolicyPathError","","Error while extracting and manipulating policies",89,null],[13,"Signer","","Signing error",89,null],[13,"InvalidProgressValue","","Progress value must be between <code>0.0</code> (included) and <code>100.0</code> …",89,null],[13,"ProgressUpdateError","","Progress update error (maybe the channel has been closed)",89,null],[13,"InvalidOutpoint","","Requested outpoint doesn\'t exist in the tx (vout greater …",89,null],[13,"Descriptor","","Error related to the parsing and usage of descriptors",89,null],[13,"AddressValidator","","Error that can be returned to fail the validation of an …",89,null],[13,"Encode","","Encoding error",89,null],[13,"Miniscript","","Miniscript error",89,null],[13,"BIP32","","BIP32 error",89,null],[13,"Secp256k1","","An ECDSA error",89,null],[13,"JSON","","Error serializing or deserializing JSON data",89,null],[13,"Hex","","Hex decoding error",89,null],[13,"PSBT","","Partially signed bitcoin transaction error",89,null],[13,"Electrum","","Electrum client error",89,null],[13,"Esplora","","Esplora client error",89,null],[13,"CompactFilters","","Compact filters client error)",89,null],[13,"Sled","","Sled database error",89,null],[4,"KeychainKind","","Types of keychains",null,null],[13,"External","","External",93,null],[13,"Internal","","Internal, usually used for change outputs",93,null],[3,"FeeRate","","Fee rate",null,null],[3,"UTXO","","A wallet unspent output",null,null],[12,"outpoint","","Reference to a transaction output",94,null],[12,"txout","","Transaction output",94,null],[12,"keychain","","Type of keychain",94,null],[3,"TransactionDetails","","A wallet transaction",null,null],[12,"transaction","","Optional transaction",95,null],[12,"txid","","Transaction id",95,null],[12,"timestamp","","Timestamp",95,null],[12,"received","","Received value (sats)",95,null],[12,"sent","","Sent value (sats)",95,null],[12,"fees","","Fee value (sats)",95,null],[12,"height","","Confirmed in block height, <code>None</code> means unconfirmed",95,null],[5,"version","","Get the version of BDK at runtime",null,[[]]],[14,"descriptor","","Macro to write full descriptors with code",null,null],[14,"fragment","","Macro to write descriptor fragments with code",null,null],[11,"from","","",89,[[]]],[11,"into","","",89,[[]]],[11,"to_string","","",89,[[],["string",3]]],[11,"borrow","","",89,[[]]],[11,"borrow_mut","","",89,[[]]],[11,"try_from","","",89,[[],["result",4]]],[11,"try_into","","",89,[[],["result",4]]],[11,"type_id","","",89,[[],["typeid",3]]],[11,"vzip","","",89,[[]]],[11,"init","","",89,[[]]],[11,"deref","","",89,[[]]],[11,"deref_mut","","",89,[[]]],[11,"drop","","",89,[[]]],[11,"from","bdk::blockchain::any","",0,[[]]],[11,"into","","",0,[[]]],[11,"borrow","","",0,[[]]],[11,"borrow_mut","","",0,[[]]],[11,"try_from","","",0,[[],["result",4]]],[11,"try_into","","",0,[[],["result",4]]],[11,"type_id","","",0,[[],["typeid",3]]],[11,"vzip","","",0,[[]]],[11,"init","","",0,[[]]],[11,"deref","","",0,[[]]],[11,"deref_mut","","",0,[[]]],[11,"drop","","",0,[[]]],[11,"from","","",1,[[]]],[11,"into","","",1,[[]]],[11,"borrow","","",1,[[]]],[11,"borrow_mut","","",1,[[]]],[11,"try_from","","",1,[[],["result",4]]],[11,"try_into","","",1,[[],["result",4]]],[11,"type_id","","",1,[[],["typeid",3]]],[11,"vzip","","",1,[[]]],[11,"init","","",1,[[]]],[11,"deref","","",1,[[]]],[11,"deref_mut","","",1,[[]]],[11,"drop","","",1,[[]]],[11,"from","bdk::blockchain::electrum","",96,[[]]],[11,"into","","",96,[[]]],[11,"borrow","","",96,[[]]],[11,"borrow_mut","","",96,[[]]],[11,"try_from","","",96,[[],["result",4]]],[11,"try_into","","",96,[[],["result",4]]],[11,"type_id","","",96,[[],["typeid",3]]],[11,"vzip","","",96,[[]]],[11,"init","","",96,[[]]],[11,"deref","","",96,[[]]],[11,"deref_mut","","",96,[[]]],[11,"drop","","",96,[[]]],[11,"from","","",2,[[]]],[11,"into","","",2,[[]]],[11,"borrow","","",2,[[]]],[11,"borrow_mut","","",2,[[]]],[11,"try_from","","",2,[[],["result",4]]],[11,"try_into","","",2,[[],["result",4]]],[11,"type_id","","",2,[[],["typeid",3]]],[11,"vzip","","",2,[[]]],[11,"init","","",2,[[]]],[11,"deref","","",2,[[]]],[11,"deref_mut","","",2,[[]]],[11,"drop","","",2,[[]]],[11,"from","bdk::blockchain::esplora","",3,[[]]],[11,"into","","",3,[[]]],[11,"borrow","","",3,[[]]],[11,"borrow_mut","","",3,[[]]],[11,"try_from","","",3,[[],["result",4]]],[11,"try_into","","",3,[[],["result",4]]],[11,"type_id","","",3,[[],["typeid",3]]],[11,"vzip","","",3,[[]]],[11,"init","","",3,[[]]],[11,"deref","","",3,[[]]],[11,"deref_mut","","",3,[[]]],[11,"drop","","",3,[[]]],[11,"from","","",4,[[]]],[11,"into","","",4,[[]]],[11,"borrow","","",4,[[]]],[11,"borrow_mut","","",4,[[]]],[11,"try_from","","",4,[[],["result",4]]],[11,"try_into","","",4,[[],["result",4]]],[11,"type_id","","",4,[[],["typeid",3]]],[11,"vzip","","",4,[[]]],[11,"init","","",4,[[]]],[11,"deref","","",4,[[]]],[11,"deref_mut","","",4,[[]]],[11,"drop","","",4,[[]]],[11,"from","","",5,[[]]],[11,"into","","",5,[[]]],[11,"to_string","","",5,[[],["string",3]]],[11,"borrow","","",5,[[]]],[11,"borrow_mut","","",5,[[]]],[11,"try_from","","",5,[[],["result",4]]],[11,"try_into","","",5,[[],["result",4]]],[11,"type_id","","",5,[[],["typeid",3]]],[11,"vzip","","",5,[[]]],[11,"init","","",5,[[]]],[11,"deref","","",5,[[]]],[11,"deref_mut","","",5,[[]]],[11,"drop","","",5,[[]]],[11,"from","bdk::blockchain::compact_filters","",97,[[]]],[11,"into","","",97,[[]]],[11,"borrow","","",97,[[]]],[11,"borrow_mut","","",97,[[]]],[11,"try_from","","",97,[[],["result",4]]],[11,"try_into","","",97,[[],["result",4]]],[11,"type_id","","",97,[[],["typeid",3]]],[11,"vzip","","",97,[[]]],[11,"init","","",97,[[]]],[11,"deref","","",97,[[]]],[11,"deref_mut","","",97,[[]]],[11,"drop","","",97,[[]]],[11,"from","","",98,[[]]],[11,"into","","",98,[[]]],[11,"borrow","","",98,[[]]],[11,"borrow_mut","","",98,[[]]],[11,"try_from","","",98,[[],["result",4]]],[11,"try_into","","",98,[[],["result",4]]],[11,"type_id","","",98,[[],["typeid",3]]],[11,"vzip","","",98,[[]]],[11,"init","","",98,[[]]],[11,"deref","","",98,[[]]],[11,"deref_mut","","",98,[[]]],[11,"drop","","",98,[[]]],[11,"from","","",6,[[]]],[11,"into","","",6,[[]]],[11,"borrow","","",6,[[]]],[11,"borrow_mut","","",6,[[]]],[11,"try_from","","",6,[[],["result",4]]],[11,"try_into","","",6,[[],["result",4]]],[11,"type_id","","",6,[[],["typeid",3]]],[11,"vzip","","",6,[[]]],[11,"init","","",6,[[]]],[11,"deref","","",6,[[]]],[11,"deref_mut","","",6,[[]]],[11,"drop","","",6,[[]]],[11,"from","","",7,[[]]],[11,"into","","",7,[[]]],[11,"borrow","","",7,[[]]],[11,"borrow_mut","","",7,[[]]],[11,"try_from","","",7,[[],["result",4]]],[11,"try_into","","",7,[[],["result",4]]],[11,"type_id","","",7,[[],["typeid",3]]],[11,"vzip","","",7,[[]]],[11,"init","","",7,[[]]],[11,"deref","","",7,[[]]],[11,"deref_mut","","",7,[[]]],[11,"drop","","",7,[[]]],[11,"from","","",8,[[]]],[11,"into","","",8,[[]]],[11,"borrow","","",8,[[]]],[11,"borrow_mut","","",8,[[]]],[11,"try_from","","",8,[[],["result",4]]],[11,"try_into","","",8,[[],["result",4]]],[11,"type_id","","",8,[[],["typeid",3]]],[11,"vzip","","",8,[[]]],[11,"init","","",8,[[]]],[11,"deref","","",8,[[]]],[11,"deref_mut","","",8,[[]]],[11,"drop","","",8,[[]]],[11,"from","","",9,[[]]],[11,"into","","",9,[[]]],[11,"to_string","","",9,[[],["string",3]]],[11,"borrow","","",9,[[]]],[11,"borrow_mut","","",9,[[]]],[11,"try_from","","",9,[[],["result",4]]],[11,"try_into","","",9,[[],["result",4]]],[11,"type_id","","",9,[[],["typeid",3]]],[11,"vzip","","",9,[[]]],[11,"init","","",9,[[]]],[11,"deref","","",9,[[]]],[11,"deref_mut","","",9,[[]]],[11,"drop","","",9,[[]]],[11,"from","bdk::blockchain","",10,[[]]],[11,"into","","",10,[[]]],[11,"to_owned","","",10,[[]]],[11,"clone_into","","",10,[[]]],[11,"borrow","","",10,[[]]],[11,"borrow_mut","","",10,[[]]],[11,"try_from","","",10,[[],["result",4]]],[11,"try_into","","",10,[[],["result",4]]],[11,"type_id","","",10,[[],["typeid",3]]],[11,"vzip","","",10,[[]]],[11,"equivalent","","",10,[[]]],[11,"init","","",10,[[]]],[11,"deref","","",10,[[]]],[11,"deref_mut","","",10,[[]]],[11,"drop","","",10,[[]]],[11,"from","","",99,[[]]],[11,"into","","",99,[[]]],[11,"to_owned","","",99,[[]]],[11,"clone_into","","",99,[[]]],[11,"borrow","","",99,[[]]],[11,"borrow_mut","","",99,[[]]],[11,"try_from","","",99,[[],["result",4]]],[11,"try_into","","",99,[[],["result",4]]],[11,"type_id","","",99,[[],["typeid",3]]],[11,"vzip","","",99,[[]]],[11,"init","","",99,[[]]],[11,"deref","","",99,[[]]],[11,"deref_mut","","",99,[[]]],[11,"drop","","",99,[[]]],[11,"from","","",100,[[]]],[11,"into","","",100,[[]]],[11,"to_owned","","",100,[[]]],[11,"clone_into","","",100,[[]]],[11,"borrow","","",100,[[]]],[11,"borrow_mut","","",100,[[]]],[11,"try_from","","",100,[[],["result",4]]],[11,"try_into","","",100,[[],["result",4]]],[11,"type_id","","",100,[[],["typeid",3]]],[11,"vzip","","",100,[[]]],[11,"init","","",100,[[]]],[11,"deref","","",100,[[]]],[11,"deref_mut","","",100,[[]]],[11,"drop","","",100,[[]]],[11,"from","bdk::database::any","",14,[[]]],[11,"into","","",14,[[]]],[11,"borrow","","",14,[[]]],[11,"borrow_mut","","",14,[[]]],[11,"try_from","","",14,[[],["result",4]]],[11,"try_into","","",14,[[],["result",4]]],[11,"type_id","","",14,[[],["typeid",3]]],[11,"vzip","","",14,[[]]],[11,"init","","",14,[[]]],[11,"deref","","",14,[[]]],[11,"deref_mut","","",14,[[]]],[11,"drop","","",14,[[]]],[11,"from","","",15,[[]]],[11,"into","","",15,[[]]],[11,"borrow","","",15,[[]]],[11,"borrow_mut","","",15,[[]]],[11,"try_from","","",15,[[],["result",4]]],[11,"try_into","","",15,[[],["result",4]]],[11,"type_id","","",15,[[],["typeid",3]]],[11,"vzip","","",15,[[]]],[11,"init","","",15,[[]]],[11,"deref","","",15,[[]]],[11,"deref_mut","","",15,[[]]],[11,"drop","","",15,[[]]],[11,"from","","",16,[[]]],[11,"into","","",16,[[]]],[11,"borrow","","",16,[[]]],[11,"borrow_mut","","",16,[[]]],[11,"try_from","","",16,[[],["result",4]]],[11,"try_into","","",16,[[],["result",4]]],[11,"type_id","","",16,[[],["typeid",3]]],[11,"vzip","","",16,[[]]],[11,"init","","",16,[[]]],[11,"deref","","",16,[[]]],[11,"deref_mut","","",16,[[]]],[11,"drop","","",16,[[]]],[11,"from","","",17,[[]]],[11,"into","","",17,[[]]],[11,"borrow","","",17,[[]]],[11,"borrow_mut","","",17,[[]]],[11,"try_from","","",17,[[],["result",4]]],[11,"try_into","","",17,[[],["result",4]]],[11,"type_id","","",17,[[],["typeid",3]]],[11,"vzip","","",17,[[]]],[11,"init","","",17,[[]]],[11,"deref","","",17,[[]]],[11,"deref_mut","","",17,[[]]],[11,"drop","","",17,[[]]],[11,"from","bdk::database::memory","",18,[[]]],[11,"into","","",18,[[]]],[11,"borrow","","",18,[[]]],[11,"borrow_mut","","",18,[[]]],[11,"try_from","","",18,[[],["result",4]]],[11,"try_into","","",18,[[],["result",4]]],[11,"type_id","","",18,[[],["typeid",3]]],[11,"vzip","","",18,[[]]],[11,"init","","",18,[[]]],[11,"deref","","",18,[[]]],[11,"deref_mut","","",18,[[]]],[11,"drop","","",18,[[]]],[11,"from","bdk::descriptor::error","",23,[[]]],[11,"into","","",23,[[]]],[11,"to_string","","",23,[[],["string",3]]],[11,"borrow","","",23,[[]]],[11,"borrow_mut","","",23,[[]]],[11,"try_from","","",23,[[],["result",4]]],[11,"try_into","","",23,[[],["result",4]]],[11,"type_id","","",23,[[],["typeid",3]]],[11,"vzip","","",23,[[]]],[11,"init","","",23,[[]]],[11,"deref","","",23,[[]]],[11,"deref_mut","","",23,[[]]],[11,"drop","","",23,[[]]],[11,"from","bdk::descriptor::policy","",101,[[]]],[11,"into","","",101,[[]]],[11,"to_owned","","",101,[[]]],[11,"clone_into","","",101,[[]]],[11,"borrow","","",101,[[]]],[11,"borrow_mut","","",101,[[]]],[11,"try_from","","",101,[[],["result",4]]],[11,"try_into","","",101,[[],["result",4]]],[11,"type_id","","",101,[[],["typeid",3]]],[11,"vzip","","",101,[[]]],[11,"init","","",101,[[]]],[11,"deref","","",101,[[]]],[11,"deref_mut","","",101,[[]]],[11,"drop","","",101,[[]]],[11,"from","","",24,[[]]],[11,"into","","",24,[[]]],[11,"to_owned","","",24,[[]]],[11,"clone_into","","",24,[[]]],[11,"borrow","","",24,[[]]],[11,"borrow_mut","","",24,[[]]],[11,"try_from","","",24,[[],["result",4]]],[11,"try_into","","",24,[[],["result",4]]],[11,"type_id","","",24,[[],["typeid",3]]],[11,"vzip","","",24,[[]]],[11,"init","","",24,[[]]],[11,"deref","","",24,[[]]],[11,"deref_mut","","",24,[[]]],[11,"drop","","",24,[[]]],[11,"from","","",33,[[]]],[11,"into","","",33,[[]]],[11,"to_owned","","",33,[[]]],[11,"clone_into","","",33,[[]]],[11,"borrow","","",33,[[]]],[11,"borrow_mut","","",33,[[]]],[11,"try_from","","",33,[[],["result",4]]],[11,"try_into","","",33,[[],["result",4]]],[11,"type_id","","",33,[[],["typeid",3]]],[11,"vzip","","",33,[[]]],[11,"init","","",33,[[]]],[11,"deref","","",33,[[]]],[11,"deref_mut","","",33,[[]]],[11,"drop","","",33,[[]]],[11,"from","","",37,[[]]],[11,"into","","",37,[[]]],[11,"to_owned","","",37,[[]]],[11,"clone_into","","",37,[[]]],[11,"borrow","","",37,[[]]],[11,"borrow_mut","","",37,[[]]],[11,"try_from","","",37,[[],["result",4]]],[11,"try_into","","",37,[[],["result",4]]],[11,"type_id","","",37,[[],["typeid",3]]],[11,"vzip","","",37,[[]]],[11,"init","","",37,[[]]],[11,"deref","","",37,[[]]],[11,"deref_mut","","",37,[[]]],[11,"drop","","",37,[[]]],[11,"from","","",38,[[]]],[11,"into","","",38,[[]]],[11,"to_owned","","",38,[[]]],[11,"clone_into","","",38,[[]]],[11,"borrow","","",38,[[]]],[11,"borrow_mut","","",38,[[]]],[11,"try_from","","",38,[[],["result",4]]],[11,"try_into","","",38,[[],["result",4]]],[11,"type_id","","",38,[[],["typeid",3]]],[11,"vzip","","",38,[[]]],[11,"equivalent","","",38,[[]]],[11,"init","","",38,[[]]],[11,"deref","","",38,[[]]],[11,"deref_mut","","",38,[[]]],[11,"drop","","",38,[[]]],[11,"from","","",39,[[]]],[11,"into","","",39,[[]]],[11,"to_string","","",39,[[],["string",3]]],[11,"borrow","","",39,[[]]],[11,"borrow_mut","","",39,[[]]],[11,"try_from","","",39,[[],["result",4]]],[11,"try_into","","",39,[[],["result",4]]],[11,"type_id","","",39,[[],["typeid",3]]],[11,"vzip","","",39,[[]]],[11,"init","","",39,[[]]],[11,"deref","","",39,[[]]],[11,"deref_mut","","",39,[[]]],[11,"drop","","",39,[[]]],[11,"to_wallet_descriptor","bdk::descriptor::template","",41,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",41,[[]]],[11,"into","","",41,[[]]],[11,"borrow","","",41,[[]]],[11,"borrow_mut","","",41,[[]]],[11,"try_from","","",41,[[],["result",4]]],[11,"try_into","","",41,[[],["result",4]]],[11,"type_id","","",41,[[],["typeid",3]]],[11,"vzip","","",41,[[]]],[11,"init","","",41,[[]]],[11,"deref","","",41,[[]]],[11,"deref_mut","","",41,[[]]],[11,"drop","","",41,[[]]],[11,"to_wallet_descriptor","","",42,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",42,[[]]],[11,"into","","",42,[[]]],[11,"borrow","","",42,[[]]],[11,"borrow_mut","","",42,[[]]],[11,"try_from","","",42,[[],["result",4]]],[11,"try_into","","",42,[[],["result",4]]],[11,"type_id","","",42,[[],["typeid",3]]],[11,"vzip","","",42,[[]]],[11,"init","","",42,[[]]],[11,"deref","","",42,[[]]],[11,"deref_mut","","",42,[[]]],[11,"drop","","",42,[[]]],[11,"to_wallet_descriptor","","",43,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",43,[[]]],[11,"into","","",43,[[]]],[11,"borrow","","",43,[[]]],[11,"borrow_mut","","",43,[[]]],[11,"try_from","","",43,[[],["result",4]]],[11,"try_into","","",43,[[],["result",4]]],[11,"type_id","","",43,[[],["typeid",3]]],[11,"vzip","","",43,[[]]],[11,"init","","",43,[[]]],[11,"deref","","",43,[[]]],[11,"deref_mut","","",43,[[]]],[11,"drop","","",43,[[]]],[11,"to_wallet_descriptor","","",44,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",44,[[]]],[11,"into","","",44,[[]]],[11,"borrow","","",44,[[]]],[11,"borrow_mut","","",44,[[]]],[11,"try_from","","",44,[[],["result",4]]],[11,"try_into","","",44,[[],["result",4]]],[11,"type_id","","",44,[[],["typeid",3]]],[11,"vzip","","",44,[[]]],[11,"init","","",44,[[]]],[11,"deref","","",44,[[]]],[11,"deref_mut","","",44,[[]]],[11,"drop","","",44,[[]]],[11,"to_wallet_descriptor","","",45,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",45,[[]]],[11,"into","","",45,[[]]],[11,"borrow","","",45,[[]]],[11,"borrow_mut","","",45,[[]]],[11,"try_from","","",45,[[],["result",4]]],[11,"try_into","","",45,[[],["result",4]]],[11,"type_id","","",45,[[],["typeid",3]]],[11,"vzip","","",45,[[]]],[11,"init","","",45,[[]]],[11,"deref","","",45,[[]]],[11,"deref_mut","","",45,[[]]],[11,"drop","","",45,[[]]],[11,"to_wallet_descriptor","","",46,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",46,[[]]],[11,"into","","",46,[[]]],[11,"borrow","","",46,[[]]],[11,"borrow_mut","","",46,[[]]],[11,"try_from","","",46,[[],["result",4]]],[11,"try_into","","",46,[[],["result",4]]],[11,"type_id","","",46,[[],["typeid",3]]],[11,"vzip","","",46,[[]]],[11,"init","","",46,[[]]],[11,"deref","","",46,[[]]],[11,"deref_mut","","",46,[[]]],[11,"drop","","",46,[[]]],[11,"to_wallet_descriptor","","",47,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",47,[[]]],[11,"into","","",47,[[]]],[11,"borrow","","",47,[[]]],[11,"borrow_mut","","",47,[[]]],[11,"try_from","","",47,[[],["result",4]]],[11,"try_into","","",47,[[],["result",4]]],[11,"type_id","","",47,[[],["typeid",3]]],[11,"vzip","","",47,[[]]],[11,"init","","",47,[[]]],[11,"deref","","",47,[[]]],[11,"deref_mut","","",47,[[]]],[11,"drop","","",47,[[]]],[11,"to_wallet_descriptor","","",48,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",48,[[]]],[11,"into","","",48,[[]]],[11,"borrow","","",48,[[]]],[11,"borrow_mut","","",48,[[]]],[11,"try_from","","",48,[[],["result",4]]],[11,"try_into","","",48,[[],["result",4]]],[11,"type_id","","",48,[[],["typeid",3]]],[11,"vzip","","",48,[[]]],[11,"init","","",48,[[]]],[11,"deref","","",48,[[]]],[11,"deref_mut","","",48,[[]]],[11,"drop","","",48,[[]]],[11,"to_wallet_descriptor","","",49,[[["network",4]],[["error",4],["result",4]]]],[11,"from","","",49,[[]]],[11,"into","","",49,[[]]],[11,"borrow","","",49,[[]]],[11,"borrow_mut","","",49,[[]]],[11,"try_from","","",49,[[],["result",4]]],[11,"try_into","","",49,[[],["result",4]]],[11,"type_id","","",49,[[],["typeid",3]]],[11,"vzip","","",49,[[]]],[11,"init","","",49,[[]]],[11,"deref","","",49,[[]]],[11,"deref_mut","","",49,[[]]],[11,"drop","","",49,[[]]],[11,"from","bdk::descriptor","",50,[[]]],[11,"into","","",50,[[]]],[11,"to_owned","","",50,[[]]],[11,"clone_into","","",50,[[]]],[11,"to_string","","",50,[[],["string",3]]],[11,"borrow","","",50,[[]]],[11,"borrow_mut","","",50,[[]]],[11,"try_from","","",50,[[],["result",4]]],[11,"try_into","","",50,[[],["result",4]]],[11,"type_id","","",50,[[],["typeid",3]]],[11,"vzip","","",50,[[]]],[11,"equivalent","","",50,[[]]],[11,"init","","",50,[[]]],[11,"deref","","",50,[[]]],[11,"deref_mut","","",50,[[]]],[11,"drop","","",50,[[]]],[11,"as_enum","","",102,[[],["scriptcontextenum",4]]],[11,"from","","",102,[[]]],[11,"into","","",102,[[]]],[11,"to_owned","","",102,[[]]],[11,"clone_into","","",102,[[]]],[11,"borrow","","",102,[[]]],[11,"borrow_mut","","",102,[[]]],[11,"try_from","","",102,[[],["result",4]]],[11,"try_into","","",102,[[],["result",4]]],[11,"type_id","","",102,[[],["typeid",3]]],[11,"vzip","","",102,[[]]],[11,"equivalent","","",102,[[]]],[11,"init","","",102,[[]]],[11,"deref","","",102,[[]]],[11,"deref_mut","","",102,[[]]],[11,"drop","","",102,[[]]],[11,"from","","",51,[[]]],[11,"into","","",51,[[]]],[11,"to_owned","","",51,[[]]],[11,"clone_into","","",51,[[]]],[11,"to_string","","",51,[[],["string",3]]],[11,"borrow","","",51,[[]]],[11,"borrow_mut","","",51,[[]]],[11,"try_from","","",51,[[],["result",4]]],[11,"try_into","","",51,[[],["result",4]]],[11,"type_id","","",51,[[],["typeid",3]]],[11,"vzip","","",51,[[]]],[11,"equivalent","","",51,[[]]],[11,"init","","",51,[[]]],[11,"deref","","",51,[[]]],[11,"deref_mut","","",51,[[]]],[11,"drop","","",51,[[]]],[11,"as_enum","","",103,[[],["scriptcontextenum",4]]],[11,"from","","",103,[[]]],[11,"into","","",103,[[]]],[11,"to_owned","","",103,[[]]],[11,"clone_into","","",103,[[]]],[11,"borrow","","",103,[[]]],[11,"borrow_mut","","",103,[[]]],[11,"try_from","","",103,[[],["result",4]]],[11,"try_into","","",103,[[],["result",4]]],[11,"type_id","","",103,[[],["typeid",3]]],[11,"vzip","","",103,[[]]],[11,"equivalent","","",103,[[]]],[11,"init","","",103,[[]]],[11,"deref","","",103,[[]]],[11,"deref_mut","","",103,[[]]],[11,"drop","","",103,[[]]],[11,"from","","",54,[[]]],[11,"into","","",54,[[]]],[11,"to_owned","","",54,[[]]],[11,"clone_into","","",54,[[]]],[11,"to_string","","",54,[[],["string",3]]],[11,"borrow","","",54,[[]]],[11,"borrow_mut","","",54,[[]]],[11,"try_from","","",54,[[],["result",4]]],[11,"try_into","","",54,[[],["result",4]]],[11,"type_id","","",54,[[],["typeid",3]]],[11,"vzip","","",54,[[]]],[11,"equivalent","","",54,[[]]],[11,"init","","",54,[[]]],[11,"deref","","",54,[[]]],[11,"deref_mut","","",54,[[]]],[11,"drop","","",54,[[]]],[11,"from","bdk::keys","",58,[[]]],[11,"into","","",58,[[]]],[11,"to_owned","","",58,[[]]],[11,"clone_into","","",58,[[]]],[11,"to_string","","",58,[[],["string",3]]],[11,"borrow","","",58,[[]]],[11,"borrow_mut","","",58,[[]]],[11,"try_from","","",58,[[],["result",4]]],[11,"try_into","","",58,[[],["result",4]]],[11,"type_id","","",58,[[],["typeid",3]]],[11,"vzip","","",58,[[]]],[11,"equivalent","","",58,[[]]],[11,"init","","",58,[[]]],[11,"deref","","",58,[[]]],[11,"deref_mut","","",58,[[]]],[11,"drop","","",58,[[]]],[11,"from","","",59,[[]]],[11,"into","","",59,[[]]],[11,"to_string","","",59,[[],["string",3]]],[11,"borrow","","",59,[[]]],[11,"borrow_mut","","",59,[[]]],[11,"try_from","","",59,[[],["result",4]]],[11,"try_into","","",59,[[],["result",4]]],[11,"type_id","","",59,[[],["typeid",3]]],[11,"vzip","","",59,[[]]],[11,"init","","",59,[[]]],[11,"deref","","",59,[[]]],[11,"deref_mut","","",59,[[]]],[11,"drop","","",59,[[]]],[11,"from","","",60,[[]]],[11,"into","","",60,[[]]],[11,"borrow","","",60,[[]]],[11,"borrow_mut","","",60,[[]]],[11,"try_from","","",60,[[],["result",4]]],[11,"try_into","","",60,[[],["result",4]]],[11,"type_id","","",60,[[],["typeid",3]]],[11,"vzip","","",60,[[]]],[11,"init","","",60,[[]]],[11,"deref","","",60,[[]]],[11,"deref_mut","","",60,[[]]],[11,"drop","","",60,[[]]],[11,"from","","",61,[[]]],[11,"into","","",61,[[]]],[11,"to_owned","","",61,[[]]],[11,"clone_into","","",61,[[]]],[11,"borrow","","",61,[[]]],[11,"borrow_mut","","",61,[[]]],[11,"try_from","","",61,[[],["result",4]]],[11,"try_into","","",61,[[],["result",4]]],[11,"type_id","","",61,[[],["typeid",3]]],[11,"vzip","","",61,[[]]],[11,"equivalent","","",61,[[]]],[11,"init","","",61,[[]]],[11,"deref","","",61,[[]]],[11,"deref_mut","","",61,[[]]],[11,"drop","","",61,[[]]],[11,"from","","",62,[[]]],[11,"into","","",62,[[]]],[11,"to_owned","","",62,[[]]],[11,"clone_into","","",62,[[]]],[11,"to_string","","",62,[[],["string",3]]],[11,"borrow","","",62,[[]]],[11,"borrow_mut","","",62,[[]]],[11,"try_from","","",62,[[],["result",4]]],[11,"try_into","","",62,[[],["result",4]]],[11,"type_id","","",62,[[],["typeid",3]]],[11,"vzip","","",62,[[]]],[11,"equivalent","","",62,[[]]],[11,"init","","",62,[[]]],[11,"deref","","",62,[[]]],[11,"deref_mut","","",62,[[]]],[11,"drop","","",62,[[]]],[11,"from","","",63,[[]]],[11,"into","","",63,[[]]],[11,"borrow","","",63,[[]]],[11,"borrow_mut","","",63,[[]]],[11,"try_from","","",63,[[],["result",4]]],[11,"try_into","","",63,[[],["result",4]]],[11,"type_id","","",63,[[],["typeid",3]]],[11,"vzip","","",63,[[]]],[11,"init","","",63,[[]]],[11,"deref","","",63,[[]]],[11,"deref_mut","","",63,[[]]],[11,"drop","","",63,[[]]],[11,"from","","",64,[[]]],[11,"into","","",64,[[]]],[11,"to_owned","","",64,[[]]],[11,"clone_into","","",64,[[]]],[11,"borrow","","",64,[[]]],[11,"borrow_mut","","",64,[[]]],[11,"try_from","","",64,[[],["result",4]]],[11,"try_into","","",64,[[],["result",4]]],[11,"type_id","","",64,[[],["typeid",3]]],[11,"vzip","","",64,[[]]],[11,"equivalent","","",64,[[]]],[11,"init","","",64,[[]]],[11,"deref","","",64,[[]]],[11,"deref_mut","","",64,[[]]],[11,"drop","","",64,[[]]],[11,"from","","",68,[[]]],[11,"into","","",68,[[]]],[11,"borrow","","",68,[[]]],[11,"borrow_mut","","",68,[[]]],[11,"try_from","","",68,[[],["result",4]]],[11,"try_into","","",68,[[],["result",4]]],[11,"type_id","","",68,[[],["typeid",3]]],[11,"vzip","","",68,[[]]],[11,"init","","",68,[[]]],[11,"deref","","",68,[[]]],[11,"deref_mut","","",68,[[]]],[11,"drop","","",68,[[]]],[11,"from","","",71,[[]]],[11,"into","","",71,[[]]],[11,"to_owned","","",71,[[]]],[11,"clone_into","","",71,[[]]],[11,"borrow","","",71,[[]]],[11,"borrow_mut","","",71,[[]]],[11,"try_from","","",71,[[],["result",4]]],[11,"try_into","","",71,[[],["result",4]]],[11,"type_id","","",71,[[],["typeid",3]]],[11,"vzip","","",71,[[]]],[11,"init","","",71,[[]]],[11,"deref","","",71,[[]]],[11,"deref_mut","","",71,[[]]],[11,"drop","","",71,[[]]],[11,"from","","",72,[[]]],[11,"into","","",72,[[]]],[11,"to_string","","",72,[[],["string",3]]],[11,"borrow","","",72,[[]]],[11,"borrow_mut","","",72,[[]]],[11,"try_from","","",72,[[],["result",4]]],[11,"try_into","","",72,[[],["result",4]]],[11,"type_id","","",72,[[],["typeid",3]]],[11,"vzip","","",72,[[]]],[11,"init","","",72,[[]]],[11,"deref","","",72,[[]]],[11,"deref_mut","","",72,[[]]],[11,"drop","","",72,[[]]],[11,"from","bdk","",93,[[]]],[11,"into","","",93,[[]]],[11,"to_owned","","",93,[[]]],[11,"clone_into","","",93,[[]]],[11,"borrow","","",93,[[]]],[11,"borrow_mut","","",93,[[]]],[11,"try_from","","",93,[[],["result",4]]],[11,"try_into","","",93,[[],["result",4]]],[11,"type_id","","",93,[[],["typeid",3]]],[11,"write_base32","","",93,[[],["result",4]]],[11,"base32_len","","",93,[[]]],[11,"check_base32","","",93,[[],[["vec",3],["result",4]]]],[11,"vzip","","",93,[[]]],[11,"equivalent","","",93,[[]]],[11,"init","","",93,[[]]],[11,"deref","","",93,[[]]],[11,"deref_mut","","",93,[[]]],[11,"drop","","",93,[[]]],[11,"from","","",104,[[]]],[11,"into","","",104,[[]]],[11,"to_owned","","",104,[[]]],[11,"clone_into","","",104,[[]]],[11,"borrow","","",104,[[]]],[11,"borrow_mut","","",104,[[]]],[11,"try_from","","",104,[[],["result",4]]],[11,"try_into","","",104,[[],["result",4]]],[11,"type_id","","",104,[[],["typeid",3]]],[11,"vzip","","",104,[[]]],[11,"init","","",104,[[]]],[11,"deref","","",104,[[]]],[11,"deref_mut","","",104,[[]]],[11,"drop","","",104,[[]]],[11,"from","","",94,[[]]],[11,"into","","",94,[[]]],[11,"to_owned","","",94,[[]]],[11,"clone_into","","",94,[[]]],[11,"borrow","","",94,[[]]],[11,"borrow_mut","","",94,[[]]],[11,"try_from","","",94,[[],["result",4]]],[11,"try_into","","",94,[[],["result",4]]],[11,"type_id","","",94,[[],["typeid",3]]],[11,"vzip","","",94,[[]]],[11,"equivalent","","",94,[[]]],[11,"init","","",94,[[]]],[11,"deref","","",94,[[]]],[11,"deref_mut","","",94,[[]]],[11,"drop","","",94,[[]]],[11,"from","","",95,[[]]],[11,"into","","",95,[[]]],[11,"to_owned","","",95,[[]]],[11,"clone_into","","",95,[[]]],[11,"borrow","","",95,[[]]],[11,"borrow_mut","","",95,[[]]],[11,"try_from","","",95,[[],["result",4]]],[11,"try_into","","",95,[[],["result",4]]],[11,"type_id","","",95,[[],["typeid",3]]],[11,"vzip","","",95,[[]]],[11,"equivalent","","",95,[[]]],[11,"init","","",95,[[]]],[11,"deref","","",95,[[]]],[11,"deref_mut","","",95,[[]]],[11,"drop","","",95,[[]]],[11,"from","bdk::wallet::address_validator","",73,[[]]],[11,"into","","",73,[[]]],[11,"to_owned","","",73,[[]]],[11,"clone_into","","",73,[[]]],[11,"to_string","","",73,[[],["string",3]]],[11,"borrow","","",73,[[]]],[11,"borrow_mut","","",73,[[]]],[11,"try_from","","",73,[[],["result",4]]],[11,"try_into","","",73,[[],["result",4]]],[11,"type_id","","",73,[[],["typeid",3]]],[11,"vzip","","",73,[[]]],[11,"equivalent","","",73,[[]]],[11,"init","","",73,[[]]],[11,"deref","","",73,[[]]],[11,"deref_mut","","",73,[[]]],[11,"drop","","",73,[[]]],[11,"from","bdk::wallet::coin_selection","",75,[[]]],[11,"into","","",75,[[]]],[11,"borrow","","",75,[[]]],[11,"borrow_mut","","",75,[[]]],[11,"try_from","","",75,[[],["result",4]]],[11,"try_into","","",75,[[],["result",4]]],[11,"type_id","","",75,[[],["typeid",3]]],[11,"vzip","","",75,[[]]],[11,"init","","",75,[[]]],[11,"deref","","",75,[[]]],[11,"deref_mut","","",75,[[]]],[11,"drop","","",75,[[]]],[11,"from","","",105,[[]]],[11,"into","","",105,[[]]],[11,"borrow","","",105,[[]]],[11,"borrow_mut","","",105,[[]]],[11,"try_from","","",105,[[],["result",4]]],[11,"try_into","","",105,[[],["result",4]]],[11,"type_id","","",105,[[],["typeid",3]]],[11,"vzip","","",105,[[]]],[11,"init","","",105,[[]]],[11,"deref","","",105,[[]]],[11,"deref_mut","","",105,[[]]],[11,"drop","","",105,[[]]],[11,"from","","",77,[[]]],[11,"into","","",77,[[]]],[11,"borrow","","",77,[[]]],[11,"borrow_mut","","",77,[[]]],[11,"try_from","","",77,[[],["result",4]]],[11,"try_into","","",77,[[],["result",4]]],[11,"type_id","","",77,[[],["typeid",3]]],[11,"vzip","","",77,[[]]],[11,"init","","",77,[[]]],[11,"deref","","",77,[[]]],[11,"deref_mut","","",77,[[]]],[11,"drop","","",77,[[]]],[11,"from","bdk::wallet::export","",78,[[]]],[11,"into","","",78,[[]]],[11,"borrow","","",78,[[]]],[11,"borrow_mut","","",78,[[]]],[11,"try_from","","",78,[[],["result",4]]],[11,"try_into","","",78,[[],["result",4]]],[11,"type_id","","",78,[[],["typeid",3]]],[11,"vzip","","",78,[[]]],[11,"init","","",78,[[]]],[11,"deref","","",78,[[]]],[11,"deref_mut","","",78,[[]]],[11,"drop","","",78,[[]]],[11,"from","bdk::wallet::signer","",79,[[]]],[11,"into","","",79,[[]]],[11,"to_owned","","",79,[[]]],[11,"clone_into","","",79,[[]]],[11,"borrow","","",79,[[]]],[11,"borrow_mut","","",79,[[]]],[11,"try_from","","",79,[[],["result",4]]],[11,"try_into","","",79,[[],["result",4]]],[11,"type_id","","",79,[[],["typeid",3]]],[11,"vzip","","",79,[[]]],[11,"equivalent","","",79,[[]]],[11,"init","","",79,[[]]],[11,"deref","","",79,[[]]],[11,"deref_mut","","",79,[[]]],[11,"drop","","",79,[[]]],[11,"from","","",80,[[]]],[11,"into","","",80,[[]]],[11,"to_owned","","",80,[[]]],[11,"clone_into","","",80,[[]]],[11,"to_string","","",80,[[],["string",3]]],[11,"borrow","","",80,[[]]],[11,"borrow_mut","","",80,[[]]],[11,"try_from","","",80,[[],["result",4]]],[11,"try_into","","",80,[[],["result",4]]],[11,"type_id","","",80,[[],["typeid",3]]],[11,"vzip","","",80,[[]]],[11,"equivalent","","",80,[[]]],[11,"init","","",80,[[]]],[11,"deref","","",80,[[]]],[11,"deref_mut","","",80,[[]]],[11,"drop","","",80,[[]]],[11,"from","","",82,[[]]],[11,"into","","",82,[[]]],[11,"to_owned","","",82,[[]]],[11,"clone_into","","",82,[[]]],[11,"borrow","","",82,[[]]],[11,"borrow_mut","","",82,[[]]],[11,"try_from","","",82,[[],["result",4]]],[11,"try_into","","",82,[[],["result",4]]],[11,"type_id","","",82,[[],["typeid",3]]],[11,"vzip","","",82,[[]]],[11,"equivalent","","",82,[[]]],[11,"init","","",82,[[]]],[11,"deref","","",82,[[]]],[11,"deref_mut","","",82,[[]]],[11,"drop","","",82,[[]]],[11,"from","","",83,[[]]],[11,"into","","",83,[[]]],[11,"to_owned","","",83,[[]]],[11,"clone_into","","",83,[[]]],[11,"borrow","","",83,[[]]],[11,"borrow_mut","","",83,[[]]],[11,"try_from","","",83,[[],["result",4]]],[11,"try_into","","",83,[[],["result",4]]],[11,"type_id","","",83,[[],["typeid",3]]],[11,"vzip","","",83,[[]]],[11,"init","","",83,[[]]],[11,"deref","","",83,[[]]],[11,"deref_mut","","",83,[[]]],[11,"drop","","",83,[[]]],[11,"from","bdk::wallet::tx_builder","",106,[[]]],[11,"into","","",106,[[]]],[11,"to_owned","","",106,[[]]],[11,"clone_into","","",106,[[]]],[11,"borrow","","",106,[[]]],[11,"borrow_mut","","",106,[[]]],[11,"try_from","","",106,[[],["result",4]]],[11,"try_into","","",106,[[],["result",4]]],[11,"type_id","","",106,[[],["typeid",3]]],[11,"vzip","","",106,[[]]],[11,"init","","",106,[[]]],[11,"deref","","",106,[[]]],[11,"deref_mut","","",106,[[]]],[11,"drop","","",106,[[]]],[11,"from","","",107,[[]]],[11,"into","","",107,[[]]],[11,"to_owned","","",107,[[]]],[11,"clone_into","","",107,[[]]],[11,"borrow","","",107,[[]]],[11,"borrow_mut","","",107,[[]]],[11,"try_from","","",107,[[],["result",4]]],[11,"try_into","","",107,[[],["result",4]]],[11,"type_id","","",107,[[],["typeid",3]]],[11,"vzip","","",107,[[]]],[11,"init","","",107,[[]]],[11,"deref","","",107,[[]]],[11,"deref_mut","","",107,[[]]],[11,"drop","","",107,[[]]],[11,"from","","",84,[[]]],[11,"into","","",84,[[]]],[11,"borrow","","",84,[[]]],[11,"borrow_mut","","",84,[[]]],[11,"try_from","","",84,[[],["result",4]]],[11,"try_into","","",84,[[],["result",4]]],[11,"type_id","","",84,[[],["typeid",3]]],[11,"vzip","","",84,[[]]],[11,"init","","",84,[[]]],[11,"deref","","",84,[[]]],[11,"deref_mut","","",84,[[]]],[11,"drop","","",84,[[]]],[11,"from","","",85,[[]]],[11,"into","","",85,[[]]],[11,"to_owned","","",85,[[]]],[11,"clone_into","","",85,[[]]],[11,"borrow","","",85,[[]]],[11,"borrow_mut","","",85,[[]]],[11,"try_from","","",85,[[],["result",4]]],[11,"try_into","","",85,[[],["result",4]]],[11,"type_id","","",85,[[],["typeid",3]]],[11,"vzip","","",85,[[]]],[11,"equivalent","","",85,[[]]],[11,"init","","",85,[[]]],[11,"deref","","",85,[[]]],[11,"deref_mut","","",85,[[]]],[11,"drop","","",85,[[]]],[11,"from","","",86,[[]]],[11,"into","","",86,[[]]],[11,"to_owned","","",86,[[]]],[11,"clone_into","","",86,[[]]],[11,"borrow","","",86,[[]]],[11,"borrow_mut","","",86,[[]]],[11,"try_from","","",86,[[],["result",4]]],[11,"try_into","","",86,[[],["result",4]]],[11,"type_id","","",86,[[],["typeid",3]]],[11,"vzip","","",86,[[]]],[11,"equivalent","","",86,[[]]],[11,"init","","",86,[[]]],[11,"deref","","",86,[[]]],[11,"deref_mut","","",86,[[]]],[11,"drop","","",86,[[]]],[11,"from","bdk::wallet","",88,[[]]],[11,"into","","",88,[[]]],[11,"borrow","","",88,[[]]],[11,"borrow_mut","","",88,[[]]],[11,"try_from","","",88,[[],["result",4]]],[11,"try_into","","",88,[[],["result",4]]],[11,"type_id","","",88,[[],["typeid",3]]],[11,"vzip","","",88,[[]]],[11,"init","","",88,[[]]],[11,"deref","","",88,[[]]],[11,"deref_mut","","",88,[[]]],[11,"drop","","",88,[[]]],[11,"clone","bdk::descriptor","",54,[[],["terminal",4]]],[11,"clone","","",51,[[],["miniscript",3]]],[11,"clone","","",102,[[],["legacy",4]]],[11,"clone","bdk::keys","",58,[[],["descriptorpublickey",4]]],[11,"clone","","",61,[[],["descriptorsinglepub",3]]],[11,"clone","","",62,[[],["sortedmultivec",3]]],[11,"clone","bdk::descriptor","",103,[[],["segwitv0",4]]],[11,"clone","","",50,[[],["descriptor",4]]],[11,"from_str","","Parse a Miniscript from string and perform sanity checks …",51,[[],[["error",4],["result",4],["miniscript",3]]]],[11,"from_str","bdk::keys","",58,[[],[["descriptorpublickey",4],["result",4]]]],[11,"from_str","","",59,[[],[["descriptorsecretkey",4],["result",4]]]],[11,"from_str","bdk::descriptor","",50,[[],[["result",4],["descriptor",4],["error",4]]]],[11,"check_terminal_non_malleable","","",103,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","",103,[[],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_consensus_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_policy_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"max_satisfaction_size","","",103,[[["miniscript",3]],["option",4]]],[11,"check_terminal_non_malleable","","",102,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","",102,[[],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_consensus_validity","","",102,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","",102,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","",102,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"max_satisfaction_size","","",102,[[["miniscript",3]],["option",4]]],[11,"partial_cmp","","",102,[[["legacy",4]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",51,[[["miniscript",3]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",103,[[["segwitv0",4]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",54,[[["terminal",4]],[["option",4],["ordering",4]]]],[11,"lt","","",54,[[["terminal",4]]]],[11,"le","","",54,[[["terminal",4]]]],[11,"gt","","",54,[[["terminal",4]]]],[11,"ge","","",54,[[["terminal",4]]]],[11,"partial_cmp","bdk::keys","",62,[[["sortedmultivec",3]],[["option",4],["ordering",4]]]],[11,"lt","","",62,[[["sortedmultivec",3]]]],[11,"le","","",62,[[["sortedmultivec",3]]]],[11,"gt","","",62,[[["sortedmultivec",3]]]],[11,"ge","","",62,[[["sortedmultivec",3]]]],[11,"partial_cmp","","",58,[[["descriptorpublickey",4]],[["option",4],["ordering",4]]]],[11,"lt","","",58,[[["descriptorpublickey",4]]]],[11,"le","","",58,[[["descriptorpublickey",4]]]],[11,"gt","","",58,[[["descriptorpublickey",4]]]],[11,"ge","","",58,[[["descriptorpublickey",4]]]],[11,"partial_cmp","","",61,[[["descriptorsinglepub",3]],[["option",4],["ordering",4]]]],[11,"lt","","",61,[[["descriptorsinglepub",3]]]],[11,"le","","",61,[[["descriptorsinglepub",3]]]],[11,"gt","","",61,[[["descriptorsinglepub",3]]]],[11,"ge","","",61,[[["descriptorsinglepub",3]]]],[11,"partial_cmp","bdk::descriptor","",50,[[["descriptor",4]],[["option",4],["ordering",4]]]],[11,"lt","","",50,[[["descriptor",4]]]],[11,"le","","",50,[[["descriptor",4]]]],[11,"gt","","",50,[[["descriptor",4]]]],[11,"ge","","",50,[[["descriptor",4]]]],[11,"lift","","",50,[[],[["error",4],["policy",4],["result",4]]]],[11,"lift","","",51,[[],[["error",4],["policy",4],["result",4]]]],[11,"lift","bdk::keys","",62,[[],[["error",4],["policy",4],["result",4]]]],[11,"lift","bdk::descriptor","",54,[[],[["error",4],["policy",4],["result",4]]]],[11,"to_pubkeyhash","bdk::keys","",58,[[],["descriptorpublickey",4]]],[11,"fmt","","",61,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",62,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",102,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",103,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",54,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",58,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",60,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",51,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",50,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",59,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",54,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",62,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",50,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",59,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",58,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",51,[[["formatter",3]],[["result",4],["error",3]]]],[11,"hash","bdk::keys","",58,[[]]],[11,"hash","bdk::descriptor","",51,[[]]],[11,"hash","","",54,[[]]],[11,"hash","bdk::keys","",61,[[]]],[11,"eq","","",61,[[["descriptorsinglepub",3]]]],[11,"ne","","",61,[[["descriptorsinglepub",3]]]],[11,"eq","bdk::descriptor","",54,[[["terminal",4]]]],[11,"ne","","",54,[[["terminal",4]]]],[11,"eq","","",103,[[["segwitv0",4]]]],[11,"eq","","",102,[[["legacy",4]]]],[11,"eq","bdk::keys","",62,[[["sortedmultivec",3]]]],[11,"ne","","",62,[[["sortedmultivec",3]]]],[11,"eq","bdk::descriptor","",50,[[["descriptor",4]]]],[11,"ne","","",50,[[["descriptor",4]]]],[11,"eq","","",51,[[["miniscript",3]]]],[11,"eq","bdk::keys","",58,[[["descriptorpublickey",4]]]],[11,"ne","","",58,[[["descriptorpublickey",4]]]],[11,"from_tree","bdk::descriptor","Parse an expression tree into a descriptor",50,[[["tree",3]],[["result",4],["descriptor",4],["error",4]]]],[11,"from_tree","","Parse an expression tree into a Miniscript. As a general …",51,[[["tree",3]],[["error",4],["result",4],["miniscript",3]]]],[11,"from_tree","","",54,[[["tree",3]],[["result",4],["error",4],["terminal",4]]]],[11,"cmp","","",50,[[["descriptor",4]],["ordering",4]]],[11,"cmp","","",51,[[["miniscript",3]],["ordering",4]]],[11,"cmp","","",54,[[["terminal",4]],["ordering",4]]],[11,"cmp","bdk::keys","",62,[[["sortedmultivec",3]],["ordering",4]]],[11,"cmp","","",58,[[["descriptorpublickey",4]],["ordering",4]]],[11,"cmp","","",61,[[["descriptorsinglepub",3]],["ordering",4]]],[11,"cmp","bdk::descriptor","",103,[[["segwitv0",4]],["ordering",4]]],[11,"cmp","","",102,[[["legacy",4]],["ordering",4]]],[11,"to_public_key","bdk::keys","",58,[[["descriptorpublickeyctx",3]],["publickey",3]]],[11,"hash_to_hash160","","",58,[[["descriptorpublickeyctx",3]],["hash",3]]],[11,"from_config","bdk::blockchain::any","",0,[[],[["error",4],["result",4]]]],[11,"from_config","bdk::blockchain::electrum","",96,[[],[["error",4],["result",4]]]],[11,"from_config","bdk::blockchain::esplora","",3,[[],[["error",4],["result",4]]]],[11,"from_config","bdk::blockchain::compact_filters","",6,[[],[["error",4],["result",4]]]],[11,"update","bdk::blockchain","",99,[[["string",3],["option",4]],[["error",4],["result",4]]]],[11,"update","","",100,[[["string",3],["option",4]],[["error",4],["result",4]]]],[11,"set_script_pubkey","bdk::database::any","",14,[[["script",3],["keychainkind",4]],[["error",4],["result",4]]]],[11,"set_utxo","","",14,[[["utxo",3]],[["error",4],["result",4]]]],[11,"set_raw_tx","","",14,[[["transaction",3]],[["error",4],["result",4]]]],[11,"set_tx","","",14,[[["transactiondetails",3]],[["error",4],["result",4]]]],[11,"set_last_index","","",14,[[["keychainkind",4]],[["error",4],["result",4]]]],[11,"del_script_pubkey_from_path","","",14,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[11,"del_path_from_script_pubkey","","",14,[[["script",3]],[["error",4],["option",4],["result",4]]]],[11,"del_utxo","","",14,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[11,"del_raw_tx","","",14,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"del_tx","","",14,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[11,"del_last_index","","",14,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[11,"set_script_pubkey","","",15,[[["script",3],["keychainkind",4]],[["error",4],["result",4]]]],[11,"set_utxo","","",15,[[["utxo",3]],[["error",4],["result",4]]]],[11,"set_raw_tx","","",15,[[["transaction",3]],[["error",4],["result",4]]]],[11,"set_tx","","",15,[[["transactiondetails",3]],[["error",4],["result",4]]]],[11,"set_last_index","","",15,[[["keychainkind",4]],[["error",4],["result",4]]]],[11,"del_script_pubkey_from_path","","",15,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[11,"del_path_from_script_pubkey","","",15,[[["script",3]],[["error",4],["option",4],["result",4]]]],[11,"del_utxo","","",15,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[11,"del_raw_tx","","",15,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"del_tx","","",15,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[11,"del_last_index","","",15,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[11,"set_script_pubkey","bdk::database::memory","",18,[[["script",3],["keychainkind",4]],[["error",4],["result",4]]]],[11,"set_utxo","","",18,[[["utxo",3]],[["error",4],["result",4]]]],[11,"set_raw_tx","","",18,[[["transaction",3]],[["error",4],["result",4]]]],[11,"set_tx","","",18,[[["transactiondetails",3]],[["error",4],["result",4]]]],[11,"set_last_index","","",18,[[["keychainkind",4]],[["error",4],["result",4]]]],[11,"del_script_pubkey_from_path","","",18,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[11,"del_path_from_script_pubkey","","",18,[[["script",3]],[["error",4],["option",4],["result",4]]]],[11,"del_utxo","","",18,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[11,"del_raw_tx","","",18,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"del_tx","","",18,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[11,"del_last_index","","",18,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[11,"check_descriptor_checksum","bdk::database::any","",14,[[["asref",8],["keychainkind",4]],[["error",4],["result",4]]]],[11,"iter_script_pubkeys","","",14,[[["option",4],["keychainkind",4]],[["result",4],["vec",3],["error",4]]]],[11,"iter_utxos","","",14,[[],[["vec",3],["result",4],["error",4]]]],[11,"iter_raw_txs","","",14,[[],[["result",4],["vec",3],["error",4]]]],[11,"iter_txs","","",14,[[],[["result",4],["vec",3],["error",4]]]],[11,"get_script_pubkey_from_path","","",14,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[11,"get_path_from_script_pubkey","","",14,[[["script",3]],[["error",4],["option",4],["result",4]]]],[11,"get_utxo","","",14,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[11,"get_raw_tx","","",14,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"get_tx","","",14,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[11,"get_last_index","","",14,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[11,"increment_last_index","","",14,[[["keychainkind",4]],[["result",4],["error",4]]]],[11,"check_descriptor_checksum","bdk::database::memory","",18,[[["asref",8],["keychainkind",4]],[["error",4],["result",4]]]],[11,"iter_script_pubkeys","","",18,[[["option",4],["keychainkind",4]],[["result",4],["vec",3],["error",4]]]],[11,"iter_utxos","","",18,[[],[["vec",3],["result",4],["error",4]]]],[11,"iter_raw_txs","","",18,[[],[["result",4],["vec",3],["error",4]]]],[11,"iter_txs","","",18,[[],[["result",4],["vec",3],["error",4]]]],[11,"get_script_pubkey_from_path","","",18,[[["keychainkind",4]],[["result",4],["error",4],["option",4]]]],[11,"get_path_from_script_pubkey","","",18,[[["script",3]],[["error",4],["option",4],["result",4]]]],[11,"get_utxo","","",18,[[["outpoint",3]],[["option",4],["error",4],["result",4]]]],[11,"get_raw_tx","","",18,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"get_tx","","",18,[[["txid",3]],[["option",4],["error",4],["result",4]]]],[11,"get_last_index","","",18,[[["keychainkind",4]],[["option",4],["result",4],["error",4]]]],[11,"increment_last_index","","",18,[[["keychainkind",4]],[["result",4],["error",4]]]],[11,"begin_batch","bdk::database::any","",14,[[]]],[11,"commit_batch","","",14,[[],[["error",4],["result",4]]]],[11,"begin_batch","bdk::database::memory","",18,[[]]],[11,"commit_batch","","",18,[[],[["error",4],["result",4]]]],[11,"from_config","bdk::database::any","",14,[[],[["error",4],["result",4]]]],[11,"from_config","bdk::database::memory","",18,[[],[["error",4],["result",4]]]],[11,"build","bdk::descriptor::template","",41,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",42,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",43,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",44,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",45,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",46,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",47,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",48,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",49,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"to_wallet_descriptor","bdk","",108,[[["network",4]],[["descriptorerror",4],["result",4]]]],[11,"to_wallet_descriptor","","",109,[[["network",4]],[["descriptorerror",4],["result",4]]]],[11,"extract_policy","bdk::descriptor","",51,[[["signerscontainer",3],["secp256k1",3]],[["option",4],["result",4],["error",4]]]],[11,"extract_policy","","",50,[[["signerscontainer",3],["secp256k1",3]],[["option",4],["result",4],["error",4]]]],[11,"to_descriptor_key","bdk::keys","",68,[[],[["descriptorkey",4],["result",4],["keyerror",4]]]],[11,"to_descriptor_key","","",63,[[],[["descriptorkey",4],["result",4],["keyerror",4]]]],[11,"to_descriptor_key","","",58,[[],[["descriptorkey",4],["result",4],["keyerror",4]]]],[11,"to_descriptor_key","","",59,[[],[["descriptorkey",4],["result",4],["keyerror",4]]]],[11,"add_metadata","bdk","",110,[[["derivationpath",3],["option",4],["keysource",6]],[["descriptorkey",4],["result",4],["keyerror",4]]]],[11,"add_metadata","bdk::keys","",68,[[["derivationpath",3],["option",4],["keysource",6]],[["descriptorkey",4],["result",4],["keyerror",4]]]],[11,"coin_select","bdk::wallet::coin_selection","",105,[[["vec",3],["feerate",3]],[["result",4],["coinselectionresult",3],["error",4]]]],[11,"coin_select","","",77,[[["vec",3],["feerate",3]],[["result",4],["coinselectionresult",3],["error",4]]]],[11,"get_capabilities","bdk::blockchain::any","",0,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",0,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"sync","","",0,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",0,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"broadcast","","",0,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",0,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",0,[[],[["feerate",3],["error",4],["result",4]]]],[11,"get_capabilities","bdk::blockchain::electrum","",96,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",96,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",96,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"broadcast","","",96,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",96,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",96,[[],[["feerate",3],["error",4],["result",4]]]],[11,"get_capabilities","bdk::blockchain::esplora","",3,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",3,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",3,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"broadcast","","",3,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",3,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",3,[[],[["feerate",3],["error",4],["result",4]]]],[11,"get_capabilities","bdk::blockchain::compact_filters","",6,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",6,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",6,[[["txid",3]],[["result",4],["option",4],["error",4]]]],[11,"broadcast","","",6,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",6,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",6,[[],[["feerate",3],["error",4],["result",4]]]],[11,"as_ref","bdk","",93,[[]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["addressvalidatorerror",4]]]],[11,"from","","",89,[[["policyerror",4]]]],[11,"from","","",89,[[["signererror",4]]]],[11,"from","","",89,[[["keyerror",4]],["error",4]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",3]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["esploraerror",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["compactfilterserror",4]]]],[11,"from","bdk::blockchain::any","",0,[[["electrumblockchain",3]]]],[11,"from","","",0,[[["esplorablockchain",3]]]],[11,"from","","",0,[[["compactfiltersblockchain",3]]]],[11,"from","","",1,[[["electrumblockchainconfig",3]]]],[11,"from","","",1,[[["esplorablockchainconfig",3]]]],[11,"from","","",1,[[["compactfiltersblockchainconfig",3]]]],[11,"from","bdk::blockchain::electrum","",96,[[["client",3]]]],[11,"from","bdk::blockchain::esplora","",5,[[["error",3]]]],[11,"from","","",5,[[["parseinterror",3]]]],[11,"from","","",5,[[["error",4]]]],[11,"from","","",5,[[["error",4]]]],[11,"from","bdk::blockchain::compact_filters","",9,[[["error",3]]]],[11,"from","","",9,[[["error",3]]]],[11,"from","","",9,[[["error",4]]]],[11,"from","","",9,[[["systemtimeerror",3]]]],[11,"from","","",9,[[["error",4]]]],[11,"from","bdk::database::any","",14,[[["memorydatabase",3]]]],[11,"from","","",14,[[["tree",3]]]],[11,"from","","",15,[[]]],[11,"from","","",15,[[]]],[11,"from","","",17,[[]]],[11,"from","","",17,[[["sleddbconfiguration",3]]]],[11,"from","bdk::descriptor::error","",23,[[["keyerror",4]],["error",4]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["policyerror",4]]]],[11,"from","bdk::descriptor::policy","",33,[[]]],[11,"from","","",37,[[["satisfiableitem",4]]]],[11,"from","bdk::keys","",72,[[["error",4]]]],[11,"from","","",72,[[["error",4]]]],[11,"from","bdk::wallet::signer","",79,[[["hash",3]],["signerid",4]]],[11,"from","","",79,[[["fingerprint",3]],["signerid",4]]],[11,"from","","",83,[[["keymap",6]],["signerscontainer",3]]],[11,"clone","bdk::blockchain","",10,[[],["capability",4]]],[11,"clone","","",99,[[],["noopprogress",3]]],[11,"clone","","",100,[[],["logprogress",3]]],[11,"clone","bdk::descriptor::policy","",101,[[],["pkorf",3]]],[11,"clone","","",24,[[],["satisfiableitem",4]]],[11,"clone","","",33,[[],["satisfaction",4]]],[11,"clone","","",37,[[],["policy",3]]],[11,"clone","","",38,[[],["condition",3]]],[11,"clone","bdk::keys","",64,[[],["scriptcontextenum",4]]],[11,"clone","","",71,[[],["privatekeygenerateoptions",3]]],[11,"clone","bdk","",93,[[],["keychainkind",4]]],[11,"clone","","",104,[[],["feerate",3]]],[11,"clone","","",94,[[],["utxo",3]]],[11,"clone","","",95,[[],["transactiondetails",3]]],[11,"clone","bdk::wallet::address_validator","",73,[[],["addressvalidatorerror",4]]],[11,"clone","bdk::wallet::signer","",79,[[],["signerid",4]]],[11,"clone","","",80,[[],["signererror",4]]],[11,"clone","","",82,[[],["signerordering",3]]],[11,"clone","","",83,[[],["signerscontainer",3]]],[11,"clone","bdk::wallet::tx_builder","",106,[[],["createtx",3]]],[11,"clone","","",107,[[],["bumpfee",3]]],[11,"clone","","",85,[[],["txordering",4]]],[11,"clone","","",86,[[],["changespendpolicy",4]]],[11,"default","bdk::blockchain::compact_filters","",97,[[],["mempool",3]]],[11,"default","bdk::database::memory","",18,[[],["memorydatabase",3]]],[11,"default","bdk::descriptor::policy","",101,[[],["pkorf",3]]],[11,"default","","",38,[[],["condition",3]]],[11,"default","bdk::keys","",71,[[]]],[11,"default","bdk","",104,[[]]],[11,"default","","",95,[[],["transactiondetails",3]]],[11,"default","bdk::wallet::coin_selection","",105,[[],["largestfirstcoinselection",3]]],[11,"default","","",77,[[]]],[11,"default","bdk::wallet::signer","",82,[[]]],[11,"default","","",83,[[],["signerscontainer",3]]],[11,"default","bdk::wallet::tx_builder","",106,[[],["createtx",3]]],[11,"default","","",107,[[],["bumpfee",3]]],[11,"default","","",84,[[]]],[11,"default","","",85,[[]]],[11,"default","","",86,[[]]],[11,"cmp","bdk::descriptor::policy","",38,[[["condition",3]],["ordering",4]]],[11,"cmp","bdk::wallet::signer","",79,[[["signerid",4]],["ordering",4]]],[11,"cmp","","",82,[[["signerordering",3]],["ordering",4]]],[11,"cmp","bdk::wallet::tx_builder","",85,[[["txordering",4]],["ordering",4]]],[11,"cmp","","",86,[[["changespendpolicy",4]],["ordering",4]]],[11,"eq","bdk::blockchain","",10,[[["capability",4]]]],[11,"eq","bdk::descriptor::policy","",38,[[["condition",3]]]],[11,"ne","","",38,[[["condition",3]]]],[11,"eq","bdk::keys","",64,[[["scriptcontextenum",4]]]],[11,"eq","bdk","",93,[[["keychainkind",4]]]],[11,"eq","","",104,[[["feerate",3]]]],[11,"ne","","",104,[[["feerate",3]]]],[11,"eq","","",94,[[["utxo",3]]]],[11,"ne","","",94,[[["utxo",3]]]],[11,"eq","","",95,[[["transactiondetails",3]]]],[11,"ne","","",95,[[["transactiondetails",3]]]],[11,"eq","bdk::wallet::address_validator","",73,[[["addressvalidatorerror",4]]]],[11,"ne","","",73,[[["addressvalidatorerror",4]]]],[11,"eq","bdk::wallet::signer","",79,[[["signerid",4]]]],[11,"ne","","",79,[[["signerid",4]]]],[11,"eq","","",80,[[["signererror",4]]]],[11,"eq","","",82,[[["signerordering",3]]]],[11,"ne","","",82,[[["signerordering",3]]]],[11,"eq","bdk::wallet::tx_builder","",85,[[["txordering",4]]]],[11,"eq","","",86,[[["changespendpolicy",4]]]],[11,"partial_cmp","bdk::descriptor::policy","",38,[[["condition",3]],[["option",4],["ordering",4]]]],[11,"lt","","",38,[[["condition",3]]]],[11,"le","","",38,[[["condition",3]]]],[11,"gt","","",38,[[["condition",3]]]],[11,"ge","","",38,[[["condition",3]]]],[11,"partial_cmp","bdk","",104,[[["feerate",3]],[["option",4],["ordering",4]]]],[11,"lt","","",104,[[["feerate",3]]]],[11,"le","","",104,[[["feerate",3]]]],[11,"gt","","",104,[[["feerate",3]]]],[11,"ge","","",104,[[["feerate",3]]]],[11,"partial_cmp","bdk::wallet::signer","",79,[[["signerid",4]],[["option",4],["ordering",4]]]],[11,"lt","","",79,[[["signerid",4]]]],[11,"le","","",79,[[["signerid",4]]]],[11,"gt","","",79,[[["signerid",4]]]],[11,"ge","","",79,[[["signerid",4]]]],[11,"partial_cmp","","",82,[[["signerordering",3]],[["option",4],["ordering",4]]]],[11,"lt","","",82,[[["signerordering",3]]]],[11,"le","","",82,[[["signerordering",3]]]],[11,"gt","","",82,[[["signerordering",3]]]],[11,"ge","","",82,[[["signerordering",3]]]],[11,"partial_cmp","bdk::wallet::tx_builder","",85,[[["txordering",4]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",86,[[["changespendpolicy",4]],[["option",4],["ordering",4]]]],[11,"to_string","bdk::wallet::export","",78,[[],["string",3]]],[11,"deref","bdk::keys","",68,[[]]],[11,"fmt","bdk","",89,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::any","",1,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::electrum","",2,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::esplora","",3,[[["formatter",3]],["result",6]]],[11,"fmt","","",4,[[["formatter",3]],["result",6]]],[11,"fmt","","",5,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::compact_filters","",97,[[["formatter",3]],["result",6]]],[11,"fmt","","",98,[[["formatter",3]],["result",6]]],[11,"fmt","","",6,[[["formatter",3]],["result",6]]],[11,"fmt","","",7,[[["formatter",3]],["result",6]]],[11,"fmt","","",8,[[["formatter",3]],["result",6]]],[11,"fmt","","",9,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain","",10,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::database::any","",14,[[["formatter",3]],["result",6]]],[11,"fmt","","",16,[[["formatter",3]],["result",6]]],[11,"fmt","","",17,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::database::memory","",18,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::error","",23,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::policy","",101,[[["formatter",3]],["result",6]]],[11,"fmt","","",24,[[["formatter",3]],["result",6]]],[11,"fmt","","",33,[[["formatter",3]],["result",6]]],[11,"fmt","","",37,[[["formatter",3]],["result",6]]],[11,"fmt","","",38,[[["formatter",3]],["result",6]]],[11,"fmt","","",39,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::keys","",63,[[["formatter",3]],["result",6]]],[11,"fmt","","",64,[[["formatter",3]],["result",6]]],[11,"fmt","","",71,[[["formatter",3]],["result",6]]],[11,"fmt","","",72,[[["formatter",3]],["result",6]]],[11,"fmt","bdk","",93,[[["formatter",3]],["result",6]]],[11,"fmt","","",104,[[["formatter",3]],["result",6]]],[11,"fmt","","",94,[[["formatter",3]],["result",6]]],[11,"fmt","","",95,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::address_validator","",73,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::coin_selection","",75,[[["formatter",3]],["result",6]]],[11,"fmt","","",105,[[["formatter",3]],["result",6]]],[11,"fmt","","",77,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::export","",78,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::signer","",79,[[["formatter",3]],["result",6]]],[11,"fmt","","",80,[[["formatter",3]],["result",6]]],[11,"fmt","","",82,[[["formatter",3]],["result",6]]],[11,"fmt","","",83,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::tx_builder","",106,[[["formatter",3]],["result",6]]],[11,"fmt","","",107,[[["formatter",3]],["result",6]]],[11,"fmt","","",84,[[["formatter",3]],["result",6]]],[11,"fmt","","",85,[[["formatter",3]],["result",6]]],[11,"fmt","","",86,[[["formatter",3]],["result",6]]],[11,"fmt","bdk","",89,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::esplora","",5,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::compact_filters","",9,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::error","",23,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::policy","",39,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::keys","",72,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::address_validator","",73,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::signer","",80,[[["formatter",3]],["result",6]]],[11,"hash","bdk::blockchain","",10,[[]]],[11,"hash","bdk::descriptor::policy","",38,[[]]],[11,"hash","bdk","",93,[[]]],[11,"hash","bdk::wallet::signer","",79,[[]]],[11,"hash","bdk::wallet::tx_builder","",85,[[]]],[11,"hash","","",86,[[]]],[11,"from_str","bdk::wallet::export","",78,[[],["result",4]]],[11,"serialize","bdk::blockchain::any","",1,[[],["result",4]]],[11,"serialize","bdk::blockchain::electrum","",2,[[],["result",4]]],[11,"serialize","bdk::blockchain::esplora","",4,[[],["result",4]]],[11,"serialize","bdk::blockchain::compact_filters","",7,[[],["result",4]]],[11,"serialize","","",8,[[],["result",4]]],[11,"serialize","bdk::database::any","",16,[[],["result",4]]],[11,"serialize","","",17,[[],["result",4]]],[11,"serialize","bdk::descriptor::policy","",101,[[],["result",4]]],[11,"serialize","","",24,[[],["result",4]]],[11,"serialize","","",33,[[],["result",4]]],[11,"serialize","","",37,[[],["result",4]]],[11,"serialize","","",38,[[],["result",4]]],[11,"serialize","bdk","",93,[[],["result",4]]],[11,"serialize","","",94,[[],["result",4]]],[11,"serialize","","",95,[[],["result",4]]],[11,"serialize","bdk::wallet::export","",78,[[],["result",4]]],[11,"deserialize","bdk::blockchain::any","",1,[[],["result",4]]],[11,"deserialize","bdk::blockchain::electrum","",2,[[],["result",4]]],[11,"deserialize","bdk::blockchain::esplora","",4,[[],["result",4]]],[11,"deserialize","bdk::blockchain::compact_filters","",7,[[],["result",4]]],[11,"deserialize","","",8,[[],["result",4]]],[11,"deserialize","bdk::database::any","",16,[[],["result",4]]],[11,"deserialize","","",17,[[],["result",4]]],[11,"deserialize","bdk","",93,[[],["result",4]]],[11,"deserialize","","",94,[[],["result",4]]],[11,"deserialize","","",95,[[],["result",4]]],[11,"deserialize","bdk::wallet::export","",78,[[],["result",4]]],[11,"add_tx","bdk::blockchain::compact_filters","Add a transaction to the mempool",97,[[["transaction",3]]]],[11,"get_tx","","Look-up a transaction in the mempool given an [<code>Inventory</code>] …",97,[[["inventory",4]],[["option",4],["transaction",3]]]],[11,"has_tx","","Return whether or not the mempool contains a transaction …",97,[[["txid",3]]]],[11,"iter_txs","","Return the list of transactions contained in the mempool",97,[[],[["vec",3],["transaction",3]]]],[11,"connect","","Connect to a peer over a plaintext TCP connection",98,[[["network",4],["mempool",3],["tosocketaddrs",8],["arc",3]],[["compactfilterserror",4],["result",4]]]],[11,"connect_proxy","","Connect to a peer through a SOCKS5 proxy, optionally by …",98,[[["network",4],["mempool",3],["option",4],["tosocketaddrs",8],["totargetaddr",8],["arc",3]],[["compactfilterserror",4],["result",4]]]],[11,"get_version","","Return the [<code>VersionMessage</code>] sent by the peer",98,[[],["versionmessage",3]]],[11,"get_network","","Return the Bitcoin [<code>Network</code>] in use",98,[[],["network",4]]],[11,"get_mempool","","Return the mempool used by this peer",98,[[],[["mempool",3],["arc",3]]]],[11,"is_connected","","Return whether or not the peer is still connected",98,[[]]],[11,"send","","Send a raw Bitcoin message to the peer",98,[[["networkmessage",4]],[["compactfilterserror",4],["result",4]]]],[11,"recv","","Waits for a specific incoming Bitcoin message, optionally …",98,[[["duration",3],["option",4]],[["compactfilterserror",4],["option",4],["result",4]]]],[11,"translate_pk","bdk::descriptor","Convert a descriptor using abstract keys to one using …",50,[[],[["result",4],["descriptor",4]]]],[11,"sanity_check","","Whether the descriptor is safe Checks whether all the …",50,[[],[["error",4],["result",4]]]],[11,"address","","Computes the Bitcoin address of the descriptor, if one …",50,[[["network",4]],[["option",4],["address",3]]]],[11,"script_pubkey","","Computes the scriptpubkey of the descriptor <code>to_pk_ctx</code> …",50,[[],["script",3]]],[11,"unsigned_script_sig","","Computes the scriptSig that will be in place for an …",50,[[],["script",3]]],[11,"witness_script","","Computes the \\\"witness script\\\" of the descriptor, i.e. the …",50,[[],["script",3]]],[11,"get_satisfication","","Returns satisfying witness and scriptSig to spend an …",50,[[],[["result",4],["error",4]]]],[11,"satisfy","","Attempts to produce a satisfying witness and scriptSig to …",50,[[["txin",3]],[["error",4],["result",4]]]],[11,"max_satisfaction_weight","","Computes an upper bound on the weight of a satisfying …",50,[[],["option",4]]],[11,"script_code","","Get the <code>scriptCode</code> of a transaction output.",50,[[],["script",3]]],[11,"derive","","Derives all wildcard keys in the descriptor using the …",50,[[["childnumber",4]],[["descriptorpublickey",4],["descriptor",4]]]],[11,"parse_descriptor","","Parse a descriptor that may contain secret keys",50,[[],[["result",4],["error",4]]]],[11,"to_string_with_secret","","Serialize a descriptor to string with its secret keys",50,[[["hashmap",3]],["string",3]]],[11,"requires_sig","","Whether all spend paths of miniscript require a signature",51,[[]]],[11,"is_non_malleable","","Whether the miniscript is malleable",51,[[]]],[11,"within_resource_limits","","Whether the miniscript can exceed the resource …",51,[[]]],[11,"has_mixed_timelocks","","Whether the miniscript contains a combination of timelocks",51,[[]]],[11,"has_repeated_keys","","Whether the miniscript has repeated Pk or Pkh",51,[[]]],[11,"sanity_check","","Check whether the underlying Miniscript is safe under the …",51,[[],[["result",4],["analysiserror",4]]]],[11,"iter","","Creates a new [Iter] iterator that will iterate over all […",51,[[],["iter",3]]],[11,"iter_pk","","Creates a new [PkIter] iterator that will iterate over …",51,[[],["pkiter",3]]],[11,"iter_pkh","","Creates a new [PkhIter] iterator that will iterate over …",51,[[],["pkhiter",3]]],[11,"iter_pk_pkh","","Creates a new [PkPkhIter] iterator that will iterate over …",51,[[],["pkpkhiter",3]]],[11,"branches","","Enumerates all child nodes of the current AST node (<code>self</code>) …",51,[[],[["miniscript",3],["global",3],["vec",3]]]],[11,"get_nth_child","","Returns child node with given index, if any",51,[[],[["option",4],["miniscript",3]]]],[11,"get_leaf_pk","","Returns <code>Vec</code> with cloned version of all public keys from …",51,[[],[["vec",3],["global",3]]]],[11,"get_leaf_pkh","","Returns <code>Vec</code> with hashes of all public keys from the …",51,[[],[["vec",3],["global",3]]]],[11,"get_leaf_pk_pkh","","Returns <code>Vec</code> of [PkPkh] entries, representing either …",51,[[],[["pkpkh",4],["vec",3],["global",3]]]],[11,"get_nth_pk","","Returns <code>Option::Some</code> with cloned n\'th public key from the …",51,[[],["option",4]]],[11,"get_nth_pkh","","Returns <code>Option::Some</code> with hash of n\'th public key from …",51,[[],["option",4]]],[11,"get_nth_pk_pkh","","Returns <code>Option::Some</code> with hash of n\'th public key or hash …",51,[[],[["pkpkh",4],["option",4]]]],[11,"from_ast","","Add type information(Type and Extdata) to Miniscript …",51,[[["terminal",4]],[["error",4],["result",4],["miniscript",3]]]],[11,"into_inner","","Extracts the <code>AstElem</code> representing the root of the …",51,[[],["terminal",4]]],[11,"as_inner","","Get a reference to the inner <code>AstElem</code> representing the …",51,[[],["terminal",4]]],[11,"parse_insane","","Attempt to parse an insane(scripts don\'t clear sanity …",51,[[["script",3]],[["result",4],["miniscript",3],["error",4]]]],[11,"parse","","Attempt to parse a Script into Miniscript representation. …",51,[[["script",3]],[["result",4],["miniscript",3],["error",4]]]],[11,"encode","","Encode as a Bitcoin script",51,[[],["script",3]]],[11,"script_size","","Size, in bytes of the script-pubkey. If this Miniscript …",51,[[]]],[11,"max_satisfaction_witness_elements","","Maximum number of witness elements used to satisfy the …",51,[[],["option",4]]],[11,"max_satisfaction_size","","Maximum size, in bytes, of a satisfying witness. For …",51,[[],["option",4]]],[11,"translate_pk","","This will panic if translatefpk returns an uncompressed …",51,[[],[["result",4],["miniscript",3]]]],[11,"from_str_insane","","Attempt to parse an insane(scripts don\'t clear sanity …",51,[[],[["error",4],["result",4],["miniscript",3]]]],[11,"satisfy","","Attempt to produce non-malleable satisfying witness for …",51,[[],[["error",4],["vec",3],["result",4]]]],[11,"satisfy_malleable","","Attempt to produce a malleable satisfying witness for the …",51,[[],[["error",4],["vec",3],["result",4]]]],[11,"lift_check","","Lifting corresponds conversion of miniscript into Policy […",51,[[],[["lifterror",4],["result",4]]]],[11,"translate_pk","","Convert an AST element with one public key type to one of …",54,[[],[["result",4],["terminal",4]]]],[11,"encode","","Encode the element as a fragment of Bitcoin Script. The …",54,[[["builder",3]],["builder",3]]],[11,"script_size","","Size, in bytes of the script-pubkey. If this Miniscript …",54,[[]]],[11,"derive","bdk::keys","Derives the specified child key if self is a wildcard …",58,[[["childnumber",4]],["descriptorpublickey",4]]],[11,"as_public","","Return the public version of this key, by applying either …",59,[[["secp256k1",3]],[["descriptorpublickey",4],["result",4],["descriptorkeyparseerror",3]]]],[11,"new","","Create a new instance of <code>SortedMultiVec</code> given a list of …",62,[[["vec",3],["global",3]],[["sortedmultivec",3],["result",4],["error",4]]]],[11,"translate_pk","","This will panic if translatefpk returns an uncompressed …",62,[[],[["result",4],["sortedmultivec",3]]]],[11,"sorted_node","","Create Terminal::Multi containing sorted pubkeys",62,[[],["terminal",4]]],[11,"encode","","Encode as a Bitcoin script",62,[[],["script",3]]],[11,"satisfy","","Attempt to produce a satisfying witness for the witness …",62,[[],[["error",4],["vec",3],["result",4]]]],[11,"script_size","","Size, in bytes of the script-pubkey. If this Miniscript …",62,[[]]],[11,"max_satisfaction_witness_elements","","Maximum number of witness elements used to satisfy the …",62,[[]]],[11,"max_satisfaction_size","","Maximum size, in bytes, of a satisfying witness. For …",62,[[]]],[11,"as_byte","bdk","Return [<code>KeychainKind</code>] as a byte",93,[[]]],[11,"from_btc_per_kvb","","Create a new instance of [<code>FeeRate</code>] given a float fee rate …",104,[[]]],[11,"from_sat_per_vb","","Create a new instance of [<code>FeeRate</code>] given a float fee rate …",104,[[]]],[11,"default_min_relay_fee","","Create a new [<code>FeeRate</code>] with the default min relay fee …",104,[[]]],[11,"as_sat_vb","","Return the value as satoshi/vbyte",104,[[]]]],"p":[[4,"AnyBlockchain"],[4,"AnyBlockchainConfig"],[3,"ElectrumBlockchainConfig"],[3,"EsploraBlockchain"],[3,"EsploraBlockchainConfig"],[4,"EsploraError"],[3,"CompactFiltersBlockchain"],[3,"BitcoinPeerConfig"],[3,"CompactFiltersBlockchainConfig"],[4,"CompactFiltersError"],[4,"Capability"],[8,"Blockchain"],[8,"ConfigurableBlockchain"],[8,"Progress"],[4,"AnyDatabase"],[4,"AnyBatch"],[3,"SledDbConfiguration"],[4,"AnyDatabaseConfig"],[3,"MemoryDatabase"],[8,"BatchOperations"],[8,"Database"],[8,"BatchDatabase"],[8,"ConfigurableDatabase"],[4,"Error"],[4,"SatisfiableItem"],[13,"SHA256Preimage"],[13,"HASH256Preimage"],[13,"RIPEMD160Preimage"],[13,"HASH160Preimage"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[13,"Multisig"],[13,"Thresh"],[4,"Satisfaction"],[13,"Partial"],[13,"PartialComplete"],[13,"Complete"],[3,"Policy"],[3,"Condition"],[4,"PolicyError"],[8,"DescriptorTemplate"],[3,"P2PKH"],[3,"P2WPKH_P2SH"],[3,"P2WPKH"],[3,"BIP44"],[3,"BIP44Public"],[3,"BIP49"],[3,"BIP49Public"],[3,"BIP84"],[3,"BIP84Public"],[4,"Descriptor"],[3,"Miniscript"],[8,"MiniscriptKey"],[8,"ScriptContext"],[4,"Terminal"],[8,"ToPublicKey"],[8,"ToWalletDescriptor"],[8,"ExtractPolicy"],[4,"DescriptorPublicKey"],[4,"DescriptorSecretKey"],[3,"DescriptorSinglePriv"],[3,"DescriptorSinglePub"],[3,"SortedMultiVec"],[4,"DescriptorKey"],[4,"ScriptContextEnum"],[8,"ExtScriptContext"],[8,"ToDescriptorKey"],[8,"DerivableKey"],[3,"GeneratedKey"],[8,"GeneratableKey"],[8,"GeneratableDefaultOptions"],[3,"PrivateKeyGenerateOptions"],[4,"KeyError"],[4,"AddressValidatorError"],[8,"AddressValidator"],[3,"CoinSelectionResult"],[8,"CoinSelectionAlgorithm"],[3,"BranchAndBoundCoinSelection"],[3,"WalletExport"],[4,"SignerId"],[4,"SignerError"],[8,"Signer"],[3,"SignerOrdering"],[3,"SignersContainer"],[3,"TxBuilder"],[4,"TxOrdering"],[4,"ChangeSpendPolicy"],[8,"IsDust"],[3,"Wallet"],[4,"Error"],[13,"InsufficientFunds"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[4,"KeychainKind"],[3,"UTXO"],[3,"TransactionDetails"],[3,"ElectrumBlockchain"],[3,"Mempool"],[3,"Peer"],[3,"NoopProgress"],[3,"LogProgress"],[3,"PKOrF"],[4,"Legacy"],[4,"Segwitv0"],[3,"FeeRate"],[3,"LargestFirstCoinSelection"],[3,"CreateTx"],[3,"BumpFee"],[6,"ExtendedDescriptor"],[6,"DescriptorTemplateOut"],[6,"MnemonicWithPassphrase"]]}\
+"bdk":{"doc":"A modern, lightweight, descriptor-based wallet library …","i":[[0,"blockchain","bdk","Blockchain backends",null,null],[0,"any","bdk::blockchain","Runtime-checked blockchain types",null,null],[4,"AnyBlockchain","bdk::blockchain::any","Type that can contain any of the [<code>Blockchain</code>] types …",null,null],[13,"Electrum","","Electrum client",0,null],[13,"Esplora","","Esplora client",0,null],[13,"CompactFilters","","Compact filters client",0,null],[4,"AnyBlockchainConfig","","Type that can contain any of the blockchain …",null,null],[13,"Electrum","","Electrum client",1,null],[13,"Esplora","","Esplora client",1,null],[13,"CompactFilters","","Compact filters client",1,null],[0,"electrum","bdk::blockchain","Electrum",null,null],[3,"ElectrumBlockchain","bdk::blockchain::electrum","Wrapper over an Electrum Client that implements the …",null,null],[3,"ElectrumBlockchainConfig","","Configuration for an [<code>ElectrumBlockchain</code>]",null,null],[12,"url","","URL of the Electrum server (such as ElectrumX, Esplora, …",2,null],[12,"socks5","","URL of the socks5 proxy server or a Tor service",2,null],[12,"retry","","Request retry count",2,null],[12,"timeout","","Request timeout (seconds)",2,null],[0,"esplora","bdk::blockchain","Esplora",null,null],[3,"EsploraBlockchain","bdk::blockchain::esplora","Structure that implements the logic to sync with Esplora",null,null],[11,"new","","Create a new instance of the client from a base URL",3,[[["option",4]]]],[3,"EsploraBlockchainConfig","","Configuration for an [<code>EsploraBlockchain</code>]",null,null],[12,"base_url","","Base URL of the esplora service",4,null],[12,"concurrency","","Number of parallel requests sent to the esplora service …",4,null],[4,"EsploraError","","Errors that can happen during a sync with […",null,null],[13,"Reqwest","","Error with the HTTP call",5,null],[13,"Parsing","","Invalid number returned",5,null],[13,"BitcoinEncoding","","Invalid Bitcoin data returned",5,null],[13,"Hex","","Invalid Hex data returned",5,null],[13,"TransactionNotFound","","Transaction not found",5,null],[13,"HeaderHeightNotFound","","Header height not found",5,null],[13,"HeaderHashNotFound","","Header hash not found",5,null],[0,"compact_filters","bdk::blockchain","Compact Filters",null,null],[3,"Mempool","bdk::blockchain::compact_filters","Container for unconfirmed, but valid Bitcoin transactions",null,null],[3,"Peer","","A Bitcoin peer",null,null],[3,"CompactFiltersBlockchain","","Structure implementing the required blockchain traits",null,null],[11,"new","","Construct a new instance given a list of peers, a path to …",6,[[["asref",8],["peer",3],["path",3],["option",4],["vec",3]],[["compactfilterserror",4],["result",4]]]],[3,"BitcoinPeerConfig","","Data to connect to a Bitcoin P2P peer",null,null],[12,"address","","Peer address such as 127.0.0.1:18333",7,null],[12,"socks5","","Optional socks5 proxy",7,null],[12,"socks5_credentials","","Optional socks5 proxy credentials",7,null],[3,"CompactFiltersBlockchainConfig","","Configuration for a [<code>CompactFiltersBlockchain</code>]",null,null],[12,"peers","","List of peers to try to connect to for asking headers and …",8,null],[12,"network","","Network used",8,null],[12,"storage_dir","","Storage dir to save partially downloaded headers and full …",8,null],[12,"skip_blocks","","Optionally skip initial <code>skip_blocks</code> blocks (default: 0)",8,null],[4,"CompactFiltersError","","An error that can occur during sync with a […",null,null],[13,"InvalidResponse","","A peer sent an invalid or unexpected response",9,null],[13,"InvalidHeaders","","The headers returned are invalid",9,null],[13,"InvalidFilterHeader","","The compact filter headers returned are invalid",9,null],[13,"InvalidFilter","","The compact filter returned is invalid",9,null],[13,"MissingBlock","","The peer is missing a block in the valid chain",9,null],[13,"DataCorruption","","The data stored in the block filters storage are corrupted",9,null],[13,"NotConnected","","A peer is not connected",9,null],[13,"Timeout","","A peer took too long to reply to one of our messages",9,null],[13,"NoPeers","","No peers have been specified",9,null],[13,"DB","","Internal database error",9,null],[13,"IO","","Internal I/O error",9,null],[13,"BIP158","","Invalid BIP158 filter",9,null],[13,"Time","","Internal system time error",9,null],[13,"Global","","Wrapper for [<code>crate::error::Error</code>]",9,null],[4,"Capability","bdk::blockchain","Capabilities that can be supported by a [<code>Blockchain</code>] …",null,null],[13,"FullHistory","","Can recover the full history of a wallet and not only the …",10,null],[13,"GetAnyTx","","Can fetch any historical transaction given its txid",10,null],[13,"AccurateFees","","Can compute accurate fees for the transactions found …",10,null],[8,"Blockchain","","Trait that defines the actions that must be supported by …",null,null],[10,"get_capabilities","","Return the set of [<code>Capability</code>] supported by this backend",11,[[],[["capability",4],["hashset",3]]]],[10,"setup","","Setup the backend and populate the internal database for …",11,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"sync","","Populate the internal database with transactions and UTXOs",11,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[10,"get_tx","","Fetch a transaction from the blockchain given its txid",11,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[10,"broadcast","","Broadcast a transaction",11,[[["transaction",3]],[["error",4],["result",4]]]],[10,"get_height","","Return the current height",11,[[],[["result",4],["error",4]]]],[10,"estimate_fee","","Estimate the fee rate required to confirm a transaction …",11,[[],[["error",4],["feerate",3],["result",4]]]],[8,"ConfigurableBlockchain","","Trait for [<code>Blockchain</code>] types that can be created given a …",null,null],[16,"Config","","Type that contains the configuration",12,null],[10,"from_config","","Create a new instance given a configuration",12,[[],[["result",4],["error",4]]]],[6,"ProgressData","","Data sent with a progress update over a [<code>channel</code>]",null,null],[8,"Progress","","Trait for types that can receive and process progress …",null,null],[10,"update","","Send a new progress update",13,[[["option",4],["string",3]],[["error",4],["result",4]]]],[5,"progress","","Shortcut to create a [<code>channel</code>] (pair of [<code>Sender</code>] and […",null,[[]]],[3,"NoopProgress","","Type that implements [<code>Progress</code>] and drops every update …",null,null],[5,"noop_progress","","Create a new instance of [<code>NoopProgress</code>]",null,[[],["noopprogress",3]]],[3,"LogProgress","","Type that implements [<code>Progress</code>] and logs at level <code>INFO</code> …",null,null],[5,"log_progress","","Create a nwe instance of [<code>LogProgress</code>]",null,[[],["logprogress",3]]],[0,"database","bdk","Database types",null,null],[0,"any","bdk::database","Runtime-checked database types",null,null],[4,"AnyDatabase","bdk::database::any","Type that can contain any of the [<code>Database</code>] types defined …",null,null],[13,"Memory","","In-memory ephemeral database",14,null],[13,"Sled","","Simple key-value embedded database based on [<code>sled</code>]",14,null],[4,"AnyBatch","","Type that contains any of the [<code>BatchDatabase::Batch</code>] …",null,null],[13,"Memory","","In-memory ephemeral database",15,null],[13,"Sled","","Simple key-value embedded database based on [<code>sled</code>]",15,null],[3,"SledDbConfiguration","","Configuration type for a [<code>sled::Tree</code>] database",null,null],[12,"path","","Main directory of the db",16,null],[12,"tree_name","","Name of the database tree, a separated namespace for the …",16,null],[4,"AnyDatabaseConfig","","Type that can contain any of the database configurations …",null,null],[13,"Memory","","Memory database has no config",17,null],[13,"Sled","","Simple key-value embedded database based on [<code>sled</code>]",17,null],[0,"memory","bdk::database","In-memory ephemeral database",null,null],[3,"MemoryDatabase","bdk::database::memory","In-memory ephemeral database",null,null],[11,"new","","Create a new empty database",18,[[]]],[8,"BatchOperations","bdk::database","Trait for operations that can be batched",null,null],[10,"set_script_pubkey","","Store a script_pubkey along with its keychain and child …",19,[[["keychainkind",4],["script",3]],[["error",4],["result",4]]]],[10,"set_utxo","","Store a [<code>UTXO</code>]",19,[[["utxo",3]],[["error",4],["result",4]]]],[10,"set_raw_tx","","Store a raw transaction",19,[[["transaction",3]],[["error",4],["result",4]]]],[10,"set_tx","","Store the metadata of a transaction",19,[[["transactiondetails",3]],[["error",4],["result",4]]]],[10,"set_last_index","","Store the last derivation index for a given keychain.",19,[[["keychainkind",4]],[["error",4],["result",4]]]],[10,"del_script_pubkey_from_path","","Delete a script_pubkey given the keychain and its child …",19,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[10,"del_path_from_script_pubkey","","Delete the data related to a specific script_pubkey, …",19,[[["script",3]],[["result",4],["option",4],["error",4]]]],[10,"del_utxo","","Delete a [<code>UTXO</code>] given its [<code>OutPoint</code>]",19,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[10,"del_raw_tx","","Delete a raw transaction given its [<code>Txid</code>]",19,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[10,"del_tx","","Delete the metadata of a transaction and optionally the …",19,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[10,"del_last_index","","Delete the last derivation index for a keychain.",19,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[8,"Database","","Trait for reading data from a database",null,null],[10,"check_descriptor_checksum","","Read and checks the descriptor checksum for a given …",20,[[["keychainkind",4],["asref",8]],[["error",4],["result",4]]]],[10,"iter_script_pubkeys","","Return the list of script_pubkeys",20,[[["option",4],["keychainkind",4]],[["result",4],["vec",3],["error",4]]]],[10,"iter_utxos","","Return the list of [<code>UTXO</code>]s",20,[[],[["vec",3],["result",4],["error",4]]]],[10,"iter_raw_txs","","Return the list of raw transactions",20,[[],[["result",4],["error",4],["vec",3]]]],[10,"iter_txs","","Return the list of transactions metadata",20,[[],[["result",4],["vec",3],["error",4]]]],[10,"get_script_pubkey_from_path","","Fetch a script_pubkey given the child number of a …",20,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[10,"get_path_from_script_pubkey","","Fetch the keychain and child number of a given …",20,[[["script",3]],[["result",4],["option",4],["error",4]]]],[10,"get_utxo","","Fetch a [<code>UTXO</code>] given its [<code>OutPoint</code>]",20,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[10,"get_raw_tx","","Fetch a raw transaction given its [<code>Txid</code>]",20,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[10,"get_tx","","Fetch the transaction metadata and optionally also the …",20,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[10,"get_last_index","","Return the last defivation index for a keychain.",20,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[10,"increment_last_index","","Increment the last derivation index for a keychain and …",20,[[["keychainkind",4]],[["result",4],["error",4]]]],[8,"BatchDatabase","","Trait for a database that supports batch operations",null,null],[16,"Batch","","Container for the operations",21,null],[10,"begin_batch","","Create a new batch container",21,[[]]],[10,"commit_batch","","Consume and apply a batch of operations",21,[[],[["error",4],["result",4]]]],[8,"ConfigurableDatabase","","Trait for [<code>Database</code>] types that can be created given a …",null,null],[16,"Config","","Type that contains the configuration",22,null],[10,"from_config","","Create a new instance given a configuration",22,[[],[["result",4],["error",4]]]],[0,"descriptor","bdk","Descriptors",null,null],[0,"checksum","bdk::descriptor","Descriptor checksum",null,null],[5,"get_checksum","bdk::descriptor::checksum","Compute the checksum of a descriptor",null,[[],[["string",3],["descriptorerror",4],["result",4]]]],[0,"error","bdk::descriptor","Descriptor errors",null,null],[4,"Error","bdk::descriptor::error","Errors related to the parsing and usage of descriptors",null,null],[13,"InvalidHDKeyPath","","Invalid HD Key path, such as having a wildcard but a …",23,null],[13,"InvalidDescriptorChecksum","","The provided descriptor doesn\'t match its checksum",23,null],[13,"Key","","Error thrown while working with <code>keys</code>",23,null],[13,"Policy","","Error while extracting and manipulating policies",23,null],[13,"InvalidDescriptorCharacter","","Invalid character found in the descriptor checksum",23,null],[13,"BIP32","","BIP32 error",23,null],[13,"Base58","","Error during base58 decoding",23,null],[13,"PK","","Key-related error",23,null],[13,"Miniscript","","Miniscript error",23,null],[13,"Hex","","Hex decoding error",23,null],[0,"policy","bdk::descriptor","Descriptor policy",null,null],[3,"PKOrF","bdk::descriptor::policy","Raw public key or extended key fingerprint",null,null],[4,"SatisfiableItem","","An item that needs to be satisfied",null,null],[13,"Signature","","Signature for a raw public key",24,null],[13,"SignatureKey","","Signature for an extended key fingerprint",24,null],[13,"SHA256Preimage","","SHA256 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",25,null],[13,"HASH256Preimage","bdk::descriptor::policy","Double SHA256 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",26,null],[13,"RIPEMD160Preimage","bdk::descriptor::policy","RIPEMD160 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",27,null],[13,"HASH160Preimage","bdk::descriptor::policy","SHA256 then RIPEMD160 preimage hash",24,null],[12,"hash","bdk::descriptor::policy::SatisfiableItem","The digest value",28,null],[13,"AbsoluteTimelock","bdk::descriptor::policy","Absolute timeclock timestamp",24,null],[12,"value","bdk::descriptor::policy::SatisfiableItem","The timestamp value",29,null],[13,"RelativeTimelock","bdk::descriptor::policy","Relative timelock locktime",24,null],[12,"value","bdk::descriptor::policy::SatisfiableItem","The locktime value",30,null],[13,"Multisig","bdk::descriptor::policy","Multi-signature public keys with threshold count",24,null],[12,"keys","bdk::descriptor::policy::SatisfiableItem","The raw public key or extended key fingerprint",31,null],[12,"threshold","","The required threshold count",31,null],[13,"Thresh","bdk::descriptor::policy","Threshold items with threshold count",24,null],[12,"items","bdk::descriptor::policy::SatisfiableItem","The policy items",32,null],[12,"threshold","","The required threshold count",32,null],[11,"is_leaf","bdk::descriptor::policy","Returns whether the [<code>SatisfiableItem</code>] is a leaf item",24,[[]]],[11,"id","","Returns a unique id for the [<code>SatisfiableItem</code>]",24,[[],["string",3]]],[6,"ConditionMap","","Type for a map of sets of [<code>Condition</code>] items keyed by each …",null,null],[6,"FoldedConditionMap","","Type for a map of folded sets of [<code>Condition</code>] items keyed …",null,null],[4,"Satisfaction","","Represent if and how much a policy item is satisfied by …",null,null],[13,"Partial","","Only a partial satisfaction of some kind of threshold …",33,null],[12,"n","bdk::descriptor::policy::Satisfaction","Total number of items",34,null],[12,"m","","Threshold",34,null],[12,"items","","The items that can be satisfied by the descriptor",34,null],[12,"sorted","","Whether the items are sorted in lexicographic order (used …",34,null],[12,"conditions","","Extra conditions that also need to be satisfied",34,null],[13,"PartialComplete","bdk::descriptor::policy","Can reach the threshold of some kind of threshold policy",33,null],[12,"n","bdk::descriptor::policy::Satisfaction","Total number of items",35,null],[12,"m","","Threshold",35,null],[12,"items","","The items that can be satisfied by the descriptor",35,null],[12,"sorted","","Whether the items are sorted in lexicographic order (used …",35,null],[12,"conditions","","Extra conditions that also need to be satisfied",35,null],[13,"Complete","bdk::descriptor::policy","Can satisfy the policy item",33,null],[12,"condition","bdk::descriptor::policy::Satisfaction","Extra conditions that also need to be satisfied",36,null],[13,"None","bdk::descriptor::policy","Cannot satisfy or contribute to the policy item",33,null],[11,"is_leaf","","Returns whether the [<code>Satisfaction</code>] is a leaf item",33,[[]]],[3,"Policy","","Descriptor spending policy",null,null],[12,"id","","Identifier for this policy node",37,null],[12,"item","","Type of this policy node",37,null],[12,"satisfaction","","How a much given PSBT already satisfies this polcy node <strong>…",37,null],[12,"contribution","","How the wallet\'s descriptor can satisfy this policy node",37,null],[3,"Condition","","An extra condition that must be satisfied but that is out …",null,null],[12,"csv","","Optional CheckSequenceVerify condition",38,null],[12,"timelock","","Optional timelock condition",38,null],[11,"is_null","","Returns <code>true</code> if there are no extra conditions to verify",38,[[]]],[4,"PolicyError","","Errors that can happen while extracting and manipulating …",null,null],[13,"NotEnoughItemsSelected","","Not enough items are selected to satisfy a […",39,null],[13,"TooManyItemsSelected","","Too many items are selected to satisfy a […",39,null],[13,"IndexOutOfRange","","Index out of range for an item to satisfy a […",39,null],[13,"AddOnLeaf","","Can not add to an item that is [<code>Satisfaction::None</code>] or […",39,null],[13,"AddOnPartialComplete","","Can not add to an item that is […",39,null],[13,"MixedTimelockUnits","","Can not merge CSV or timelock values unless both are less …",39,null],[13,"IncompatibleConditions","","Incompatible conditions (not currently used)",39,null],[11,"requires_path","","Return whether or not a specific path in the policy tree …",37,[[]]],[11,"get_condition","","Return the conditions that are set by the spending policy …",37,[[["btreemap",3]],[["condition",3],["policyerror",4],["result",4]]]],[0,"template","bdk::descriptor","Descriptor templates",null,null],[6,"DescriptorTemplateOut","bdk::descriptor::template","Type alias for the return type of [<code>DescriptorTemplate</code>], …",null,null],[8,"DescriptorTemplate","","Trait for descriptor templates that can be built into a …",null,null],[10,"build","","Build the complete descriptor",40,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[3,"P2PKH","","P2PKH template. Expands to a descriptor <code>pkh(key)</code>",null,null],[12,"0","","",41,null],[3,"P2WPKH_P2SH","","P2WPKH-P2SH template. Expands to a descriptor …",null,null],[12,"0","","",42,null],[3,"P2WPKH","","P2WPKH template. Expands to a descriptor <code>wpkh(key)</code>",null,null],[12,"0","","",43,null],[3,"BIP44","","BIP44 template. Expands to <code>pkh(key/44\'/0\'/0\'/{0,1}/*)</code>",null,null],[12,"0","","",44,null],[12,"1","","",44,null],[3,"BIP44Public","","BIP44 public template. Expands to <code>pkh(key/{0,1}/*)</code>",null,null],[12,"0","","",45,null],[12,"1","","",45,null],[12,"2","","",45,null],[3,"BIP49","","BIP49 template. Expands to <code>sh(wpkh(key/49\'/0\'/0\'/{0,1}/*))</code>",null,null],[12,"0","","",46,null],[12,"1","","",46,null],[3,"BIP49Public","","BIP49 public template. Expands to <code>sh(wpkh(key/{0,1}/*))</code>",null,null],[12,"0","","",47,null],[12,"1","","",47,null],[12,"2","","",47,null],[3,"BIP84","","BIP84 template. Expands to <code>wpkh(key/84\'/0\'/0\'/{0,1}/*)</code>",null,null],[12,"0","","",48,null],[12,"1","","",48,null],[3,"BIP84Public","","BIP84 public template. Expands to <code>wpkh(key/{0,1}/*)</code>",null,null],[12,"0","","",49,null],[12,"1","","",49,null],[12,"2","","",49,null],[6,"KeyMap","bdk::descriptor","Alias type for a map of public key to secret key",null,null],[4,"Descriptor","","Script descriptor",null,null],[13,"Bare","","A raw scriptpubkey (including pay-to-pubkey) under Legacy …",50,null],[13,"Pk","","Pay-to-Pubkey",50,null],[13,"Pkh","","Pay-to-PubKey-Hash",50,null],[13,"Wpkh","","Pay-to-Witness-PubKey-Hash",50,null],[13,"ShWpkh","","Pay-to-Witness-PubKey-Hash inside P2SH",50,null],[13,"Sh","","Pay-to-ScriptHash with Legacy context",50,null],[13,"Wsh","","Pay-to-Witness-ScriptHash with Segwitv0 context",50,null],[13,"ShWsh","","P2SH-P2WSH with Segwitv0 context",50,null],[13,"ShSortedMulti","","Sortedmulti under P2SH",50,null],[13,"WshSortedMulti","","Sortedmulti under P2WSH",50,null],[13,"ShWshSortedMulti","","Sortedmulti under P2SH-P2WSH",50,null],[4,"Legacy","","Legacy ScriptContext To be used as P2SH scripts For …",null,null],[3,"Miniscript","","Top-level script AST type",null,null],[12,"node","","A node in the Abstract Syntax Tree(",51,null],[12,"ty","","The correctness and malleability type information for the …",51,null],[12,"ext","","Additional information helpful for extra analysis.",51,null],[8,"MiniscriptKey","","Public key trait which can be converted to Hash type",null,null],[11,"is_uncompressed","","Check if the publicKey is uncompressed. The default …",52,[[]]],[16,"Hash","","The associated Hash type with the publicKey",52,null],[10,"to_pubkeyhash","","Converts an object to PublicHash",52,[[]]],[8,"ScriptContext","","The ScriptContext for Miniscript. Additional type …",null,null],[10,"check_terminal_non_malleable","","Depending on ScriptContext, fragments can be malleable. …",53,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","Check whether the given satisfaction is valid under the …",53,[[],[["result",4],["scriptcontexterror",4]]]],[10,"max_satisfaction_size","","Depending on script context, the size of a satifaction …",53,[[["miniscript",3]],["option",4]]],[11,"check_global_consensus_validity","","Depending on script Context, some of the Terminals might …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_policy_validity","","Depending on script Context, some of the script resource …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","Consensus rules at the Miniscript satisfaction time. It …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","Policy rules at the Miniscript satisfaction time. It is …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_validity","","Check the consensus + policy(if not disabled) rules that …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_validity","","Check the consensus + policy(if not disabled) rules …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"top_level_type_check","","Check whether the top-level is type B",53,[[["miniscript",3]],[["result",4],["error",4]]]],[11,"other_top_level_checks","","Other top level checks that are context specific",53,[[["miniscript",3]],[["result",4],["error",4]]]],[11,"top_level_checks","","Check top level consensus rules.",53,[[["miniscript",3]],[["result",4],["error",4]]]],[4,"Segwitv0","","Segwitv0 ScriptContext",null,null],[4,"Terminal","","All AST elements",null,null],[13,"True","","<code>1</code>",54,null],[13,"False","","<code>0</code>",54,null],[13,"PkK","","<code><key></code>",54,null],[13,"PkH","","<code>DUP HASH160 <keyhash> EQUALVERIFY</code>",54,null],[13,"After","","<code>n CHECKLOCKTIMEVERIFY</code>",54,null],[13,"Older","","<code>n CHECKSEQUENCEVERIFY</code>",54,null],[13,"Sha256","","<code>SIZE 32 EQUALVERIFY SHA256 <hash> EQUAL</code>",54,null],[13,"Hash256","","<code>SIZE 32 EQUALVERIFY HASH256 <hash> EQUAL</code>",54,null],[13,"Ripemd160","","<code>SIZE 32 EQUALVERIFY RIPEMD160 <hash> EQUAL</code>",54,null],[13,"Hash160","","<code>SIZE 32 EQUALVERIFY HASH160 <hash> EQUAL</code>",54,null],[13,"Alt","","<code>TOALTSTACK [E] FROMALTSTACK</code>",54,null],[13,"Swap","","<code>SWAP [E1]</code>",54,null],[13,"Check","","<code>[Kt]/[Ke] CHECKSIG</code>",54,null],[13,"DupIf","","<code>DUP IF [V] ENDIF</code>",54,null],[13,"Verify","","[T] VERIFY",54,null],[13,"NonZero","","SIZE 0NOTEQUAL IF [Fn] ENDIF",54,null],[13,"ZeroNotEqual","","[X] 0NOTEQUAL",54,null],[13,"AndV","","[V] [T]/[V]/[F]/[Kt]",54,null],[13,"AndB","","[E] [W] BOOLAND",54,null],[13,"AndOr","","[various] NOTIF [various] ELSE [various] ENDIF",54,null],[13,"OrB","","[E] [W] BOOLOR",54,null],[13,"OrD","","[E] IFDUP NOTIF [T]/[E] ENDIF",54,null],[13,"OrC","","[E] NOTIF [V] ENDIF",54,null],[13,"OrI","","IF [various] ELSE [various] ENDIF",54,null],[13,"Thresh","","[E] ([W] ADD)* k EQUAL",54,null],[13,"Multi","","k ()* n CHECKMULTISIG",54,null],[8,"ToPublicKey","","Trait describing public key types which can be converted …",null,null],[10,"to_public_key","","Converts an object to a public key C represents …",55,[[],["publickey",3]]],[11,"serialized_len","","Computes the size of a public key when serialized in a …",55,[[]]],[10,"hash_to_hash160","","Converts a hashed version of the public key to a <code>hash160</code> …",55,[[],["hash",3]]],[6,"ExtendedDescriptor","","Alias for a [<code>Descriptor</code>] that can contain extended keys …",null,null],[6,"HDKeyPaths","","Alias for the type of maps that represent derivation …",null,null],[8,"ToWalletDescriptor","","Trait for types which can be converted into an […",null,null],[10,"to_wallet_descriptor","","Convert to wallet descriptor",56,[[["network",4]],[["result",4],["descriptorerror",4]]]],[8,"ExtractPolicy","","Trait implemented on [<code>Descriptor</code>]s to add a method to …",null,null],[10,"extract_policy","","Extract the spending [<code>policy</code>]",57,[[["secp256k1",3],["signerscontainer",3]],[["option",4],["result",4],["descriptorerror",4]]]],[0,"keys","bdk","Key formats",null,null],[0,"bip39","bdk::keys","BIP-0039",null,null],[6,"MnemonicWithPassphrase","bdk::keys::bip39","Type for a BIP39 mnemonic with an optional passphrase",null,null],[4,"DescriptorPublicKey","bdk::keys","The MiniscriptKey corresponding to Descriptors. This can …",null,null],[13,"SinglePub","","Single Public Key",58,null],[13,"XPub","","Xpub",58,null],[4,"DescriptorSecretKey","","A Secret Key that can be either a single key or an Xprv",null,null],[13,"SinglePriv","","Single Secret Key",59,null],[13,"XPrv","","Xprv",59,null],[3,"DescriptorSinglePriv","","A Single Descriptor Secret Key with optional origin …",null,null],[12,"origin","","Origin information",60,null],[12,"key","","The key",60,null],[3,"DescriptorSinglePub","","A Single Descriptor Key with optional origin information",null,null],[12,"origin","","Origin information",61,null],[12,"key","","The key",61,null],[3,"SortedMultiVec","","Contents of a \\\"sortedmulti\\\" descriptor",null,null],[12,"k","","signatures required",62,null],[12,"pks","","public keys inside sorted Multi",62,null],[8,"ScriptContext","","The ScriptContext for Miniscript. Additional type …",null,null],[10,"check_terminal_non_malleable","","Depending on ScriptContext, fragments can be malleable. …",53,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","Check whether the given satisfaction is valid under the …",53,[[],[["result",4],["scriptcontexterror",4]]]],[10,"max_satisfaction_size","","Depending on script context, the size of a satifaction …",53,[[["miniscript",3]],["option",4]]],[11,"check_global_consensus_validity","","Depending on script Context, some of the Terminals might …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_policy_validity","","Depending on script Context, some of the script resource …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","Consensus rules at the Miniscript satisfaction time. It …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","Policy rules at the Miniscript satisfaction time. It is …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_validity","","Check the consensus + policy(if not disabled) rules that …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_validity","","Check the consensus + policy(if not disabled) rules …",53,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"top_level_type_check","","Check whether the top-level is type B",53,[[["miniscript",3]],[["result",4],["error",4]]]],[11,"other_top_level_checks","","Other top level checks that are context specific",53,[[["miniscript",3]],[["result",4],["error",4]]]],[11,"top_level_checks","","Check top level consensus rules.",53,[[["miniscript",3]],[["result",4],["error",4]]]],[6,"ValidNetworks","","Set of valid networks for a key",null,null],[5,"any_network","","Create a set containing mainnet, testnet and regtest",null,[[],["validnetworks",6]]],[5,"mainnet_network","","Create a set only containing mainnet",null,[[],["validnetworks",6]]],[5,"test_networks","","Create a set containing testnet and regtest",null,[[],["validnetworks",6]]],[5,"merge_networks","","Compute the intersection of two sets",null,[[["validnetworks",6]],["validnetworks",6]]],[4,"DescriptorKey","","Container for public or secret keys",null,null],[11,"from_public","","Create an instance given a public key and a set of valid …",63,[[["descriptorpublickey",4],["validnetworks",6]]]],[11,"from_secret","","Create an instance given a secret key and a set of valid …",63,[[["descriptorsecretkey",4],["validnetworks",6]]]],[11,"override_valid_networks","","Override the computed set of valid networks",63,[[["validnetworks",6]]]],[4,"ScriptContextEnum","","Enum representation of the known valid [<code>ScriptContext</code>]s",null,null],[13,"Legacy","","Legacy scripts",64,null],[13,"Segwitv0","","Segwitv0 scripts",64,null],[11,"is_legacy","","Returns whether the script context is […",64,[[]]],[11,"is_segwit_v0","","Returns whether the script context is […",64,[[]]],[8,"ExtScriptContext","","Trait that adds extra useful methods to [<code>ScriptContext</code>]s",null,null],[10,"as_enum","","Returns the [<code>ScriptContext</code>] as a [<code>ScriptContextEnum</code>]",65,[[],["scriptcontextenum",4]]],[11,"is_legacy","","Returns whether the script context is <code>Legacy</code>",65,[[]]],[11,"is_segwit_v0","","Returns whether the script context is <code>Segwitv0</code>",65,[[]]],[8,"ToDescriptorKey","","Trait for objects that can be turned into a public or …",null,null],[10,"to_descriptor_key","","Turn the key into a [<code>DescriptorKey</code>] within the requested […",66,[[],[["keyerror",4],["descriptorkey",4],["result",4]]]],[8,"DerivableKey","","Trait for keys that can be derived.",null,null],[10,"add_metadata","","Add a extra metadata, consume <code>self</code> and turn it into a […",67,[[["derivationpath",3],["option",4],["keysource",6]],[["keyerror",4],["descriptorkey",4],["result",4]]]],[3,"GeneratedKey","","Output of a [<code>GeneratableKey</code>] key generation",null,null],[11,"into_key","","Consumes <code>self</code> and returns the key",68,[[]]],[8,"GeneratableKey","","Trait for keys that can be generated",null,null],[16,"Entropy","","Type specifying the amount of entropy required e.g. …",69,null],[16,"Options","","Extra options required by the <code>generate_with_entropy</code>",69,null],[16,"Error","","Returned error in case of failure",69,null],[10,"generate_with_entropy","","Generate a key given the extra options and the entropy",69,[[],[["result",4],["generatedkey",3]]]],[11,"generate","","Generate a key given the options with a random entropy",69,[[],[["result",4],["generatedkey",3]]]],[8,"GeneratableDefaultOptions","","Trait that allows generating a key with the default …",null,null],[11,"generate_with_entropy_default","","Generate a key with the default options and a given …",70,[[],[["result",4],["generatedkey",3]]]],[11,"generate_default","","Generate a key with the default options and a random …",70,[[],[["result",4],["generatedkey",3]]]],[3,"PrivateKeyGenerateOptions","","Options for generating a [<code>PrivateKey</code>]",null,null],[12,"compressed","","Whether the generated key should be \\\"compressed\\\" or not",71,null],[4,"KeyError","","Errors thrown while working with <code>keys</code>",null,null],[13,"InvalidScriptContext","","The key cannot exist in the given script context",72,null],[13,"InvalidNetwork","","The key is not valid for the given network",72,null],[13,"InvalidChecksum","","The key has an invalid checksum",72,null],[13,"Message","","Custom error message",72,null],[13,"BIP32","","BIP32 error",72,null],[13,"Miniscript","","Miniscript error",72,null],[0,"wallet","bdk","Wallet",null,null],[0,"address_validator","bdk::wallet","Address validation callbacks",null,null],[4,"AddressValidatorError","bdk::wallet::address_validator","Errors that can be returned to fail the validation of an …",null,null],[13,"UserRejected","","User rejected the address",73,null],[13,"ConnectionError","","Network connection error",73,null],[13,"TimeoutError","","Network request timeout error",73,null],[13,"InvalidScript","","Invalid script",73,null],[13,"Message","","A custom error message",73,null],[8,"AddressValidator","","Trait to build address validators",null,null],[10,"validate","","Validate or inspect an address",74,[[["keychainkind",4],["script",3],["hdkeypaths",6]],[["result",4],["addressvalidatorerror",4]]]],[0,"coin_selection","bdk::wallet","Coin selection",null,null],[6,"DefaultCoinSelectionAlgorithm","bdk::wallet::coin_selection","Default coin selection algorithm used by <code>TxBuilder</code> if not …",null,null],[3,"CoinSelectionResult","","Result of a successful coin selection",null,null],[12,"selected","","List of outputs selected for use as inputs",75,null],[12,"selected_amount","","Sum of the selected inputs\' value",75,null],[12,"fee_amount","","Total fee amount in satoshi",75,null],[8,"CoinSelectionAlgorithm","","Trait for generalized coin selection algorithms",null,null],[10,"coin_select","","Perform the coin selection",76,[[["vec",3],["feerate",3]],[["coinselectionresult",3],["error",4],["result",4]]]],[3,"LargestFirstCoinSelection","","Simple and dumb coin selection",null,null],[3,"BranchAndBoundCoinSelection","","Branch and bound coin selection",null,null],[11,"new","","Create new instance with target size for change output",77,[[]]],[0,"export","bdk::wallet","Wallet export",null,null],[3,"WalletExport","bdk::wallet::export","Structure that contains the export of a wallet",null,null],[12,"blockheight","","Earliest block to rescan when looking for the wallet\'s …",78,null],[12,"label","","Arbitrary label for the wallet",78,null],[11,"export_wallet","","Export a wallet",78,[[["wallet",3]],["result",4]]],[11,"descriptor","","Return the external descriptor",78,[[],["string",3]]],[11,"change_descriptor","","Return the internal descriptor, if present",78,[[],[["option",4],["string",3]]]],[0,"signer","bdk::wallet","Generalized signers",null,null],[4,"SignerId","bdk::wallet::signer","Identifier of a signer in the <code>SignersContainers</code>. Used as …",null,null],[13,"PkHash","","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA …",79,null],[13,"Fingerprint","","The fingerprint of a BIP32 extended key",79,null],[13,"Dummy","","Dummy identifier",79,null],[4,"SignerError","","Signing error",null,null],[13,"MissingKey","","The private key is missing for the required public key",80,null],[13,"InvalidKey","","The private key in use has the right fingerprint but …",80,null],[13,"UserCanceled","","The user canceled the operation",80,null],[13,"InputIndexOutOfRange","","Input index is out of range",80,null],[13,"MissingNonWitnessUtxo","","The <code>non_witness_utxo</code> field of the transaction is required …",80,null],[13,"InvalidNonWitnessUtxo","","The <code>non_witness_utxo</code> specified is invalid",80,null],[13,"MissingWitnessUtxo","","The <code>witness_utxo</code> field of the transaction is required to …",80,null],[13,"MissingWitnessScript","","The <code>witness_script</code> field of the transaction is requied to …",80,null],[13,"MissingHDKeypath","","The fingerprint and derivation path are missing from the …",80,null],[8,"Signer","","Trait for signers",null,null],[10,"sign","","Sign a PSBT",81,[[["partiallysignedtransaction",3],["option",4],["secp256k1",3]],[["signererror",4],["result",4]]]],[10,"sign_whole_tx","","Return whether or not the signer signs the whole …",81,[[]]],[10,"id","","Return the [<code>SignerId</code>] for this signer",81,[[["secp256k1",3]],["signerid",4]]],[11,"descriptor_secret_key","","Return the secret key for the signer",81,[[],[["descriptorsecretkey",4],["option",4]]]],[3,"SignerOrdering","","Defines the order in which signers are called",null,null],[12,"0","","",82,null],[3,"SignersContainer","","Container for multiple signers",null,null],[11,"as_key_map","","Create a map of public keys to secret keys",83,[[["secp256k1",3]],["keymap",6]]],[11,"new","","Default constructor",83,[[]]],[11,"add_external","","Adds an external signer to the container for the …",83,[[["signerid",4],["signerordering",3],["signer",8],["arc",3]],[["arc",3],["option",4]]]],[11,"remove","","Removes a signer from the container and returns it",83,[[["signerid",4],["signerordering",3]],[["arc",3],["option",4]]]],[11,"ids","","Returns the list of identifiers of all the signers in the …",83,[[],[["vec",3],["signerid",4]]]],[11,"signers","","Returns the list of signers in the container, sorted by …",83,[[],[["vec",3],["arc",3]]]],[11,"find","","Finds the signer with lowest ordering for a given id in …",83,[[["signerid",4]],[["option",4],["arc",3]]]],[0,"time","bdk::wallet","Cross-platform time",null,null],[5,"get_timestamp","bdk::wallet::time","Return the current timestamp in seconds",null,[[]]],[0,"tx_builder","bdk::wallet","Transaction builder",null,null],[8,"TxBuilderContext","bdk::wallet::tx_builder","Context in which the [<code>TxBuilder</code>] is valid",null,null],[3,"CreateTx","","Marker type to indicate the [<code>TxBuilder</code>] is being used to …",null,null],[3,"BumpFee","","Marker type to indicate the [<code>TxBuilder</code>] is being used to …",null,null],[3,"TxBuilder","","A transaction builder",null,null],[11,"fee_rate","","Set a custom fee rate",84,[[["feerate",3]]]],[11,"fee_absolute","","Set an absolute fee",84,[[]]],[11,"policy_path","","Set the policy path to use while creating the transaction …",84,[[["keychainkind",4],["vec",3],["string",3],["btreemap",3]]]],[11,"add_utxos","","Add the list of outpoints to the internal list of UTXOs …",84,[[],[["error",4],["result",4]]]],[11,"add_utxo","","Add a utxo to the internal list of utxos that <strong>must</strong> be …",84,[[["outpoint",3]],[["error",4],["result",4]]]],[11,"manually_selected_only","","Only spend utxos added by <code>add_utxo</code>.",84,[[]]],[11,"unspendable","","Replace the internal list of unspendable utxos with a new …",84,[[["vec",3],["outpoint",3]]]],[11,"add_unspendable","","Add a utxo to the internal list of unspendable utxos",84,[[["outpoint",3]]]],[11,"sighash","","Sign with a specific sig hash",84,[[["sighashtype",4]]]],[11,"ordering","","Choose the ordering for inputs and outputs of the …",84,[[["txordering",4]]]],[11,"nlocktime","","Use a specific nLockTime while creating the transaction",84,[[]]],[11,"version","","Build a transaction with a specific version",84,[[]]],[11,"do_not_spend_change","","Do not spend change outputs",84,[[]]],[11,"only_spend_change","","Only spend change outputs",84,[[]]],[11,"change_policy","","Set a specific [<code>ChangeSpendPolicy</code>]. See […",84,[[["changespendpolicy",4]]]],[11,"force_non_witness_utxo","","Fill-in the <code>psbt::Input::non_witness_utxo</code> field even if …",84,[[]]],[11,"include_output_redeem_witness_script","","Fill-in the <code>psbt::Output::redeem_script</code> and …",84,[[]]],[11,"add_global_xpubs","","Fill-in the <code>PSBT_GLOBAL_XPUB</code> field with the extended keys …",84,[[]]],[11,"drain_wallet","","Spend all the available inputs. This respects filters …",84,[[]]],[11,"coin_selection","","Choose the coin selection algorithm",84,[[["coinselectionalgorithm",8]],[["txbuilder",3],["coinselectionalgorithm",8]]]],[11,"finish","","Finish the building the transaction.",84,[[],[["error",4],["result",4]]]],[11,"set_recipients","","Replace the recipients already added with a new list",84,[[["vec",3]]]],[11,"add_recipient","","Add a recipient to the internal list",84,[[["script",3]]]],[11,"set_single_recipient","","Set a single recipient that will get all the selected …",84,[[["script",3]]]],[11,"enable_rbf","","Enable signaling RBF",84,[[]]],[11,"enable_rbf_with_sequence","","Enable signaling RBF with a specific nSequence value",84,[[]]],[11,"maintain_single_recipient","","Bump the fees of a transaction made with …",84,[[],[["error",4],["result",4]]]],[4,"TxOrdering","","Ordering of the transaction\'s inputs and outputs",null,null],[13,"Shuffle","","Randomized (default)",85,null],[13,"Untouched","","Unchanged",85,null],[13,"BIP69Lexicographic","","BIP69 / Lexicographic",85,null],[11,"sort_tx","","Sort transaction inputs and outputs by [<code>TxOrdering</code>] …",85,[[["transaction",3]]]],[4,"ChangeSpendPolicy","","Policy regarding the use of change outputs when creating …",null,null],[13,"ChangeAllowed","","Use both change and non-change outputs (default)",86,null],[13,"OnlyChange","","Only use change outputs (see [<code>TxBuilder::only_spend_change</code>…",86,null],[13,"ChangeForbidden","","Only use non-change outputs (see […",86,null],[8,"IsDust","bdk::wallet","Trait to check if a value is below the dust limit",null,null],[10,"is_dust","","Check whether or not a value is below dust limit",87,[[]]],[3,"Wallet","","A Bitcoin wallet",null,null],[11,"new_offline","","Create a new \\\"offline\\\" wallet",88,[[["network",4],["option",4],["towalletdescriptor",8]],[["result",4],["error",4]]]],[11,"get_new_address","","Return a newly generated address using the external …",88,[[],[["address",3],["error",4],["result",4]]]],[11,"is_mine","","Return whether or not a <code>script</code> is part of this wallet …",88,[[["script",3]],[["result",4],["error",4]]]],[11,"list_unspent","","Return the list of unspent outputs of this wallet",88,[[],[["vec",3],["result",4],["error",4]]]],[11,"get_utxo","","Returns the <code>UTXO</code> owned by this wallet corresponding to …",88,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[11,"list_transactions","","Return the list of transactions made and received by the …",88,[[],[["result",4],["vec",3],["error",4]]]],[11,"get_balance","","Return the balance, meaning the sum of this wallet\'s …",88,[[],[["error",4],["result",4]]]],[11,"add_signer","","Add an external signer",88,[[["keychainkind",4],["signerordering",3],["signer",8],["arc",3]]]],[11,"add_address_validator","","Add an address validator",88,[[["arc",3],["addressvalidator",8]]]],[11,"build_tx","","Start building a transaction.",88,[[],[["createtx",3],["txbuilder",3],["defaultcoinselectionalgorithm",6]]]],[11,"build_fee_bump","","Bump the fee of a transaction previously created with …",88,[[["txid",3]],[["error",4],["result",4],["txbuilder",3]]]],[11,"sign","","Sign a transaction with all the wallet\'s signers, in the …",88,[[["psbt",3],["option",4]],[["result",4],["error",4]]]],[11,"policies","","Return the spending policies for the wallet\'s descriptor",88,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[11,"public_descriptor","","Return the \\\"public\\\" version of the wallet\'s descriptor, …",88,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[11,"finalize_psbt","","Try to finalize a PSBT",88,[[["psbt",3],["option",4]],[["result",4],["error",4]]]],[11,"secp_ctx","","Return the secp256k1 context used for all signing …",88,[[],["secp256k1",3]]],[11,"get_descriptor_for_keychain","","Returns the descriptor used to create adddresses for a …",88,[[["keychainkind",4]],["extendeddescriptor",6]]],[11,"new","","Create a new \\\"online\\\" wallet",88,[[["network",4],["option",4],["towalletdescriptor",8]],[["result",4],["error",4]]]],[11,"sync","","Sync the internal database with the blockchain",88,[[["progress",8],["option",4]],[["error",4],["result",4]]]],[11,"client","","Return a reference to the internal blockchain client",88,[[]]],[11,"network","","Get the Bitcoin network the wallet is using.",88,[[],["network",4]]],[11,"broadcast","","Broadcast a transaction to the network",88,[[["transaction",3]],[["result",4],["error",4],["txid",3]]]],[4,"Error","bdk","Errors that can be thrown by the <code>Wallet</code>",null,null],[13,"InvalidU32Bytes","","Wrong number of bytes found when trying to convert to u32",89,null],[13,"Generic","","Generic error",89,null],[13,"ScriptDoesntHaveAddressForm","","This error is thrown when trying to convert Bare and …",89,null],[13,"SingleRecipientMultipleOutputs","","Found multiple outputs when <code>single_recipient</code> option has …",89,null],[13,"SingleRecipientNoInputs","","<code>single_recipient</code> option is selected but neither …",89,null],[13,"NoRecipients","","Cannot build a tx without recipients",89,null],[13,"NoUtxosSelected","","<code>manually_selected_only</code> option is selected but no utxo has …",89,null],[13,"OutputBelowDustLimit","","Output created is under the dust limit, 546 satoshis",89,null],[13,"InsufficientFunds","","Wallet\'s UTXO set is not enough to cover recipient\'s …",89,null],[12,"needed","bdk::Error","Sats needed for some transaction",90,null],[12,"available","","Sats available for spending",90,null],[13,"BnBTotalTriesExceeded","bdk","Branch and bound coin selection possible attempts with …",89,null],[13,"BnBNoExactMatch","","Branch and bound coin selection tries to avoid needing a …",89,null],[13,"UnknownUTXO","","Happens when trying to spend an UTXO that is not in the …",89,null],[13,"TransactionNotFound","","Thrown when a tx is not found in the internal database",89,null],[13,"TransactionConfirmed","","Happens when trying to bump a transaction that is already …",89,null],[13,"IrreplaceableTransaction","","Trying to replace a tx that has a sequence >= <code>0xFFFFFFFE</code>",89,null],[13,"FeeRateTooLow","","When bumping a tx the fee rate requested is lower than …",89,null],[12,"required","bdk::Error","Required fee rate (satoshi/vbyte)",91,null],[13,"FeeTooLow","bdk","When bumping a tx the absolute fee requested is lower …",89,null],[12,"required","bdk::Error","Required fee absolute value (satoshi)",92,null],[13,"MissingKeyOrigin","bdk","In order to use the <code>TxBuilder::add_global_xpubs</code> option …",89,null],[13,"Key","","Error while working with <code>keys</code>",89,null],[13,"ChecksumMismatch","","Descriptor checksum mismatch",89,null],[13,"SpendingPolicyRequired","","Spending policy is not compatible with this <code>KeychainKind</code>",89,null],[13,"InvalidPolicyPathError","","Error while extracting and manipulating policies",89,null],[13,"Signer","","Signing error",89,null],[13,"InvalidProgressValue","","Progress value must be between <code>0.0</code> (included) and <code>100.0</code> …",89,null],[13,"ProgressUpdateError","","Progress update error (maybe the channel has been closed)",89,null],[13,"InvalidOutpoint","","Requested outpoint doesn\'t exist in the tx (vout greater …",89,null],[13,"Descriptor","","Error related to the parsing and usage of descriptors",89,null],[13,"AddressValidator","","Error that can be returned to fail the validation of an …",89,null],[13,"Encode","","Encoding error",89,null],[13,"Miniscript","","Miniscript error",89,null],[13,"BIP32","","BIP32 error",89,null],[13,"Secp256k1","","An ECDSA error",89,null],[13,"JSON","","Error serializing or deserializing JSON data",89,null],[13,"Hex","","Hex decoding error",89,null],[13,"PSBT","","Partially signed bitcoin transaction error",89,null],[13,"Electrum","","Electrum client error",89,null],[13,"Esplora","","Esplora client error",89,null],[13,"CompactFilters","","Compact filters client error)",89,null],[13,"Sled","","Sled database error",89,null],[4,"KeychainKind","","Types of keychains",null,null],[13,"External","","External",93,null],[13,"Internal","","Internal, usually used for change outputs",93,null],[3,"FeeRate","","Fee rate",null,null],[3,"UTXO","","A wallet unspent output",null,null],[12,"outpoint","","Reference to a transaction output",94,null],[12,"txout","","Transaction output",94,null],[12,"keychain","","Type of keychain",94,null],[3,"TransactionDetails","","A wallet transaction",null,null],[12,"transaction","","Optional transaction",95,null],[12,"txid","","Transaction id",95,null],[12,"timestamp","","Timestamp",95,null],[12,"received","","Received value (sats)",95,null],[12,"sent","","Sent value (sats)",95,null],[12,"fees","","Fee value (sats)",95,null],[12,"height","","Confirmed in block height, <code>None</code> means unconfirmed",95,null],[5,"version","","Get the version of BDK at runtime",null,[[]]],[14,"descriptor","","Macro to write full descriptors with code",null,null],[14,"fragment","","Macro to write descriptor fragments with code",null,null],[11,"from","","",89,[[]]],[11,"into","","",89,[[]]],[11,"to_string","","",89,[[],["string",3]]],[11,"borrow","","",89,[[]]],[11,"borrow_mut","","",89,[[]]],[11,"try_from","","",89,[[],["result",4]]],[11,"try_into","","",89,[[],["result",4]]],[11,"type_id","","",89,[[],["typeid",3]]],[11,"vzip","","",89,[[]]],[11,"init","","",89,[[]]],[11,"deref","","",89,[[]]],[11,"deref_mut","","",89,[[]]],[11,"drop","","",89,[[]]],[11,"from","bdk::blockchain::any","",0,[[]]],[11,"into","","",0,[[]]],[11,"borrow","","",0,[[]]],[11,"borrow_mut","","",0,[[]]],[11,"try_from","","",0,[[],["result",4]]],[11,"try_into","","",0,[[],["result",4]]],[11,"type_id","","",0,[[],["typeid",3]]],[11,"vzip","","",0,[[]]],[11,"init","","",0,[[]]],[11,"deref","","",0,[[]]],[11,"deref_mut","","",0,[[]]],[11,"drop","","",0,[[]]],[11,"from","","",1,[[]]],[11,"into","","",1,[[]]],[11,"borrow","","",1,[[]]],[11,"borrow_mut","","",1,[[]]],[11,"try_from","","",1,[[],["result",4]]],[11,"try_into","","",1,[[],["result",4]]],[11,"type_id","","",1,[[],["typeid",3]]],[11,"vzip","","",1,[[]]],[11,"init","","",1,[[]]],[11,"deref","","",1,[[]]],[11,"deref_mut","","",1,[[]]],[11,"drop","","",1,[[]]],[11,"from","bdk::blockchain::electrum","",96,[[]]],[11,"into","","",96,[[]]],[11,"borrow","","",96,[[]]],[11,"borrow_mut","","",96,[[]]],[11,"try_from","","",96,[[],["result",4]]],[11,"try_into","","",96,[[],["result",4]]],[11,"type_id","","",96,[[],["typeid",3]]],[11,"vzip","","",96,[[]]],[11,"init","","",96,[[]]],[11,"deref","","",96,[[]]],[11,"deref_mut","","",96,[[]]],[11,"drop","","",96,[[]]],[11,"from","","",2,[[]]],[11,"into","","",2,[[]]],[11,"borrow","","",2,[[]]],[11,"borrow_mut","","",2,[[]]],[11,"try_from","","",2,[[],["result",4]]],[11,"try_into","","",2,[[],["result",4]]],[11,"type_id","","",2,[[],["typeid",3]]],[11,"vzip","","",2,[[]]],[11,"init","","",2,[[]]],[11,"deref","","",2,[[]]],[11,"deref_mut","","",2,[[]]],[11,"drop","","",2,[[]]],[11,"from","bdk::blockchain::esplora","",3,[[]]],[11,"into","","",3,[[]]],[11,"borrow","","",3,[[]]],[11,"borrow_mut","","",3,[[]]],[11,"try_from","","",3,[[],["result",4]]],[11,"try_into","","",3,[[],["result",4]]],[11,"type_id","","",3,[[],["typeid",3]]],[11,"vzip","","",3,[[]]],[11,"init","","",3,[[]]],[11,"deref","","",3,[[]]],[11,"deref_mut","","",3,[[]]],[11,"drop","","",3,[[]]],[11,"from","","",4,[[]]],[11,"into","","",4,[[]]],[11,"borrow","","",4,[[]]],[11,"borrow_mut","","",4,[[]]],[11,"try_from","","",4,[[],["result",4]]],[11,"try_into","","",4,[[],["result",4]]],[11,"type_id","","",4,[[],["typeid",3]]],[11,"vzip","","",4,[[]]],[11,"init","","",4,[[]]],[11,"deref","","",4,[[]]],[11,"deref_mut","","",4,[[]]],[11,"drop","","",4,[[]]],[11,"from","","",5,[[]]],[11,"into","","",5,[[]]],[11,"to_string","","",5,[[],["string",3]]],[11,"borrow","","",5,[[]]],[11,"borrow_mut","","",5,[[]]],[11,"try_from","","",5,[[],["result",4]]],[11,"try_into","","",5,[[],["result",4]]],[11,"type_id","","",5,[[],["typeid",3]]],[11,"vzip","","",5,[[]]],[11,"init","","",5,[[]]],[11,"deref","","",5,[[]]],[11,"deref_mut","","",5,[[]]],[11,"drop","","",5,[[]]],[11,"from","bdk::blockchain::compact_filters","",97,[[]]],[11,"into","","",97,[[]]],[11,"borrow","","",97,[[]]],[11,"borrow_mut","","",97,[[]]],[11,"try_from","","",97,[[],["result",4]]],[11,"try_into","","",97,[[],["result",4]]],[11,"type_id","","",97,[[],["typeid",3]]],[11,"vzip","","",97,[[]]],[11,"init","","",97,[[]]],[11,"deref","","",97,[[]]],[11,"deref_mut","","",97,[[]]],[11,"drop","","",97,[[]]],[11,"from","","",98,[[]]],[11,"into","","",98,[[]]],[11,"borrow","","",98,[[]]],[11,"borrow_mut","","",98,[[]]],[11,"try_from","","",98,[[],["result",4]]],[11,"try_into","","",98,[[],["result",4]]],[11,"type_id","","",98,[[],["typeid",3]]],[11,"vzip","","",98,[[]]],[11,"init","","",98,[[]]],[11,"deref","","",98,[[]]],[11,"deref_mut","","",98,[[]]],[11,"drop","","",98,[[]]],[11,"from","","",6,[[]]],[11,"into","","",6,[[]]],[11,"borrow","","",6,[[]]],[11,"borrow_mut","","",6,[[]]],[11,"try_from","","",6,[[],["result",4]]],[11,"try_into","","",6,[[],["result",4]]],[11,"type_id","","",6,[[],["typeid",3]]],[11,"vzip","","",6,[[]]],[11,"init","","",6,[[]]],[11,"deref","","",6,[[]]],[11,"deref_mut","","",6,[[]]],[11,"drop","","",6,[[]]],[11,"from","","",7,[[]]],[11,"into","","",7,[[]]],[11,"borrow","","",7,[[]]],[11,"borrow_mut","","",7,[[]]],[11,"try_from","","",7,[[],["result",4]]],[11,"try_into","","",7,[[],["result",4]]],[11,"type_id","","",7,[[],["typeid",3]]],[11,"vzip","","",7,[[]]],[11,"init","","",7,[[]]],[11,"deref","","",7,[[]]],[11,"deref_mut","","",7,[[]]],[11,"drop","","",7,[[]]],[11,"from","","",8,[[]]],[11,"into","","",8,[[]]],[11,"borrow","","",8,[[]]],[11,"borrow_mut","","",8,[[]]],[11,"try_from","","",8,[[],["result",4]]],[11,"try_into","","",8,[[],["result",4]]],[11,"type_id","","",8,[[],["typeid",3]]],[11,"vzip","","",8,[[]]],[11,"init","","",8,[[]]],[11,"deref","","",8,[[]]],[11,"deref_mut","","",8,[[]]],[11,"drop","","",8,[[]]],[11,"from","","",9,[[]]],[11,"into","","",9,[[]]],[11,"to_string","","",9,[[],["string",3]]],[11,"borrow","","",9,[[]]],[11,"borrow_mut","","",9,[[]]],[11,"try_from","","",9,[[],["result",4]]],[11,"try_into","","",9,[[],["result",4]]],[11,"type_id","","",9,[[],["typeid",3]]],[11,"vzip","","",9,[[]]],[11,"init","","",9,[[]]],[11,"deref","","",9,[[]]],[11,"deref_mut","","",9,[[]]],[11,"drop","","",9,[[]]],[11,"from","bdk::blockchain","",10,[[]]],[11,"into","","",10,[[]]],[11,"to_owned","","",10,[[]]],[11,"clone_into","","",10,[[]]],[11,"borrow","","",10,[[]]],[11,"borrow_mut","","",10,[[]]],[11,"try_from","","",10,[[],["result",4]]],[11,"try_into","","",10,[[],["result",4]]],[11,"type_id","","",10,[[],["typeid",3]]],[11,"vzip","","",10,[[]]],[11,"equivalent","","",10,[[]]],[11,"init","","",10,[[]]],[11,"deref","","",10,[[]]],[11,"deref_mut","","",10,[[]]],[11,"drop","","",10,[[]]],[11,"from","","",99,[[]]],[11,"into","","",99,[[]]],[11,"to_owned","","",99,[[]]],[11,"clone_into","","",99,[[]]],[11,"borrow","","",99,[[]]],[11,"borrow_mut","","",99,[[]]],[11,"try_from","","",99,[[],["result",4]]],[11,"try_into","","",99,[[],["result",4]]],[11,"type_id","","",99,[[],["typeid",3]]],[11,"vzip","","",99,[[]]],[11,"init","","",99,[[]]],[11,"deref","","",99,[[]]],[11,"deref_mut","","",99,[[]]],[11,"drop","","",99,[[]]],[11,"from","","",100,[[]]],[11,"into","","",100,[[]]],[11,"to_owned","","",100,[[]]],[11,"clone_into","","",100,[[]]],[11,"borrow","","",100,[[]]],[11,"borrow_mut","","",100,[[]]],[11,"try_from","","",100,[[],["result",4]]],[11,"try_into","","",100,[[],["result",4]]],[11,"type_id","","",100,[[],["typeid",3]]],[11,"vzip","","",100,[[]]],[11,"init","","",100,[[]]],[11,"deref","","",100,[[]]],[11,"deref_mut","","",100,[[]]],[11,"drop","","",100,[[]]],[11,"from","bdk::database::any","",14,[[]]],[11,"into","","",14,[[]]],[11,"borrow","","",14,[[]]],[11,"borrow_mut","","",14,[[]]],[11,"try_from","","",14,[[],["result",4]]],[11,"try_into","","",14,[[],["result",4]]],[11,"type_id","","",14,[[],["typeid",3]]],[11,"vzip","","",14,[[]]],[11,"init","","",14,[[]]],[11,"deref","","",14,[[]]],[11,"deref_mut","","",14,[[]]],[11,"drop","","",14,[[]]],[11,"from","","",15,[[]]],[11,"into","","",15,[[]]],[11,"borrow","","",15,[[]]],[11,"borrow_mut","","",15,[[]]],[11,"try_from","","",15,[[],["result",4]]],[11,"try_into","","",15,[[],["result",4]]],[11,"type_id","","",15,[[],["typeid",3]]],[11,"vzip","","",15,[[]]],[11,"init","","",15,[[]]],[11,"deref","","",15,[[]]],[11,"deref_mut","","",15,[[]]],[11,"drop","","",15,[[]]],[11,"from","","",16,[[]]],[11,"into","","",16,[[]]],[11,"borrow","","",16,[[]]],[11,"borrow_mut","","",16,[[]]],[11,"try_from","","",16,[[],["result",4]]],[11,"try_into","","",16,[[],["result",4]]],[11,"type_id","","",16,[[],["typeid",3]]],[11,"vzip","","",16,[[]]],[11,"init","","",16,[[]]],[11,"deref","","",16,[[]]],[11,"deref_mut","","",16,[[]]],[11,"drop","","",16,[[]]],[11,"from","","",17,[[]]],[11,"into","","",17,[[]]],[11,"borrow","","",17,[[]]],[11,"borrow_mut","","",17,[[]]],[11,"try_from","","",17,[[],["result",4]]],[11,"try_into","","",17,[[],["result",4]]],[11,"type_id","","",17,[[],["typeid",3]]],[11,"vzip","","",17,[[]]],[11,"init","","",17,[[]]],[11,"deref","","",17,[[]]],[11,"deref_mut","","",17,[[]]],[11,"drop","","",17,[[]]],[11,"from","bdk::database::memory","",18,[[]]],[11,"into","","",18,[[]]],[11,"borrow","","",18,[[]]],[11,"borrow_mut","","",18,[[]]],[11,"try_from","","",18,[[],["result",4]]],[11,"try_into","","",18,[[],["result",4]]],[11,"type_id","","",18,[[],["typeid",3]]],[11,"vzip","","",18,[[]]],[11,"init","","",18,[[]]],[11,"deref","","",18,[[]]],[11,"deref_mut","","",18,[[]]],[11,"drop","","",18,[[]]],[11,"from","bdk::descriptor::error","",23,[[]]],[11,"into","","",23,[[]]],[11,"to_string","","",23,[[],["string",3]]],[11,"borrow","","",23,[[]]],[11,"borrow_mut","","",23,[[]]],[11,"try_from","","",23,[[],["result",4]]],[11,"try_into","","",23,[[],["result",4]]],[11,"type_id","","",23,[[],["typeid",3]]],[11,"vzip","","",23,[[]]],[11,"init","","",23,[[]]],[11,"deref","","",23,[[]]],[11,"deref_mut","","",23,[[]]],[11,"drop","","",23,[[]]],[11,"from","bdk::descriptor::policy","",101,[[]]],[11,"into","","",101,[[]]],[11,"to_owned","","",101,[[]]],[11,"clone_into","","",101,[[]]],[11,"borrow","","",101,[[]]],[11,"borrow_mut","","",101,[[]]],[11,"try_from","","",101,[[],["result",4]]],[11,"try_into","","",101,[[],["result",4]]],[11,"type_id","","",101,[[],["typeid",3]]],[11,"vzip","","",101,[[]]],[11,"init","","",101,[[]]],[11,"deref","","",101,[[]]],[11,"deref_mut","","",101,[[]]],[11,"drop","","",101,[[]]],[11,"from","","",24,[[]]],[11,"into","","",24,[[]]],[11,"to_owned","","",24,[[]]],[11,"clone_into","","",24,[[]]],[11,"borrow","","",24,[[]]],[11,"borrow_mut","","",24,[[]]],[11,"try_from","","",24,[[],["result",4]]],[11,"try_into","","",24,[[],["result",4]]],[11,"type_id","","",24,[[],["typeid",3]]],[11,"vzip","","",24,[[]]],[11,"init","","",24,[[]]],[11,"deref","","",24,[[]]],[11,"deref_mut","","",24,[[]]],[11,"drop","","",24,[[]]],[11,"from","","",33,[[]]],[11,"into","","",33,[[]]],[11,"to_owned","","",33,[[]]],[11,"clone_into","","",33,[[]]],[11,"borrow","","",33,[[]]],[11,"borrow_mut","","",33,[[]]],[11,"try_from","","",33,[[],["result",4]]],[11,"try_into","","",33,[[],["result",4]]],[11,"type_id","","",33,[[],["typeid",3]]],[11,"vzip","","",33,[[]]],[11,"init","","",33,[[]]],[11,"deref","","",33,[[]]],[11,"deref_mut","","",33,[[]]],[11,"drop","","",33,[[]]],[11,"from","","",37,[[]]],[11,"into","","",37,[[]]],[11,"to_owned","","",37,[[]]],[11,"clone_into","","",37,[[]]],[11,"borrow","","",37,[[]]],[11,"borrow_mut","","",37,[[]]],[11,"try_from","","",37,[[],["result",4]]],[11,"try_into","","",37,[[],["result",4]]],[11,"type_id","","",37,[[],["typeid",3]]],[11,"vzip","","",37,[[]]],[11,"init","","",37,[[]]],[11,"deref","","",37,[[]]],[11,"deref_mut","","",37,[[]]],[11,"drop","","",37,[[]]],[11,"from","","",38,[[]]],[11,"into","","",38,[[]]],[11,"to_owned","","",38,[[]]],[11,"clone_into","","",38,[[]]],[11,"borrow","","",38,[[]]],[11,"borrow_mut","","",38,[[]]],[11,"try_from","","",38,[[],["result",4]]],[11,"try_into","","",38,[[],["result",4]]],[11,"type_id","","",38,[[],["typeid",3]]],[11,"vzip","","",38,[[]]],[11,"equivalent","","",38,[[]]],[11,"init","","",38,[[]]],[11,"deref","","",38,[[]]],[11,"deref_mut","","",38,[[]]],[11,"drop","","",38,[[]]],[11,"from","","",39,[[]]],[11,"into","","",39,[[]]],[11,"to_string","","",39,[[],["string",3]]],[11,"borrow","","",39,[[]]],[11,"borrow_mut","","",39,[[]]],[11,"try_from","","",39,[[],["result",4]]],[11,"try_into","","",39,[[],["result",4]]],[11,"type_id","","",39,[[],["typeid",3]]],[11,"vzip","","",39,[[]]],[11,"init","","",39,[[]]],[11,"deref","","",39,[[]]],[11,"deref_mut","","",39,[[]]],[11,"drop","","",39,[[]]],[11,"to_wallet_descriptor","bdk::descriptor::template","",41,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",41,[[]]],[11,"into","","",41,[[]]],[11,"borrow","","",41,[[]]],[11,"borrow_mut","","",41,[[]]],[11,"try_from","","",41,[[],["result",4]]],[11,"try_into","","",41,[[],["result",4]]],[11,"type_id","","",41,[[],["typeid",3]]],[11,"vzip","","",41,[[]]],[11,"init","","",41,[[]]],[11,"deref","","",41,[[]]],[11,"deref_mut","","",41,[[]]],[11,"drop","","",41,[[]]],[11,"to_wallet_descriptor","","",42,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",42,[[]]],[11,"into","","",42,[[]]],[11,"borrow","","",42,[[]]],[11,"borrow_mut","","",42,[[]]],[11,"try_from","","",42,[[],["result",4]]],[11,"try_into","","",42,[[],["result",4]]],[11,"type_id","","",42,[[],["typeid",3]]],[11,"vzip","","",42,[[]]],[11,"init","","",42,[[]]],[11,"deref","","",42,[[]]],[11,"deref_mut","","",42,[[]]],[11,"drop","","",42,[[]]],[11,"to_wallet_descriptor","","",43,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",43,[[]]],[11,"into","","",43,[[]]],[11,"borrow","","",43,[[]]],[11,"borrow_mut","","",43,[[]]],[11,"try_from","","",43,[[],["result",4]]],[11,"try_into","","",43,[[],["result",4]]],[11,"type_id","","",43,[[],["typeid",3]]],[11,"vzip","","",43,[[]]],[11,"init","","",43,[[]]],[11,"deref","","",43,[[]]],[11,"deref_mut","","",43,[[]]],[11,"drop","","",43,[[]]],[11,"to_wallet_descriptor","","",44,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",44,[[]]],[11,"into","","",44,[[]]],[11,"borrow","","",44,[[]]],[11,"borrow_mut","","",44,[[]]],[11,"try_from","","",44,[[],["result",4]]],[11,"try_into","","",44,[[],["result",4]]],[11,"type_id","","",44,[[],["typeid",3]]],[11,"vzip","","",44,[[]]],[11,"init","","",44,[[]]],[11,"deref","","",44,[[]]],[11,"deref_mut","","",44,[[]]],[11,"drop","","",44,[[]]],[11,"to_wallet_descriptor","","",45,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",45,[[]]],[11,"into","","",45,[[]]],[11,"borrow","","",45,[[]]],[11,"borrow_mut","","",45,[[]]],[11,"try_from","","",45,[[],["result",4]]],[11,"try_into","","",45,[[],["result",4]]],[11,"type_id","","",45,[[],["typeid",3]]],[11,"vzip","","",45,[[]]],[11,"init","","",45,[[]]],[11,"deref","","",45,[[]]],[11,"deref_mut","","",45,[[]]],[11,"drop","","",45,[[]]],[11,"to_wallet_descriptor","","",46,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",46,[[]]],[11,"into","","",46,[[]]],[11,"borrow","","",46,[[]]],[11,"borrow_mut","","",46,[[]]],[11,"try_from","","",46,[[],["result",4]]],[11,"try_into","","",46,[[],["result",4]]],[11,"type_id","","",46,[[],["typeid",3]]],[11,"vzip","","",46,[[]]],[11,"init","","",46,[[]]],[11,"deref","","",46,[[]]],[11,"deref_mut","","",46,[[]]],[11,"drop","","",46,[[]]],[11,"to_wallet_descriptor","","",47,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",47,[[]]],[11,"into","","",47,[[]]],[11,"borrow","","",47,[[]]],[11,"borrow_mut","","",47,[[]]],[11,"try_from","","",47,[[],["result",4]]],[11,"try_into","","",47,[[],["result",4]]],[11,"type_id","","",47,[[],["typeid",3]]],[11,"vzip","","",47,[[]]],[11,"init","","",47,[[]]],[11,"deref","","",47,[[]]],[11,"deref_mut","","",47,[[]]],[11,"drop","","",47,[[]]],[11,"to_wallet_descriptor","","",48,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",48,[[]]],[11,"into","","",48,[[]]],[11,"borrow","","",48,[[]]],[11,"borrow_mut","","",48,[[]]],[11,"try_from","","",48,[[],["result",4]]],[11,"try_into","","",48,[[],["result",4]]],[11,"type_id","","",48,[[],["typeid",3]]],[11,"vzip","","",48,[[]]],[11,"init","","",48,[[]]],[11,"deref","","",48,[[]]],[11,"deref_mut","","",48,[[]]],[11,"drop","","",48,[[]]],[11,"to_wallet_descriptor","","",49,[[["network",4]],[["result",4],["error",4]]]],[11,"from","","",49,[[]]],[11,"into","","",49,[[]]],[11,"borrow","","",49,[[]]],[11,"borrow_mut","","",49,[[]]],[11,"try_from","","",49,[[],["result",4]]],[11,"try_into","","",49,[[],["result",4]]],[11,"type_id","","",49,[[],["typeid",3]]],[11,"vzip","","",49,[[]]],[11,"init","","",49,[[]]],[11,"deref","","",49,[[]]],[11,"deref_mut","","",49,[[]]],[11,"drop","","",49,[[]]],[11,"from","bdk::descriptor","",50,[[]]],[11,"into","","",50,[[]]],[11,"to_owned","","",50,[[]]],[11,"clone_into","","",50,[[]]],[11,"to_string","","",50,[[],["string",3]]],[11,"borrow","","",50,[[]]],[11,"borrow_mut","","",50,[[]]],[11,"try_from","","",50,[[],["result",4]]],[11,"try_into","","",50,[[],["result",4]]],[11,"type_id","","",50,[[],["typeid",3]]],[11,"vzip","","",50,[[]]],[11,"equivalent","","",50,[[]]],[11,"init","","",50,[[]]],[11,"deref","","",50,[[]]],[11,"deref_mut","","",50,[[]]],[11,"drop","","",50,[[]]],[11,"as_enum","","",102,[[],["scriptcontextenum",4]]],[11,"from","","",102,[[]]],[11,"into","","",102,[[]]],[11,"to_owned","","",102,[[]]],[11,"clone_into","","",102,[[]]],[11,"borrow","","",102,[[]]],[11,"borrow_mut","","",102,[[]]],[11,"try_from","","",102,[[],["result",4]]],[11,"try_into","","",102,[[],["result",4]]],[11,"type_id","","",102,[[],["typeid",3]]],[11,"vzip","","",102,[[]]],[11,"equivalent","","",102,[[]]],[11,"init","","",102,[[]]],[11,"deref","","",102,[[]]],[11,"deref_mut","","",102,[[]]],[11,"drop","","",102,[[]]],[11,"from","","",51,[[]]],[11,"into","","",51,[[]]],[11,"to_owned","","",51,[[]]],[11,"clone_into","","",51,[[]]],[11,"to_string","","",51,[[],["string",3]]],[11,"borrow","","",51,[[]]],[11,"borrow_mut","","",51,[[]]],[11,"try_from","","",51,[[],["result",4]]],[11,"try_into","","",51,[[],["result",4]]],[11,"type_id","","",51,[[],["typeid",3]]],[11,"vzip","","",51,[[]]],[11,"equivalent","","",51,[[]]],[11,"init","","",51,[[]]],[11,"deref","","",51,[[]]],[11,"deref_mut","","",51,[[]]],[11,"drop","","",51,[[]]],[11,"as_enum","","",103,[[],["scriptcontextenum",4]]],[11,"from","","",103,[[]]],[11,"into","","",103,[[]]],[11,"to_owned","","",103,[[]]],[11,"clone_into","","",103,[[]]],[11,"borrow","","",103,[[]]],[11,"borrow_mut","","",103,[[]]],[11,"try_from","","",103,[[],["result",4]]],[11,"try_into","","",103,[[],["result",4]]],[11,"type_id","","",103,[[],["typeid",3]]],[11,"vzip","","",103,[[]]],[11,"equivalent","","",103,[[]]],[11,"init","","",103,[[]]],[11,"deref","","",103,[[]]],[11,"deref_mut","","",103,[[]]],[11,"drop","","",103,[[]]],[11,"from","","",54,[[]]],[11,"into","","",54,[[]]],[11,"to_owned","","",54,[[]]],[11,"clone_into","","",54,[[]]],[11,"to_string","","",54,[[],["string",3]]],[11,"borrow","","",54,[[]]],[11,"borrow_mut","","",54,[[]]],[11,"try_from","","",54,[[],["result",4]]],[11,"try_into","","",54,[[],["result",4]]],[11,"type_id","","",54,[[],["typeid",3]]],[11,"vzip","","",54,[[]]],[11,"equivalent","","",54,[[]]],[11,"init","","",54,[[]]],[11,"deref","","",54,[[]]],[11,"deref_mut","","",54,[[]]],[11,"drop","","",54,[[]]],[11,"from","bdk::keys","",58,[[]]],[11,"into","","",58,[[]]],[11,"to_owned","","",58,[[]]],[11,"clone_into","","",58,[[]]],[11,"to_string","","",58,[[],["string",3]]],[11,"borrow","","",58,[[]]],[11,"borrow_mut","","",58,[[]]],[11,"try_from","","",58,[[],["result",4]]],[11,"try_into","","",58,[[],["result",4]]],[11,"type_id","","",58,[[],["typeid",3]]],[11,"vzip","","",58,[[]]],[11,"equivalent","","",58,[[]]],[11,"init","","",58,[[]]],[11,"deref","","",58,[[]]],[11,"deref_mut","","",58,[[]]],[11,"drop","","",58,[[]]],[11,"from","","",59,[[]]],[11,"into","","",59,[[]]],[11,"to_string","","",59,[[],["string",3]]],[11,"borrow","","",59,[[]]],[11,"borrow_mut","","",59,[[]]],[11,"try_from","","",59,[[],["result",4]]],[11,"try_into","","",59,[[],["result",4]]],[11,"type_id","","",59,[[],["typeid",3]]],[11,"vzip","","",59,[[]]],[11,"init","","",59,[[]]],[11,"deref","","",59,[[]]],[11,"deref_mut","","",59,[[]]],[11,"drop","","",59,[[]]],[11,"from","","",60,[[]]],[11,"into","","",60,[[]]],[11,"borrow","","",60,[[]]],[11,"borrow_mut","","",60,[[]]],[11,"try_from","","",60,[[],["result",4]]],[11,"try_into","","",60,[[],["result",4]]],[11,"type_id","","",60,[[],["typeid",3]]],[11,"vzip","","",60,[[]]],[11,"init","","",60,[[]]],[11,"deref","","",60,[[]]],[11,"deref_mut","","",60,[[]]],[11,"drop","","",60,[[]]],[11,"from","","",61,[[]]],[11,"into","","",61,[[]]],[11,"to_owned","","",61,[[]]],[11,"clone_into","","",61,[[]]],[11,"borrow","","",61,[[]]],[11,"borrow_mut","","",61,[[]]],[11,"try_from","","",61,[[],["result",4]]],[11,"try_into","","",61,[[],["result",4]]],[11,"type_id","","",61,[[],["typeid",3]]],[11,"vzip","","",61,[[]]],[11,"equivalent","","",61,[[]]],[11,"init","","",61,[[]]],[11,"deref","","",61,[[]]],[11,"deref_mut","","",61,[[]]],[11,"drop","","",61,[[]]],[11,"from","","",62,[[]]],[11,"into","","",62,[[]]],[11,"to_owned","","",62,[[]]],[11,"clone_into","","",62,[[]]],[11,"to_string","","",62,[[],["string",3]]],[11,"borrow","","",62,[[]]],[11,"borrow_mut","","",62,[[]]],[11,"try_from","","",62,[[],["result",4]]],[11,"try_into","","",62,[[],["result",4]]],[11,"type_id","","",62,[[],["typeid",3]]],[11,"vzip","","",62,[[]]],[11,"equivalent","","",62,[[]]],[11,"init","","",62,[[]]],[11,"deref","","",62,[[]]],[11,"deref_mut","","",62,[[]]],[11,"drop","","",62,[[]]],[11,"from","","",63,[[]]],[11,"into","","",63,[[]]],[11,"borrow","","",63,[[]]],[11,"borrow_mut","","",63,[[]]],[11,"try_from","","",63,[[],["result",4]]],[11,"try_into","","",63,[[],["result",4]]],[11,"type_id","","",63,[[],["typeid",3]]],[11,"vzip","","",63,[[]]],[11,"init","","",63,[[]]],[11,"deref","","",63,[[]]],[11,"deref_mut","","",63,[[]]],[11,"drop","","",63,[[]]],[11,"from","","",64,[[]]],[11,"into","","",64,[[]]],[11,"to_owned","","",64,[[]]],[11,"clone_into","","",64,[[]]],[11,"borrow","","",64,[[]]],[11,"borrow_mut","","",64,[[]]],[11,"try_from","","",64,[[],["result",4]]],[11,"try_into","","",64,[[],["result",4]]],[11,"type_id","","",64,[[],["typeid",3]]],[11,"vzip","","",64,[[]]],[11,"equivalent","","",64,[[]]],[11,"init","","",64,[[]]],[11,"deref","","",64,[[]]],[11,"deref_mut","","",64,[[]]],[11,"drop","","",64,[[]]],[11,"from","","",68,[[]]],[11,"into","","",68,[[]]],[11,"borrow","","",68,[[]]],[11,"borrow_mut","","",68,[[]]],[11,"try_from","","",68,[[],["result",4]]],[11,"try_into","","",68,[[],["result",4]]],[11,"type_id","","",68,[[],["typeid",3]]],[11,"vzip","","",68,[[]]],[11,"init","","",68,[[]]],[11,"deref","","",68,[[]]],[11,"deref_mut","","",68,[[]]],[11,"drop","","",68,[[]]],[11,"from","","",71,[[]]],[11,"into","","",71,[[]]],[11,"to_owned","","",71,[[]]],[11,"clone_into","","",71,[[]]],[11,"borrow","","",71,[[]]],[11,"borrow_mut","","",71,[[]]],[11,"try_from","","",71,[[],["result",4]]],[11,"try_into","","",71,[[],["result",4]]],[11,"type_id","","",71,[[],["typeid",3]]],[11,"vzip","","",71,[[]]],[11,"init","","",71,[[]]],[11,"deref","","",71,[[]]],[11,"deref_mut","","",71,[[]]],[11,"drop","","",71,[[]]],[11,"from","","",72,[[]]],[11,"into","","",72,[[]]],[11,"to_string","","",72,[[],["string",3]]],[11,"borrow","","",72,[[]]],[11,"borrow_mut","","",72,[[]]],[11,"try_from","","",72,[[],["result",4]]],[11,"try_into","","",72,[[],["result",4]]],[11,"type_id","","",72,[[],["typeid",3]]],[11,"vzip","","",72,[[]]],[11,"init","","",72,[[]]],[11,"deref","","",72,[[]]],[11,"deref_mut","","",72,[[]]],[11,"drop","","",72,[[]]],[11,"from","bdk","",93,[[]]],[11,"into","","",93,[[]]],[11,"to_owned","","",93,[[]]],[11,"clone_into","","",93,[[]]],[11,"borrow","","",93,[[]]],[11,"borrow_mut","","",93,[[]]],[11,"try_from","","",93,[[],["result",4]]],[11,"try_into","","",93,[[],["result",4]]],[11,"type_id","","",93,[[],["typeid",3]]],[11,"write_base32","","",93,[[],["result",4]]],[11,"base32_len","","",93,[[]]],[11,"check_base32","","",93,[[],[["vec",3],["result",4]]]],[11,"vzip","","",93,[[]]],[11,"equivalent","","",93,[[]]],[11,"init","","",93,[[]]],[11,"deref","","",93,[[]]],[11,"deref_mut","","",93,[[]]],[11,"drop","","",93,[[]]],[11,"from","","",104,[[]]],[11,"into","","",104,[[]]],[11,"to_owned","","",104,[[]]],[11,"clone_into","","",104,[[]]],[11,"borrow","","",104,[[]]],[11,"borrow_mut","","",104,[[]]],[11,"try_from","","",104,[[],["result",4]]],[11,"try_into","","",104,[[],["result",4]]],[11,"type_id","","",104,[[],["typeid",3]]],[11,"vzip","","",104,[[]]],[11,"init","","",104,[[]]],[11,"deref","","",104,[[]]],[11,"deref_mut","","",104,[[]]],[11,"drop","","",104,[[]]],[11,"from","","",94,[[]]],[11,"into","","",94,[[]]],[11,"to_owned","","",94,[[]]],[11,"clone_into","","",94,[[]]],[11,"borrow","","",94,[[]]],[11,"borrow_mut","","",94,[[]]],[11,"try_from","","",94,[[],["result",4]]],[11,"try_into","","",94,[[],["result",4]]],[11,"type_id","","",94,[[],["typeid",3]]],[11,"vzip","","",94,[[]]],[11,"equivalent","","",94,[[]]],[11,"init","","",94,[[]]],[11,"deref","","",94,[[]]],[11,"deref_mut","","",94,[[]]],[11,"drop","","",94,[[]]],[11,"from","","",95,[[]]],[11,"into","","",95,[[]]],[11,"to_owned","","",95,[[]]],[11,"clone_into","","",95,[[]]],[11,"borrow","","",95,[[]]],[11,"borrow_mut","","",95,[[]]],[11,"try_from","","",95,[[],["result",4]]],[11,"try_into","","",95,[[],["result",4]]],[11,"type_id","","",95,[[],["typeid",3]]],[11,"vzip","","",95,[[]]],[11,"equivalent","","",95,[[]]],[11,"init","","",95,[[]]],[11,"deref","","",95,[[]]],[11,"deref_mut","","",95,[[]]],[11,"drop","","",95,[[]]],[11,"from","bdk::wallet::address_validator","",73,[[]]],[11,"into","","",73,[[]]],[11,"to_owned","","",73,[[]]],[11,"clone_into","","",73,[[]]],[11,"to_string","","",73,[[],["string",3]]],[11,"borrow","","",73,[[]]],[11,"borrow_mut","","",73,[[]]],[11,"try_from","","",73,[[],["result",4]]],[11,"try_into","","",73,[[],["result",4]]],[11,"type_id","","",73,[[],["typeid",3]]],[11,"vzip","","",73,[[]]],[11,"equivalent","","",73,[[]]],[11,"init","","",73,[[]]],[11,"deref","","",73,[[]]],[11,"deref_mut","","",73,[[]]],[11,"drop","","",73,[[]]],[11,"from","bdk::wallet::coin_selection","",75,[[]]],[11,"into","","",75,[[]]],[11,"borrow","","",75,[[]]],[11,"borrow_mut","","",75,[[]]],[11,"try_from","","",75,[[],["result",4]]],[11,"try_into","","",75,[[],["result",4]]],[11,"type_id","","",75,[[],["typeid",3]]],[11,"vzip","","",75,[[]]],[11,"init","","",75,[[]]],[11,"deref","","",75,[[]]],[11,"deref_mut","","",75,[[]]],[11,"drop","","",75,[[]]],[11,"from","","",105,[[]]],[11,"into","","",105,[[]]],[11,"borrow","","",105,[[]]],[11,"borrow_mut","","",105,[[]]],[11,"try_from","","",105,[[],["result",4]]],[11,"try_into","","",105,[[],["result",4]]],[11,"type_id","","",105,[[],["typeid",3]]],[11,"vzip","","",105,[[]]],[11,"init","","",105,[[]]],[11,"deref","","",105,[[]]],[11,"deref_mut","","",105,[[]]],[11,"drop","","",105,[[]]],[11,"from","","",77,[[]]],[11,"into","","",77,[[]]],[11,"borrow","","",77,[[]]],[11,"borrow_mut","","",77,[[]]],[11,"try_from","","",77,[[],["result",4]]],[11,"try_into","","",77,[[],["result",4]]],[11,"type_id","","",77,[[],["typeid",3]]],[11,"vzip","","",77,[[]]],[11,"init","","",77,[[]]],[11,"deref","","",77,[[]]],[11,"deref_mut","","",77,[[]]],[11,"drop","","",77,[[]]],[11,"from","bdk::wallet::export","",78,[[]]],[11,"into","","",78,[[]]],[11,"borrow","","",78,[[]]],[11,"borrow_mut","","",78,[[]]],[11,"try_from","","",78,[[],["result",4]]],[11,"try_into","","",78,[[],["result",4]]],[11,"type_id","","",78,[[],["typeid",3]]],[11,"vzip","","",78,[[]]],[11,"init","","",78,[[]]],[11,"deref","","",78,[[]]],[11,"deref_mut","","",78,[[]]],[11,"drop","","",78,[[]]],[11,"from","bdk::wallet::signer","",79,[[]]],[11,"into","","",79,[[]]],[11,"to_owned","","",79,[[]]],[11,"clone_into","","",79,[[]]],[11,"borrow","","",79,[[]]],[11,"borrow_mut","","",79,[[]]],[11,"try_from","","",79,[[],["result",4]]],[11,"try_into","","",79,[[],["result",4]]],[11,"type_id","","",79,[[],["typeid",3]]],[11,"vzip","","",79,[[]]],[11,"equivalent","","",79,[[]]],[11,"init","","",79,[[]]],[11,"deref","","",79,[[]]],[11,"deref_mut","","",79,[[]]],[11,"drop","","",79,[[]]],[11,"from","","",80,[[]]],[11,"into","","",80,[[]]],[11,"to_owned","","",80,[[]]],[11,"clone_into","","",80,[[]]],[11,"to_string","","",80,[[],["string",3]]],[11,"borrow","","",80,[[]]],[11,"borrow_mut","","",80,[[]]],[11,"try_from","","",80,[[],["result",4]]],[11,"try_into","","",80,[[],["result",4]]],[11,"type_id","","",80,[[],["typeid",3]]],[11,"vzip","","",80,[[]]],[11,"equivalent","","",80,[[]]],[11,"init","","",80,[[]]],[11,"deref","","",80,[[]]],[11,"deref_mut","","",80,[[]]],[11,"drop","","",80,[[]]],[11,"from","","",82,[[]]],[11,"into","","",82,[[]]],[11,"to_owned","","",82,[[]]],[11,"clone_into","","",82,[[]]],[11,"borrow","","",82,[[]]],[11,"borrow_mut","","",82,[[]]],[11,"try_from","","",82,[[],["result",4]]],[11,"try_into","","",82,[[],["result",4]]],[11,"type_id","","",82,[[],["typeid",3]]],[11,"vzip","","",82,[[]]],[11,"equivalent","","",82,[[]]],[11,"init","","",82,[[]]],[11,"deref","","",82,[[]]],[11,"deref_mut","","",82,[[]]],[11,"drop","","",82,[[]]],[11,"from","","",83,[[]]],[11,"into","","",83,[[]]],[11,"to_owned","","",83,[[]]],[11,"clone_into","","",83,[[]]],[11,"borrow","","",83,[[]]],[11,"borrow_mut","","",83,[[]]],[11,"try_from","","",83,[[],["result",4]]],[11,"try_into","","",83,[[],["result",4]]],[11,"type_id","","",83,[[],["typeid",3]]],[11,"vzip","","",83,[[]]],[11,"init","","",83,[[]]],[11,"deref","","",83,[[]]],[11,"deref_mut","","",83,[[]]],[11,"drop","","",83,[[]]],[11,"from","bdk::wallet::tx_builder","",106,[[]]],[11,"into","","",106,[[]]],[11,"to_owned","","",106,[[]]],[11,"clone_into","","",106,[[]]],[11,"borrow","","",106,[[]]],[11,"borrow_mut","","",106,[[]]],[11,"try_from","","",106,[[],["result",4]]],[11,"try_into","","",106,[[],["result",4]]],[11,"type_id","","",106,[[],["typeid",3]]],[11,"vzip","","",106,[[]]],[11,"init","","",106,[[]]],[11,"deref","","",106,[[]]],[11,"deref_mut","","",106,[[]]],[11,"drop","","",106,[[]]],[11,"from","","",107,[[]]],[11,"into","","",107,[[]]],[11,"to_owned","","",107,[[]]],[11,"clone_into","","",107,[[]]],[11,"borrow","","",107,[[]]],[11,"borrow_mut","","",107,[[]]],[11,"try_from","","",107,[[],["result",4]]],[11,"try_into","","",107,[[],["result",4]]],[11,"type_id","","",107,[[],["typeid",3]]],[11,"vzip","","",107,[[]]],[11,"init","","",107,[[]]],[11,"deref","","",107,[[]]],[11,"deref_mut","","",107,[[]]],[11,"drop","","",107,[[]]],[11,"from","","",84,[[]]],[11,"into","","",84,[[]]],[11,"to_owned","","",84,[[]]],[11,"clone_into","","",84,[[]]],[11,"borrow","","",84,[[]]],[11,"borrow_mut","","",84,[[]]],[11,"try_from","","",84,[[],["result",4]]],[11,"try_into","","",84,[[],["result",4]]],[11,"type_id","","",84,[[],["typeid",3]]],[11,"vzip","","",84,[[]]],[11,"init","","",84,[[]]],[11,"deref","","",84,[[]]],[11,"deref_mut","","",84,[[]]],[11,"drop","","",84,[[]]],[11,"from","","",85,[[]]],[11,"into","","",85,[[]]],[11,"to_owned","","",85,[[]]],[11,"clone_into","","",85,[[]]],[11,"borrow","","",85,[[]]],[11,"borrow_mut","","",85,[[]]],[11,"try_from","","",85,[[],["result",4]]],[11,"try_into","","",85,[[],["result",4]]],[11,"type_id","","",85,[[],["typeid",3]]],[11,"vzip","","",85,[[]]],[11,"equivalent","","",85,[[]]],[11,"init","","",85,[[]]],[11,"deref","","",85,[[]]],[11,"deref_mut","","",85,[[]]],[11,"drop","","",85,[[]]],[11,"from","","",86,[[]]],[11,"into","","",86,[[]]],[11,"to_owned","","",86,[[]]],[11,"clone_into","","",86,[[]]],[11,"borrow","","",86,[[]]],[11,"borrow_mut","","",86,[[]]],[11,"try_from","","",86,[[],["result",4]]],[11,"try_into","","",86,[[],["result",4]]],[11,"type_id","","",86,[[],["typeid",3]]],[11,"vzip","","",86,[[]]],[11,"equivalent","","",86,[[]]],[11,"init","","",86,[[]]],[11,"deref","","",86,[[]]],[11,"deref_mut","","",86,[[]]],[11,"drop","","",86,[[]]],[11,"from","bdk::wallet","",88,[[]]],[11,"into","","",88,[[]]],[11,"borrow","","",88,[[]]],[11,"borrow_mut","","",88,[[]]],[11,"try_from","","",88,[[],["result",4]]],[11,"try_into","","",88,[[],["result",4]]],[11,"type_id","","",88,[[],["typeid",3]]],[11,"vzip","","",88,[[]]],[11,"init","","",88,[[]]],[11,"deref","","",88,[[]]],[11,"deref_mut","","",88,[[]]],[11,"drop","","",88,[[]]],[11,"fmt","bdk::descriptor","",54,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",62,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",50,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",59,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",58,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",51,[[["formatter",3]],[["result",4],["error",3]]]],[11,"hash","bdk::keys","",58,[[]]],[11,"hash","bdk::descriptor","",51,[[]]],[11,"hash","","",54,[[]]],[11,"hash","bdk::keys","",61,[[]]],[11,"check_terminal_non_malleable","bdk::descriptor","",103,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","",103,[[],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_consensus_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_policy_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","",103,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"max_satisfaction_size","","",103,[[["miniscript",3]],["option",4]]],[11,"check_terminal_non_malleable","","",102,[[["terminal",4]],[["result",4],["scriptcontexterror",4]]]],[11,"check_witness","","",102,[[],[["result",4],["scriptcontexterror",4]]]],[11,"check_global_consensus_validity","","",102,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_consensus_validity","","",102,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"check_local_policy_validity","","",102,[[["miniscript",3]],[["result",4],["scriptcontexterror",4]]]],[11,"max_satisfaction_size","","",102,[[["miniscript",3]],["option",4]]],[11,"partial_cmp","","",102,[[["legacy",4]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",51,[[["miniscript",3]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",103,[[["segwitv0",4]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",54,[[["terminal",4]],[["option",4],["ordering",4]]]],[11,"lt","","",54,[[["terminal",4]]]],[11,"le","","",54,[[["terminal",4]]]],[11,"gt","","",54,[[["terminal",4]]]],[11,"ge","","",54,[[["terminal",4]]]],[11,"partial_cmp","bdk::keys","",62,[[["sortedmultivec",3]],[["option",4],["ordering",4]]]],[11,"lt","","",62,[[["sortedmultivec",3]]]],[11,"le","","",62,[[["sortedmultivec",3]]]],[11,"gt","","",62,[[["sortedmultivec",3]]]],[11,"ge","","",62,[[["sortedmultivec",3]]]],[11,"partial_cmp","","",58,[[["descriptorpublickey",4]],[["option",4],["ordering",4]]]],[11,"lt","","",58,[[["descriptorpublickey",4]]]],[11,"le","","",58,[[["descriptorpublickey",4]]]],[11,"gt","","",58,[[["descriptorpublickey",4]]]],[11,"ge","","",58,[[["descriptorpublickey",4]]]],[11,"partial_cmp","","",61,[[["descriptorsinglepub",3]],[["option",4],["ordering",4]]]],[11,"lt","","",61,[[["descriptorsinglepub",3]]]],[11,"le","","",61,[[["descriptorsinglepub",3]]]],[11,"gt","","",61,[[["descriptorsinglepub",3]]]],[11,"ge","","",61,[[["descriptorsinglepub",3]]]],[11,"partial_cmp","bdk::descriptor","",50,[[["descriptor",4]],[["option",4],["ordering",4]]]],[11,"lt","","",50,[[["descriptor",4]]]],[11,"le","","",50,[[["descriptor",4]]]],[11,"gt","","",50,[[["descriptor",4]]]],[11,"ge","","",50,[[["descriptor",4]]]],[11,"fmt","bdk::keys","",61,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",62,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",102,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",103,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",54,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",58,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",60,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::descriptor","",51,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","","",50,[[["formatter",3]],[["result",4],["error",3]]]],[11,"fmt","bdk::keys","",59,[[["formatter",3]],[["result",4],["error",3]]]],[11,"lift","bdk::descriptor","",50,[[],[["error",4],["policy",4],["result",4]]]],[11,"lift","","",51,[[],[["error",4],["policy",4],["result",4]]]],[11,"lift","bdk::keys","",62,[[],[["error",4],["policy",4],["result",4]]]],[11,"lift","bdk::descriptor","",54,[[],[["error",4],["policy",4],["result",4]]]],[11,"to_pubkeyhash","bdk::keys","",58,[[],["descriptorpublickey",4]]],[11,"to_public_key","","",58,[[["descriptorpublickeyctx",3]],["publickey",3]]],[11,"hash_to_hash160","","",58,[[["descriptorpublickeyctx",3]],["hash",3]]],[11,"clone","bdk::descriptor","",54,[[],["terminal",4]]],[11,"clone","","",51,[[],["miniscript",3]]],[11,"clone","","",102,[[],["legacy",4]]],[11,"clone","bdk::keys","",58,[[],["descriptorpublickey",4]]],[11,"clone","","",61,[[],["descriptorsinglepub",3]]],[11,"clone","","",62,[[],["sortedmultivec",3]]],[11,"clone","bdk::descriptor","",103,[[],["segwitv0",4]]],[11,"clone","","",50,[[],["descriptor",4]]],[11,"eq","bdk::keys","",61,[[["descriptorsinglepub",3]]]],[11,"ne","","",61,[[["descriptorsinglepub",3]]]],[11,"eq","bdk::descriptor","",54,[[["terminal",4]]]],[11,"ne","","",54,[[["terminal",4]]]],[11,"eq","","",103,[[["segwitv0",4]]]],[11,"eq","","",102,[[["legacy",4]]]],[11,"eq","bdk::keys","",62,[[["sortedmultivec",3]]]],[11,"ne","","",62,[[["sortedmultivec",3]]]],[11,"eq","bdk::descriptor","",50,[[["descriptor",4]]]],[11,"ne","","",50,[[["descriptor",4]]]],[11,"eq","","",51,[[["miniscript",3]]]],[11,"eq","bdk::keys","",58,[[["descriptorpublickey",4]]]],[11,"ne","","",58,[[["descriptorpublickey",4]]]],[11,"cmp","bdk::descriptor","",50,[[["descriptor",4]],["ordering",4]]],[11,"cmp","","",51,[[["miniscript",3]],["ordering",4]]],[11,"cmp","","",54,[[["terminal",4]],["ordering",4]]],[11,"cmp","bdk::keys","",62,[[["sortedmultivec",3]],["ordering",4]]],[11,"cmp","","",58,[[["descriptorpublickey",4]],["ordering",4]]],[11,"cmp","","",61,[[["descriptorsinglepub",3]],["ordering",4]]],[11,"cmp","bdk::descriptor","",103,[[["segwitv0",4]],["ordering",4]]],[11,"cmp","","",102,[[["legacy",4]],["ordering",4]]],[11,"from_tree","","Parse an expression tree into a descriptor",50,[[["tree",3]],[["result",4],["descriptor",4],["error",4]]]],[11,"from_tree","","Parse an expression tree into a Miniscript. As a general …",51,[[["tree",3]],[["miniscript",3],["error",4],["result",4]]]],[11,"from_tree","","",54,[[["tree",3]],[["result",4],["error",4],["terminal",4]]]],[11,"from_str","","Parse a Miniscript from string and perform sanity checks …",51,[[],[["miniscript",3],["error",4],["result",4]]]],[11,"from_str","bdk::keys","",58,[[],[["result",4],["descriptorpublickey",4]]]],[11,"from_str","","",59,[[],[["result",4],["descriptorsecretkey",4]]]],[11,"from_str","bdk::descriptor","",50,[[],[["result",4],["descriptor",4],["error",4]]]],[11,"from_config","bdk::blockchain::any","",0,[[],[["result",4],["error",4]]]],[11,"from_config","bdk::blockchain::electrum","",96,[[],[["result",4],["error",4]]]],[11,"from_config","bdk::blockchain::esplora","",3,[[],[["result",4],["error",4]]]],[11,"from_config","bdk::blockchain::compact_filters","",6,[[],[["result",4],["error",4]]]],[11,"update","bdk::blockchain","",99,[[["option",4],["string",3]],[["error",4],["result",4]]]],[11,"update","","",100,[[["option",4],["string",3]],[["error",4],["result",4]]]],[11,"set_script_pubkey","bdk::database::any","",14,[[["keychainkind",4],["script",3]],[["error",4],["result",4]]]],[11,"set_utxo","","",14,[[["utxo",3]],[["error",4],["result",4]]]],[11,"set_raw_tx","","",14,[[["transaction",3]],[["error",4],["result",4]]]],[11,"set_tx","","",14,[[["transactiondetails",3]],[["error",4],["result",4]]]],[11,"set_last_index","","",14,[[["keychainkind",4]],[["error",4],["result",4]]]],[11,"del_script_pubkey_from_path","","",14,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[11,"del_path_from_script_pubkey","","",14,[[["script",3]],[["result",4],["option",4],["error",4]]]],[11,"del_utxo","","",14,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[11,"del_raw_tx","","",14,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"del_tx","","",14,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"del_last_index","","",14,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[11,"set_script_pubkey","","",15,[[["keychainkind",4],["script",3]],[["error",4],["result",4]]]],[11,"set_utxo","","",15,[[["utxo",3]],[["error",4],["result",4]]]],[11,"set_raw_tx","","",15,[[["transaction",3]],[["error",4],["result",4]]]],[11,"set_tx","","",15,[[["transactiondetails",3]],[["error",4],["result",4]]]],[11,"set_last_index","","",15,[[["keychainkind",4]],[["error",4],["result",4]]]],[11,"del_script_pubkey_from_path","","",15,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[11,"del_path_from_script_pubkey","","",15,[[["script",3]],[["result",4],["option",4],["error",4]]]],[11,"del_utxo","","",15,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[11,"del_raw_tx","","",15,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"del_tx","","",15,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"del_last_index","","",15,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[11,"set_script_pubkey","bdk::database::memory","",18,[[["keychainkind",4],["script",3]],[["error",4],["result",4]]]],[11,"set_utxo","","",18,[[["utxo",3]],[["error",4],["result",4]]]],[11,"set_raw_tx","","",18,[[["transaction",3]],[["error",4],["result",4]]]],[11,"set_tx","","",18,[[["transactiondetails",3]],[["error",4],["result",4]]]],[11,"set_last_index","","",18,[[["keychainkind",4]],[["error",4],["result",4]]]],[11,"del_script_pubkey_from_path","","",18,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[11,"del_path_from_script_pubkey","","",18,[[["script",3]],[["result",4],["option",4],["error",4]]]],[11,"del_utxo","","",18,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[11,"del_raw_tx","","",18,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"del_tx","","",18,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"del_last_index","","",18,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[11,"check_descriptor_checksum","bdk::database::any","",14,[[["keychainkind",4],["asref",8]],[["error",4],["result",4]]]],[11,"iter_script_pubkeys","","",14,[[["option",4],["keychainkind",4]],[["result",4],["vec",3],["error",4]]]],[11,"iter_utxos","","",14,[[],[["vec",3],["result",4],["error",4]]]],[11,"iter_raw_txs","","",14,[[],[["result",4],["error",4],["vec",3]]]],[11,"iter_txs","","",14,[[],[["result",4],["vec",3],["error",4]]]],[11,"get_script_pubkey_from_path","","",14,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[11,"get_path_from_script_pubkey","","",14,[[["script",3]],[["result",4],["option",4],["error",4]]]],[11,"get_utxo","","",14,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[11,"get_raw_tx","","",14,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"get_tx","","",14,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"get_last_index","","",14,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[11,"increment_last_index","","",14,[[["keychainkind",4]],[["result",4],["error",4]]]],[11,"check_descriptor_checksum","bdk::database::memory","",18,[[["keychainkind",4],["asref",8]],[["error",4],["result",4]]]],[11,"iter_script_pubkeys","","",18,[[["option",4],["keychainkind",4]],[["result",4],["vec",3],["error",4]]]],[11,"iter_utxos","","",18,[[],[["vec",3],["result",4],["error",4]]]],[11,"iter_raw_txs","","",18,[[],[["result",4],["error",4],["vec",3]]]],[11,"iter_txs","","",18,[[],[["result",4],["vec",3],["error",4]]]],[11,"get_script_pubkey_from_path","","",18,[[["keychainkind",4]],[["option",4],["error",4],["result",4]]]],[11,"get_path_from_script_pubkey","","",18,[[["script",3]],[["result",4],["option",4],["error",4]]]],[11,"get_utxo","","",18,[[["outpoint",3]],[["error",4],["result",4],["option",4]]]],[11,"get_raw_tx","","",18,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"get_tx","","",18,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"get_last_index","","",18,[[["keychainkind",4]],[["result",4],["option",4],["error",4]]]],[11,"increment_last_index","","",18,[[["keychainkind",4]],[["result",4],["error",4]]]],[11,"begin_batch","bdk::database::any","",14,[[]]],[11,"commit_batch","","",14,[[],[["error",4],["result",4]]]],[11,"begin_batch","bdk::database::memory","",18,[[]]],[11,"commit_batch","","",18,[[],[["error",4],["result",4]]]],[11,"from_config","bdk::database::any","",14,[[],[["result",4],["error",4]]]],[11,"from_config","bdk::database::memory","",18,[[],[["result",4],["error",4]]]],[11,"build","bdk::descriptor::template","",41,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",42,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",43,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",44,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",45,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",46,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",47,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",48,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"build","","",49,[[],[["descriptortemplateout",6],["descriptorerror",4],["result",4]]]],[11,"to_wallet_descriptor","bdk","",108,[[["network",4]],[["result",4],["descriptorerror",4]]]],[11,"to_wallet_descriptor","","",109,[[["network",4]],[["result",4],["descriptorerror",4]]]],[11,"extract_policy","bdk::descriptor","",51,[[["secp256k1",3],["signerscontainer",3]],[["option",4],["error",4],["result",4]]]],[11,"extract_policy","","",50,[[["secp256k1",3],["signerscontainer",3]],[["option",4],["error",4],["result",4]]]],[11,"to_descriptor_key","bdk::keys","",68,[[],[["keyerror",4],["descriptorkey",4],["result",4]]]],[11,"to_descriptor_key","","",63,[[],[["keyerror",4],["descriptorkey",4],["result",4]]]],[11,"to_descriptor_key","","",58,[[],[["keyerror",4],["descriptorkey",4],["result",4]]]],[11,"to_descriptor_key","","",59,[[],[["keyerror",4],["descriptorkey",4],["result",4]]]],[11,"add_metadata","bdk","",110,[[["derivationpath",3],["option",4],["keysource",6]],[["keyerror",4],["descriptorkey",4],["result",4]]]],[11,"add_metadata","bdk::keys","",68,[[["derivationpath",3],["option",4],["keysource",6]],[["keyerror",4],["descriptorkey",4],["result",4]]]],[11,"coin_select","bdk::wallet::coin_selection","",105,[[["vec",3],["feerate",3]],[["coinselectionresult",3],["error",4],["result",4]]]],[11,"coin_select","","",77,[[["vec",3],["feerate",3]],[["coinselectionresult",3],["error",4],["result",4]]]],[11,"get_capabilities","bdk::blockchain::any","",0,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",0,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"sync","","",0,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",0,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"broadcast","","",0,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",0,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",0,[[],[["error",4],["feerate",3],["result",4]]]],[11,"get_capabilities","bdk::blockchain::electrum","",96,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",96,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",96,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"broadcast","","",96,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",96,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",96,[[],[["error",4],["feerate",3],["result",4]]]],[11,"get_capabilities","bdk::blockchain::esplora","",3,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",3,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",3,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"broadcast","","",3,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",3,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",3,[[],[["error",4],["feerate",3],["result",4]]]],[11,"get_capabilities","bdk::blockchain::compact_filters","",6,[[],[["capability",4],["hashset",3]]]],[11,"setup","","",6,[[["option",4],["progress",8]],[["error",4],["result",4]]]],[11,"get_tx","","",6,[[["txid",3]],[["result",4],["error",4],["option",4]]]],[11,"broadcast","","",6,[[["transaction",3]],[["error",4],["result",4]]]],[11,"get_height","","",6,[[],[["result",4],["error",4]]]],[11,"estimate_fee","","",6,[[],[["error",4],["feerate",3],["result",4]]]],[11,"as_ref","bdk","",93,[[]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["addressvalidatorerror",4]]]],[11,"from","","",89,[[["policyerror",4]]]],[11,"from","","",89,[[["signererror",4]]]],[11,"from","","",89,[[["keyerror",4]],["error",4]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",3]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["esploraerror",4]]]],[11,"from","","",89,[[["error",4]]]],[11,"from","","",89,[[["compactfilterserror",4]]]],[11,"from","bdk::blockchain::any","",0,[[["electrumblockchain",3]]]],[11,"from","","",0,[[["esplorablockchain",3]]]],[11,"from","","",0,[[["compactfiltersblockchain",3]]]],[11,"from","","",1,[[["electrumblockchainconfig",3]]]],[11,"from","","",1,[[["esplorablockchainconfig",3]]]],[11,"from","","",1,[[["compactfiltersblockchainconfig",3]]]],[11,"from","bdk::blockchain::electrum","",96,[[["client",3]]]],[11,"from","bdk::blockchain::esplora","",5,[[["error",3]]]],[11,"from","","",5,[[["parseinterror",3]]]],[11,"from","","",5,[[["error",4]]]],[11,"from","","",5,[[["error",4]]]],[11,"from","bdk::blockchain::compact_filters","",9,[[["error",3]]]],[11,"from","","",9,[[["error",3]]]],[11,"from","","",9,[[["error",4]]]],[11,"from","","",9,[[["systemtimeerror",3]]]],[11,"from","","",9,[[["error",4]]]],[11,"from","bdk::database::any","",14,[[["memorydatabase",3]]]],[11,"from","","",14,[[["tree",3]]]],[11,"from","","",15,[[]]],[11,"from","","",15,[[]]],[11,"from","","",17,[[]]],[11,"from","","",17,[[["sleddbconfiguration",3]]]],[11,"from","bdk::descriptor::error","",23,[[["keyerror",4]],["error",4]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["error",4]]]],[11,"from","","",23,[[["policyerror",4]]]],[11,"from","bdk::descriptor::policy","",33,[[]]],[11,"from","","",37,[[["satisfiableitem",4]]]],[11,"from","bdk::keys","",72,[[["error",4]]]],[11,"from","","",72,[[["error",4]]]],[11,"from","bdk::wallet::signer","",79,[[["hash",3]],["signerid",4]]],[11,"from","","",79,[[["fingerprint",3]],["signerid",4]]],[11,"from","","",83,[[["keymap",6]],["signerscontainer",3]]],[11,"clone","bdk::blockchain","",10,[[],["capability",4]]],[11,"clone","","",99,[[],["noopprogress",3]]],[11,"clone","","",100,[[],["logprogress",3]]],[11,"clone","bdk::descriptor::policy","",101,[[],["pkorf",3]]],[11,"clone","","",24,[[],["satisfiableitem",4]]],[11,"clone","","",33,[[],["satisfaction",4]]],[11,"clone","","",37,[[],["policy",3]]],[11,"clone","","",38,[[],["condition",3]]],[11,"clone","bdk::keys","",64,[[],["scriptcontextenum",4]]],[11,"clone","","",71,[[],["privatekeygenerateoptions",3]]],[11,"clone","bdk","",93,[[],["keychainkind",4]]],[11,"clone","","",104,[[],["feerate",3]]],[11,"clone","","",94,[[],["utxo",3]]],[11,"clone","","",95,[[],["transactiondetails",3]]],[11,"clone","bdk::wallet::address_validator","",73,[[],["addressvalidatorerror",4]]],[11,"clone","bdk::wallet::signer","",79,[[],["signerid",4]]],[11,"clone","","",80,[[],["signererror",4]]],[11,"clone","","",82,[[],["signerordering",3]]],[11,"clone","","",83,[[],["signerscontainer",3]]],[11,"clone","bdk::wallet::tx_builder","",106,[[],["createtx",3]]],[11,"clone","","",107,[[],["bumpfee",3]]],[11,"clone","","",84,[[],["txbuilder",3]]],[11,"clone","","",85,[[],["txordering",4]]],[11,"clone","","",86,[[],["changespendpolicy",4]]],[11,"default","bdk::blockchain::compact_filters","",97,[[],["mempool",3]]],[11,"default","bdk::database::memory","",18,[[],["memorydatabase",3]]],[11,"default","bdk::descriptor::policy","",101,[[],["pkorf",3]]],[11,"default","","",38,[[],["condition",3]]],[11,"default","bdk::keys","",71,[[]]],[11,"default","bdk","",104,[[]]],[11,"default","","",95,[[],["transactiondetails",3]]],[11,"default","bdk::wallet::coin_selection","",105,[[],["largestfirstcoinselection",3]]],[11,"default","","",77,[[]]],[11,"default","bdk::wallet::signer","",82,[[]]],[11,"default","","",83,[[],["signerscontainer",3]]],[11,"default","bdk::wallet::tx_builder","",106,[[],["createtx",3]]],[11,"default","","",107,[[],["bumpfee",3]]],[11,"default","","",85,[[]]],[11,"default","","",86,[[]]],[11,"cmp","bdk::descriptor::policy","",38,[[["condition",3]],["ordering",4]]],[11,"cmp","bdk::wallet::signer","",79,[[["signerid",4]],["ordering",4]]],[11,"cmp","","",82,[[["signerordering",3]],["ordering",4]]],[11,"cmp","bdk::wallet::tx_builder","",85,[[["txordering",4]],["ordering",4]]],[11,"cmp","","",86,[[["changespendpolicy",4]],["ordering",4]]],[11,"eq","bdk::blockchain","",10,[[["capability",4]]]],[11,"eq","bdk::descriptor::policy","",38,[[["condition",3]]]],[11,"ne","","",38,[[["condition",3]]]],[11,"eq","bdk::keys","",64,[[["scriptcontextenum",4]]]],[11,"eq","bdk","",93,[[["keychainkind",4]]]],[11,"eq","","",104,[[["feerate",3]]]],[11,"ne","","",104,[[["feerate",3]]]],[11,"eq","","",94,[[["utxo",3]]]],[11,"ne","","",94,[[["utxo",3]]]],[11,"eq","","",95,[[["transactiondetails",3]]]],[11,"ne","","",95,[[["transactiondetails",3]]]],[11,"eq","bdk::wallet::address_validator","",73,[[["addressvalidatorerror",4]]]],[11,"ne","","",73,[[["addressvalidatorerror",4]]]],[11,"eq","bdk::wallet::signer","",79,[[["signerid",4]]]],[11,"ne","","",79,[[["signerid",4]]]],[11,"eq","","",80,[[["signererror",4]]]],[11,"eq","","",82,[[["signerordering",3]]]],[11,"ne","","",82,[[["signerordering",3]]]],[11,"eq","bdk::wallet::tx_builder","",85,[[["txordering",4]]]],[11,"eq","","",86,[[["changespendpolicy",4]]]],[11,"partial_cmp","bdk::descriptor::policy","",38,[[["condition",3]],[["option",4],["ordering",4]]]],[11,"lt","","",38,[[["condition",3]]]],[11,"le","","",38,[[["condition",3]]]],[11,"gt","","",38,[[["condition",3]]]],[11,"ge","","",38,[[["condition",3]]]],[11,"partial_cmp","bdk","",104,[[["feerate",3]],[["option",4],["ordering",4]]]],[11,"lt","","",104,[[["feerate",3]]]],[11,"le","","",104,[[["feerate",3]]]],[11,"gt","","",104,[[["feerate",3]]]],[11,"ge","","",104,[[["feerate",3]]]],[11,"partial_cmp","bdk::wallet::signer","",79,[[["signerid",4]],[["option",4],["ordering",4]]]],[11,"lt","","",79,[[["signerid",4]]]],[11,"le","","",79,[[["signerid",4]]]],[11,"gt","","",79,[[["signerid",4]]]],[11,"ge","","",79,[[["signerid",4]]]],[11,"partial_cmp","","",82,[[["signerordering",3]],[["option",4],["ordering",4]]]],[11,"lt","","",82,[[["signerordering",3]]]],[11,"le","","",82,[[["signerordering",3]]]],[11,"gt","","",82,[[["signerordering",3]]]],[11,"ge","","",82,[[["signerordering",3]]]],[11,"partial_cmp","bdk::wallet::tx_builder","",85,[[["txordering",4]],[["option",4],["ordering",4]]]],[11,"partial_cmp","","",86,[[["changespendpolicy",4]],[["option",4],["ordering",4]]]],[11,"to_string","bdk::wallet::export","",78,[[],["string",3]]],[11,"deref","bdk::keys","",68,[[]]],[11,"fmt","bdk","",89,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::any","",1,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::electrum","",2,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::esplora","",3,[[["formatter",3]],["result",6]]],[11,"fmt","","",4,[[["formatter",3]],["result",6]]],[11,"fmt","","",5,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::compact_filters","",97,[[["formatter",3]],["result",6]]],[11,"fmt","","",98,[[["formatter",3]],["result",6]]],[11,"fmt","","",6,[[["formatter",3]],["result",6]]],[11,"fmt","","",7,[[["formatter",3]],["result",6]]],[11,"fmt","","",8,[[["formatter",3]],["result",6]]],[11,"fmt","","",9,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain","",10,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::database::any","",14,[[["formatter",3]],["result",6]]],[11,"fmt","","",16,[[["formatter",3]],["result",6]]],[11,"fmt","","",17,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::database::memory","",18,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::error","",23,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::policy","",101,[[["formatter",3]],["result",6]]],[11,"fmt","","",24,[[["formatter",3]],["result",6]]],[11,"fmt","","",33,[[["formatter",3]],["result",6]]],[11,"fmt","","",37,[[["formatter",3]],["result",6]]],[11,"fmt","","",38,[[["formatter",3]],["result",6]]],[11,"fmt","","",39,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::keys","",63,[[["formatter",3]],["result",6]]],[11,"fmt","","",64,[[["formatter",3]],["result",6]]],[11,"fmt","","",71,[[["formatter",3]],["result",6]]],[11,"fmt","","",72,[[["formatter",3]],["result",6]]],[11,"fmt","bdk","",93,[[["formatter",3]],["result",6]]],[11,"fmt","","",104,[[["formatter",3]],["result",6]]],[11,"fmt","","",94,[[["formatter",3]],["result",6]]],[11,"fmt","","",95,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::address_validator","",73,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::coin_selection","",75,[[["formatter",3]],["result",6]]],[11,"fmt","","",105,[[["formatter",3]],["result",6]]],[11,"fmt","","",77,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::export","",78,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::signer","",79,[[["formatter",3]],["result",6]]],[11,"fmt","","",80,[[["formatter",3]],["result",6]]],[11,"fmt","","",82,[[["formatter",3]],["result",6]]],[11,"fmt","","",83,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::tx_builder","",106,[[["formatter",3]],["result",6]]],[11,"fmt","","",107,[[["formatter",3]],["result",6]]],[11,"fmt","","",84,[[["formatter",3]],["result",6]]],[11,"fmt","","",85,[[["formatter",3]],["result",6]]],[11,"fmt","","",86,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet","",88,[[["formatter",3]],["result",6]]],[11,"fmt","bdk","",89,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::esplora","",5,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::blockchain::compact_filters","",9,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::error","",23,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::descriptor::policy","",39,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::keys","",72,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::address_validator","",73,[[["formatter",3]],["result",6]]],[11,"fmt","bdk::wallet::signer","",80,[[["formatter",3]],["result",6]]],[11,"hash","bdk::blockchain","",10,[[]]],[11,"hash","bdk::descriptor::policy","",38,[[]]],[11,"hash","bdk","",93,[[]]],[11,"hash","bdk::wallet::signer","",79,[[]]],[11,"hash","bdk::wallet::tx_builder","",85,[[]]],[11,"hash","","",86,[[]]],[11,"from_str","bdk::wallet::export","",78,[[],["result",4]]],[11,"serialize","bdk::blockchain::any","",1,[[],["result",4]]],[11,"serialize","bdk::blockchain::electrum","",2,[[],["result",4]]],[11,"serialize","bdk::blockchain::esplora","",4,[[],["result",4]]],[11,"serialize","bdk::blockchain::compact_filters","",7,[[],["result",4]]],[11,"serialize","","",8,[[],["result",4]]],[11,"serialize","bdk::database::any","",16,[[],["result",4]]],[11,"serialize","","",17,[[],["result",4]]],[11,"serialize","bdk::descriptor::policy","",101,[[],["result",4]]],[11,"serialize","","",24,[[],["result",4]]],[11,"serialize","","",33,[[],["result",4]]],[11,"serialize","","",37,[[],["result",4]]],[11,"serialize","","",38,[[],["result",4]]],[11,"serialize","bdk","",93,[[],["result",4]]],[11,"serialize","","",94,[[],["result",4]]],[11,"serialize","","",95,[[],["result",4]]],[11,"serialize","bdk::wallet::export","",78,[[],["result",4]]],[11,"deserialize","bdk::blockchain::any","",1,[[],["result",4]]],[11,"deserialize","bdk::blockchain::electrum","",2,[[],["result",4]]],[11,"deserialize","bdk::blockchain::esplora","",4,[[],["result",4]]],[11,"deserialize","bdk::blockchain::compact_filters","",7,[[],["result",4]]],[11,"deserialize","","",8,[[],["result",4]]],[11,"deserialize","bdk::database::any","",16,[[],["result",4]]],[11,"deserialize","","",17,[[],["result",4]]],[11,"deserialize","bdk","",93,[[],["result",4]]],[11,"deserialize","","",94,[[],["result",4]]],[11,"deserialize","","",95,[[],["result",4]]],[11,"deserialize","bdk::wallet::export","",78,[[],["result",4]]],[11,"add_tx","bdk::blockchain::compact_filters","Add a transaction to the mempool",97,[[["transaction",3]]]],[11,"get_tx","","Look-up a transaction in the mempool given an [<code>Inventory</code>] …",97,[[["inventory",4]],[["transaction",3],["option",4]]]],[11,"has_tx","","Return whether or not the mempool contains a transaction …",97,[[["txid",3]]]],[11,"iter_txs","","Return the list of transactions contained in the mempool",97,[[],[["vec",3],["transaction",3]]]],[11,"connect","","Connect to a peer over a plaintext TCP connection",98,[[["arc",3],["mempool",3],["network",4],["tosocketaddrs",8]],[["compactfilterserror",4],["result",4]]]],[11,"connect_proxy","","Connect to a peer through a SOCKS5 proxy, optionally by …",98,[[["arc",3],["option",4],["mempool",3],["network",4],["tosocketaddrs",8],["totargetaddr",8]],[["compactfilterserror",4],["result",4]]]],[11,"get_version","","Return the [<code>VersionMessage</code>] sent by the peer",98,[[],["versionmessage",3]]],[11,"get_network","","Return the Bitcoin [<code>Network</code>] in use",98,[[],["network",4]]],[11,"get_mempool","","Return the mempool used by this peer",98,[[],[["arc",3],["mempool",3]]]],[11,"is_connected","","Return whether or not the peer is still connected",98,[[]]],[11,"send","","Send a raw Bitcoin message to the peer",98,[[["networkmessage",4]],[["result",4],["compactfilterserror",4]]]],[11,"recv","","Waits for a specific incoming Bitcoin message, optionally …",98,[[["option",4],["duration",3]],[["option",4],["result",4],["compactfilterserror",4]]]],[11,"translate_pk","bdk::descriptor","Convert a descriptor using abstract keys to one using …",50,[[],[["result",4],["descriptor",4]]]],[11,"sanity_check","","Whether the descriptor is safe Checks whether all the …",50,[[],[["result",4],["error",4]]]],[11,"address","","Computes the Bitcoin address of the descriptor, if one …",50,[[["network",4]],[["address",3],["option",4]]]],[11,"script_pubkey","","Computes the scriptpubkey of the descriptor <code>to_pk_ctx</code> …",50,[[],["script",3]]],[11,"unsigned_script_sig","","Computes the scriptSig that will be in place for an …",50,[[],["script",3]]],[11,"witness_script","","Computes the \\\"witness script\\\" of the descriptor, i.e. the …",50,[[],["script",3]]],[11,"get_satisfication","","Returns satisfying witness and scriptSig to spend an …",50,[[],[["result",4],["error",4]]]],[11,"satisfy","","Attempts to produce a satisfying witness and scriptSig to …",50,[[["txin",3]],[["result",4],["error",4]]]],[11,"max_satisfaction_weight","","Computes an upper bound on the weight of a satisfying …",50,[[],["option",4]]],[11,"script_code","","Get the <code>scriptCode</code> of a transaction output.",50,[[],["script",3]]],[11,"derive","","Derives all wildcard keys in the descriptor using the …",50,[[["childnumber",4]],[["descriptor",4],["descriptorpublickey",4]]]],[11,"parse_descriptor","","Parse a descriptor that may contain secret keys",50,[[],[["error",4],["result",4]]]],[11,"to_string_with_secret","","Serialize a descriptor to string with its secret keys",50,[[["hashmap",3]],["string",3]]],[11,"requires_sig","","Whether all spend paths of miniscript require a signature",51,[[]]],[11,"is_non_malleable","","Whether the miniscript is malleable",51,[[]]],[11,"within_resource_limits","","Whether the miniscript can exceed the resource …",51,[[]]],[11,"has_mixed_timelocks","","Whether the miniscript contains a combination of timelocks",51,[[]]],[11,"has_repeated_keys","","Whether the miniscript has repeated Pk or Pkh",51,[[]]],[11,"sanity_check","","Check whether the underlying Miniscript is safe under the …",51,[[],[["result",4],["analysiserror",4]]]],[11,"iter","","Creates a new [Iter] iterator that will iterate over all […",51,[[],["iter",3]]],[11,"iter_pk","","Creates a new [PkIter] iterator that will iterate over …",51,[[],["pkiter",3]]],[11,"iter_pkh","","Creates a new [PkhIter] iterator that will iterate over …",51,[[],["pkhiter",3]]],[11,"iter_pk_pkh","","Creates a new [PkPkhIter] iterator that will iterate over …",51,[[],["pkpkhiter",3]]],[11,"branches","","Enumerates all child nodes of the current AST node (<code>self</code>) …",51,[[],[["vec",3],["miniscript",3],["global",3]]]],[11,"get_nth_child","","Returns child node with given index, if any",51,[[],[["option",4],["miniscript",3]]]],[11,"get_leaf_pk","","Returns <code>Vec</code> with cloned version of all public keys from …",51,[[],[["vec",3],["global",3]]]],[11,"get_leaf_pkh","","Returns <code>Vec</code> with hashes of all public keys from the …",51,[[],[["global",3],["vec",3]]]],[11,"get_leaf_pk_pkh","","Returns <code>Vec</code> of [PkPkh] entries, representing either …",51,[[],[["pkpkh",4],["vec",3],["global",3]]]],[11,"get_nth_pk","","Returns <code>Option::Some</code> with cloned n\'th public key from the …",51,[[],["option",4]]],[11,"get_nth_pkh","","Returns <code>Option::Some</code> with hash of n\'th public key from …",51,[[],["option",4]]],[11,"get_nth_pk_pkh","","Returns <code>Option::Some</code> with hash of n\'th public key or hash …",51,[[],[["pkpkh",4],["option",4]]]],[11,"from_ast","","Add type information(Type and Extdata) to Miniscript …",51,[[["terminal",4]],[["miniscript",3],["error",4],["result",4]]]],[11,"into_inner","","Extracts the <code>AstElem</code> representing the root of the …",51,[[],["terminal",4]]],[11,"as_inner","","Get a reference to the inner <code>AstElem</code> representing the …",51,[[],["terminal",4]]],[11,"parse_insane","","Attempt to parse an insane(scripts don\'t clear sanity …",51,[[["script",3]],[["result",4],["miniscript",3],["error",4]]]],[11,"parse","","Attempt to parse a Script into Miniscript representation. …",51,[[["script",3]],[["result",4],["miniscript",3],["error",4]]]],[11,"encode","","Encode as a Bitcoin script",51,[[],["script",3]]],[11,"script_size","","Size, in bytes of the script-pubkey. If this Miniscript …",51,[[]]],[11,"max_satisfaction_witness_elements","","Maximum number of witness elements used to satisfy the …",51,[[],["option",4]]],[11,"max_satisfaction_size","","Maximum size, in bytes, of a satisfying witness. For …",51,[[],["option",4]]],[11,"translate_pk","","This will panic if translatefpk returns an uncompressed …",51,[[],[["result",4],["miniscript",3]]]],[11,"from_str_insane","","Attempt to parse an insane(scripts don\'t clear sanity …",51,[[],[["miniscript",3],["error",4],["result",4]]]],[11,"satisfy","","Attempt to produce non-malleable satisfying witness for …",51,[[],[["result",4],["error",4],["vec",3]]]],[11,"satisfy_malleable","","Attempt to produce a malleable satisfying witness for the …",51,[[],[["result",4],["error",4],["vec",3]]]],[11,"lift_check","","Lifting corresponds conversion of miniscript into Policy […",51,[[],[["result",4],["lifterror",4]]]],[11,"translate_pk","","Convert an AST element with one public key type to one of …",54,[[],[["result",4],["terminal",4]]]],[11,"encode","","Encode the element as a fragment of Bitcoin Script. The …",54,[[["builder",3]],["builder",3]]],[11,"script_size","","Size, in bytes of the script-pubkey. If this Miniscript …",54,[[]]],[11,"derive","bdk::keys","Derives the specified child key if self is a wildcard …",58,[[["childnumber",4]],["descriptorpublickey",4]]],[11,"as_public","","Return the public version of this key, by applying either …",59,[[["secp256k1",3]],[["descriptorkeyparseerror",3],["descriptorpublickey",4],["result",4]]]],[11,"new","","Create a new instance of <code>SortedMultiVec</code> given a list of …",62,[[["vec",3],["global",3]],[["error",4],["sortedmultivec",3],["result",4]]]],[11,"translate_pk","","This will panic if translatefpk returns an uncompressed …",62,[[],[["result",4],["sortedmultivec",3]]]],[11,"sorted_node","","Create Terminal::Multi containing sorted pubkeys",62,[[],["terminal",4]]],[11,"encode","","Encode as a Bitcoin script",62,[[],["script",3]]],[11,"satisfy","","Attempt to produce a satisfying witness for the witness …",62,[[],[["result",4],["error",4],["vec",3]]]],[11,"script_size","","Size, in bytes of the script-pubkey. If this Miniscript …",62,[[]]],[11,"max_satisfaction_witness_elements","","Maximum number of witness elements used to satisfy the …",62,[[]]],[11,"max_satisfaction_size","","Maximum size, in bytes, of a satisfying witness. For …",62,[[]]],[11,"as_byte","bdk","Return [<code>KeychainKind</code>] as a byte",93,[[]]],[11,"from_btc_per_kvb","","Create a new instance of [<code>FeeRate</code>] given a float fee rate …",104,[[]]],[11,"from_sat_per_vb","","Create a new instance of [<code>FeeRate</code>] given a float fee rate …",104,[[]]],[11,"default_min_relay_fee","","Create a new [<code>FeeRate</code>] with the default min relay fee …",104,[[]]],[11,"as_sat_vb","","Return the value as satoshi/vbyte",104,[[]]]],"p":[[4,"AnyBlockchain"],[4,"AnyBlockchainConfig"],[3,"ElectrumBlockchainConfig"],[3,"EsploraBlockchain"],[3,"EsploraBlockchainConfig"],[4,"EsploraError"],[3,"CompactFiltersBlockchain"],[3,"BitcoinPeerConfig"],[3,"CompactFiltersBlockchainConfig"],[4,"CompactFiltersError"],[4,"Capability"],[8,"Blockchain"],[8,"ConfigurableBlockchain"],[8,"Progress"],[4,"AnyDatabase"],[4,"AnyBatch"],[3,"SledDbConfiguration"],[4,"AnyDatabaseConfig"],[3,"MemoryDatabase"],[8,"BatchOperations"],[8,"Database"],[8,"BatchDatabase"],[8,"ConfigurableDatabase"],[4,"Error"],[4,"SatisfiableItem"],[13,"SHA256Preimage"],[13,"HASH256Preimage"],[13,"RIPEMD160Preimage"],[13,"HASH160Preimage"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[13,"Multisig"],[13,"Thresh"],[4,"Satisfaction"],[13,"Partial"],[13,"PartialComplete"],[13,"Complete"],[3,"Policy"],[3,"Condition"],[4,"PolicyError"],[8,"DescriptorTemplate"],[3,"P2PKH"],[3,"P2WPKH_P2SH"],[3,"P2WPKH"],[3,"BIP44"],[3,"BIP44Public"],[3,"BIP49"],[3,"BIP49Public"],[3,"BIP84"],[3,"BIP84Public"],[4,"Descriptor"],[3,"Miniscript"],[8,"MiniscriptKey"],[8,"ScriptContext"],[4,"Terminal"],[8,"ToPublicKey"],[8,"ToWalletDescriptor"],[8,"ExtractPolicy"],[4,"DescriptorPublicKey"],[4,"DescriptorSecretKey"],[3,"DescriptorSinglePriv"],[3,"DescriptorSinglePub"],[3,"SortedMultiVec"],[4,"DescriptorKey"],[4,"ScriptContextEnum"],[8,"ExtScriptContext"],[8,"ToDescriptorKey"],[8,"DerivableKey"],[3,"GeneratedKey"],[8,"GeneratableKey"],[8,"GeneratableDefaultOptions"],[3,"PrivateKeyGenerateOptions"],[4,"KeyError"],[4,"AddressValidatorError"],[8,"AddressValidator"],[3,"CoinSelectionResult"],[8,"CoinSelectionAlgorithm"],[3,"BranchAndBoundCoinSelection"],[3,"WalletExport"],[4,"SignerId"],[4,"SignerError"],[8,"Signer"],[3,"SignerOrdering"],[3,"SignersContainer"],[3,"TxBuilder"],[4,"TxOrdering"],[4,"ChangeSpendPolicy"],[8,"IsDust"],[3,"Wallet"],[4,"Error"],[13,"InsufficientFunds"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[4,"KeychainKind"],[3,"UTXO"],[3,"TransactionDetails"],[3,"ElectrumBlockchain"],[3,"Mempool"],[3,"Peer"],[3,"NoopProgress"],[3,"LogProgress"],[3,"PKOrF"],[4,"Legacy"],[4,"Segwitv0"],[3,"FeeRate"],[3,"LargestFirstCoinSelection"],[3,"CreateTx"],[3,"BumpFee"],[6,"ExtendedDescriptor"],[6,"DescriptorTemplateOut"],[6,"MnemonicWithPassphrase"]]}\
}');
addSearchOptions(searchIndex);initSearch(searchIndex);
\ No newline at end of file
<span id="3248">3248</span>
<span id="3249">3249</span>
<span id="3250">3250</span>
-<span id="3251">3251</span>
-<span id="3252">3252</span>
-<span id="3253">3253</span>
-<span id="3254">3254</span>
-<span id="3255">3255</span>
-<span id="3256">3256</span>
-<span id="3257">3257</span>
-<span id="3258">3258</span>
-<span id="3259">3259</span>
-<span id="3260">3260</span>
-<span id="3261">3261</span>
-<span id="3262">3262</span>
-<span id="3263">3263</span>
-<span id="3264">3264</span>
-<span id="3265">3265</span>
-<span id="3266">3266</span>
-<span id="3267">3267</span>
-<span id="3268">3268</span>
-<span id="3269">3269</span>
-<span id="3270">3270</span>
-<span id="3271">3271</span>
-<span id="3272">3272</span>
-<span id="3273">3273</span>
-<span id="3274">3274</span>
-<span id="3275">3275</span>
-<span id="3276">3276</span>
-<span id="3277">3277</span>
-<span id="3278">3278</span>
-<span id="3279">3279</span>
-<span id="3280">3280</span>
-<span id="3281">3281</span>
-<span id="3282">3282</span>
-<span id="3283">3283</span>
-<span id="3284">3284</span>
-<span id="3285">3285</span>
-<span id="3286">3286</span>
-<span id="3287">3287</span>
-<span id="3288">3288</span>
-<span id="3289">3289</span>
-<span id="3290">3290</span>
-<span id="3291">3291</span>
-<span id="3292">3292</span>
-<span id="3293">3293</span>
-<span id="3294">3294</span>
-<span id="3295">3295</span>
-<span id="3296">3296</span>
-<span id="3297">3297</span>
-<span id="3298">3298</span>
-<span id="3299">3299</span>
-<span id="3300">3300</span>
-<span id="3301">3301</span>
-<span id="3302">3302</span>
-<span id="3303">3303</span>
-<span id="3304">3304</span>
-<span id="3305">3305</span>
-<span id="3306">3306</span>
-<span id="3307">3307</span>
-<span id="3308">3308</span>
-<span id="3309">3309</span>
-<span id="3310">3310</span>
-<span id="3311">3311</span>
-<span id="3312">3312</span>
-<span id="3313">3313</span>
-<span id="3314">3314</span>
-<span id="3315">3315</span>
-<span id="3316">3316</span>
-<span id="3317">3317</span>
-<span id="3318">3318</span>
-<span id="3319">3319</span>
-<span id="3320">3320</span>
-<span id="3321">3321</span>
-<span id="3322">3322</span>
-<span id="3323">3323</span>
-<span id="3324">3324</span>
-<span id="3325">3325</span>
-<span id="3326">3326</span>
-<span id="3327">3327</span>
-<span id="3328">3328</span>
-<span id="3329">3329</span>
-<span id="3330">3330</span>
-<span id="3331">3331</span>
-<span id="3332">3332</span>
-<span id="3333">3333</span>
-<span id="3334">3334</span>
-<span id="3335">3335</span>
-<span id="3336">3336</span>
-<span id="3337">3337</span>
-<span id="3338">3338</span>
-<span id="3339">3339</span>
-<span id="3340">3340</span>
-<span id="3341">3341</span>
-<span id="3342">3342</span>
-<span id="3343">3343</span>
-<span id="3344">3344</span>
-<span id="3345">3345</span>
-<span id="3346">3346</span>
-<span id="3347">3347</span>
-<span id="3348">3348</span>
-<span id="3349">3349</span>
-<span id="3350">3350</span>
-<span id="3351">3351</span>
-<span id="3352">3352</span>
-<span id="3353">3353</span>
-<span id="3354">3354</span>
-<span id="3355">3355</span>
-<span id="3356">3356</span>
-<span id="3357">3357</span>
-<span id="3358">3358</span>
-<span id="3359">3359</span>
-<span id="3360">3360</span>
-<span id="3361">3361</span>
-<span id="3362">3362</span>
-<span id="3363">3363</span>
-<span id="3364">3364</span>
-<span id="3365">3365</span>
-<span id="3366">3366</span>
-<span id="3367">3367</span>
-<span id="3368">3368</span>
-<span id="3369">3369</span>
-<span id="3370">3370</span>
-<span id="3371">3371</span>
-<span id="3372">3372</span>
-<span id="3373">3373</span>
-<span id="3374">3374</span>
-<span id="3375">3375</span>
-<span id="3376">3376</span>
-<span id="3377">3377</span>
-<span id="3378">3378</span>
-<span id="3379">3379</span>
-<span id="3380">3380</span>
-<span id="3381">3381</span>
-<span id="3382">3382</span>
-<span id="3383">3383</span>
-<span id="3384">3384</span>
-<span id="3385">3385</span>
-<span id="3386">3386</span>
-<span id="3387">3387</span>
-<span id="3388">3388</span>
-<span id="3389">3389</span>
-<span id="3390">3390</span>
-<span id="3391">3391</span>
-<span id="3392">3392</span>
-<span id="3393">3393</span>
-<span id="3394">3394</span>
-<span id="3395">3395</span>
-<span id="3396">3396</span>
-<span id="3397">3397</span>
-<span id="3398">3398</span>
-<span id="3399">3399</span>
-<span id="3400">3400</span>
-<span id="3401">3401</span>
-<span id="3402">3402</span>
-<span id="3403">3403</span>
-<span id="3404">3404</span>
-<span id="3405">3405</span>
-<span id="3406">3406</span>
-<span id="3407">3407</span>
-<span id="3408">3408</span>
-<span id="3409">3409</span>
-<span id="3410">3410</span>
-<span id="3411">3411</span>
-<span id="3412">3412</span>
-<span id="3413">3413</span>
-<span id="3414">3414</span>
-<span id="3415">3415</span>
-<span id="3416">3416</span>
-<span id="3417">3417</span>
-<span id="3418">3418</span>
-<span id="3419">3419</span>
-<span id="3420">3420</span>
-<span id="3421">3421</span>
-<span id="3422">3422</span>
-<span id="3423">3423</span>
-<span id="3424">3424</span>
-<span id="3425">3425</span>
-<span id="3426">3426</span>
-<span id="3427">3427</span>
-<span id="3428">3428</span>
-<span id="3429">3429</span>
-<span id="3430">3430</span>
-<span id="3431">3431</span>
-<span id="3432">3432</span>
-<span id="3433">3433</span>
-<span id="3434">3434</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">// Magical Bitcoin Library</span>
<span class="comment">// Written in 2020 by</span>
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">utils</span>::<span class="ident">IsDust</span>;
<span class="kw">use</span> <span class="ident">address_validator</span>::<span class="ident">AddressValidator</span>;
+<span class="kw">use</span> <span class="ident">coin_selection</span>::<span class="ident">DefaultCoinSelectionAlgorithm</span>;
<span class="kw">use</span> <span class="ident">signer</span>::{<span class="ident">Signer</span>, <span class="ident">SignerOrdering</span>, <span class="ident">SignersContainer</span>};
-<span class="kw">use</span> <span class="ident">tx_builder</span>::{<span class="ident">BumpFee</span>, <span class="ident">CreateTx</span>, <span class="ident">FeePolicy</span>, <span class="ident">TxBuilder</span>, <span class="ident">TxBuilderContext</span>};
+<span class="kw">use</span> <span class="ident">tx_builder</span>::{<span class="ident">BumpFee</span>, <span class="ident">CreateTx</span>, <span class="ident">FeePolicy</span>, <span class="ident">TxBuilder</span>, <span class="ident">TxParams</span>};
<span class="kw">use</span> <span class="ident">utils</span>::{
<span class="ident">check_nlocktime</span>, <span class="ident">check_nsequence_rbf</span>, <span class="ident">descriptor_to_pk_ctx</span>, <span class="ident">After</span>, <span class="ident">Older</span>, <span class="ident">SecpCtx</span>,
<span class="ident">DUST_LIMIT_SATOSHI</span>,
<span class="doccomment">/// A wallet takes descriptors, a [`database`](trait@crate::database::Database) and a</span>
<span class="doccomment">/// [`blockchain`](trait@crate::blockchain::Blockchain) and implements the basic functions that a Bitcoin wallets</span>
<span class="doccomment">/// needs to operate, like [generating addresses](Wallet::get_new_address), [returning the balance](Wallet::get_balance),</span>
-<span class="doccomment">/// [creating transactions](Wallet::create_tx), etc.</span>
+<span class="doccomment">/// [creating transactions](Wallet::build_tx), etc.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// A wallet can be either "online" if the [`blockchain`](crate::blockchain) type provided</span>
<span class="doccomment">/// implements [`Blockchain`], or "offline" if it is the unit type `()`. Offline wallets only expose</span>
<span class="doccomment">/// methods that don't need any interaction with the blockchain to work.</span>
+<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Wallet</span><span class="op"><</span><span class="ident">B</span>, <span class="ident">D</span><span class="op">></span> {
<span class="ident">descriptor</span>: <span class="ident">ExtendedDescriptor</span>,
<span class="ident">change_descriptor</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">ExtendedDescriptor</span><span class="op">></span>,
<span class="self">self</span>.<span class="ident">database</span>.<span class="ident">borrow</span>().<span class="ident">iter_utxos</span>()
}
+ <span class="doccomment">/// Returns the `UTXO` owned by this wallet corresponding to `outpoint` if it exists in the</span>
+ <span class="doccomment">/// wallet's database.</span>
+ <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_utxo</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">outpoint</span>: <span class="ident">OutPoint</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">UTXO</span><span class="op">></span>, <span class="ident">Error</span><span class="op">></span> {
+ <span class="self">self</span>.<span class="ident">database</span>.<span class="ident">borrow</span>().<span class="ident">get_utxo</span>(<span class="kw-2">&</span><span class="ident">outpoint</span>)
+ }
+
<span class="doccomment">/// Return the list of transactions made and received by the wallet</span>
<span class="doccomment">///</span>
<span class="doccomment">/// Optionally fill the [`TransactionDetails::transaction`] field with the raw transaction if</span>
<span class="self">self</span>.<span class="ident">address_validators</span>.<span class="ident">push</span>(<span class="ident">validator</span>);
}
- <span class="doccomment">/// Create a new transaction following the options specified in the `builder`</span>
+ <span class="doccomment">/// Start building a transaction.</span>
+ <span class="doccomment">///</span>
+ <span class="doccomment">/// This returns a blank [`TxBuilder`] from which you can specify the parameters for the transaction.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ## Example</span>
<span class="doccomment">///</span>
- <span class="doccomment">/// ```no_run</span>
+ <span class="doccomment">/// ```</span>
<span class="doccomment">/// # use std::str::FromStr;</span>
<span class="doccomment">/// # use bitcoin::*;</span>
<span class="doccomment">/// # use bdk::*;</span>
<span class="doccomment">/// # use bdk::database::*;</span>
<span class="doccomment">/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";</span>
- <span class="doccomment">/// # let wallet = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;</span>
+ <span class="doccomment">/// # let wallet = doctest_wallet!();</span>
<span class="doccomment">/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();</span>
- <span class="doccomment">/// let (psbt, details) = wallet.create_tx(</span>
- <span class="doccomment">/// TxBuilder::with_recipients(vec![(to_address.script_pubkey(), 50_000)])</span>
- <span class="doccomment">/// )?;</span>
+ <span class="doccomment">/// let (psbt, details) = {</span>
+ <span class="doccomment">/// let mut builder = wallet.build_tx();</span>
+ <span class="doccomment">/// builder</span>
+ <span class="doccomment">/// .add_recipient(to_address.script_pubkey(), 50_000);</span>
+ <span class="doccomment">/// builder.finish()?</span>
+ <span class="doccomment">/// };</span>
+ <span class="doccomment">///</span>
<span class="doccomment">/// // sign and broadcast ...</span>
<span class="doccomment">/// # Ok::<(), bdk::Error>(())</span>
<span class="doccomment">/// ```</span>
- <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">create_tx</span><span class="op"><</span><span class="ident">Cs</span>: <span class="ident">coin_selection</span>::<span class="ident">CoinSelectionAlgorithm</span><span class="op"><</span><span class="ident">D</span><span class="op">></span><span class="op">></span>(
+ <span class="doccomment">///</span>
+ <span class="doccomment">/// [`TxBuilder`]: crate::TxBuilder</span>
+ <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">build_tx</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">TxBuilder</span><span class="op"><</span><span class="lifetime">'_</span>, <span class="ident">B</span>, <span class="ident">D</span>, <span class="ident">DefaultCoinSelectionAlgorithm</span>, <span class="ident">CreateTx</span><span class="op">></span> {
+ <span class="ident">TxBuilder</span> {
+ <span class="ident">wallet</span>: <span class="kw-2">&</span><span class="self">self</span>,
+ <span class="ident">params</span>: <span class="ident">TxParams</span>::<span class="ident">default</span>(),
+ <span class="ident">coin_selection</span>: <span class="ident">DefaultCoinSelectionAlgorithm</span>::<span class="ident">default</span>(),
+ <span class="ident">phantom</span>: <span class="ident">core</span>::<span class="ident">marker</span>::<span class="ident">PhantomData</span>,
+ }
+ }
+
+ <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">create_tx</span><span class="op"><</span><span class="ident">Cs</span>: <span class="ident">coin_selection</span>::<span class="ident">CoinSelectionAlgorithm</span><span class="op"><</span><span class="ident">D</span><span class="op">></span><span class="op">></span>(
<span class="kw-2">&</span><span class="self">self</span>,
- <span class="ident">builder</span>: <span class="ident">TxBuilder</span><span class="op"><</span><span class="ident">D</span>, <span class="ident">Cs</span>, <span class="ident">CreateTx</span><span class="op">></span>,
+ <span class="ident">coin_selection</span>: <span class="ident">Cs</span>,
+ <span class="ident">params</span>: <span class="ident">TxParams</span>,
) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span>(<span class="ident">PSBT</span>, <span class="ident">TransactionDetails</span>), <span class="ident">Error</span><span class="op">></span> {
<span class="kw">let</span> <span class="ident">external_policy</span> <span class="op">=</span> <span class="self">self</span>
.<span class="ident">descriptor</span>
<span class="comment">// The policy allows spending external outputs, but it requires a policy path that hasn't been</span>
<span class="comment">// provided</span>
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">change_policy</span> <span class="op">!</span><span class="op">=</span> <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>::<span class="ident">OnlyChange</span>
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">change_policy</span> <span class="op">!</span><span class="op">=</span> <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>::<span class="ident">OnlyChange</span>
<span class="op">&&</span> <span class="ident">external_policy</span>.<span class="ident">requires_path</span>()
- <span class="op">&&</span> <span class="ident">builder</span>.<span class="ident">external_policy_path</span>.<span class="ident">is_none</span>()
+ <span class="op">&&</span> <span class="ident">params</span>.<span class="ident">external_policy_path</span>.<span class="ident">is_none</span>()
{
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">SpendingPolicyRequired</span>(<span class="ident">KeychainKind</span>::<span class="ident">External</span>));
};
<span class="comment">// Same for the internal_policy path, if present</span>
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">internal_policy</span>) <span class="op">=</span> <span class="kw-2">&</span><span class="ident">internal_policy</span> {
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">change_policy</span> <span class="op">!</span><span class="op">=</span> <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>::<span class="ident">ChangeForbidden</span>
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">change_policy</span> <span class="op">!</span><span class="op">=</span> <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>::<span class="ident">ChangeForbidden</span>
<span class="op">&&</span> <span class="ident">internal_policy</span>.<span class="ident">requires_path</span>()
- <span class="op">&&</span> <span class="ident">builder</span>.<span class="ident">internal_policy_path</span>.<span class="ident">is_none</span>()
+ <span class="op">&&</span> <span class="ident">params</span>.<span class="ident">internal_policy_path</span>.<span class="ident">is_none</span>()
{
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">SpendingPolicyRequired</span>(<span class="ident">KeychainKind</span>::<span class="ident">Internal</span>));
};
}
<span class="kw">let</span> <span class="ident">external_requirements</span> <span class="op">=</span> <span class="ident">external_policy</span>.<span class="ident">get_condition</span>(
- <span class="ident">builder</span>
+ <span class="ident">params</span>
.<span class="ident">external_policy_path</span>
.<span class="ident">as_ref</span>()
.<span class="ident">unwrap_or</span>(<span class="kw-2">&</span><span class="ident">BTreeMap</span>::<span class="ident">new</span>()),
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">policy</span><span class="op">|</span> {
<span class="prelude-val">Ok</span>::<span class="op"><</span><span class="kw">_</span>, <span class="ident">Error</span><span class="op">></span>(
<span class="ident">policy</span>.<span class="ident">get_condition</span>(
- <span class="ident">builder</span>
+ <span class="ident">params</span>
.<span class="ident">internal_policy_path</span>
.<span class="ident">as_ref</span>()
.<span class="ident">unwrap_or</span>(<span class="kw-2">&</span><span class="ident">BTreeMap</span>::<span class="ident">new</span>()),
.<span class="ident">merge</span>(<span class="kw-2">&</span><span class="ident">internal_requirements</span>.<span class="ident">unwrap_or_default</span>())<span class="question-mark">?</span>;
<span class="macro">debug</span><span class="macro">!</span>(<span class="string">"Policy requirements: {:?}"</span>, <span class="ident">requirements</span>);
- <span class="kw">let</span> <span class="ident">version</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>.<span class="ident">version</span> {
+ <span class="kw">let</span> <span class="ident">version</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">params</span>.<span class="ident">version</span> {
<span class="prelude-val">Some</span>(<span class="ident">tx_builder</span>::<span class="ident">Version</span>(<span class="number">0</span>)) <span class="op">=</span><span class="op">></span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">Generic</span>(<span class="string">"Invalid version `0`"</span>.<span class="ident">into</span>()))
}
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="number">1</span>,
};
- <span class="kw">let</span> <span class="ident">lock_time</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>.<span class="ident">locktime</span> {
+ <span class="kw">let</span> <span class="ident">lock_time</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">params</span>.<span class="ident">locktime</span> {
<span class="comment">// No nLockTime, default to 0</span>
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="ident">requirements</span>.<span class="ident">timelock</span>.<span class="ident">unwrap_or</span>(<span class="number">0</span>),
<span class="comment">// Specific nLockTime required and we have no constraints, so just set to that value</span>
<span class="prelude-val">Some</span>(<span class="ident">x</span>) <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">Generic</span>(<span class="macro">format</span><span class="macro">!</span>(<span class="string">"TxBuilder requested timelock of `{}`, but at least `{}` is required to spend from this script"</span>, <span class="ident">x</span>, <span class="ident">requirements</span>.<span class="ident">timelock</span>.<span class="ident">unwrap</span>())))
};
- <span class="kw">let</span> <span class="ident">n_sequence</span> <span class="op">=</span> <span class="kw">match</span> (<span class="ident">builder</span>.<span class="ident">rbf</span>, <span class="ident">requirements</span>.<span class="ident">csv</span>) {
+ <span class="kw">let</span> <span class="ident">n_sequence</span> <span class="op">=</span> <span class="kw">match</span> (<span class="ident">params</span>.<span class="ident">rbf</span>, <span class="ident">requirements</span>.<span class="ident">csv</span>) {
<span class="comment">// No RBF or CSV but there's an nLockTime, so the nSequence cannot be final</span>
(<span class="prelude-val">None</span>, <span class="prelude-val">None</span>) <span class="kw">if</span> <span class="ident">lock_time</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> <span class="op">=</span><span class="op">></span> <span class="number">0xFFFFFFFE</span>,
<span class="comment">// No RBF, CSV or nLockTime, make the transaction final</span>
(<span class="prelude-val">Some</span>(<span class="ident">rbf</span>), <span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">rbf</span>.<span class="ident">get_value</span>(),
};
+ <span class="kw">let</span> (<span class="ident">fee_rate</span>, <span class="kw-2">mut</span> <span class="ident">fee_amount</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">params</span>
+ .<span class="ident">fee_policy</span>
+ .<span class="ident">as_ref</span>()
+ .<span class="ident">unwrap_or</span>(<span class="kw-2">&</span><span class="ident">FeePolicy</span>::<span class="ident">FeeRate</span>(<span class="ident">FeeRate</span>::<span class="ident">default</span>()))
+ {
+ <span class="comment">//FIXME: see https://github.com/bitcoindevkit/bdk/issues/256</span>
+ <span class="ident">FeePolicy</span>::<span class="ident">FeeAmount</span>(<span class="ident">fee</span>) <span class="op">=</span><span class="op">></span> {
+ <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">previous_fee</span>) <span class="op">=</span> <span class="ident">params</span>.<span class="ident">bumping_fee</span> {
+ <span class="kw">if</span> <span class="kw-2">*</span><span class="ident">fee</span> <span class="op"><</span> <span class="ident">previous_fee</span>.<span class="ident">absolute</span> {
+ <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">FeeTooLow</span> {
+ <span class="ident">required</span>: <span class="ident">previous_fee</span>.<span class="ident">absolute</span>,
+ });
+ }
+ }
+ (<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">0.0</span>), <span class="kw-2">*</span><span class="ident">fee</span> <span class="kw">as</span> <span class="ident">f32</span>)
+ }
+ <span class="ident">FeePolicy</span>::<span class="ident">FeeRate</span>(<span class="ident">rate</span>) <span class="op">=</span><span class="op">></span> {
+ <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">previous_fee</span>) <span class="op">=</span> <span class="ident">params</span>.<span class="ident">bumping_fee</span> {
+ <span class="kw">let</span> <span class="ident">required_feerate</span> <span class="op">=</span> <span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="ident">previous_fee</span>.<span class="ident">rate</span> <span class="op">+</span> <span class="number">1.0</span>);
+ <span class="kw">if</span> <span class="kw-2">*</span><span class="ident">rate</span> <span class="op"><</span> <span class="ident">required_feerate</span> {
+ <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">FeeRateTooLow</span> {
+ <span class="ident">required</span>: <span class="ident">required_feerate</span>,
+ });
+ }
+ }
+ (<span class="kw-2">*</span><span class="ident">rate</span>, <span class="number">0.0</span>)
+ }
+ };
+
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">Transaction</span> {
<span class="ident">version</span>,
<span class="ident">lock_time</span>,
<span class="ident">output</span>: <span class="macro">vec</span><span class="macro">!</span>[],
};
- <span class="kw">let</span> (<span class="ident">fee_rate</span>, <span class="kw-2">mut</span> <span class="ident">fee_amount</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>
- .<span class="ident">fee_policy</span>
- .<span class="ident">as_ref</span>()
- .<span class="ident">unwrap_or</span>(<span class="kw-2">&</span><span class="ident">FeePolicy</span>::<span class="ident">FeeRate</span>(<span class="ident">FeeRate</span>::<span class="ident">default</span>()))
- {
- <span class="ident">FeePolicy</span>::<span class="ident">FeeAmount</span>(<span class="ident">amount</span>) <span class="op">=</span><span class="op">></span> (<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">0.0</span>), <span class="kw-2">*</span><span class="ident">amount</span> <span class="kw">as</span> <span class="ident">f32</span>),
- <span class="ident">FeePolicy</span>::<span class="ident">FeeRate</span>(<span class="ident">rate</span>) <span class="op">=</span><span class="op">></span> (<span class="kw-2">*</span><span class="ident">rate</span>, <span class="number">0.0</span>),
- };
-
- <span class="comment">// try not to move from `builder` because we still need to use it later.</span>
- <span class="kw">let</span> <span class="ident">recipients</span> <span class="op">=</span> <span class="kw">match</span> <span class="kw-2">&</span><span class="ident">builder</span>.<span class="ident">single_recipient</span> {
+ <span class="kw">let</span> <span class="ident">recipients</span> <span class="op">=</span> <span class="kw">match</span> <span class="kw-2">&</span><span class="ident">params</span>.<span class="ident">single_recipient</span> {
<span class="prelude-val">Some</span>(<span class="ident">recipient</span>) <span class="op">=</span><span class="op">></span> <span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">recipient</span>, <span class="number">0</span>)],
- <span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="ident">builder</span>.<span class="ident">recipients</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">r</span>, <span class="ident">v</span>)<span class="op">|</span> (<span class="ident">r</span>, <span class="kw-2">*</span><span class="ident">v</span>)).<span class="ident">collect</span>(),
+ <span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="ident">params</span>.<span class="ident">recipients</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">r</span>, <span class="ident">v</span>)<span class="op">|</span> (<span class="ident">r</span>, <span class="kw-2">*</span><span class="ident">v</span>)).<span class="ident">collect</span>(),
};
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">single_recipient</span>.<span class="ident">is_some</span>()
- <span class="op">&&</span> <span class="op">!</span><span class="ident">builder</span>.<span class="ident">manually_selected_only</span>
- <span class="op">&&</span> <span class="op">!</span><span class="ident">builder</span>.<span class="ident">drain_wallet</span>
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">single_recipient</span>.<span class="ident">is_some</span>()
+ <span class="op">&&</span> <span class="op">!</span><span class="ident">params</span>.<span class="ident">manually_selected_only</span>
+ <span class="op">&&</span> <span class="op">!</span><span class="ident">params</span>.<span class="ident">drain_wallet</span>
+ <span class="op">&&</span> <span class="ident">params</span>.<span class="ident">bumping_fee</span>.<span class="ident">is_none</span>()
{
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">SingleRecipientNoInputs</span>);
}
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">NoRecipients</span>);
}
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">manually_selected_only</span> <span class="op">&&</span> <span class="ident">builder</span>.<span class="ident">utxos</span>.<span class="ident">is_empty</span>() {
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">manually_selected_only</span> <span class="op">&&</span> <span class="ident">params</span>.<span class="ident">utxos</span>.<span class="ident">is_empty</span>() {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">NoUtxosSelected</span>);
}
<span class="ident">fee_amount</span> <span class="op">+</span><span class="op">=</span> <span class="ident">calc_fee_bytes</span>(<span class="ident">tx</span>.<span class="ident">get_weight</span>());
<span class="kw">for</span> (<span class="ident">index</span>, (<span class="ident">script_pubkey</span>, <span class="ident">satoshi</span>)) <span class="kw">in</span> <span class="ident">recipients</span>.<span class="ident">into_iter</span>().<span class="ident">enumerate</span>() {
- <span class="kw">let</span> <span class="ident">value</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>.<span class="ident">single_recipient</span> {
+ <span class="kw">let</span> <span class="ident">value</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">params</span>.<span class="ident">single_recipient</span> {
<span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="number">0</span>,
<span class="prelude-val">None</span> <span class="kw">if</span> <span class="ident">satoshi</span>.<span class="ident">is_dust</span>() <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">OutputBelowDustLimit</span>(<span class="ident">index</span>)),
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="ident">satoshi</span>,
<span class="ident">outgoing</span> <span class="op">+</span><span class="op">=</span> <span class="ident">value</span>;
}
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">change_policy</span> <span class="op">!</span><span class="op">=</span> <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>::<span class="ident">ChangeAllowed</span>
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">change_policy</span> <span class="op">!</span><span class="op">=</span> <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>::<span class="ident">ChangeAllowed</span>
<span class="op">&&</span> <span class="self">self</span>.<span class="ident">change_descriptor</span>.<span class="ident">is_none</span>()
{
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">Generic</span>(
}
<span class="kw">let</span> (<span class="ident">required_utxos</span>, <span class="ident">optional_utxos</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">preselect_utxos</span>(
- <span class="ident">builder</span>.<span class="ident">change_policy</span>,
- <span class="kw-2">&</span><span class="ident">builder</span>.<span class="ident">unspendable</span>,
- <span class="kw-2">&</span><span class="ident">builder</span>.<span class="ident">utxos</span>,
- <span class="ident">builder</span>.<span class="ident">drain_wallet</span>,
- <span class="ident">builder</span>.<span class="ident">manually_selected_only</span>,
- <span class="bool-val">false</span>, <span class="comment">// we don't mind using unconfirmed outputs here, hopefully coin selection will sort this out?</span>
+ <span class="ident">params</span>.<span class="ident">change_policy</span>,
+ <span class="kw-2">&</span><span class="ident">params</span>.<span class="ident">unspendable</span>,
+ <span class="ident">params</span>.<span class="ident">utxos</span>.<span class="ident">clone</span>(),
+ <span class="ident">params</span>.<span class="ident">drain_wallet</span>,
+ <span class="ident">params</span>.<span class="ident">manually_selected_only</span>,
+ <span class="ident">params</span>.<span class="ident">bumping_fee</span>.<span class="ident">is_some</span>(), <span class="comment">// we mandate confirmed transactions if we're bumping the fee</span>
)<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">coin_selection</span>::<span class="ident">CoinSelectionResult</span> {
<span class="ident">selected</span>,
<span class="ident">selected_amount</span>,
<span class="kw-2">mut</span> <span class="ident">fee_amount</span>,
- } <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">coin_selection</span>.<span class="ident">coin_select</span>(
+ } <span class="op">=</span> <span class="ident">coin_selection</span>.<span class="ident">coin_select</span>(
<span class="self">self</span>.<span class="ident">database</span>.<span class="ident">borrow</span>().<span class="ident">deref</span>(),
<span class="ident">required_utxos</span>,
<span class="ident">optional_utxos</span>,
.<span class="ident">collect</span>();
<span class="comment">// prepare the change output</span>
- <span class="kw">let</span> <span class="ident">change_output</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>.<span class="ident">single_recipient</span> {
+ <span class="kw">let</span> <span class="ident">change_output</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">params</span>.<span class="ident">single_recipient</span> {
<span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">None</span>,
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
<span class="kw">let</span> <span class="ident">change_script</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_change_address</span>()<span class="question-mark">?</span>;
}
<span class="comment">// sort input/outputs according to the chosen algorithm</span>
- <span class="ident">builder</span>.<span class="ident">ordering</span>.<span class="ident">sort_tx</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>);
+ <span class="ident">params</span>.<span class="ident">ordering</span>.<span class="ident">sort_tx</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>);
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
- <span class="kw">let</span> <span class="ident">psbt</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">complete_transaction</span>(<span class="ident">tx</span>, <span class="ident">selected</span>, <span class="ident">builder</span>)<span class="question-mark">?</span>;
+ <span class="kw">let</span> <span class="ident">psbt</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">complete_transaction</span>(<span class="ident">tx</span>, <span class="ident">selected</span>, <span class="ident">params</span>)<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">transaction_details</span> <span class="op">=</span> <span class="ident">TransactionDetails</span> {
<span class="ident">transaction</span>: <span class="prelude-val">None</span>,
<span class="prelude-val">Ok</span>((<span class="ident">psbt</span>, <span class="ident">transaction_details</span>))
}
- <span class="doccomment">/// Bump the fee of a transaction following the options specified in the `builder`</span>
+ <span class="doccomment">/// Bump the fee of a transaction previously created with this wallet.</span>
<span class="doccomment">///</span>
- <span class="doccomment">/// Return an error if the transaction is already confirmed or doesn't explicitly signal RBF.</span>
+ <span class="doccomment">/// Returns an error if the transaction is already confirmed or doesn't explicitly signal</span>
+ <span class="doccomment">/// *repalce by fee* (RBF). If the transaction can be fee bumped then it returns a [`TxBuilder`]</span>
+ <span class="doccomment">/// pre-populated with the inputs and outputs of the original transaction.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// **NOTE**: if the original transaction was made with [`TxBuilder::set_single_recipient`],</span>
<span class="doccomment">/// the [`TxBuilder::maintain_single_recipient`] flag should be enabled to correctly reduce the</span>
<span class="doccomment">/// only output's value in order to increase the fees.</span>
<span class="doccomment">///</span>
- <span class="doccomment">/// If the `builder` specifies some `utxos` that must be spent, they will be added to the</span>
- <span class="doccomment">/// transaction regardless of whether they are necessary or not to cover additional fees.</span>
- <span class="doccomment">///</span>
<span class="doccomment">/// ## Example</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ```no_run</span>
+ <span class="doccomment">/// # // TODO: remove norun -- bumping fee seems to need the tx in the wallet database first.</span>
<span class="doccomment">/// # use std::str::FromStr;</span>
<span class="doccomment">/// # use bitcoin::*;</span>
<span class="doccomment">/// # use bdk::*;</span>
<span class="doccomment">/// # use bdk::database::*;</span>
<span class="doccomment">/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";</span>
- <span class="doccomment">/// # let wallet = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;</span>
- <span class="doccomment">/// let txid = Txid::from_str("faff0a466b70f5d5f92bd757a92c1371d4838bdd5bc53a06764e2488e51ce8f8").unwrap();</span>
- <span class="doccomment">/// let (psbt, details) = wallet.bump_fee(</span>
- <span class="doccomment">/// &txid,</span>
- <span class="doccomment">/// TxBuilder::new().fee_rate(FeeRate::from_sat_per_vb(5.0)),</span>
- <span class="doccomment">/// )?;</span>
- <span class="doccomment">/// // sign and broadcast ...</span>
+ <span class="doccomment">/// # let wallet = doctest_wallet!();</span>
+ <span class="doccomment">/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();</span>
+ <span class="doccomment">/// let (psbt, _) = {</span>
+ <span class="doccomment">/// let mut builder = wallet.build_tx();</span>
+ <span class="doccomment">/// builder</span>
+ <span class="doccomment">/// .add_recipient(to_address.script_pubkey(), 50_000)</span>
+ <span class="doccomment">/// .enable_rbf();</span>
+ <span class="doccomment">/// builder.finish()?</span>
+ <span class="doccomment">/// };</span>
+ <span class="doccomment">/// let (psbt, _) = wallet.sign(psbt, None)?;</span>
+ <span class="doccomment">/// let tx = psbt.extract_tx();</span>
+ <span class="doccomment">/// // broadcast tx but it's taking too long to confirm so we want to bump the fee</span>
+ <span class="doccomment">/// let (psbt, _) = {</span>
+ <span class="doccomment">/// let mut builder = wallet.build_fee_bump(tx.txid())?;</span>
+ <span class="doccomment">/// builder</span>
+ <span class="doccomment">/// .fee_rate(FeeRate::from_sat_per_vb(5.0));</span>
+ <span class="doccomment">/// builder.finish()?</span>
+ <span class="doccomment">/// };</span>
+ <span class="doccomment">///</span>
+ <span class="doccomment">/// let (psbt, _) = wallet.sign(psbt, None)?;</span>
+ <span class="doccomment">/// let fee_bumped_tx = psbt.extract_tx();</span>
+ <span class="doccomment">/// // broadcast fee_bumped_tx to replace original</span>
<span class="doccomment">/// # Ok::<(), bdk::Error>(())</span>
<span class="doccomment">/// ```</span>
<span class="comment">// TODO: support for merging multiple transactions while bumping the fees</span>
<span class="comment">// TODO: option to force addition of an extra output? seems bad for privacy to update the</span>
<span class="comment">// change</span>
- <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">bump_fee</span><span class="op"><</span><span class="ident">Cs</span>: <span class="ident">coin_selection</span>::<span class="ident">CoinSelectionAlgorithm</span><span class="op"><</span><span class="ident">D</span><span class="op">></span><span class="op">></span>(
+ <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">build_fee_bump</span>(
<span class="kw-2">&</span><span class="self">self</span>,
- <span class="ident">txid</span>: <span class="kw-2">&</span><span class="ident">Txid</span>,
- <span class="ident">builder</span>: <span class="ident">TxBuilder</span><span class="op"><</span><span class="ident">D</span>, <span class="ident">Cs</span>, <span class="ident">BumpFee</span><span class="op">></span>,
- ) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span>(<span class="ident">PSBT</span>, <span class="ident">TransactionDetails</span>), <span class="ident">Error</span><span class="op">></span> {
+ <span class="ident">txid</span>: <span class="ident">Txid</span>,
+ ) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">TxBuilder</span><span class="op"><</span><span class="lifetime">'_</span>, <span class="ident">B</span>, <span class="ident">D</span>, <span class="ident">DefaultCoinSelectionAlgorithm</span>, <span class="ident">BumpFee</span><span class="op">></span>, <span class="ident">Error</span><span class="op">></span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">details</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">database</span>.<span class="ident">borrow</span>().<span class="ident">get_tx</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="bool-val">true</span>)<span class="question-mark">?</span> {
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">TransactionNotFound</span>),
<span class="prelude-val">Some</span>(<span class="ident">tx</span>) <span class="kw">if</span> <span class="ident">tx</span>.<span class="ident">transaction</span>.<span class="ident">is_none</span>() <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">TransactionNotFound</span>),
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">IrreplaceableTransaction</span>);
}
- <span class="comment">// the new tx must "pay for its bandwidth"</span>
<span class="kw">let</span> <span class="ident">vbytes</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">get_weight</span>() <span class="kw">as</span> <span class="ident">f32</span> <span class="op">/</span> <span class="number">4.0</span>;
- <span class="kw">let</span> <span class="ident">required_feerate</span> <span class="op">=</span> <span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="kw">as</span> <span class="ident">f32</span> <span class="op">/</span> <span class="ident">vbytes</span> <span class="op">+</span> <span class="number">1.0</span>);
-
- <span class="comment">// find the index of the output that we can update. either the change or the only one if</span>
- <span class="comment">// it's `single_recipient`</span>
- <span class="kw">let</span> <span class="ident">updatable_output</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>.<span class="ident">single_recipient</span> {
- <span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="kw">if</span> <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">len</span>() <span class="op">!</span><span class="op">=</span> <span class="number">1</span> <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">SingleRecipientMultipleOutputs</span>),
- <span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Some</span>(<span class="number">0</span>),
- <span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
- <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">change_output</span> <span class="op">=</span> <span class="prelude-val">None</span>;
- <span class="kw">for</span> (<span class="ident">index</span>, <span class="ident">txout</span>) <span class="kw">in</span> <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">iter</span>().<span class="ident">enumerate</span>() {
- <span class="comment">// look for an output that we know and that has the right KeychainKind. We use</span>
- <span class="comment">// `get_descriptor_for` to find what's the KeychainKind for `Internal`</span>
- <span class="comment">// addresses really is, because if there's no change_descriptor it's actually equal</span>
- <span class="comment">// to "External"</span>
- <span class="kw">let</span> (<span class="kw">_</span>, <span class="ident">change_type</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">KeychainKind</span>::<span class="ident">Internal</span>);
- <span class="kw">match</span> <span class="self">self</span>
- .<span class="ident">database</span>
- .<span class="ident">borrow</span>()
- .<span class="ident">get_path_from_script_pubkey</span>(<span class="kw-2">&</span><span class="ident">txout</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span>
- {
- <span class="prelude-val">Some</span>((<span class="ident">keychain</span>, <span class="kw">_</span>)) <span class="kw">if</span> <span class="ident">keychain</span> <span class="op">=</span><span class="op">=</span> <span class="ident">change_type</span> <span class="op">=</span><span class="op">></span> {
- <span class="ident">change_output</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">index</span>);
- <span class="kw">break</span>;
- }
- <span class="kw">_</span> <span class="op">=</span><span class="op">></span> {}
- }
- }
-
- <span class="ident">change_output</span>
- }
- };
- <span class="kw">let</span> <span class="ident">updatable_output</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">updatable_output</span> {
- <span class="prelude-val">Some</span>(<span class="ident">updatable_output</span>) <span class="op">=</span><span class="op">></span> <span class="ident">updatable_output</span>,
- <span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
- <span class="comment">// we need a change output, add one here and take into account the extra fees for it</span>
- <span class="kw">let</span> <span class="ident">change_script</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_change_address</span>()<span class="question-mark">?</span>;
- <span class="kw">let</span> <span class="ident">change_txout</span> <span class="op">=</span> <span class="ident">TxOut</span> {
- <span class="ident">script_pubkey</span>: <span class="ident">change_script</span>,
- <span class="ident">value</span>: <span class="number">0</span>,
- };
- <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">push</span>(<span class="ident">change_txout</span>);
-
- <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">len</span>() <span class="op">-</span> <span class="number">1</span>
- }
- };
-
- <span class="comment">// initially always remove the output we can change</span>
- <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">removed_updatable_output</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">remove</span>(<span class="ident">updatable_output</span>);
- <span class="kw">if</span> <span class="self">self</span>.<span class="ident">is_mine</span>(<span class="kw-2">&</span><span class="ident">removed_updatable_output</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span> {
- <span class="ident">details</span>.<span class="ident">received</span> <span class="op">-</span><span class="op">=</span> <span class="ident">removed_updatable_output</span>.<span class="ident">value</span>;
- }
+ <span class="kw">let</span> <span class="ident">feerate</span> <span class="op">=</span> <span class="ident">details</span>.<span class="ident">fees</span> <span class="kw">as</span> <span class="ident">f32</span> <span class="op">/</span> <span class="ident">vbytes</span>;
<span class="kw">let</span> <span class="ident">deriv_ctx</span> <span class="op">=</span> <span class="ident">descriptor_to_pk_ctx</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>);
- <span class="kw">let</span> <span class="ident">original_sequence</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>;
-
<span class="comment">// remove the inputs from the tx and process them</span>
<span class="kw">let</span> <span class="ident">original_txin</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">input</span>.<span class="ident">drain</span>(..).<span class="ident">collect</span>::<span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="kw">_</span><span class="op">></span><span class="op">></span>();
- <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">original_utxos</span> <span class="op">=</span> <span class="ident">original_txin</span>
+ <span class="kw">let</span> <span class="ident">original_utxos</span> <span class="op">=</span> <span class="ident">original_txin</span>
.<span class="ident">iter</span>()
- .<span class="ident">map</span>(<span class="op">|</span><span class="ident">txin</span><span class="op">|</span> <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span>(<span class="ident">UTXO</span>, <span class="ident">usize</span>), <span class="ident">Error</span><span class="op">></span> {
+ .<span class="ident">map</span>(<span class="op">|</span><span class="ident">txin</span><span class="op">|</span> <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="kw">_</span>, <span class="ident">Error</span><span class="op">></span> {
<span class="kw">let</span> <span class="ident">txout</span> <span class="op">=</span> <span class="self">self</span>
.<span class="ident">database</span>
.<span class="ident">borrow</span>()
.<span class="ident">get_path_from_script_pubkey</span>(<span class="kw-2">&</span><span class="ident">txout</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span>
{
<span class="prelude-val">Some</span>((<span class="ident">keychain</span>, <span class="kw">_</span>)) <span class="op">=</span><span class="op">></span> (
- <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>)
+ <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">keychain</span>)
.<span class="number">0</span>
.<span class="ident">max_satisfaction_weight</span>(<span class="ident">deriv_ctx</span>)
.<span class="ident">unwrap</span>(),
})
.<span class="ident">collect</span>::<span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="kw">_</span><span class="op">></span>, <span class="kw">_</span><span class="op">></span><span class="op">></span>()<span class="question-mark">?</span>;
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">manually_selected_only</span> <span class="op">&&</span> <span class="ident">builder</span>.<span class="ident">utxos</span>.<span class="ident">is_empty</span>() {
- <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">NoUtxosSelected</span>);
- }
-
- <span class="kw">let</span> <span class="ident">builder_extra_utxos</span> <span class="op">=</span> <span class="ident">builder</span>
- .<span class="ident">utxos</span>
- .<span class="ident">iter</span>()
- .<span class="ident">filter</span>(<span class="op">|</span><span class="ident">utxo</span><span class="op">|</span> {
- <span class="op">!</span><span class="ident">original_txin</span>
- .<span class="ident">iter</span>()
- .<span class="ident">any</span>(<span class="op">|</span><span class="ident">txin</span><span class="op">|</span> <span class="op">&&</span><span class="ident">txin</span>.<span class="ident">previous_output</span> <span class="op">=</span><span class="op">=</span> <span class="ident">utxo</span>)
- })
- .<span class="ident">cloned</span>()
- .<span class="ident">collect</span>::<span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="kw">_</span><span class="op">></span><span class="op">></span>();
-
- <span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">required_utxos</span>, <span class="ident">optional_utxos</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">preselect_utxos</span>(
- <span class="ident">builder</span>.<span class="ident">change_policy</span>,
- <span class="kw-2">&</span><span class="ident">builder</span>.<span class="ident">unspendable</span>,
- <span class="kw-2">&</span><span class="ident">builder_extra_utxos</span>[..],
- <span class="ident">builder</span>.<span class="ident">drain_wallet</span>,
- <span class="ident">builder</span>.<span class="ident">manually_selected_only</span>,
- <span class="bool-val">true</span>, <span class="comment">// we only want confirmed transactions for RBF</span>
- )<span class="question-mark">?</span>;
-
- <span class="ident">required_utxos</span>.<span class="ident">append</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">original_utxos</span>);
-
- <span class="kw">let</span> <span class="ident">amount_needed</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="number">0</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">out</span><span class="op">|</span> <span class="ident">acc</span> <span class="op">+</span> <span class="ident">out</span>.<span class="ident">value</span>);
- <span class="kw">let</span> (<span class="ident">new_feerate</span>, <span class="ident">initial_fee</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">builder</span>
- .<span class="ident">fee_policy</span>
- .<span class="ident">as_ref</span>()
- .<span class="ident">unwrap_or</span>(<span class="kw-2">&</span><span class="ident">FeePolicy</span>::<span class="ident">FeeRate</span>(<span class="ident">FeeRate</span>::<span class="ident">default</span>()))
- {
- <span class="ident">FeePolicy</span>::<span class="ident">FeeAmount</span>(<span class="ident">amount</span>) <span class="op">=</span><span class="op">></span> {
- <span class="kw">if</span> <span class="kw-2">*</span><span class="ident">amount</span> <span class="op"><</span> <span class="ident">details</span>.<span class="ident">fees</span> {
- <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">FeeTooLow</span> {
- <span class="ident">required</span>: <span class="ident">details</span>.<span class="ident">fees</span>,
- });
- }
- (<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">0.0</span>), <span class="kw-2">*</span><span class="ident">amount</span> <span class="kw">as</span> <span class="ident">f32</span>)
- }
- <span class="ident">FeePolicy</span>::<span class="ident">FeeRate</span>(<span class="ident">rate</span>) <span class="op">=</span><span class="op">></span> {
- <span class="kw">if</span> <span class="kw-2">*</span><span class="ident">rate</span> <span class="op"><</span> <span class="ident">required_feerate</span> {
- <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">FeeRateTooLow</span> {
- <span class="ident">required</span>: <span class="ident">required_feerate</span>,
- });
+ <span class="kw">if</span> <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">len</span>() <span class="op">></span> <span class="number">1</span> {
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">change_index</span> <span class="op">=</span> <span class="prelude-val">None</span>;
+ <span class="kw">for</span> (<span class="ident">index</span>, <span class="ident">txout</span>) <span class="kw">in</span> <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">iter</span>().<span class="ident">enumerate</span>() {
+ <span class="kw">let</span> (<span class="kw">_</span>, <span class="ident">change_type</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">KeychainKind</span>::<span class="ident">Internal</span>);
+ <span class="kw">match</span> <span class="self">self</span>
+ .<span class="ident">database</span>
+ .<span class="ident">borrow</span>()
+ .<span class="ident">get_path_from_script_pubkey</span>(<span class="kw-2">&</span><span class="ident">txout</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span>
+ {
+ <span class="prelude-val">Some</span>((<span class="ident">keychain</span>, <span class="kw">_</span>)) <span class="kw">if</span> <span class="ident">keychain</span> <span class="op">=</span><span class="op">=</span> <span class="ident">change_type</span> <span class="op">=</span><span class="op">></span> <span class="ident">change_index</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">index</span>),
+ <span class="kw">_</span> <span class="op">=</span><span class="op">></span> {}
}
- (<span class="kw-2">*</span><span class="ident">rate</span>, <span class="ident">tx</span>.<span class="ident">get_weight</span>() <span class="kw">as</span> <span class="ident">f32</span> <span class="op">/</span> <span class="number">4.0</span> <span class="op">*</span> <span class="ident">rate</span>.<span class="ident">as_sat_vb</span>())
}
- };
- <span class="kw">let</span> <span class="ident">coin_selection</span>::<span class="ident">CoinSelectionResult</span> {
- <span class="ident">selected</span>,
- <span class="ident">selected_amount</span>,
- <span class="ident">fee_amount</span>,
- } <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">coin_selection</span>.<span class="ident">coin_select</span>(
- <span class="self">self</span>.<span class="ident">database</span>.<span class="ident">borrow</span>().<span class="ident">deref</span>(),
- <span class="ident">required_utxos</span>,
- <span class="ident">optional_utxos</span>,
- <span class="ident">new_feerate</span>,
- <span class="ident">amount_needed</span>,
- <span class="ident">initial_fee</span>,
- )<span class="question-mark">?</span>;
-
- <span class="ident">tx</span>.<span class="ident">input</span> <span class="op">=</span> <span class="ident">selected</span>
- .<span class="ident">iter</span>()
- .<span class="ident">map</span>(<span class="op">|</span><span class="ident">u</span><span class="op">|</span> <span class="ident">bitcoin</span>::<span class="ident">TxIn</span> {
- <span class="ident">previous_output</span>: <span class="ident">u</span>.<span class="ident">outpoint</span>,
- <span class="ident">script_sig</span>: <span class="ident">Script</span>::<span class="ident">default</span>(),
- <span class="comment">// TODO: use builder.n_sequence??</span>
- <span class="ident">sequence</span>: <span class="ident">original_sequence</span>,
- <span class="ident">witness</span>: <span class="macro">vec</span><span class="macro">!</span>[],
- })
- .<span class="ident">collect</span>();
-
- <span class="ident">details</span>.<span class="ident">sent</span> <span class="op">=</span> <span class="ident">selected_amount</span>;
-
- <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">fee_amount</span> <span class="op">=</span> <span class="ident">fee_amount</span>.<span class="ident">ceil</span>() <span class="kw">as</span> <span class="ident">u64</span>;
- <span class="kw">let</span> <span class="ident">removed_output_fee_cost</span> <span class="op">=</span> (<span class="ident">serialize</span>(<span class="kw-2">&</span><span class="ident">removed_updatable_output</span>).<span class="ident">len</span>() <span class="kw">as</span> <span class="ident">f32</span>
- <span class="op">*</span> <span class="ident">new_feerate</span>.<span class="ident">as_sat_vb</span>())
- .<span class="ident">ceil</span>() <span class="kw">as</span> <span class="ident">u64</span>;
-
- <span class="kw">let</span> <span class="ident">change_val</span> <span class="op">=</span> <span class="ident">selected_amount</span> <span class="op">-</span> <span class="ident">amount_needed</span> <span class="op">-</span> <span class="ident">fee_amount</span>;
- <span class="kw">let</span> <span class="ident">change_val_after_add</span> <span class="op">=</span> <span class="ident">change_val</span>.<span class="ident">saturating_sub</span>(<span class="ident">removed_output_fee_cost</span>);
- <span class="kw">match</span> <span class="ident">builder</span>.<span class="ident">single_recipient</span> {
- <span class="prelude-val">None</span> <span class="kw">if</span> <span class="ident">change_val_after_add</span>.<span class="ident">is_dust</span>() <span class="op">=</span><span class="op">></span> {
- <span class="comment">// skip the change output because it's dust, this adds up to the fees</span>
- <span class="ident">fee_amount</span> <span class="op">+</span><span class="op">=</span> <span class="ident">change_val</span>;
- }
- <span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="kw">if</span> <span class="ident">change_val_after_add</span>.<span class="ident">is_dust</span>() <span class="op">=</span><span class="op">></span> {
- <span class="comment">// single_recipient but the only output would be below dust limit</span>
- <span class="comment">// TODO: or OutputBelowDustLimit?</span>
- <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Error</span>::<span class="ident">InsufficientFunds</span> {
- <span class="ident">needed</span>: <span class="ident">DUST_LIMIT_SATOSHI</span>,
- <span class="ident">available</span>: <span class="ident">change_val_after_add</span>,
- });
- }
- <span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
- <span class="ident">removed_updatable_output</span>.<span class="ident">value</span> <span class="op">=</span> <span class="ident">change_val_after_add</span>;
- <span class="ident">fee_amount</span> <span class="op">+</span><span class="op">=</span> <span class="ident">removed_output_fee_cost</span>;
- <span class="ident">details</span>.<span class="ident">received</span> <span class="op">+</span><span class="op">=</span> <span class="ident">change_val_after_add</span>;
-
- <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">push</span>(<span class="ident">removed_updatable_output</span>);
- }
- <span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {
- <span class="ident">removed_updatable_output</span>.<span class="ident">value</span> <span class="op">=</span> <span class="ident">change_val_after_add</span>;
- <span class="ident">fee_amount</span> <span class="op">+</span><span class="op">=</span> <span class="ident">removed_output_fee_cost</span>;
-
- <span class="comment">// single recipient and it's our address</span>
- <span class="kw">if</span> <span class="self">self</span>.<span class="ident">is_mine</span>(<span class="kw-2">&</span><span class="ident">removed_updatable_output</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span> {
- <span class="ident">details</span>.<span class="ident">received</span> <span class="op">=</span> <span class="ident">change_val_after_add</span>;
- }
-
- <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">push</span>(<span class="ident">removed_updatable_output</span>);
+ <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">change_index</span>) <span class="op">=</span> <span class="ident">change_index</span> {
+ <span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">remove</span>(<span class="ident">change_index</span>);
}
}
- <span class="comment">// sort input/outputs according to the chosen algorithm</span>
- <span class="ident">builder</span>.<span class="ident">ordering</span>.<span class="ident">sort_tx</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>);
-
- <span class="comment">// TODO: check that we are not replacing more than 100 txs from mempool</span>
-
- <span class="ident">details</span>.<span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
- <span class="ident">details</span>.<span class="ident">fees</span> <span class="op">=</span> <span class="ident">fee_amount</span>;
- <span class="ident">details</span>.<span class="ident">timestamp</span> <span class="op">=</span> <span class="ident">time</span>::<span class="ident">get_timestamp</span>();
-
- <span class="kw">let</span> <span class="ident">psbt</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">complete_transaction</span>(<span class="ident">tx</span>, <span class="ident">selected</span>, <span class="ident">builder</span>)<span class="question-mark">?</span>;
+ <span class="kw">let</span> <span class="ident">params</span> <span class="op">=</span> <span class="ident">TxParams</span> {
+ <span class="comment">// TODO: figure out what rbf option should be?</span>
+ <span class="ident">version</span>: <span class="prelude-val">Some</span>(<span class="ident">tx_builder</span>::<span class="ident">Version</span>(<span class="ident">tx</span>.<span class="ident">version</span>)),
+ <span class="ident">recipients</span>: <span class="ident">tx</span>
+ .<span class="ident">output</span>
+ .<span class="ident">into_iter</span>()
+ .<span class="ident">map</span>(<span class="op">|</span><span class="ident">txout</span><span class="op">|</span> (<span class="ident">txout</span>.<span class="ident">script_pubkey</span>, <span class="ident">txout</span>.<span class="ident">value</span>))
+ .<span class="ident">collect</span>(),
+ <span class="ident">utxos</span>: <span class="ident">original_utxos</span>,
+ <span class="ident">bumping_fee</span>: <span class="prelude-val">Some</span>(<span class="ident">tx_builder</span>::<span class="ident">PreviousFee</span> {
+ <span class="ident">absolute</span>: <span class="ident">details</span>.<span class="ident">fees</span>,
+ <span class="ident">rate</span>: <span class="ident">feerate</span>,
+ }),
+ ..<span class="ident">Default</span>::<span class="ident">default</span>()
+ };
- <span class="prelude-val">Ok</span>((<span class="ident">psbt</span>, <span class="ident">details</span>))
+ <span class="prelude-val">Ok</span>(<span class="ident">TxBuilder</span> {
+ <span class="ident">wallet</span>: <span class="kw-2">&</span><span class="self">self</span>,
+ <span class="ident">params</span>,
+ <span class="ident">coin_selection</span>: <span class="ident">DefaultCoinSelectionAlgorithm</span>::<span class="ident">default</span>(),
+ <span class="ident">phantom</span>: <span class="ident">core</span>::<span class="ident">marker</span>::<span class="ident">PhantomData</span>,
+ })
}
<span class="doccomment">/// Sign a transaction with all the wallet's signers, in the order specified by every signer's</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ## Example</span>
<span class="doccomment">///</span>
- <span class="doccomment">/// ```no_run</span>
+ <span class="doccomment">/// ```</span>
<span class="doccomment">/// # use std::str::FromStr;</span>
<span class="doccomment">/// # use bitcoin::*;</span>
<span class="doccomment">/// # use bdk::*;</span>
<span class="doccomment">/// # use bdk::database::*;</span>
<span class="doccomment">/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";</span>
- <span class="doccomment">/// # let wallet = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;</span>
- <span class="doccomment">/// # let (psbt, _) = wallet.create_tx(TxBuilder::new())?;</span>
+ <span class="doccomment">/// # let wallet = doctest_wallet!();</span>
+ <span class="doccomment">/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();</span>
+ <span class="doccomment">/// let (psbt, _) = {</span>
+ <span class="doccomment">/// let mut builder = wallet.build_tx();</span>
+ <span class="doccomment">/// builder.add_recipient(to_address.script_pubkey(), 50_000);</span>
+ <span class="doccomment">/// builder.finish()?</span>
+ <span class="doccomment">/// };</span>
<span class="doccomment">/// let (signed_psbt, finalized) = wallet.sign(psbt, None)?;</span>
+ <span class="doccomment">/// assert!(finalized, "we should have signed all the inputs");</span>
<span class="doccomment">/// # Ok::<(), bdk::Error>(())</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">sign</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="kw-2">mut</span> <span class="ident">psbt</span>: <span class="ident">PSBT</span>, <span class="ident">assume_height</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">u32</span><span class="op">></span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span>(<span class="ident">PSBT</span>, <span class="ident">bool</span>), <span class="ident">Error</span><span class="op">></span> {
<span class="comment">// this helps us doing our job later</span>
<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>
}
+ <span class="doccomment">/// Returns the descriptor used to create adddresses for a particular `keychain`.</span>
+ <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_descriptor_for_keychain</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">keychain</span>: <span class="ident">KeychainKind</span>) <span class="op">-</span><span class="op">></span> <span class="kw-2">&</span><span class="ident">ExtendedDescriptor</span> {
+ <span class="kw">let</span> (<span class="ident">descriptor</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
+ <span class="ident">descriptor</span>
+ }
+
<span class="comment">// Internals</span>
- <span class="kw">fn</span> <span class="ident">get_descriptor_for_keychain</span>(
+ <span class="kw">fn</span> <span class="ident">_get_descriptor_for_keychain</span>(
<span class="kw-2">&</span><span class="self">self</span>,
<span class="ident">keychain</span>: <span class="ident">KeychainKind</span>,
) <span class="op">-</span><span class="op">></span> (<span class="kw-2">&</span><span class="ident">ExtendedDescriptor</span>, <span class="ident">KeychainKind</span>) {
.<span class="ident">database</span>
.<span class="ident">borrow</span>()
.<span class="ident">get_path_from_script_pubkey</span>(<span class="kw-2">&</span><span class="ident">txout</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span>
- .<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">keychain</span>, <span class="ident">child</span>)<span class="op">|</span> (<span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>).<span class="number">0</span>, <span class="ident">child</span>))
+ .<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">keychain</span>, <span class="ident">child</span>)<span class="op">|</span> (<span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>), <span class="ident">child</span>))
.<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">desc</span>, <span class="ident">child</span>)<span class="op">|</span> <span class="ident">desc</span>.<span class="ident">derive</span>(<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="ident">child</span>).<span class="ident">unwrap</span>())))
}
<span class="kw">fn</span> <span class="ident">get_change_address</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Script</span>, <span class="ident">Error</span><span class="op">></span> {
<span class="kw">let</span> <span class="ident">deriv_ctx</span> <span class="op">=</span> <span class="ident">descriptor_to_pk_ctx</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>);
- <span class="kw">let</span> (<span class="ident">desc</span>, <span class="ident">keychain</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">KeychainKind</span>::<span class="ident">Internal</span>);
+ <span class="kw">let</span> (<span class="ident">desc</span>, <span class="ident">keychain</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">KeychainKind</span>::<span class="ident">Internal</span>);
<span class="kw">let</span> <span class="ident">index</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">fetch_and_increment_index</span>(<span class="ident">keychain</span>)<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="ident">desc</span>
}
<span class="kw">fn</span> <span class="ident">fetch_and_increment_index</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">keychain</span>: <span class="ident">KeychainKind</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">u32</span>, <span class="ident">Error</span><span class="op">></span> {
- <span class="kw">let</span> (<span class="ident">descriptor</span>, <span class="ident">keychain</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
+ <span class="kw">let</span> (<span class="ident">descriptor</span>, <span class="ident">keychain</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
<span class="kw">let</span> <span class="ident">index</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">descriptor</span>.<span class="ident">is_fixed</span>() {
<span class="bool-val">true</span> <span class="op">=</span><span class="op">></span> <span class="number">0</span>,
<span class="bool-val">false</span> <span class="op">=</span><span class="op">></span> <span class="self">self</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">increment_last_index</span>(<span class="ident">keychain</span>)<span class="question-mark">?</span>,
<span class="ident">from</span>: <span class="ident">u32</span>,
<span class="kw-2">mut</span> <span class="ident">count</span>: <span class="ident">u32</span>,
) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span>(), <span class="ident">Error</span><span class="op">></span> {
- <span class="kw">let</span> (<span class="ident">descriptor</span>, <span class="ident">keychain</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
+ <span class="kw">let</span> (<span class="ident">descriptor</span>, <span class="ident">keychain</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
<span class="kw">if</span> <span class="ident">descriptor</span>.<span class="ident">is_fixed</span>() {
<span class="kw">if</span> <span class="ident">from</span> <span class="op">></span> <span class="number">0</span> {
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
(
<span class="ident">utxo</span>,
<span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>)
- .<span class="number">0</span>
.<span class="ident">max_satisfaction_weight</span>(<span class="ident">deriv_ctx</span>)
.<span class="ident">unwrap</span>(),
)
<span class="kw-2">&</span><span class="self">self</span>,
<span class="ident">change_policy</span>: <span class="ident">tx_builder</span>::<span class="ident">ChangeSpendPolicy</span>,
<span class="ident">unspendable</span>: <span class="kw-2">&</span><span class="ident">HashSet</span><span class="op"><</span><span class="ident">OutPoint</span><span class="op">></span>,
- <span class="ident">manually_selected</span>: <span class="kw-2">&</span>[<span class="ident">OutPoint</span>],
+ <span class="ident">manually_selected</span>: <span class="ident">Vec</span><span class="op"><</span>(<span class="ident">UTXO</span>, <span class="ident">usize</span>)<span class="op">></span>,
<span class="ident">must_use_all_available</span>: <span class="ident">bool</span>,
<span class="ident">manual_only</span>: <span class="ident">bool</span>,
<span class="ident">must_only_use_confirmed_tx</span>: <span class="ident">bool</span>,
<span class="comment">// must_spend <- manually selected utxos</span>
<span class="comment">// may_spend <- all other available utxos</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">may_spend</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_available_utxos</span>()<span class="question-mark">?</span>;
- <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">must_spend</span> <span class="op">=</span> {
- <span class="kw">let</span> <span class="ident">must_spend_idx</span> <span class="op">=</span> <span class="ident">manually_selected</span>
+ <span class="ident">may_spend</span>.<span class="ident">retain</span>(<span class="op">|</span><span class="ident">may_spend</span><span class="op">|</span> {
+ <span class="ident">manually_selected</span>
.<span class="ident">iter</span>()
- .<span class="ident">map</span>(<span class="op">|</span><span class="ident">manually_selected</span><span class="op">|</span> {
- <span class="ident">may_spend</span>
- .<span class="ident">iter</span>()
- .<span class="ident">position</span>(<span class="op">|</span><span class="ident">available</span><span class="op">|</span> <span class="ident">available</span>.<span class="number">0</span>.<span class="ident">outpoint</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">*</span><span class="ident">manually_selected</span>)
- .<span class="ident">ok_or</span>(<span class="ident">Error</span>::<span class="ident">UnknownUTXO</span>)
- })
- .<span class="ident">collect</span>::<span class="op"><</span><span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="kw">_</span><span class="op">></span>, <span class="kw">_</span><span class="op">></span><span class="op">></span>()<span class="question-mark">?</span>;
-
- <span class="ident">must_spend_idx</span>
- .<span class="ident">into_iter</span>()
- .<span class="ident">map</span>(<span class="op">|</span><span class="ident">i</span><span class="op">|</span> <span class="ident">may_spend</span>.<span class="ident">remove</span>(<span class="ident">i</span>))
- .<span class="ident">collect</span>()
- };
+ .<span class="ident">find</span>(<span class="op">|</span><span class="ident">manually_selected</span><span class="op">|</span> <span class="ident">manually_selected</span>.<span class="number">0</span>.<span class="ident">outpoint</span> <span class="op">=</span><span class="op">=</span> <span class="ident">may_spend</span>.<span class="number">0</span>.<span class="ident">outpoint</span>)
+ .<span class="ident">is_none</span>()
+ });
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">must_spend</span> <span class="op">=</span> <span class="ident">manually_selected</span>;
<span class="comment">// NOTE: we are intentionally ignoring `unspendable` here. i.e manual</span>
<span class="comment">// selection overrides unspendable.</span>
<span class="prelude-val">Ok</span>((<span class="ident">must_spend</span>, <span class="ident">may_spend</span>))
}
- <span class="kw">fn</span> <span class="ident">complete_transaction</span><span class="op"><</span>
- <span class="ident">Cs</span>: <span class="ident">coin_selection</span>::<span class="ident">CoinSelectionAlgorithm</span><span class="op"><</span><span class="ident">D</span><span class="op">></span>,
- <span class="ident">Ctx</span>: <span class="ident">TxBuilderContext</span>,
- <span class="op">></span>(
+ <span class="kw">fn</span> <span class="ident">complete_transaction</span>(
<span class="kw-2">&</span><span class="self">self</span>,
<span class="ident">tx</span>: <span class="ident">Transaction</span>,
<span class="ident">selected</span>: <span class="ident">Vec</span><span class="op"><</span><span class="ident">UTXO</span><span class="op">></span>,
- <span class="ident">builder</span>: <span class="ident">TxBuilder</span><span class="op"><</span><span class="ident">D</span>, <span class="ident">Cs</span>, <span class="ident">Ctx</span><span class="op">></span>,
+ <span class="ident">params</span>: <span class="ident">TxParams</span>,
) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">PSBT</span>, <span class="ident">Error</span><span class="op">></span> {
<span class="kw">use</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">psbt</span>::<span class="ident">serialize</span>::<span class="ident">Serialize</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">psbt</span> <span class="op">=</span> <span class="ident">PSBT</span>::<span class="ident">from_unsigned_tx</span>(<span class="ident">tx</span>)<span class="question-mark">?</span>;
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">add_global_xpubs</span> {
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">add_global_xpubs</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">all_xpubs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">descriptor</span>.<span class="ident">get_extended_keys</span>()<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">change_descriptor</span>) <span class="op">=</span> <span class="kw-2">&</span><span class="self">self</span>.<span class="ident">change_descriptor</span> {
<span class="ident">all_xpubs</span>.<span class="ident">extend</span>(<span class="ident">change_descriptor</span>.<span class="ident">get_extended_keys</span>()<span class="question-mark">?</span>);
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="kw">continue</span>,
};
- <span class="comment">// Only set it if the builder has a custom one, otherwise leave blank which defaults to</span>
+ <span class="comment">// Only set it if the params has a custom one, otherwise leave blank which defaults to</span>
<span class="comment">// SIGHASH_ALL</span>
- <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">sighash_type</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">sighash</span> {
+ <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">sighash_type</span>) <span class="op">=</span> <span class="ident">params</span>.<span class="ident">sighash</span> {
<span class="ident">psbt_input</span>.<span class="ident">sighash_type</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">sighash_type</span>);
}
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="kw">continue</span>,
};
- <span class="kw">let</span> (<span class="ident">desc</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
+ <span class="kw">let</span> (<span class="ident">desc</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
<span class="ident">psbt_input</span>.<span class="ident">hd_keypaths</span> <span class="op">=</span> <span class="ident">desc</span>.<span class="ident">get_hd_keypaths</span>(<span class="ident">child</span>, <span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>)<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">derived_descriptor</span> <span class="op">=</span> <span class="ident">desc</span>.<span class="ident">derive</span>(<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="ident">child</span>)<span class="question-mark">?</span>);
<span class="ident">psbt_input</span>.<span class="ident">witness_utxo</span> <span class="op">=</span>
<span class="prelude-val">Some</span>(<span class="ident">prev_tx</span>.<span class="ident">output</span>[<span class="ident">prev_output</span>.<span class="ident">vout</span> <span class="kw">as</span> <span class="ident">usize</span>].<span class="ident">clone</span>());
}
- <span class="kw">if</span> <span class="op">!</span><span class="ident">derived_descriptor</span>.<span class="ident">is_witness</span>() <span class="op">|</span><span class="op">|</span> <span class="ident">builder</span>.<span class="ident">force_non_witness_utxo</span> {
+ <span class="kw">if</span> <span class="op">!</span><span class="ident">derived_descriptor</span>.<span class="ident">is_witness</span>() <span class="op">|</span><span class="op">|</span> <span class="ident">params</span>.<span class="ident">force_non_witness_utxo</span> {
<span class="ident">psbt_input</span>.<span class="ident">non_witness_utxo</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">prev_tx</span>);
}
}
.<span class="ident">borrow</span>()
.<span class="ident">get_path_from_script_pubkey</span>(<span class="kw-2">&</span><span class="ident">tx_output</span>.<span class="ident">script_pubkey</span>)<span class="question-mark">?</span>
{
- <span class="kw">let</span> (<span class="ident">desc</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
+ <span class="kw">let</span> (<span class="ident">desc</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">_get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
<span class="ident">psbt_output</span>.<span class="ident">hd_keypaths</span> <span class="op">=</span> <span class="ident">desc</span>.<span class="ident">get_hd_keypaths</span>(<span class="ident">child</span>, <span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>)<span class="question-mark">?</span>;
- <span class="kw">if</span> <span class="ident">builder</span>.<span class="ident">include_output_redeem_witness_script</span> {
+ <span class="kw">if</span> <span class="ident">params</span>.<span class="ident">include_output_redeem_witness_script</span> {
<span class="kw">let</span> <span class="ident">derived_descriptor</span> <span class="op">=</span> <span class="ident">desc</span>.<span class="ident">derive</span>(<span class="ident">ChildNumber</span>::<span class="ident">from_normal_idx</span>(<span class="ident">child</span>)<span class="question-mark">?</span>);
<span class="ident">psbt_output</span>.<span class="ident">witness_script</span> <span class="op">=</span> <span class="ident">derived_descriptor</span>.<span class="ident">psbt_witness_script</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>);
<span class="ident">psbt_output</span>.<span class="ident">redeem_script</span> <span class="op">=</span> <span class="ident">derived_descriptor</span>.<span class="ident">psbt_redeem_script</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>);
<span class="macro">debug</span><span class="macro">!</span>(<span class="string">"Found descriptor {:?}/{}"</span>, <span class="ident">keychain</span>, <span class="ident">child</span>);
<span class="comment">// merge hd_keypaths</span>
- <span class="kw">let</span> (<span class="ident">desc</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
+ <span class="kw">let</span> <span class="ident">desc</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_descriptor_for_keychain</span>(<span class="ident">keychain</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">hd_keypaths</span> <span class="op">=</span> <span class="ident">desc</span>.<span class="ident">get_hd_keypaths</span>(<span class="ident">child</span>, <span class="kw-2">&</span><span class="self">self</span>.<span class="ident">secp</span>)<span class="question-mark">?</span>;
<span class="ident">psbt_input</span>.<span class="ident">hd_keypaths</span>.<span class="ident">append</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">hd_keypaths</span>);
}
)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> {
@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">50_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)
},
- <span class="prelude-val">Some</span>(<span class="number">100</span>),
+ <span class="prelude-val">Some</span>(<span class="number">100</span>)
);
(<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="ident">txid</span>)
<span class="attribute">#[<span class="ident">should_panic</span>(<span class="ident">expected</span> <span class="op">=</span> <span class="string">"NoRecipients"</span>)]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_empty_recipients</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[]))
- .<span class="ident">unwrap</span>();
+ <span class="ident">wallet</span>.<span class="ident">build_tx</span>().<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_manually_selected_empty_utxos</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">manually_selected_only</span>()
- .<span class="ident">utxos</span>(<span class="macro">vec</span><span class="macro">!</span>[]),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">manually_selected_only</span>();
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_version_0</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">version</span>(<span class="number">0</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">version</span>(<span class="number">0</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_version_1_csv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_csv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">version</span>(<span class="number">1</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">version</span>(<span class="number">1</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_version</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">version</span>(<span class="number">42</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">version</span>(<span class="number">42</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">version</span>, <span class="number">42</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_default_locktime</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">lock_time</span>, <span class="number">0</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_default_locktime_cltv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_cltv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">lock_time</span>, <span class="number">100_000</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_locktime</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">nlocktime</span>(<span class="number">630_000</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">nlocktime</span>(<span class="number">630_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">lock_time</span>, <span class="number">630_000</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_locktime_compatible_with_cltv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_cltv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">nlocktime</span>(<span class="number">630_000</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">nlocktime</span>(<span class="number">630_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">lock_time</span>, <span class="number">630_000</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_locktime_incompatible_with_cltv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_cltv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">nlocktime</span>(<span class="number">50000</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">nlocktime</span>(<span class="number">50000</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_no_rbf_csv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_csv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">6</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_with_default_rbf_csv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_csv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
-
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="comment">// When CSV is enabled it takes precedence over the rbf value (unless forced by the user).</span>
<span class="comment">// It will be set to the OP_CSV value, in this case 6</span>
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">6</span>);
<span class="kw">fn</span> <span class="ident">test_create_tx_with_custom_rbf_csv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_csv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">enable_rbf_with_sequence</span>(<span class="number">3</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf_with_sequence</span>(<span class="number">3</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_no_rbf_cltv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_single_sig_cltv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">0xFFFFFFFE</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_invalid_rbf_sequence</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">enable_rbf_with_sequence</span>(<span class="number">0xFFFFFFFE</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf_with_sequence</span>(<span class="number">0xFFFFFFFE</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_rbf_sequence</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">enable_rbf_with_sequence</span>(<span class="number">0xDEADBEEF</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf_with_sequence</span>(<span class="number">0xDEADBEEF</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">0xDEADBEEF</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_default_sequence</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">0xFFFFFFFF</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_change_policy_no_internal</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">do_not_spend_change</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">do_not_spend_change</span>();
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_single_recipient_drain_wallet</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="kw">fn</span> <span class="ident">test_create_tx_default_fee_rate</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_fee_rate</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">extract_tx</span>(), <span class="ident">details</span>.<span class="ident">fees</span>, <span class="ident">FeeRate</span>::<span class="ident">default</span>(), @<span class="ident">add_signature</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_fee_rate</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>));
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_fee_rate</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">extract_tx</span>(), <span class="ident">details</span>.<span class="ident">fees</span>, <span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>), @<span class="ident">add_signature</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_absolute_fee</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">fee_absolute</span>(<span class="number">100</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">fee_absolute</span>(<span class="number">100</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span>, <span class="number">100</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="kw">fn</span> <span class="ident">test_create_tx_absolute_zero_fee</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">fee_absolute</span>(<span class="number">0</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">fee_absolute</span>(<span class="number">0</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span>, <span class="number">0</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="kw">fn</span> <span class="ident">test_create_tx_absolute_high_fee</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">_psbt</span>, <span class="ident">_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">fee_absolute</span>(<span class="number">60_000</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">fee_absolute</span>(<span class="number">60_000</span>);
+ <span class="kw">let</span> (<span class="ident">_psbt</span>, <span class="ident">_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)])
- .<span class="ident">ordering</span>(<span class="ident">TxOrdering</span>::<span class="ident">Untouched</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">ordering</span>(<span class="ident">TxOrdering</span>::<span class="ident">Untouched</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">2</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>[<span class="number">0</span>].<span class="ident">value</span>, <span class="number">25_000</span>);
<span class="kw">fn</span> <span class="ident">test_create_tx_skip_change_dust</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">49_800</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">49_800</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>[<span class="number">0</span>].<span class="ident">value</span>, <span class="number">49_800</span>);
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
<span class="comment">// very high fee rate, so that the only output would be below dust</span>
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">453.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">453.0</span>));
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_ordering_respected</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[
- (<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>),
- (<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">10_000</span>),
- ])
- .<span class="ident">ordering</span>(<span class="kw">super</span>::<span class="ident">tx_builder</span>::<span class="ident">TxOrdering</span>::<span class="ident">BIP69Lexicographic</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">10_000</span>)
+ .<span class="ident">ordering</span>(<span class="kw">super</span>::<span class="ident">tx_builder</span>::<span class="ident">TxOrdering</span>::<span class="ident">BIP69Lexicographic</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">3</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="kw">fn</span> <span class="ident">test_create_tx_default_sighash</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">30_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">sighash_type</span>, <span class="prelude-val">None</span>);
}
<span class="kw">fn</span> <span class="ident">test_create_tx_custom_sighash</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)])
- .<span class="ident">sighash</span>(<span class="ident">bitcoin</span>::<span class="ident">SigHashType</span>::<span class="ident">Single</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)
+ .<span class="ident">sighash</span>(<span class="ident">bitcoin</span>::<span class="ident">SigHashType</span>::<span class="ident">Single</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">sighash_type</span>,
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh([d34db33f/44'/0'/0']tpubDEnoLuPdBep9bzw5LoGYpsxUQYheRQ9gcgrJhJEcdKFB9cWQRyYmkCyRoTqeD4tJYiVVgt6A3rN6rWn9RYhR9sBsGxji29LYWHuKKbdb1ev/0/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">hd_keypaths</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="macro">testutils</span><span class="macro">!</span>(@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">5</span>);
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">outputs</span>[<span class="number">0</span>].<span class="ident">hd_keypaths</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"sh(pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">redeem_script</span>,
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"wsh(pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">redeem_script</span>, <span class="prelude-val">None</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"sh(wsh(pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">script</span> <span class="op">=</span> <span class="ident">Script</span>::<span class="ident">from</span>(
<span class="ident">Vec</span>::<span class="op"><</span><span class="ident">u8</span><span class="op">></span>::<span class="ident">from_hex</span>(
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"sh(pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">non_witness_utxo</span>.<span class="ident">is_some</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">witness_utxo</span>.<span class="ident">is_none</span>());
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"wsh(pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">non_witness_utxo</span>.<span class="ident">is_none</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">witness_utxo</span>.<span class="ident">is_some</span>());
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"sh(wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">non_witness_utxo</span>.<span class="ident">is_none</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">witness_utxo</span>.<span class="ident">is_some</span>());
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"wsh(pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">force_non_witness_utxo</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">force_non_witness_utxo</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">non_witness_utxo</span>.<span class="ident">is_some</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">witness_utxo</span>.<span class="ident">is_some</span>());
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_add_utxo</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="kw">let</span> <span class="ident">small_output_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">small_output_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)]).<span class="ident">add_utxo</span>(
- <span class="ident">OutPoint</span> {
- <span class="ident">txid</span>: <span class="ident">small_output_txid</span>,
- <span class="ident">vout</span>: <span class="number">0</span>,
- },
- ),
- )
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)
+ .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
+ <span class="ident">txid</span>: <span class="ident">small_output_txid</span>,
+ <span class="ident">vout</span>: <span class="number">0</span>,
+ })
.<span class="ident">unwrap</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>.<span class="ident">len</span>(),
<span class="attribute">#[<span class="ident">should_panic</span>(<span class="ident">expected</span> <span class="op">=</span> <span class="string">"InsufficientFunds"</span>)]</span>
<span class="kw">fn</span> <span class="ident">test_create_tx_manually_selected_insufficient</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="kw">let</span> <span class="ident">small_output_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">small_output_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)])
- .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
- <span class="ident">txid</span>: <span class="ident">small_output_txid</span>,
- <span class="ident">vout</span>: <span class="number">0</span>,
- })
- .<span class="ident">manually_selected_only</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)
+ .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
+ <span class="ident">txid</span>: <span class="ident">small_output_txid</span>,
+ <span class="ident">vout</span>: <span class="number">0</span>,
+ })
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">manually_selected_only</span>();
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_a_or_b_plus_csv</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">30_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">let</span> <span class="ident">path</span> <span class="op">=</span> <span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">root_id</span>, <span class="macro">vec</span><span class="macro">!</span>[<span class="number">0</span>])].<span class="ident">into_iter</span>().<span class="ident">collect</span>();
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)])
- .<span class="ident">policy_path</span>(<span class="ident">path</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)
+ .<span class="ident">policy_path</span>(<span class="ident">path</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">0xFFFFFFFF</span>);
}
<span class="kw">let</span> <span class="ident">path</span> <span class="op">=</span> <span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">root_id</span>, <span class="macro">vec</span><span class="macro">!</span>[<span class="number">1</span>])].<span class="ident">into_iter</span>().<span class="ident">collect</span>();
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)])
- .<span class="ident">policy_path</span>(<span class="ident">path</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">30_000</span>)
+ .<span class="ident">policy_path</span>(<span class="ident">path</span>, <span class="ident">KeychainKind</span>::<span class="ident">External</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">global</span>.<span class="ident">unsigned_tx</span>.<span class="ident">input</span>[<span class="number">0</span>].<span class="ident">sequence</span>, <span class="number">144</span>);
}
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh([73756c7f/48'/0'/0'/2']tpubDCKxNyM3bLgbEX13Mcd8mYxbVg9ajDkWXMh29hMWBurKfVmBfWAM96QVP3zaUcN51HvkZ3ar4VwP82kC8JZhhux8vFQoJintSpVBwpFvyU3/0/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">add_global_xpubs</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">add_global_xpubs</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">type_value</span> <span class="op">=</span> <span class="number">0x01</span>;
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">base58</span>::<span class="ident">from_check</span>(<span class="string">"tpubDCKxNyM3bLgbEX13Mcd8mYxbVg9ajDkWXMh29hMWBurKfVmBfWAM96QVP3zaUcN51HvkZ3ar4VwP82kC8JZhhux8vFQoJintSpVBwpFvyU3"</span>).<span class="ident">unwrap</span>();
<span class="kw">fn</span> <span class="ident">test_create_tx_global_xpubs_origin_missing</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh(tpubDCKxNyM3bLgbEX13Mcd8mYxbVg9ajDkWXMh29hMWBurKfVmBfWAM96QVP3zaUcN51HvkZ3ar4VwP82kC8JZhhux8vFQoJintSpVBwpFvyU3/0/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">add_global_xpubs</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">add_global_xpubs</span>();
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh(tpubD6NzVbkrYhZ4Y55A58Gv9RSNF5hy84b5AJqYy7sCcjFrkcLpPre8kmgfit6kY1Zs3BLgeypTDBZJM222guPpdz7Cup5yzaMu62u7mYGbwFL/0/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">add_global_xpubs</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">add_global_xpubs</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">type_value</span> <span class="op">=</span> <span class="number">0x01</span>;
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">base58</span>::<span class="ident">from_check</span>(<span class="string">"tpubD6NzVbkrYhZ4Y55A58Gv9RSNF5hy84b5AJqYy7sCcjFrkcLpPre8kmgfit6kY1Zs3BLgeypTDBZJM222guPpdz7Cup5yzaMu62u7mYGbwFL"</span>).<span class="ident">unwrap</span>();
<span class="kw">fn</span> <span class="ident">test_bump_fee_irreplaceable_tx</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
+
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the utxos, we know they can't be used anyways</span>
<span class="ident">details</span>.<span class="ident">transaction</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">tx</span>);
<span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">details</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>.<span class="ident">bump_fee</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="ident">TxBuilder</span>::<span class="ident">new</span>()).<span class="ident">unwrap</span>();
+ <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>().<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_confirmed_tx</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(<span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(
- <span class="ident">addr</span>.<span class="ident">script_pubkey</span>(),
- <span class="number">25_000</span>,
- )]))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>.<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
+
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the utxos, we know they can't be used anyways</span>
<span class="ident">details</span>.<span class="ident">height</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="number">42</span>);
<span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">details</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>.<span class="ident">bump_fee</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="ident">TxBuilder</span>::<span class="ident">new</span>()).<span class="ident">unwrap</span>();
+ <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>().<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_low_fee_rate</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
+
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the utxos, we know they can't be used anyways</span>
<span class="ident">details</span>.<span class="ident">transaction</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">tx</span>);
<span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">details</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">1.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">1.0</span>));
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_low_abs</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
+
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the utxos, we know they can't be used anyways</span>
<span class="ident">details</span>.<span class="ident">transaction</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">tx</span>);
<span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">details</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_absolute</span>(<span class="number">10</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_absolute</span>(<span class="number">10</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_zero_abs</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
+
<span class="kw">let</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the utxos, we know they can't be used anyways</span>
<span class="ident">details</span>.<span class="ident">transaction</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">tx</span>);
<span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">details</span>).<span class="ident">unwrap</span>();
- <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_absolute</span>(<span class="number">0</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_absolute</span>(<span class="number">0</span>);
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_reduce_change</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">2.5</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">2.5</span>));
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="kw">fn</span> <span class="ident">test_bump_fee_absolute_reduce_change</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">25_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_absolute</span>(<span class="number">200</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_absolute</span>(<span class="number">200</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="kw">fn</span> <span class="ident">test_bump_fee_reduce_single_recipient</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="kw">for</span> <span class="ident">txin</span> <span class="kw">in</span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>.<span class="ident">input</span> {
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">maintain_single_recipient</span>()
- .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">2.5</span>)),
- )
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">2.5</span>))
+ .<span class="ident">maintain_single_recipient</span>()
.<span class="ident">unwrap</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span>);
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="op">></span> <span class="ident">original_details</span>.<span class="ident">fees</span>);
<span class="kw">fn</span> <span class="ident">test_bump_fee_absolute_reduce_single_recipient</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="kw">for</span> <span class="ident">txin</span> <span class="kw">in</span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>.<span class="ident">input</span> {
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">maintain_single_recipient</span>()
- .<span class="ident">fee_absolute</span>(<span class="number">300</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">maintain_single_recipient</span>()
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">fee_absolute</span>(<span class="number">300</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span>);
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="op">></span> <span class="ident">original_details</span>.<span class="ident">fees</span>);
<span class="kw">fn</span> <span class="ident">test_bump_fee_drain_wallet</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="comment">// receive an extra tx so that our wallet has two utxos.</span>
- <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="ident">vout</span>: <span class="number">0</span>,
};
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">utxos</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">outpoint</span>])
- .<span class="ident">manually_selected_only</span>()
- .<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">add_utxo</span>(<span class="ident">outpoint</span>)
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">manually_selected_only</span>()
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="kw">for</span> <span class="ident">txin</span> <span class="kw">in</span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>.<span class="ident">input</span> {
<span class="comment">// for the new feerate, it should be enough to reduce the output, but since we specify</span>
<span class="comment">// `drain_wallet` we expect to spend everything</span>
- <span class="kw">let</span> (<span class="kw">_</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">drain_wallet</span>()
- .<span class="ident">maintain_single_recipient</span>()
- .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">drain_wallet</span>()
+ .<span class="ident">maintain_single_recipient</span>()
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>));
+ <span class="kw">let</span> (<span class="kw">_</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="number">75_000</span>);
}
<span class="kw">fn</span> <span class="ident">test_bump_fee_remove_output_manually_selected_only</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="comment">// receive an extra tx so that our wallet has two utxos. then we manually pick only one of</span>
- <span class="comment">// them, and make sure that `bump_fee` doesn't try to add more. eventually, it should fail</span>
- <span class="comment">// because the fee rate is too high and the single utxo isn't enough to create a non-dust</span>
- <span class="comment">// output</span>
- <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="comment">// them, and make sure that `bump_fee` doesn't try to add more. This fails because we've</span>
+ <span class="comment">// told the wallet it's not allowed to add more inputs AND it can't reduce the value of the</span>
+ <span class="comment">// existing output. In other words, bump_fee + manually_selected_only is always an error</span>
+ <span class="comment">// unless you've also set "maintain_single_recipient".</span>
+ <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="ident">vout</span>: <span class="number">0</span>,
};
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">utxos</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">outpoint</span>])
- .<span class="ident">manually_selected_only</span>()
- .<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">add_utxo</span>(<span class="ident">outpoint</span>)
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">manually_selected_only</span>()
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="kw">for</span> <span class="ident">txin</span> <span class="kw">in</span> <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">tx</span>.<span class="ident">input</span> {
.<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">original_details</span>.<span class="ident">sent</span>, <span class="number">25_000</span>);
- <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">utxos</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">outpoint</span>])
- .<span class="ident">manually_selected_only</span>()
- .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">225.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">manually_selected_only</span>()
+ .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">255.0</span>));
+ <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_add_input</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">50.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">50.0</span>));
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span> <span class="op">+</span> <span class="number">25_000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="op">+</span> <span class="ident">details</span>.<span class="ident">received</span>, <span class="number">30_000</span>);
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_absolute_add_input</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(<span class="kw-2">&</span><span class="ident">txid</span>, <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_absolute</span>(<span class="number">6_000</span>))
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_absolute</span>(<span class="number">6_000</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span> <span class="op">+</span> <span class="number">25_000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="op">+</span> <span class="ident">details</span>.<span class="ident">received</span>, <span class="number">30_000</span>);
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_no_change_add_input_and_change</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="comment">// initially make a tx without change by using `set_single_recipient`</span>
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
- <span class="ident">txid</span>: <span class="ident">incoming_txid</span>,
- <span class="ident">vout</span>: <span class="number">0</span>,
- })
- .<span class="ident">manually_selected_only</span>()
- .<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
+ <span class="ident">txid</span>: <span class="ident">incoming_txid</span>,
+ <span class="ident">vout</span>: <span class="number">0</span>,
+ })
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">manually_selected_only</span>()
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
+
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
<span class="comment">// now bump the fees without using `maintain_single_recipient`. the wallet should add an</span>
<span class="comment">// extra input and a change output, and leave the original output untouched</span>
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">50.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">50.0</span>));
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">original_send_all_amount</span> <span class="op">=</span> <span class="ident">original_details</span>.<span class="ident">sent</span> <span class="op">-</span> <span class="ident">original_details</span>.<span class="ident">fees</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span> <span class="op">+</span> <span class="number">50_000</span>);
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_add_input_change_dust</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">tx</span>.<span class="ident">input</span>.<span class="ident">len</span>(), <span class="number">1</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">tx</span>.<span class="ident">output</span>.<span class="ident">len</span>(), <span class="number">2</span>);
.<span class="ident">set_tx</span>(<span class="kw-2">&</span><span class="ident">original_details</span>)
.<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>().<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">140.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>.<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">140.0</span>));
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">original_details</span>.<span class="ident">received</span>, <span class="number">5_000</span> <span class="op">-</span> <span class="ident">original_details</span>.<span class="ident">fees</span>);
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_force_add_input</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
<span class="comment">// the new fee_rate is low enough that just reducing the change would be fine, but we force</span>
<span class="comment">// the addition of an extra input with `add_utxo()`</span>
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
- <span class="ident">txid</span>: <span class="ident">incoming_txid</span>,
- <span class="ident">vout</span>: <span class="number">0</span>,
- })
- .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>)),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
+ <span class="ident">txid</span>: <span class="ident">incoming_txid</span>,
+ <span class="ident">vout</span>: <span class="number">0</span>,
+ })
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">fee_rate</span>(<span class="ident">FeeRate</span>::<span class="ident">from_sat_per_vb</span>(<span class="number">5.0</span>));
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span> <span class="op">+</span> <span class="number">25_000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="op">+</span> <span class="ident">details</span>.<span class="ident">received</span>, <span class="number">30_000</span>);
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_bump_fee_absolute_force_add_input</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="ident">descriptors</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
- <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>().<span class="ident">received_tx</span>(
+ <span class="kw">let</span> <span class="ident">incoming_txid</span> <span class="op">=</span> <span class="kw">crate</span>::<span class="macro">populate_test_db</span><span class="macro">!</span>(
+ <span class="ident">wallet</span>.<span class="ident">database</span>.<span class="ident">borrow_mut</span>(),
<span class="macro">testutils</span><span class="macro">!</span> (@<span class="ident">tx</span> ( (@<span class="ident">external</span> <span class="ident">descriptors</span>, <span class="number">0</span>) <span class="op">=</span><span class="op">></span> <span class="number">25_000</span> ) (@<span class="ident">confirmations</span> <span class="number">1</span>)),
<span class="prelude-val">Some</span>(<span class="number">100</span>),
);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)]).<span class="ident">enable_rbf</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">enable_rbf</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw-2">mut</span> <span class="ident">original_details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tx</span> <span class="op">=</span> <span class="ident">psbt</span>.<span class="ident">extract_tx</span>();
<span class="kw">let</span> <span class="ident">txid</span> <span class="op">=</span> <span class="ident">tx</span>.<span class="ident">txid</span>();
<span class="comment">// skip saving the new utxos, we know they can't be used anyways</span>
<span class="comment">// the new fee_rate is low enough that just reducing the change would be fine, but we force</span>
<span class="comment">// the addition of an extra input with `add_utxo()`</span>
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">bump_fee</span>(
- <span class="kw-2">&</span><span class="ident">txid</span>,
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
- <span class="ident">txid</span>: <span class="ident">incoming_txid</span>,
- <span class="ident">vout</span>: <span class="number">0</span>,
- })
- .<span class="ident">fee_absolute</span>(<span class="number">250</span>),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_fee_bump</span>(<span class="ident">txid</span>).<span class="ident">unwrap</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_utxo</span>(<span class="ident">OutPoint</span> {
+ <span class="ident">txid</span>: <span class="ident">incoming_txid</span>,
+ <span class="ident">vout</span>: <span class="number">0</span>,
+ })
+ .<span class="ident">unwrap</span>()
+ .<span class="ident">fee_absolute</span>(<span class="number">250</span>);
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="ident">details</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">sent</span>, <span class="ident">original_details</span>.<span class="ident">sent</span> <span class="op">+</span> <span class="number">25_000</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">details</span>.<span class="ident">fees</span> <span class="op">+</span> <span class="ident">details</span>.<span class="ident">received</span>, <span class="number">30_000</span>);
<span class="kw">fn</span> <span class="ident">test_sign_single_xprv</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> (<span class="ident">signed_psbt</span>, <span class="ident">finalized</span>) <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">sign</span>(<span class="ident">psbt</span>, <span class="prelude-val">None</span>).<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">finalized</span>, <span class="bool-val">true</span>);
<span class="kw">fn</span> <span class="ident">test_sign_single_xprv_bip44_path</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/44'/0'/0'/0/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> (<span class="ident">signed_psbt</span>, <span class="ident">finalized</span>) <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">sign</span>(<span class="ident">psbt</span>, <span class="prelude-val">None</span>).<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">finalized</span>, <span class="bool-val">true</span>);
<span class="kw">fn</span> <span class="ident">test_sign_single_xprv_sh_wpkh</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"sh(wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> (<span class="ident">signed_psbt</span>, <span class="ident">finalized</span>) <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">sign</span>(<span class="ident">psbt</span>, <span class="prelude-val">None</span>).<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">finalized</span>, <span class="bool-val">true</span>);
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span>
<span class="ident">get_funded_wallet</span>(<span class="string">"wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> (<span class="ident">signed_psbt</span>, <span class="ident">finalized</span>) <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">sign</span>(<span class="ident">psbt</span>, <span class="prelude-val">None</span>).<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">finalized</span>, <span class="bool-val">true</span>);
<span class="kw">fn</span> <span class="ident">test_sign_single_xprv_no_hd_keypaths</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">get_new_address</span>().<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">new</span>()
- .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
- .<span class="ident">drain_wallet</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">set_single_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>())
+ .<span class="ident">drain_wallet</span>();
+ <span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">hd_keypaths</span>.<span class="ident">clear</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">psbt</span>.<span class="ident">inputs</span>[<span class="number">0</span>].<span class="ident">hd_keypaths</span>.<span class="ident">len</span>(), <span class="number">0</span>);
<span class="kw">fn</span> <span class="ident">test_include_output_redeem_witness_script</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="string">"sh(wsh(multi(1,cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW,cRjo6jqfVNP33HhSS76UhXETZsGTZYx8FMFvR9kpbtCSV1PmdZdu)))"</span>);
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)])
- .<span class="ident">include_output_redeem_witness_script</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">include_output_redeem_witness_script</span>();
+ <span class="kw">let</span> (<span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="comment">// p2sh-p2wsh transaction should contain both witness and redeem scripts</span>
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">psbt</span>
<span class="kw">fn</span> <span class="ident">test_signing_only_one_of_multiple_inputs</span>() {
<span class="kw">let</span> (<span class="ident">wallet</span>, <span class="kw">_</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">get_funded_wallet</span>(<span class="ident">get_test_wpkh</span>());
<span class="kw">let</span> <span class="ident">addr</span> <span class="op">=</span> <span class="ident">Address</span>::<span class="ident">from_str</span>(<span class="string">"2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX"</span>).<span class="ident">unwrap</span>();
- <span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">wallet</span>
- .<span class="ident">create_tx</span>(
- <span class="ident">TxBuilder</span>::<span class="ident">with_recipients</span>(<span class="macro">vec</span><span class="macro">!</span>[(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)])
- .<span class="ident">include_output_redeem_witness_script</span>(),
- )
- .<span class="ident">unwrap</span>();
+ <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">builder</span> <span class="op">=</span> <span class="ident">wallet</span>.<span class="ident">build_tx</span>();
+ <span class="ident">builder</span>
+ .<span class="ident">add_recipient</span>(<span class="ident">addr</span>.<span class="ident">script_pubkey</span>(), <span class="number">45_000</span>)
+ .<span class="ident">include_output_redeem_witness_script</span>();
+ <span class="kw">let</span> (<span class="kw-2">mut</span> <span class="ident">psbt</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">builder</span>.<span class="ident">finish</span>().<span class="ident">unwrap</span>();
<span class="comment">// add another input to the psbt that is at least passable.</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">dud_input</span> <span class="op">=</span> <span class="ident">bitcoin</span>::<span class="ident">util</span>::<span class="ident">psbt</span>::<span class="ident">Input</span>::<span class="ident">default</span>();