116 for (
const auto spkman:
wallet->GetScriptPubKeyMans(script_pubkey)) {
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.GetTx()->vout.size());
182 txouts.emplace_back(
mi->second.GetTx()->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::Erase(
const std::unordered_set<COutPoint, SaltedOutpointHasher>&
coins_to_remove)
215 for (
auto& [type,
vec] : coins) {
218 if (!coins_to_remove.contains(coin.outpoint)) return false;
221 total_amount -= coin.txout.nValue;
222 if (coin.HasEffectiveValue() && total_effective_amount.has_value()) total_effective_amount = *total_effective_amount - coin.GetEffectiveValue();
231 for (
auto& it : coins) {
232 std::shuffle(it.second.begin(), it.second.end(), rng_fast);
238 coins[type].emplace_back(out);
239 total_amount += out.txout.nValue;
240 if (out.HasEffectiveValue()) {
241 total_effective_amount = total_effective_amount.has_value() ?
242 *total_effective_amount + out.GetEffectiveValue() : out.GetEffectiveValue();
273 if (input_bytes != -1) {
277 if (
auto txo =
wallet.GetTXO(outpoint)) {
278 txout =
txo->GetTxOut();
279 if (input_bytes == -1) {
292 const auto out{
coin_control.GetExternalOutput(outpoint)};
300 if (input_bytes == -1) {
304 if (input_bytes == -1) {
318 std::optional<CFeeRate> feerate,
334 std::vector<COutPoint> outpoints;
339 for (
const auto& [outpoint,
txo] :
wallet.GetTXOs()) {
347 int nDepth =
wallet.GetTxDepthInMainChain(wtx);
406 if (ancestors > 1)
continue;
437 if (
wallet.IsSpent(outpoint))
451 bool solvable = input_bytes > -1;
474 it->second += output.
nValue;
479 outpoints.push_back(outpoint);
500 return tx1.second < tx2.second;
506 result.
Add(type, output);
511 if (feerate.has_value()) {
512 std::map<COutPoint, CAmount>
map_of_bump_fees =
wallet.chain().calculateIndividualBumpFees(outpoints, feerate.value());
514 for (
auto& [
_, outputs] : result.
coins) {
515 for (
auto& output : outputs) {
534 if (!it || it->
GetTx()->vout.size() <= prevout.
n ||
548 std::map<CTxDestination, std::vector<COutput>> result;
557 if (
auto pk_dest = std::get_if<PubKeyDestination>(&address)) {
563 result[address].emplace_back(coin);
571 const std::vector<SelectionFilter>&
filters,
578 for (
const auto& [type, outputs] : coins.
coins) {
579 for (
const COutput& output : outputs) {
581 size_t ancestors, cluster_count;
582 wallet.chain().getTransactionAncestry(output.outpoint.hash, ancestors, cluster_count);
586 group.Insert(std::make_shared<COutput>(output), ancestors, cluster_count);
592 if (!group.EligibleForSpending(filter))
continue;
610 const std::shared_ptr<COutput>& output,
OutputType type,
size_t ancestors,
size_t cluster_count,
612 std::vector<OutputGroup>&
groups =
groups_map[std::make_pair(output->txout.scriptPubKey,type)];
631 group->Insert(output, ancestors, cluster_count);
636 for (
const auto& [type,
outs] : coins.
coins) {
638 size_t ancestors, cluster_count;
639 wallet.chain().getTransactionAncestry(output.outpoint.hash, ancestors, cluster_count);
641 const auto&
shared_output = std::make_shared<COutput>(output);
643 if (output.GetEffectiveValue() > 0) {
663 if (!group.EligibleForSpending(filter))
continue;
690 const std::vector<SelectionFilter>&
filters)
692 std::vector<OutputGroup> unused;
703 std::vector<SelectionResult>
results;
704 for (
auto& [type, group] :
groups.groups_by_type) {
709 if (result)
results.push_back(*result);
718 if (allow_mixed_output_types &&
groups.TypesCount() > 1) {
729 std::vector<SelectionResult>
results;
730 std::vector<util::Result<SelectionResult>>
errors;
735 errors.emplace_back(std::move(result));
744 return util::Error{
_(
"Maximum transaction weight is less than transaction weight without inputs")};
758 return util::Error{
_(
"Maximum transaction weight is too low, can not accommodate change output")};
787 std::vector<COutPoint> outpoints;
790 for (
auto& coin : coins) {
791 if (coin->depth > 0)
continue;
792 outpoints.push_back(coin->outpoint);
797 return util::Error{
_(
"Failed to calculate bump fees, because unconfirmed UTXOs depend on an enormous cluster of unconfirmed transactions.")};
821 return util::Error{
_(
"The preselected coins total amount does not cover the transaction target. "
822 "Please allow other inputs to be automatically selected or include more coins manually")};
863 return util::Error{
_(
"The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. "
864 "Please try sending a smaller amount or manually consolidating your wallet's UTXOs")};
904 if (
wallet.m_spend_zero_conf_change) {
923 std::numeric_limits<uint64_t>::max(),
937 if (group.m_ancestors >= max_ancestors || group.m_max_cluster_count >= max_cluster_count)
total_unconf_long_chain += group.GetSelectionAmount();
943 return util::Error{
_(
"Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool")};
1039 for (
const auto& in : tx.
vin) {
1063 const std::vector<CRecipient>&
vecSend,
1064 std::optional<unsigned int> change_pos,
1093 for (
const auto& recipient :
vecSend) {
1094 if (
IsDust(recipient,
wallet.chain().relayDustFee())) {
1102 if (recipient.fSubtractFeeFromAmount) {
1113 if (!std::get_if<CNoDestination>(&
coin_control.destChange)) {
1145 if (change_spend_size == -1) {
1161 auto msg{
strprintf(
_(
"Fee rate (%s) is lower than the minimum fee rate setting (%s)."),
1165 msg +=
strprintf(
_(
"\nConsider modifying %s (%s) or %s (%s)."),
1175 return util::Error{
strprintf(
_(
"Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s."),
"-fallbackfee")};
1202 return util::Error{
_(
"Transaction requires one destination of non-zero value, a non-zero feerate, or a pre-selected input")};
1247 wallet.GetName().c_str(),
1255 for (
const auto& recipient :
vecSend)
1265 }
else if ((
unsigned int)*change_pos >
txNew.vout.size()) {
1266 return util::Error{
_(
"Transaction change output index out of range")};
1270 change_pos = std::nullopt;
1282 [&
coin_control](
const std::shared_ptr<COutput>&
a,
const std::shared_ptr<COutput>& b) {
1283 auto a_pos = coin_control.GetSelectionPos(a->outpoint);
1284 auto b_pos = coin_control.GetSelectionPos(b->outpoint);
1285 if (a_pos.has_value() && b_pos.has_value()) {
1286 return a_pos.value() < b_pos.value();
1314 auto scripts =
coin_control.GetScripts(coin->outpoint);
1315 if (scripts.first) {
1316 txNew.vin.back().scriptSig = *scripts.first;
1318 if (scripts.second) {
1319 txNew.vin.back().scriptWitness = *scripts.second;
1335 return util::Error{
_(
"Missing solving data for estimating transaction size")};
1349 auto& change =
txNew.vout.at(*change_pos);
1362 for (
const auto& recipient :
vecSend)
1364 if (change_pos && i == *change_pos) {
1369 if (recipient.fSubtractFeeFromAmount)
1382 return util::Error{
_(
"The transaction amount is too small to pay the fee")};
1384 return util::Error{
_(
"The transaction amount is too small to send after the fee has been deducted")};
1430 if (
gArgs.
GetBoolArg(
"-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS)) {
1432 auto result =
wallet.chain().checkChainLimits(tx);
1442 wallet.WalletLogPrintf(
"Coin Selection: Algorithm:%s, Waste Metric Score:%d",
GetAlgorithmName(result.GetAlgo()), result.GetWaste());
1443 wallet.WalletLogPrintf(
"Fee Calculation: Fee:%d Bytes:%u, Source: %s",
1450 const std::vector<CRecipient>&
vecSend,
1451 std::optional<unsigned int> change_pos,
1456 return util::Error{
_(
"Transaction must have at least one recipient")};
1459 if (std::any_of(
vecSend.cbegin(),
vecSend.cend(), [](
const auto& recipient){ return recipient.nAmount < 0; })) {
1460 return util::Error{
_(
"Transaction amounts must not be negative")};
1467 wallet.GetName().c_str(),
1488 wallet.GetName().c_str(),
1494 wallet.WalletLogPrintf(
"Fee non-grouped = %lld, grouped = %lld, using %s",
1520 std::map<COutPoint, Coin> coins;
1522 coins[
txin.prevout];
1524 wallet.chain().findCoins(coins);
1530 if (coins[
outPoint].out.IsNull()) {
1531 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.
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 EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
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 constexpr uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
static constexpr uint32_t MAX_SEQUENCE_NONFINAL
This is the maximum sequence number that enables both nLockTime and OP_CHECKLOCKTIMEVERIFY (BIP 65).
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.
std::optional< Txid > m_replaces_txid
std::optional< Txid > m_replaced_by_txid
std::optional< Txid > truc_child_in_mempool
int64_t GetTxTime() const
CTransactionRef GetTx() const
A wrapper to reserve an address from a wallet.
static int32_t GetTransactionWeight(const CTransaction &tx)
constexpr 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)
constexpr size_t DUMMY_NESTED_P2WPKH_INPUT_SIZE
Pre-calculated constants for input size estimation in virtual size
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)
constexpr bool DEFAULT_WALLET_REJECT_LONG_CHAINS
Default for -walletrejectlongchains.
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)
Group coins by the provided filters, groups that pass no filter are appended to 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)
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)
MinimumFeeRateResult GetMinimumFeeRate(const CWallet &wallet, const CCoinControl &coin_control)
Estimate the minimum fee rate considering user set parameters and the required fee.
util::Result< SelectionResult > SelectCoinsBnB(std::vector< OutputGroup > &utxo_pool, const CAmount &selection_target, const CAmount &cost_of_change, int max_selection_weight)
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.
std::set< std::shared_ptr< COutput >, OutputPtrComparator > OutputSet
util::Result< SelectionResult > AttemptSelection(interfaces::Chain &chain, const CAmount &nTargetValue, OutputGroupTypeMap &groups, const CoinSelectionParams &coin_selection_params, bool allow_mixed_output_types)
Attempt to find a valid input set that preserves privacy by not mixing OutputTypes.
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',...
constexpr int DEFAULT_MAX_DEPTH
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)
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)
constexpr int DEFAULT_MIN_DEPTH
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)
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
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.
constexpr 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)
FuzzedDataProvider provider
#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.
constexpr decltype(CTransaction::version) TRUC_VERSION
constexpr int64_t TRUC_CHILD_MAX_WEIGHT
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)