Constructs a Discovery instance. Discovery is used to discover funds in a Bitcoin network using descriptors.
OptionaldescriptorsCacheSize?: numberCache size limit for descriptor expressions. The cache is used to speed up data queries by avoiding unnecessary recomputations. However, it is essential to manage the memory usage of the application. If the cache size is unbounded, it could lead to excessive memory usage and degrade the application's performance, especially when dealing with a large number of descriptor expressions. On the other hand, a very small cache size may lead to more frequent cache evictions, causing the library to return a different reference for the same data when the same method is called multiple times, even if the underlying data has not changed. This is contrary to the immutability principles that the library is built upon. Ultimately, this limit acts as a trade-off between memory usage, computational efficiency, and immutability. Set to 0 for unbounded caches.
OptionaloutputsPerDescriptorCacheSize?: numberCache size limit for outputs per descriptor, related to the number of outputs
in ranged descriptor expressions. Similar to the descriptorsCacheSize,
this cache is used to speed up data queries and avoid recomputations.
As each descriptor can have multiple indices (if ranged), the number of outputs can grow rapidly,
leading to increased memory usage. Setting a limit helps keep memory usage in check,
while also maintaining the benefits of immutability and computational efficiency.
Set to 0 for unbounded caches.
Optionalimported?: { discoveryData: DiscoveryData; version: string }Optional parameter used to initialize the Discovery instance with
previously exported data with
export(). This allows for the
continuation of a previous discovery process. The imported object
should contain discoveryData and a version string. The
discoveryData is deeply cloned upon import to ensure that the
internal state of the Discovery instance is isolated from
external changes. The version is used to verify that the imported
data model is compatible with the current version of the Discovery
class.
Asynchronously fetches one or more descriptor expressions, retrieving all the historical txs associated with the outputs represented by the expressions.
Optionaldescriptor?: stringDescriptor expression representing one or potentially multiple outputs
if ranged.
Use either descriptor or descriptors, but not both simultaneously.
Optionalindex?: numberAn optional index associated with a ranged descriptor. Not applicable
when using the descriptors array, even if its elements are ranged.
Optionaldescriptors?: string[]Array of descriptor expressions. Use either descriptors or descriptor,
but not both simultaneously.
OptionalgapLimit?: numberThe gap limit for the fetch operation when retrieving ranged descriptors.
OptionalonUsed?: (descriptorOrDescriptors: string | string[]) => Promise<void>Optional callback function triggered once a descriptor's output has been identified as previously used in a transaction. It provides a way to react or perform side effects based on this finding.
OptionalonChecking?: (descriptorOrDescriptors: string | string[]) => Promise<void>Optional callback function invoked at the beginning of checking a descriptor to determine its usage status. This can be used to signal the start of a descriptor's check, potentially for logging or UI updates.
OptionalonProgress?: (descriptor: string, index: DescriptorIndex) => Promise<boolean | void>Optional callback function invoked for each output (address index) being checked for a descriptor. This is called before fetching data for the output.
Optionalnext?: () => Promise<void>Optional function triggered immediately after detecting that a descriptor's output
has been used previously. By invoking this function, it's possible to initiate
parallel discovery processes. The primary discover method will only resolve
once both its main discovery process and any supplementary processes initiated
by next have completed. Essentially, it ensures that all discovery,
both primary and secondary, finishes before moving on.
Resolves when the fetch operation completes. If used expressions are found, waits for the discovery of associated transactions.
Retrieves the fetching status and the timestamp of the last fetch for a descriptor.
Use this function to check if the data for a specific descriptor, or an index within a ranged descriptor, is currently being fetched or has been fetched.
This function also helps to avoid errors when attempting to derive data from descriptors with incomplete data,
ensuring that subsequent calls to data derivation methods such as getUtxos or
getBalance only occur once the necessary data has been successfully retrieved (and does not return undefined).
Descriptor expression representing one or potentially multiple outputs if ranged.
Optionalindex?: numberAn optional index associated with a ranged descriptor.
An object with the fetching status (fetching) and the last
fetch time (timeFetched), or undefined if never fetched.
Asynchronously discovers standard accounts (pkh, sh(wpkh), wpkh) associated with a master node. It uses a given gap limit for discovery.
The master node to discover accounts from.
OptionalgapLimit?: numberThe gap limit for address discovery
OptionalonAccountUsed?: (account: string) => Promise<void>Optional callback function triggered when an account
(associated with the master node) has been identified as having past
transactions. It's called with the external descriptor
of the account (keyPath = /0/*) that is active.
OptionalonAccountChecking?: (account: string) => Promise<void>Optional callback function invoked just as the system starts to evaluate the transaction activity of an account (associated with the master node). Useful for signaling the initiation of the discovery process for a particular account, often for UI updates or logging purposes.
OptionalonAccountProgress?: (Optional callback function invoked for each output (address index) being checked for an account's descriptors (external and internal).
Resolves when all the standrd accounts from the master node have been discovered.
Retrieves the array of descriptors with used outputs. The result is cached based on the size specified in the constructor. As long as this cache size is not exceeded, this function will maintain the same object reference if the returned array hasn't changed. This characteristic can be particularly beneficial in React and similar projects, where re-rendering occurs based on reference changes.
Returns an array of descriptor expressions. These are derived from the discovery information.
Retrieves all the accounts with used outputs:
those descriptors with keyPaths ending in {/0/*, /1/*}. An account is identified
by its external descriptor keyPath = /0/*. The result is cached based on
the size specified in the constructor. As long as this cache size is not
exceeded, this function will maintain the same object reference if the returned array remains unchanged.
This characteristic can be especially beneficial in
React or similar projects, where re-rendering occurs based on reference changes.
An array of accounts, each represented as its external descriptor expression.
Retrieves descriptor expressions associated with a specific account. The result is cached based on the size specified in the constructor. As long as this cache size is not exceeded, this function will maintain the same object reference. This characteristic can be especially beneficial in React or similar projects, where re-rendering occurs based on reference changes.
The account associated with the descriptors.
An array of descriptor expressions associated with the specified account.
Retrieves unspent transaction outputs (UTXOs) and balance associated with one or more descriptor expressions and transaction status. In addition it also retrieves spent transaction outputs (STXOS) which correspond to previous UTXOs that have been spent.
This method is useful for accessing the available funds for specific descriptor expressions in the wallet, considering the transaction status (confirmed, unconfirmed, or both).
The return value is computed based on the current state of discoveryData. The method uses memoization to maintain the same object reference for the returned result, given the same input parameters, as long as the corresponding UTXOs in discoveryData haven't changed. This can be useful in environments such as React where preserving object identity can prevent unnecessary re-renders.
An object containing the UTXOs associated with the
scriptPubKeys and the total balance of these UTXOs.
It also returns previous UTXOs that had been
eventually spent as stxos: ArraytxoMap. txoMap maps all the txos (unspent or spent
outputs) with their corresponding indexedDescriptor: IndexedDescriptor
(see IndexedDescriptor)
Convenience function which internally invokes the
getUtxosAndBalance(options).balance method.
Convenience function which internally invokes the
getUtxosAndBalance(options).utxos method.
Retrieves the next available index for a given descriptor.
The method retrieves the currently highest index used, and returns the next available index by incrementing it by 1.
The next available index.
Retrieves the transaction history for one or more descriptor expressions.
This method accesses transaction records associated with descriptor expressions and transaction status.
When withAttributions is false, it returns an array of historical transactions
(Array<TxData>). See TxData.
To determine if each transaction corresponds to a sent/received transaction, set
withAttributions to true.
When withAttributions is true, this function returns an array of
TxAttribution elements.
TxAttribution identifies the owner of the previous output for each input and
the owner of the output for each transaction.
This is useful in wallet applications to specify whether inputs are from owned outputs (e.g., change from a previous transaction) or from third parties. It also specifies if outputs are destined to third parties or are internal change. This helps wallet apps show transaction history with "Sent" or "Received" labels, considering only transactions with third parties.
See TxAttribution for a complete list of items returned per transaction.
The return value is computed based on the current state of discoveryData. The
method uses memoization to maintain the same object reference for the returned
result, given the same input parameters, as long as the corresponding transaction
records in discoveryData haven't changed.
This can be useful in environments such as React, where preserving object identity can prevent unnecessary re-renders.
Criteria for selecting transaction outputs, including descriptor expressions, transaction status, and whether to include attributions.
Whether to include attributions in the returned data.
An array containing transaction information associated with the descriptor expressions.
Retrieves the hexadecimal representation of a transaction (TxHex) from the discoveryData given the transaction ID (TxId) or a Unspent Transaction Output (Utxo)
OptionaltxId?: stringThe transaction ID.
Optionalutxo?: stringThe UTXO.
The hexadecimal representation of the transaction.
Retrieves the transaction data as a bitcoinjs-lib Transaction object given the transaction ID (TxId) or a Unspent Transaction Output (Utxo) or the hexadecimal representation of the transaction (it will then use memoization). The transaction data is obtained by first getting the transaction hexadecimal representation using getTxHex() method (unless the txHex was passed).
Use this method for quick access to the Transaction object, which avoids the need to parse the transaction hexadecimal representation (txHex). The data will have already been computed and cached for efficiency within the Discovery class.
OptionaltxId?: stringThe transaction ID.
OptionaltxHex?: stringThe transaction txHex.
Optionalutxo?: stringThe UTXO.
The transaction data as a Transaction object.
Compares two transactions based on their blockHeight and input dependencies. Can be used as callback in Array.sort function to sort from old to new.
< 0 if txWithOrderA is older than txWithOrderB, > 0 if txWithOrderA is newer than txWithOrderB, and 0 if undecided.
Given an unspent tx output, this function retrieves its descriptor (if still unspent).
Alternatively, pass a txo (any transaction output, which may have been
spent already or not) and this function will also retrieve its descriptor.
txo can be in any of these formats: ${txId}:${vout} or
using its extended form: ${txId}:${vout}:${recipientTxId}:${recipientVin}
Returns the descriptor (and index if ranged) or undefined if not found.
Optionalutxo?: stringThe UTXO.
Optionaltxo?: stringPushes a transaction to the network and updates the internal state.
This function first broadcasts the transaction using the configured explorer.
It then attempts to update the internal discoveryData by calling
addTransaction.
If addTransaction reports that one or more inputs of the pushed transaction
were already considered spent by other transactions in the library's records
(e.g., in an RBF scenario or a double-spend attempt already known to the
library), push will automatically attempt to synchronize the state. It
does this by calling fetch on all unique descriptors associated with the
conflicting input(s). This helps ensure the library's state reflects the
most current information from the blockchain/mempool regarding these conflicts.
The gapLimit parameter is used both when addTransaction is called and
during any subsequent automatic fetch operation triggered by conflicts.
It helps discover new outputs (e.g., change addresses) that might become
active due to the transaction.
Note: The success of broadcasting the transaction via explorer.push(txHex)
depends on the network and node policies. Even if broadcast is successful,
the transaction might not be immediately visible in the mempool or might be
replaced. A warning is logged if the transaction is not found in the
mempool shortly after being pushed. The final state in the library will
reflect the outcome of the internal addTransaction call and any
automatic synchronization that occurred.
The hexadecimal representation of the transaction to push.
OptionalgapLimit?: numberThe gap limit for descriptor discovery. Defaults to 20.
Given a transaction it updates the internal discoveryData state to
include it.
This function is useful when a transaction affecting one of the
descriptors has been pushed to the blockchain by a third party. It allows
updating the internal representation without performing a more expensive
fetch operation.
If the transaction was recently pushed to the blockchain, set
txData.irreversible = false and txData.blockHeight = 0.
The transaction is represented by txData, where
txData = { blockHeight: number; irreversible: boolean; txHex: TxHex; }.
It includes its hexadecimal representation txHex, its blockHeight
(zero if it's in the mempool), and whether it is irreversible or
not. irreversible is set by the Explorer, using the configuration parameter
irrevConfThresh (defaults to IRREV_CONF_THRESH = 3). It can be obtained
by calling explorer.fetchTxHistory(), for example. Set it to
false when it's been just pushed (which will be the typical use of this
function).
The gapLimit parameter is essential for managing descriptor discovery.
When addint a transaction, there is a possibility the transaction is
adding new funds as change (for example). If the range for that index
does not exist yet, the gapLimit helps to update the descriptor
corresponding to a new UTXO for new indices within the gap limit.
This function updates the internal discoveryData state to include the
provided transaction, but only if it doesn't attempt to spend outputs
already considered spent by the library.
It first checks all inputs of the transaction. If any input corresponds to
a txo (a previously known output) that is not a current utxo
(i.e., it's already considered spent by another transaction in the
library's records), this function will not modify the library state.
Instead, it will return an object detailing all such conflicting inputs.
This allows the caller (e.g., the push method) to handle these
conflicts, for instance, by re-fetching the state of all affected descriptors.
If no such input conflicts are found, the transaction is processed:
its details are added to the txMap, and relevant txIds are associated
with the OutputData of both its inputs (if owned) and outputs (if owned).
For other types of errors (e.g., invalid input data), it may still throw.
Refer to the push method's documentation for how it utilizes this
return status for automatic state synchronization.
An object indicating the outcome:
- { success: true } if the transaction was added without conflicts.
- { success: false; reason: 'INPUTS_ALREADY_SPENT'; conflicts: Array<{ descriptor: Descriptor; txo: Utxo; index?: number }> }
if one or more inputs of the transaction were already considered spent.
conflicts contains an array of all such detected conflicts.
Retrieves the Explorer instance.
The Explorer instance.
Exports the current state of the Discovery instance.
This method is used to serialize the state of the Discovery instance so
that it can be saved and potentially re-imported later using the
imported parameter in the constructor.
The exported data includes a version string and a deep clone of the internal discovery data. The deep cloning process ensures that the exported data is a snapshot of the internal state, isolated from future changes to the Discovery instance. This isolation maintains the integrity and immutability of the exported data.
The inclusion of a version string in the exported data allows for compatibility checks when re-importing the data. This check ensures that the data model of the imported data is compatible with the current version of the Discovery class.
The exported data is guaranteed to be serializable, allowing it to be safely stored or transmitted. It can be serialized using JSON.stringify or other serialization methods, such as structured serialization (https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal). This feature ensures that the data can be serialized and deserialized without loss of integrity, facilitating data persistence and transfer across different sessions or environments.
An object containing the version string and the serialized discovery data.
A class to discover funds in a Bitcoin network using descriptors. The
DiscoveryFactoryfunction internally creates and returns an instance of this class. The returned class is specialized for the providedExplorer, which is responsible for fetching blockchain data like transaction details.