94 if (!provider)
return -1;
107 const std::unique_ptr<SigningProvider> provider =
wallet->GetSolvingProvider(txout.
scriptPubKey);
131 std::optional<int64_t> weight;
133 return weight.value();
151 std::unique_ptr<Descriptor> desc{GetDescriptor(wallet, coin_control, txo.scriptPubKey)};
175 std::vector<CTxOut>
txouts;
178 const auto mi =
wallet->mapWallet.find(input.prevout.hash);
180 if (
mi !=
wallet->mapWallet.end()) {
181 assert(input.prevout.n <
mi->second.tx->vout.size());
182 txouts.emplace_back(
mi->second.tx->vout.at(input.prevout.n));
184 const auto& txout{
coin_control->GetExternalOutput(input.prevout)};
185 if (!txout)
return TxSize{-1, -1};
186 txouts.emplace_back(*txout);
194size_t CoinsResult::Size()
const
197 for (
const auto& it : coins) {
198 size += it.second.size();
203std::vector<COutput> CoinsResult::All()
const
205 std::vector<COutput>
all;
207 for (
const auto& it : coins) {
208 all.insert(
all.end(), it.second.begin(), it.second.end());
213void CoinsResult::Clear() {
217void CoinsResult::Erase(
const std::unordered_set<COutPoint, SaltedOutpointHasher>&
coins_to_remove)
219 for (
auto& [type,
vec] : coins) {
222 if (!coins_to_remove.contains(coin.outpoint)) return false;
225 total_amount -= coin.txout.nValue;
226 if (coin.HasEffectiveValue() && total_effective_amount.has_value()) total_effective_amount = *total_effective_amount - coin.GetEffectiveValue();
235 for (
auto& it : coins) {
236 std::shuffle(it.second.begin(), it.second.end(), rng_fast);
242 coins[type].emplace_back(out);
243 total_amount += out.txout.nValue;
244 if (out.HasEffectiveValue()) {
245 total_effective_amount = total_effective_amount.has_value() ?
246 *total_effective_amount + out.GetEffectiveValue() : out.GetEffectiveValue();
277 if (input_bytes != -1) {
281 if (
auto txo =
wallet.GetTXO(outpoint)) {
282 txout =
txo->GetTxOut();
283 if (input_bytes == -1) {
296 const auto out{
coin_control.GetExternalOutput(outpoint)};
304 if (input_bytes == -1) {
308 if (input_bytes == -1) {
322 std::optional<CFeeRate> feerate,
338 std::vector<COutPoint> outpoints;
343 for (
const auto& [outpoint,
txo] :
wallet.GetTXOs()) {
351 int nDepth =
wallet.GetTxDepthInMainChain(wtx);
385 if (nDepth == 0 && wtx.
mapValue.contains(
"replaces_txid")) {
397 if (nDepth == 0 && wtx.
mapValue.contains(
"replaced_by_txid")) {
410 if (ancestors > 1)
continue;
441 if (
wallet.IsSpent(outpoint))
450 std::unique_ptr<SigningProvider> provider =
wallet.GetSolvingProvider(output.
scriptPubKey);
455 bool solvable = input_bytes > -1;
478 it->second += output.
nValue;
483 outpoints.push_back(outpoint);
504 return tx1.second < tx2.second;
510 result.
Add(type, output);
515 if (feerate.has_value()) {
516 std::map<COutPoint, CAmount>
map_of_bump_fees =
wallet.chain().calculateIndividualBumpFees(outpoints, feerate.value());
518 for (
auto& [
_, outputs] : result.
coins) {
519 for (
auto& output : outputs) {
538 if (!it || it->
tx->vout.size() <= prevout.
n ||
539 !
wallet.IsMine(it->
tx->vout[prevout.
n])) {
552 std::map<CTxDestination, std::vector<COutput>> result;
561 if (
auto pk_dest = std::get_if<PubKeyDestination>(&address)) {
567 result[address].emplace_back(coin);
575 const std::vector<SelectionFilter>&
filters,
582 for (
const auto& [type, outputs] : coins.
coins) {
583 for (
const COutput& output : outputs) {
585 size_t ancestors, cluster_count;
586 wallet.chain().getTransactionAncestry(output.outpoint.hash, ancestors, cluster_count);
590 group.Insert(std::make_shared<COutput>(output), ancestors, cluster_count);
596 if (!group.EligibleForSpending(filter))
continue;
614 const std::shared_ptr<COutput>& output,
OutputType type,
size_t ancestors,
size_t cluster_count,
616 std::vector<OutputGroup>&
groups =
groups_map[std::make_pair(output->txout.scriptPubKey,type)];
635 group->Insert(output, ancestors, cluster_count);
640 for (
const auto& [type,
outs] : coins.
coins) {
642 size_t ancestors, cluster_count;
643 wallet.chain().getTransactionAncestry(output.outpoint.hash, ancestors, cluster_count);
645 const auto&
shared_output = std::make_shared<COutput>(output);
647 if (output.GetEffectiveValue() > 0) {
667 if (!group.EligibleForSpending(filter))
continue;
693 const std::vector<SelectionFilter>&
filters)
695 std::vector<OutputGroup> unused;
706 std::vector<SelectionResult>
results;
707 for (
auto& [type, group] :
groups.groups_by_type) {
712 if (result)
results.push_back(*result);
721 if (allow_mixed_output_types &&
groups.TypesCount() > 1) {
732 std::vector<SelectionResult>
results;
733 std::vector<util::Result<SelectionResult>>
errors;
738 errors.emplace_back(std::move(result));
747 return util::Error{
_(
"Maximum transaction weight is less than transaction weight without inputs")};
761 return util::Error{
_(
"Maximum transaction weight is too low, can not accommodate change output")};
790 std::vector<COutPoint> outpoints;
793 for (
auto& coin : coins) {
794 if (coin->depth > 0)
continue;
795 outpoints.push_back(coin->outpoint);
800 return util::Error{
_(
"Failed to calculate bump fees, because unconfirmed UTXOs depend on an enormous cluster of unconfirmed transactions.")};
823 return util::Error{
_(
"The preselected coins total amount does not cover the transaction target. "
824 "Please allow other inputs to be automatically selected or include more coins manually")};
865 return util::Error{
_(
"The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. "
866 "Please try sending a smaller amount or manually consolidating your wallet's UTXOs")};
906 if (
wallet.m_spend_zero_conf_change) {
925 std::numeric_limits<uint64_t>::max(),
939 if (group.m_ancestors >= max_ancestors || group.m_max_cluster_count >= max_cluster_count)
total_unconf_long_chain += group.GetSelectionAmount();
945 return util::Error{
_(
"Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool")};
1041 for (
const auto& in : tx.
vin) {
1065 const std::vector<CRecipient>&
vecSend,
1066 std::optional<unsigned int> change_pos,
1095 for (
const auto& recipient :
vecSend) {
1096 if (
IsDust(recipient,
wallet.chain().relayDustFee())) {
1104 if (recipient.fSubtractFeeFromAmount) {
1115 if (!std::get_if<CNoDestination>(&
coin_control.destChange)) {
1147 if (change_spend_size == -1) {
1166 return util::Error{
strprintf(
_(
"Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s."),
"-fallbackfee")};
1193 return util::Error{
_(
"Transaction requires one destination of non-zero value, a non-zero feerate, or a pre-selected input")};
1238 wallet.GetName().c_str(),
1246 for (
const auto& recipient :
vecSend)
1256 }
else if ((
unsigned int)*change_pos >
txNew.vout.size()) {
1257 return util::Error{
_(
"Transaction change output index out of range")};
1261 change_pos = std::nullopt;
1273 [&
coin_control](
const std::shared_ptr<COutput>&
a,
const std::shared_ptr<COutput>& b) {
1274 auto a_pos = coin_control.GetSelectionPos(a->outpoint);
1275 auto b_pos = coin_control.GetSelectionPos(b->outpoint);
1276 if (a_pos.has_value() && b_pos.has_value()) {
1277 return a_pos.value() < b_pos.value();
1305 auto scripts =
coin_control.GetScripts(coin->outpoint);
1306 if (scripts.first) {
1307 txNew.vin.back().scriptSig = *scripts.first;
1309 if (scripts.second) {
1310 txNew.vin.back().scriptWitness = *scripts.second;
1326 return util::Error{
_(
"Missing solving data for estimating transaction size")};
1340 auto& change =
txNew.vout.at(*change_pos);
1353 for (
const auto& recipient :
vecSend)
1355 if (change_pos && i == *change_pos) {
1360 if (recipient.fSubtractFeeFromAmount)
1373 return util::Error{
_(
"The transaction amount is too small to pay the fee")};
1375 return util::Error{
_(
"The transaction amount is too small to send after the fee has been deducted")};
1413 return util::Error{TransactionErrorString(TransactionError::MAX_FEE_EXCEEDED)};
1416 if (
gArgs.
GetBoolArg(
"-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS)) {
1418 auto result =
wallet.chain().checkChainLimits(tx);
1428 wallet.WalletLogPrintf(
"Coin Selection: Algorithm:%s, Waste Metric Score:%d\n",
GetAlgorithmName(result.GetAlgo()), result.GetWaste());
1429 wallet.WalletLogPrintf(
"Fee Calculation: Fee:%d Bytes:%u Tgt:%d (requested %d) Reason:\"%s\" Decay %.5f: Estimation: (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out) Fail: (%g - %g) %.2f%% %.1f/(%.1f %d mem %.1f out)\n",
1432 (
feeCalc.est.pass.totalConfirmed +
feeCalc.est.pass.inMempool +
feeCalc.est.pass.leftMempool) > 0.0 ? 100 *
feeCalc.est.pass.withinTarget / (
feeCalc.est.pass.totalConfirmed +
feeCalc.est.pass.inMempool +
feeCalc.est.pass.leftMempool) : 0.0,
1435 (
feeCalc.est.fail.totalConfirmed +
feeCalc.est.fail.inMempool +
feeCalc.est.fail.leftMempool) > 0.0 ? 100 *
feeCalc.est.fail.withinTarget / (
feeCalc.est.fail.totalConfirmed +
feeCalc.est.fail.inMempool +
feeCalc.est.fail.leftMempool) : 0.0,
1442 const std::vector<CRecipient>&
vecSend,
1443 std::optional<unsigned int> change_pos,
1448 return util::Error{
_(
"Transaction must have at least one recipient")};
1451 if (std::any_of(
vecSend.cbegin(),
vecSend.cend(), [](
const auto& recipient){ return recipient.nAmount < 0; })) {
1452 return util::Error{
_(
"Transaction amounts must not be negative")};
1459 wallet.GetName().c_str(),
1480 wallet.GetName().c_str(),
1486 wallet.WalletLogPrintf(
"Fee non-grouped = %lld, grouped = %lld, using %s\n",
1512 std::map<COutPoint, Coin> coins;
1514 coins[
txin.prevout];
1516 wallet.chain().findCoins(coins);
1522 if (coins[
outPoint].out.IsNull()) {
1523 return util::Error{
_(
"Unable to find UTXO for external input")};
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
int64_t CAmount
Amount in satoshis (Can be negative)
#define CHECK_NONFATAL(condition)
Identity function.
#define Assert(val)
Identity function.
#define STR_INTERNAL_BUG(msg)
#define Assume(val)
Assume is the identity function.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
An outpoint - a combination of a transaction hash and an index n into its vout.
Serialized script, used inside transaction inputs and outputs.
A reference to a CScript: the Hash160 of its serialization.
The basic transaction that is broadcasted on the network and contained in blocks.
const std::vector< CTxOut > vout
const std::vector< CTxIn > vin
An input of a transaction.
static const uint32_t MAX_SEQUENCE_NONFINAL
This is the maximum sequence number that enables both nLockTime and OP_CHECKLOCKTIMEVERIFY (BIP 65).
static const uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
An output of a transaction.
A signing provider to be used to interface with multiple signing providers at once.
void AddProvider(std::unique_ptr< SigningProvider > provider)
I randrange(I range) noexcept
Generate a random integer in the range [0..range), with range > 0.
An interface to be implemented by keystores that support signing.
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
virtual bool isInitialBlockDownload()=0
Check if in IBD.
virtual std::optional< CAmount > calculateCombinedBumpFee(const std::vector< COutPoint > &outpoints, const CFeeRate &target_feerate)=0
Calculate the combined bump fee for an input set per the same strategy.
virtual bool findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
Helper for findBlock to selectively return pieces of block data.
bool m_avoid_partial_spends
Avoid partial use of funds sent to a given address.
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
A transaction with a bunch of additional info that only the owner cares about.
mapValue_t mapValue
Key/value map with information about the transaction.
std::optional< Txid > truc_child_in_mempool
int64_t GetTxTime() const
A wrapper to reserve an address from a wallet.
static int32_t GetTransactionWeight(const CTransaction &tx)
static const int WITNESS_SCALE_FACTOR
@ SAT_VB
Use sat/vB fee rate unit.
is a home for simple string functions returning descriptive messages that are used in RPC and GUI int...
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
bilingual_str TransactionErrorString(const TransactionError err)
std::string StringForFeeReason(FeeReason reason)
bilingual_str ErrorString(const Result< T > &result)
const CTxOut & FindNonChangeParentOutput(const CWallet &wallet, const COutPoint &outpoint)
Find non-change parent output.
bool OutputIsChange(const CWallet &wallet, const CTxOut &txout)
CreatedTransactionResult FundTransaction(CWallet &wallet, const CMutableTransaction &tx, const std::vector< CRecipient > &recipients, const UniValue &options, CCoinControl &coinControl, bool override_min_fee)
util::Result< SelectionResult > AutomaticCoinSelection(const CWallet &wallet, CoinsResult &available_coins, const CAmount &value_to_select, const CoinSelectionParams &coin_selection_params)
Select a set of coins such that nTargetValue is met; never select unconfirmed coins if they are not o...
FilteredOutputGroups GroupOutputs(const CWallet &wallet, const CoinsResult &coins, const CoinSelectionParams &coin_sel_params, const std::vector< SelectionFilter > &filters, std::vector< OutputGroup > &ret_discarded_groups)
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, std::optional< unsigned int > change_pos, const CCoinControl &coin_control, bool sign)
Create a new transaction paying the recipients with a set of coins selected by SelectCoins(); Also cr...
bool CachedTxIsFromMe(const CWallet &wallet, const CWalletTx &wtx)
const int DEFAULT_MIN_DEPTH
util::Result< CoinsResult > FetchSelectedInputs(const CWallet &wallet, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Fetch and validate coin control selected inputs.
bool CachedTxIsTrusted(const CWallet &wallet, const CWalletTx &wtx, std::set< Txid > &trusted_parents)
static std::unique_ptr< Descriptor > GetDescriptor(const CWallet *wallet, const CCoinControl *coin_control, const CScript script_pubkey)
Infer a descriptor for the given output script.
static bool UseMaxSig(const std::optional< CTxIn > &txin, const CCoinControl *coin_control)
Whether to assume ECDSA signatures' will be high-r.
static std::optional< int64_t > GetSignedTxinWeight(const CWallet *wallet, const CCoinControl *coin_control, const CTxIn &txin, const CTxOut &txo, const bool tx_is_segwit, const bool can_grind_r)
Infer the maximum size of this input after it will be signed.
util::Result< SelectionResult > CoinGrinder(std::vector< OutputGroup > &utxo_pool, const CAmount &selection_target, CAmount change_target, int max_selection_weight)
static OutputType GetOutputType(TxoutType type, bool is_from_p2sh)
static bool IsSegwit(const Descriptor &desc)
Whether the descriptor represents, directly or not, a witness program.
const int DEFAULT_MAX_DEPTH
util::Result< SelectionResult > ChooseSelectionResult(interfaces::Chain &chain, const CAmount &nTargetValue, Groups &groups, const CoinSelectionParams &coin_selection_params)
Attempt to find a valid input set that meets the provided eligibility filter and target.
util::Result< SelectionResult > KnapsackSolver(std::vector< OutputGroup > &groups, const CAmount &nTargetValue, CAmount change_target, FastRandomContext &rng, int max_selection_weight)
util::Result< SelectionResult > SelectCoins(const CWallet &wallet, CoinsResult &available_coins, const CoinsResult &pre_set_inputs, const CAmount &nTargetValue, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Select all coins from coin_control, and if coin_control 'm_allow_other_inputs=true',...
CFeeRate GetMinimumFeeRate(const CWallet &wallet, const CCoinControl &coin_control, FeeCalculation *feeCalc)
Estimate the minimum fee rate considering user set parameters and the required fee.
CAmount GenerateChangeTarget(const CAmount payment_value, const CAmount change_fee, FastRandomContext &rng)
Choose a random change target for each transaction to make it harder to fingerprint the Core wallet b...
std::map< CTxDestination, std::vector< COutput > > ListCoins(const CWallet &wallet)
Return list of available coins and locked coins grouped by non-change output address.
std::string GetAlgorithmName(const SelectionAlgorithm algo)
void DiscourageFeeSniping(CMutableTransaction &tx, FastRandomContext &rng_fast, interfaces::Chain &chain, const uint256 &block_hash, int block_height)
Set a height-based locktime for new transactions (uses the height of the current chain tip unless we ...
static bool HasErrorMsg(const util::Result< SelectionResult > &res)
std::set< std::shared_ptr< COutput >, OutputPtrComparator > OutputSet
CFeeRate GetDiscardRate(const CWallet &wallet)
Return the maximum feerate for discarding change.
std::map< CoinEligibilityFilter, OutputGroupTypeMap > FilteredOutputGroups
TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector< CTxOut > &txouts, const CCoinControl *coin_control)
Calculate the size of the transaction using CoinControl to determine whether to expect signature grin...
static util::Result< CreatedTransactionResult > CreateTransactionInternal(CWallet &wallet, const std::vector< CRecipient > &vecSend, std::optional< unsigned int > change_pos, const CCoinControl &coin_control, bool sign) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
@ WALLET_FLAG_AVOID_REUSE
static bool IsCurrentForAntiFeeSniping(interfaces::Chain &chain, const uint256 &block_hash)
static constexpr size_t OUTPUT_GROUP_MAX_ENTRIES
int CalculateMaximumSignedInputSize(const CTxOut &txout, const COutPoint outpoint, const SigningProvider *provider, bool can_grind_r, const CCoinControl *coin_control)
static std::optional< int64_t > MaxInputWeight(const Descriptor &desc, const std::optional< CTxIn > &txin, const CCoinControl *coin_control, const bool tx_is_segwit, const bool can_grind_r)
Get the size of an input (in witness units) once it's signed.
util::Result< SelectionResult > SelectCoinsSRD(const std::vector< OutputGroup > &utxo_pool, CAmount target_value, CAmount change_fee, FastRandomContext &rng, int max_selection_weight)
Select coins by Single Random Draw (SRD).
uint64_t GetSerializeSizeForRecipient(const CRecipient &recipient)
is a home for public enum and struct type definitions that are used internally by node code,...
CAmount GetDustThreshold(const CTxOut &txout, const CFeeRate &dustRelayFeeIn)
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost, unsigned int bytes_per_sigop)
Compute the virtual transaction size (weight reinterpreted as bytes).
bool IsDust(const CTxOut &txout, const CFeeRate &dustRelayFeeIn)
static constexpr unsigned int MIN_STANDARD_TX_NONWITNESS_SIZE
The minimum non-witness size for transactions we're willing to relay/mine: one larger than 64
static constexpr int32_t MAX_STANDARD_TX_WEIGHT
The maximum weight for transactions we're willing to relay/mine.
CAmount CalculateOutputValue(const TxType &tx)
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
std::unique_ptr< Descriptor > InferDescriptor(const CScript &script, const SigningProvider &provider)
Find a descriptor for the specified script, using information from provider where possible.
static const unsigned int LOCKTIME_THRESHOLD
constexpr unsigned int GetSizeOfCompactSize(uint64_t nSize)
Compact Size size < 253 – 1 byte size <= USHRT_MAX – 3 bytes (253 + 2 bytes) size <= UINT_MAX – 5 byt...
uint64_t GetSerializeSize(const T &t)
TxoutType Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char > > &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
A mutable version of CTransaction.
std::vector< CTxOut > vout
Interface for parsed descriptor objects.
virtual std::optional< int64_t > MaxSatisfactionElems() const =0
Get the maximum size number of stack elements for satisfying this descriptor.
virtual std::optional< int64_t > MaxSatisfactionWeight(bool use_max_sig) const =0
Get the maximum size of a satisfaction for this descriptor, in weight units.
virtual std::optional< OutputType > GetOutputType() const =0
A UTXO under consideration for use in funding a new transaction.
COutPoint outpoint
The outpoint identifying this UTXO.
void ApplyBumpFee(CAmount bump_fee)
Parameters for filtering which OutputGroups we may use in coin selection.
bool check_version_trucness
bool include_immature_coinbase
Parameters for one iteration of Coin Selection.
std::optional< int > m_max_tx_weight
The maximum weight for this transaction.
COutputs available for spending, stored by OutputType.
void Add(OutputType type, const COutput &out)
CAmount GetTotalAmount() const
size_t Size() const
The following methods are provided so that CoinsResult can mimic a vector, i.e., methods can work wit...
std::map< OutputType, std::vector< COutput > > coins
A group of UTXOs paid to the same output script.
Stores several 'Groups' whose were mapped by output type.
void AddInputs(const OutputSet &inputs, bool subtract_fee_outputs)
CAmount GetChange(CAmount min_viable_change, CAmount change_fee) const
Get the amount for the change output after paying needed fees.
void RecalculateWaste(CAmount min_viable_change, CAmount change_cost, CAmount change_fee)
Calculates and stores the waste for this result given the cost of change and the opportunity cost of ...
CAmount GetSelectedValue() const
Get the sum of the input values.
CAmount GetTarget() const
SelectionAlgorithm GetAlgo() const
std::vector< std::shared_ptr< COutput > > GetShuffledInputVector() const
Get the vector of COutputs that will be used to fill in a CTransaction's vin.
#define AssertLockHeld(cs)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define TRACEPOINT(context,...)
#define TRACEPOINT_SEMAPHORE(context, event)
consteval auto _(util::TranslatedLiteral str)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
static constexpr decltype(CTransaction::version) TRUC_VERSION
static constexpr int64_t TRUC_CHILD_MAX_WEIGHT
static constexpr uint32_t MAX_BIP125_RBF_SEQUENCE
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
static void AvailableCoins(benchmark::Bench &bench, const std::vector< OutputType > &output_type)