9#include <chainparams.h>
23#include <validation.h>
37 "Submits raw transaction (serialized, hex-encoded) to local node and "
39 "\nAlso see createrawtransaction and "
40 "signrawtransactionwithkey calls.\n",
43 "The hex string of the raw transaction"},
47 "Reject transactions whose fee rate is higher than the specified "
48 "value, expressed in " +
50 "/kB\nSet to 0 to accept any fee rate.\n"},
54 "\nCreate a transaction\n" +
56 "createrawtransaction",
57 "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" "
58 "\"{\\\"myaddress\\\":10000}\"") +
59 "Sign the transaction, and get back the hex\n" +
61 "\nSend the transaction (signed hex)\n" +
63 "\nAs a JSON-RPC call\n" +
69 if (!
DecodeHexTx(mtx, request.params[0].get_str())) {
77 request.params[1].isNull()
82 Amount max_raw_tx_fee = max_raw_tx_fee_rate.
GetFee(virtual_size);
84 std::string err_string;
88 node, tx, err_string, max_raw_tx_fee,
true,
90 if (err != TransactionError::OK) {
97 return tx->GetHash().GetHex();
106 "\nReturns result of mempool acceptance tests indicating if raw "
107 "transaction(s) (serialized, hex-encoded) would be accepted by "
109 "\nIf multiple transactions are passed in, parents must come before "
110 "children and package policies apply: the transactions cannot conflict "
111 "with any mempool transactions or each other.\n"
112 "\nIf one transaction fails, other transactions may not be fully "
113 "validated (the 'allowed' key will be blank).\n"
114 "\nThe maximum number of transactions allowed is " +
117 "\nThis checks if transactions violate the consensus or policy "
119 "\nSee sendrawtransaction call.\n",
125 "An array of hex strings of raw transactions.",
134 "Reject transactions whose fee rate is higher than the specified "
135 "value, expressed in " +
141 "The result of the mempool acceptance test for each raw "
142 "transaction in the input array.\n"
143 "Returns results for each transaction in the same order they were "
145 "Transactions that cannot be fully validated due to failures in "
146 "other transactions will not contain an 'allowed' result.\n",
153 "The transaction hash in hex"},
155 "Package validation error, if any (only possible if "
156 "rawtxs had more than 1 transaction)."},
158 "Whether this tx would be accepted to the mempool and "
159 "pass client-specified maxfeerate. "
160 "If not present, the tx was not fully validated due to a "
161 "failure in another tx in the list."},
165 "Transaction fees (only present if 'allowed' is true)",
168 "transaction fee in " + ticker},
170 "the effective feerate in " + ticker +
171 " per KvB. May differ from the base feerate if, "
172 "for example, there are modified fees from "
173 "prioritisetransaction or a package feerate was "
176 "effective-includes",
177 "transactions whose fees and vsizes are included in "
178 "effective-feerate.",
181 "transaction txid in hex"},
185 "Rejection string (only present when 'allowed' is "
188 "Rejection details (only present when 'allowed' is false "
189 "and rejection details exist)"},
194 "\nCreate a transaction\n" +
196 "createrawtransaction",
197 "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" "
198 "\"{\\\"myaddress\\\":10000}\"") +
199 "Sign the transaction, and get back the hex\n" +
201 "\nTest acceptance of the transaction (signed hex)\n" +
203 "\nAs a JSON-RPC call\n" +
208 if (raw_transactions.
size() < 1 ||
211 "Array must contain between 1 and " +
216 const CFeeRate max_raw_tx_fee_rate =
217 request.params[1].isNull()
221 std::vector<CTransactionRef> txns;
222 txns.reserve(raw_transactions.
size());
223 for (
const auto &rawtx : raw_transactions.
getValues()) {
227 "TX decode failed: " + rawtx.get_str());
238 if (txns.size() > 1) {
254 bool exit_early{
false};
255 for (
const auto &tx : txns) {
257 result_inner.
pushKV(
"txid", tx->GetId().GetHex());
264 auto it = package_result.
m_tx_results.find(tx->GetId());
265 if (exit_early || it == package_result.
m_tx_results.end()) {
267 rpc_result.
push_back(std::move(result_inner));
270 const auto &tx_result = it->second;
275 if (tx_result.m_result_type ==
277 const Amount fee = tx_result.m_base_fees.value();
279 const int64_t virtual_size = tx_result.m_vsize.value();
280 const Amount max_raw_tx_fee =
281 max_raw_tx_fee_rate.
GetFee(virtual_size);
283 fee > max_raw_tx_fee) {
284 result_inner.
pushKV(
"allowed",
false);
285 result_inner.
pushKV(
"reject-reason",
292 result_inner.
pushKV(
"allowed",
true);
293 result_inner.
pushKV(
"size", virtual_size);
298 tx_result.m_effective_feerate.value().GetFeePerK());
300 for (
const auto &txid :
301 tx_result.m_txids_fee_calculations.value()) {
302 effective_includes_res.
push_back(txid.ToString());
304 fees.
pushKV(
"effective-includes",
305 std::move(effective_includes_res));
306 result_inner.
pushKV(
"fees", std::move(fees));
309 result_inner.
pushKV(
"allowed",
false);
313 result_inner.
pushKV(
"reject-reason",
"missing-inputs");
315 result_inner.
pushKV(
"reject-reason",
320 rpc_result.
push_back(std::move(result_inner));
332 "local time transaction entered pool in seconds since 1 Jan "
335 "block height when transaction entered pool"},
341 "transaction fee in " + ticker},
343 "transaction fee with fee deltas used for "
344 "mining priority in " +
350 "unconfirmed transactions used as inputs for this transaction",
352 "parent transaction id"}}},
356 "unconfirmed transactions spending outputs from this transaction",
358 "child transaction id"}}},
360 "Whether this transaction is currently unbroadcast (initial "
361 "broadcast not yet acknowledged by any peers)"},
371 fees.
pushKV(
"base", e->GetFee());
372 fees.
pushKV(
"modified", e->GetModifiedFee());
373 info.pushKV(
"fees", fees);
375 info.pushKV(
"size", (
int)e->GetTxSize());
377 info.pushKV(
"height", (
int)e->GetHeight());
378 const CTransaction &tx = e->GetTx();
379 std::set<std::string> setDepends;
380 for (
const CTxIn &txin : tx.vin) {
381 if (pool.exists(txin.prevout.GetTxId())) {
382 setDepends.insert(txin.prevout.GetTxId().ToString());
387 for (
const std::string &dep : setDepends) {
391 info.pushKV(
"depends", std::move(depends));
394 for (
const auto &child : e->GetMemPoolChildrenConst()) {
395 spent.
push_back(child.get()->GetTx().GetId().ToString());
398 info.pushKV(
"spentby", std::move(spent));
399 info.pushKV(
"unbroadcast", pool.IsUnbroadcastTx(tx.GetId()));
403 bool include_mempool_sequence) {
405 if (include_mempool_sequence) {
408 "Verbose results cannot contain mempool sequence values.");
413 const TxId &txid = e->GetTx().GetId();
423 uint64_t mempool_sequence;
424 std::vector<TxId> vtxids;
431 for (
const TxId &txid : vtxids) {
435 if (!include_mempool_sequence) {
439 o.
pushKV(
"txids", std::move(a));
440 o.
pushKV(
"mempool_sequence", mempool_sequence);
449 "Returns all transaction ids in memory pool as a json array of "
450 "string transaction ids.\n"
451 "\nHint: use getmempoolentry to fetch a specific transaction from the "
455 "True for a json object, false for array of transaction ids"},
457 "If verbose=false, returns a json object with transaction list "
458 "and mempool sequence number attached."},
477 "for verbose = false and mempool_sequence = true",
489 "The mempool sequence value."},
496 bool fVerbose =
false;
497 if (!request.params[0].isNull()) {
498 fVerbose = request.params[0].
get_bool();
501 bool include_mempool_sequence =
false;
502 if (!request.params[1].isNull()) {
503 include_mempool_sequence = request.params[1].get_bool();
507 include_mempool_sequence);
514 "getmempoolancestors",
515 "If txid is in the mempool, returns all in-mempool ancestors.\n",
518 "The transaction id (must be in mempool)"},
520 "True for a json object, false for array of transaction ids"},
524 "for verbose = false",
529 "The transaction id of an in-mempool ancestor transaction"}}},
543 bool fVerbose =
false;
544 if (!request.params[1].isNull()) {
545 fVerbose = request.params[1].
get_bool();
554 if (it == mempool.mapTx.end()) {
556 "Transaction not in mempool");
565 o.
push_back((*ancestorIt)->GetTx().GetId().ToString());
572 const TxId &_txid = e->GetTx().GetId();
585 "getmempooldescendants",
586 "If txid is in the mempool, returns all in-mempool descendants.\n",
589 "The transaction id (must be in mempool)"},
591 "True for a json object, false for array of transaction ids"},
599 "The transaction id of an in-mempool descendant "
614 bool fVerbose =
false;
615 if (!request.params[1].isNull()) {
616 fVerbose = request.params[1].
get_bool();
625 if (it == mempool.mapTx.end()) {
627 "Transaction not in mempool");
633 setDescendants.erase(it);
638 o.
push_back((*descendantIt)->GetTx().GetId().ToString());
646 const TxId &_txid = e->GetTx().GetId();
660 "Returns mempool data for given transaction\n",
663 "The transaction id (must be in mempool)"},
676 if (it == mempool.mapTx.end()) {
678 "Transaction not in mempool");
697 ret.
pushKV(
"finalized_txs_sigchecks",
714 "Returns details on the active state of the TX memory pool.\n",
722 "True if the initial load attempt of the persisted mempool "
727 "Current finalized tx count"},
729 "Sum of all finalized transaction sizes"},
731 "Sum of all finalized transaction sigchecks"},
733 "Total memory usage for the mempool"},
735 "Maximum memory usage for the mempool"},
737 "Total fees for the mempool in " + ticker +
738 ", ignoring modified fees through prioritizetransaction"},
740 "Minimum fee rate in " + ticker +
741 "/kB for tx to be accepted. Is the maximum of "
742 "minrelaytxfee and minimum mempool fee"},
744 "Current minimum relay fee for transactions"},
746 "Current number of transactions that haven't passed initial "
761 "Import a mempool.dat file and attempt to add its contents to the "
763 "Warning: Importing untrusted files is dangerous, especially if "
764 "metadata from the file is taken over.",
774 "Whether to use the current system time or use the entry "
775 "time metadata from the mempool file.\n"
776 "Warning: Importing untrusted metadata may lead to "
777 "unexpected issues and undesirable behavior."},
780 "Whether to apply the fee delta metadata from the mempool "
782 "It will be added to any existing fee deltas.\n"
783 "The fee delta can be set by the prioritisetransaction RPC.\n"
784 "Warning: Importing untrusted metadata may lead to "
785 "unexpected issues and undesirable behavior.\n"
786 "Only set this bool if you understand what it does."},
789 "Whether to apply the unbroadcast set metadata from the "
791 "Warning: Importing untrusted metadata may lead to "
792 "unexpected issues and undesirable behavior."},
809 "Can only import the mempool after the "
810 "block download and sync is done.");
815 request.params[1][
"use_current_time"]};
817 request.params[1][
"apply_fee_delta_priority"]};
819 request.params[1][
"apply_unbroadcast_set"]};
823 : use_current_time.get_bool(),
824 .apply_fee_delta_priority = apply_fee_delta.isNull()
826 : apply_fee_delta.get_bool(),
827 .apply_unbroadcast_set = apply_unbroadcast.isNull()
829 : apply_unbroadcast.get_bool(),
835 "Unable to import mempool file, see "
836 "debug.log for details.");
848 "Dumps the mempool to disk. It will fail until the previous dump is "
856 "the directory and file where the mempool was saved"},
867 "The mempool was not loaded yet");
874 "Unable to dump mempool to disk");
889 "Submit a package of raw transactions (serialized, hex-encoded) to "
891 "The package must consist of a child with its parents, and none of the "
892 "parents may depend on one another.\n"
893 "The package will be validated according to consensus and mempool "
894 "policy rules. If any transaction passes, it will be accepted to "
896 "This RPC is experimental and the interface may be unstable. Refer to "
897 "doc/policy/packages.md for documentation on package policies.\n"
898 "Warning: successful submission does not mean the transactions will "
899 "propagate throughout the network.\n",
905 "An array of raw transactions.",
918 "The transaction package result message. \"success\" "
919 "indicates all transactions were accepted into or are already "
923 "transaction results keyed by txid",
929 "Virtual transaction size."},
936 "transaction fee in " + ticker},
938 "the effective feerate in " + ticker +
939 " per KvB. May differ from the base feerate "
940 "if, for example, there are modified fees "
941 "from prioritisetransaction or a package "
942 "feerate was used."},
944 "effective-includes",
945 "transactions whose fees and vsizes are included "
946 "in effective-feerate.",
949 "transaction txid in hex"},
953 "The transaction error string, if it was rejected by "
963 if (raw_transactions.
size() < 1 ||
966 "Array must contain between 1 and " +
971 std::vector<CTransactionRef> txns;
972 txns.reserve(raw_transactions.
size());
973 for (
const auto &rawtx : raw_transactions.
getValues()) {
978 "TX decode failed: " + rawtx.get_str() +
979 " Make sure the tx has at least one input.");
985 TransactionError::INVALID_PACKAGE,
986 "package topology disallowed. not child-with-parents or "
987 "parents depend on each other.");
997 std::string package_msg =
"success";
1000 switch (package_result.m_state.GetResult()) {
1006 for (
const auto &tx : txns) {
1015 TransactionError::MEMPOOL_ERROR,
1016 package_result.m_state.GetRejectReason());
1022 package_msg = package_result.m_state.GetRejectReason();
1025 package_result.m_tx_results.empty());
1029 size_t num_broadcast{0};
1030 for (
const auto &tx : txns) {
1033 if (!mempool.
exists(tx->GetId())) {
1039 std::string err_string;
1043 if (err != TransactionError::OK) {
1046 strprintf(
"transaction broadcast failed: %s (%d "
1047 "transactions were broadcast successfully)",
1048 err_string, num_broadcast));
1054 rpc_result.pushKV(
"package_msg", package_msg);
1056 for (
const auto &tx : txns) {
1058 auto it = package_result.m_tx_results.find(tx->GetId());
1059 if (it == package_result.m_tx_results.end()) {
1061 result_inner.pushKV(
"error",
"unevaluated");
1064 const auto &tx_result = it->second;
1065 switch (it->second.m_result_type) {
1067 result_inner.pushKV(
"error",
1068 it->second.m_state.ToString());
1072 result_inner.pushKV(
1073 "vsize", int64_t{it->second.m_vsize.value()});
1075 fees.
pushKV(
"base", it->second.m_base_fees.value());
1076 if (tx_result.m_result_type ==
1083 fees.
pushKV(
"effective-feerate",
1084 tx_result.m_effective_feerate.value()
1087 for (
const auto &txid :
1088 tx_result.m_txids_fee_calculations.value()) {
1092 fees.
pushKV(
"effective-includes",
1093 std::move(effective_includes_res));
1095 result_inner.pushKV(
"fees", std::move(fees));
1098 tx_result_map.pushKV(tx->GetId().GetHex(),
1099 std::move(result_inner));
1101 rpc_result.pushKV(
"tx-results", std::move(tx_result_map));
1123 for (
const auto &c : commands) {
#define CHECK_NONFATAL(condition)
Identity function.
Fee rate in satoshis per kilobyte: Amount / kB.
Amount GetFeePerK() const
Return the fee in satoshis for a size of 1000 bytes.
Amount GetFee(size_t nBytes) const
Return the fee in satoshis for the given size in bytes.
A mutable version of CTransaction.
void appendCommand(const std::string &name, const CRPCCommand *pcmd)
Appends a CRPCCommand to the dispatch table.
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
std::set< txiter, CompareIteratorById > setEntries
bool GetLoadTried() const
CFeeRate GetMinFee() const
The minimum fee to get into the mempool, which may itself not be enough for larger-sized transactions...
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it.
Amount GetTotalFee() const EXCLUSIVE_LOCKS_REQUIRED(cs)
uint64_t GetTotalFinalizedTxSigchecks() const EXCLUSIVE_LOCKS_REQUIRED(cs)
const int64_t m_max_size_bytes
void getAllTxIds(std::vector< TxId > &vtxid) const
size_t DynamicMemoryUsage() const
bool exists(const TxId &txid) const
std::set< TxId > GetUnbroadcastTxs() const
Returns transactions in unbroadcast set.
const CFeeRate m_min_relay_feerate
uint64_t GetSequence() const EXCLUSIVE_LOCKS_REQUIRED(cs)
indexed_transaction_set::nth_index< 0 >::type::const_iterator txiter
uint64_t GetFinalizedTxCount() const EXCLUSIVE_LOCKS_REQUIRED(cs)
bool CalculateMemPoolAncestors(const CTxMemPoolEntryRef &entry, setEntries &setAncestors, bool fSearchForParents=true) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Try to calculate all in-mempool ancestors of entry.
uint64_t GetTotalFinalizedTxSize() const EXCLUSIVE_LOCKS_REQUIRED(cs)
void CalculateDescendants(txiter it, setEntries &setDescendants) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Populate setDescendants with all in-mempool descendants of hash.
unsigned long size() const
uint64_t GetTotalTxSize() const EXCLUSIVE_LOCKS_REQUIRED(cs)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
MempoolAcceptResult ProcessTransaction(const CTransactionRef &tx, bool test_accept=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Try to add a transaction to the memory pool.
bool IsInitialBlockDownload() const
Check whether we are doing an initial block download (synchronizing from disk or network)
void push_back(UniValue val)
const std::vector< UniValue > & getValues() const
void pushKVEnd(std::string key, UniValue val)
const UniValue & get_array() const
void pushKV(std::string key, UniValue val)
std::string GetRejectReason() const
std::string ToString() const
std::string ToString() const
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
std::string u8string() const
@ TX_MISSING_INPUTS
transaction was missing some of its inputs
bool DecodeHexTx(CMutableTransaction &tx, const std::string &strHexTx)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
static RPCHelpMan getmempoolinfo()
static RPCHelpMan sendrawtransaction()
static RPCHelpMan importmempool()
void RegisterMempoolRPCCommands(CRPCTable &t)
Register mempool RPC commands.
static RPCHelpMan getrawmempool()
static RPCHelpMan getmempoolentry()
UniValue MempoolInfoToJSON(const CTxMemPool &pool)
Mempool information to JSON.
static std::vector< RPCResult > MempoolEntryDescription()
static RPCHelpMan submitpackage()
UniValue MempoolToJSON(const CTxMemPool &pool, bool verbose, bool include_mempool_sequence)
Mempool to JSON.
static void entryToJSON(const CTxMemPool &pool, UniValue &info, const CTxMemPoolEntryRef &e) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
static RPCHelpMan testmempoolaccept()
static RPCHelpMan getmempooldescendants()
static RPCHelpMan getmempoolancestors()
static RPCHelpMan savemempool()
std::string FormatMoney(const Amount amt)
Do not use these functions to represent or parse monetary amounts to or from JSON but use AmountFromV...
static path u8path(const std::string &utf8_str)
bool LoadMempool(CTxMemPool &pool, const fs::path &load_path, Chainstate &active_chainstate, ImportMempoolOptions &&opts)
Import the file and attempt to add its contents to the mempool.
bool DumpMempool(const CTxMemPool &pool, const fs::path &dump_path, FopenFn mockable_fopen_function, bool skip_file_commit)
TransactionError BroadcastTransaction(const NodeContext &node, const CTransactionRef tx, std::string &err_string, const Amount max_tx_fee, bool relay, bool wait_callback)
Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
fs::path MempoolPath(const ArgsManager &argsman)
static const CFeeRate DEFAULT_MAX_RAW_TX_FEE_RATE
Maximum fee rate for sendrawtransaction and testmempoolaccept RPC calls.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
is a home for public enum and struct type definitions that are used by internally by node code,...
bool IsChildWithParentsTree(const Package &package)
Context-free check that a package IsChildWithParents() and none of the parents depend on each other (...
static constexpr uint32_t MAX_PACKAGE_COUNT
Default maximum number of transactions in a package.
@ PCKG_POLICY
The package itself is invalid (e.g. too many transactions).
@ PCKG_RESULT_UNSET
Initial value. The package has not yet been rejected.
@ PCKG_MEMPOOL_ERROR
Mempool logic error.
@ PCKG_TX
At least one tx is invalid.
int64_t GetVirtualTransactionSize(int64_t nSize, int64_t nSigChecks, unsigned int bytes_per_sigCheck)
Compute the virtual transaction size (size, or more if sigChecks are too dense).
static CTransactionRef MakeTransactionRef()
std::shared_ptr< const CTransaction > CTransactionRef
UniValue JSONRPCError(int code, const std::string &message)
@ RPC_MISC_ERROR
General application defined errors std::exception thrown in command handling.
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
@ RPC_CLIENT_IN_INITIAL_DOWNLOAD
Still downloading initial blocks.
@ RPC_DESERIALIZATION_ERROR
Error parsing or validating structure in raw format.
@ RPC_INVALID_ADDRESS_OR_KEY
Invalid address or key.
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
UniValue JSONRPCTransactionError(TransactionError terr, const std::string &err_string)
Amount AmountFromValue(const UniValue &value)
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
uint256 ParseHashV(const UniValue &v, std::string strName)
Utilities: convert hex-encoded values (throws error if not hex).
static std::string ToString(const CService &ip)
NodeContext & EnsureAnyNodeContext(const std::any &context)
CTxMemPool & EnsureMemPool(const NodeContext &node)
ChainstateManager & EnsureChainman(const NodeContext &node)
CTxMemPool & EnsureAnyMemPool(const std::any &context)
ArgsManager & EnsureAnyArgsman(const std::any &context)
static constexpr Amount zero() noexcept
static const Currency & get()
@ MEMPOOL_ENTRY
Valid, transaction was already in the mempool.
@ VALID
Fully validated, valid.
Validation result for package mempool acceptance.
PackageValidationState m_state
std::map< TxId, MempoolAcceptResult > m_tx_results
Map from txid to finished MempoolAcceptResults.
@ STR_HEX
Special type that is a STR with only hex chars.
@ AMOUNT
Special type representing a floating point amount (can be either NUM or STR)
@ OBJ_NAMED_PARAMS
Special type that behaves almost exactly like OBJ, defining an options object with a list of pre-defi...
@ OMITTED
Optional argument for which the default value is omitted from help text for one of two reasons:
std::string oneline_description
Should be empty unless it is supposed to override the auto-generated summary line.
@ NUM_TIME
Special numeric to denote unix epoch time.
@ OBJ_DYN
Special dictionary with keys that are not literals.
@ STR_HEX
Special string with only hex chars.
@ STR_AMOUNT
Special string to represent a floating point amount.
A TxId is the identifier of a transaction.
NodeContext struct containing references to chain state and connection state.
#define AssertLockNotHeld(cs)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
constexpr int64_t count_seconds(std::chrono::seconds t)
PackageMempoolAcceptResult ProcessNewPackage(Chainstate &active_chainstate, CTxMemPool &pool, const Package &package, bool test_accept)
Validate (and maybe submit) a package to the mempool.
void SyncWithValidationInterfaceQueue()
This is a synonym for the following, which asserts certain locks are not held: std::promise<void> pro...