Bitcoin Core Fuzz Coverage Report

Coverage Report

Created: 2026-06-01 16:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/zip/work/bitcoin/src/node/mining_args.cpp
Line
Count
Source
1
// Copyright (c) The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <node/mining_args.h>
6
7
#include <common/args.h>
8
#include <common/messages.h>
9
#include <consensus/amount.h>
10
#include <consensus/consensus.h>
11
#include <node/mining_types.h>
12
#include <policy/feerate.h>
13
#include <policy/policy.h>
14
#include <tinyformat.h>
15
#include <util/moneystr.h>
16
#include <util/result.h>
17
#include <util/translation.h>
18
19
#include <cstdint>
20
#include <optional>
21
#include <string>
22
#include <utility>
23
24
using common::AmountErrMsg;
25
using util::Error;
26
using util::Result;
27
28
namespace node {
29
30
Result<void> CheckMiningOptions(BlockCreateOptions options, bool use_argnames)
31
0
{
32
0
    options = FlattenMiningOptions(std::move(options));
33
0
    if (*options.block_reserved_weight < MINIMUM_BLOCK_RESERVED_WEIGHT) {
34
0
        return Error{Untranslated(strprintf("%s (%d) is lower than minimum safety value of (%d)",
Line
Count
Source
1172
0
#define strprintf tfm::format
35
0
                                            use_argnames ? "-blockreservedweight" : "block_reserved_weight",
36
0
                                            *options.block_reserved_weight, MINIMUM_BLOCK_RESERVED_WEIGHT))};
37
0
    }
38
0
    if (*options.block_reserved_weight > MAX_BLOCK_WEIGHT) {
39
0
        return Error{Untranslated(strprintf("%s (%d) exceeds consensus maximum block weight (%d)",
Line
Count
Source
1172
0
#define strprintf tfm::format
40
0
                                            use_argnames ? "-blockreservedweight" : "block_reserved_weight",
41
0
                                            *options.block_reserved_weight, MAX_BLOCK_WEIGHT))};
42
0
    }
43
0
    if (*options.block_max_weight > MAX_BLOCK_WEIGHT) {
44
0
        return Error{Untranslated(strprintf("%s (%d) exceeds consensus maximum block weight (%d)",
Line
Count
Source
1172
0
#define strprintf tfm::format
45
0
                                            use_argnames ? "-blockmaxweight" : "block_max_weight",
46
0
                                            *options.block_max_weight, MAX_BLOCK_WEIGHT))};
47
0
    }
48
0
    if (*options.block_reserved_weight > *options.block_max_weight) {
49
0
        return Error{Untranslated(strprintf("%s (%d) exceeds %s (%d)",
Line
Count
Source
1172
0
#define strprintf tfm::format
50
0
                                            use_argnames ? "-blockreservedweight" : "block_reserved_weight",
51
0
                                            *options.block_reserved_weight,
52
0
                                            use_argnames ? "-blockmaxweight" : "block_max_weight",
53
0
                                            *options.block_max_weight))};
54
0
    }
55
0
    if (options.coinbase_output_max_additional_sigops > MAX_BLOCK_SIGOPS_COST) {
56
0
        return Error{Untranslated(strprintf("%s (%zu) exceeds consensus maximum block sigops cost (%d)",
Line
Count
Source
1172
0
#define strprintf tfm::format
57
0
                                            "coinbase_output_max_additional_sigops",
58
0
                                            options.coinbase_output_max_additional_sigops, MAX_BLOCK_SIGOPS_COST))};
59
0
    }
60
0
    return {};
61
0
}
62
63
Result<BlockCreateOptions> ReadMiningArgs(const ArgsManager& args)
64
0
{
65
0
    BlockCreateOptions options;
66
0
    if (const auto arg{args.GetArg("-blockmintxfee")}) {
67
0
        std::optional<CAmount> block_min_tx_fee{ParseMoney(*arg)};
68
0
        if (!block_min_tx_fee) return Error{AmountErrMsg("blockmintxfee", *arg)};
69
0
        options.block_min_fee_rate = CFeeRate{*block_min_tx_fee};
70
0
    }
71
72
0
    if (const auto arg{args.GetBoolArg("-printpriority")}) options.print_modified_fee = *arg;
73
74
0
    options.block_reserved_weight = args.GetArg<uint64_t>("-blockreservedweight");
75
0
    options.block_max_weight = args.GetArg<uint64_t>("-blockmaxweight");
76
77
0
    if (auto result{CheckMiningOptions(options, /*use_argnames=*/true)}; !result) return Error{util::ErrorString(result)};
78
0
    return options;
79
0
}
80
81
BlockCreateOptions FlattenMiningOptions(BlockCreateOptions options)
82
0
{
83
0
    if (!options.block_min_fee_rate) options.block_min_fee_rate = CFeeRate{DEFAULT_BLOCK_MIN_TX_FEE};
84
0
    if (!options.print_modified_fee) options.print_modified_fee = DEFAULT_PRINT_MODIFIED_FEE;
85
0
    if (!options.block_reserved_weight) options.block_reserved_weight = DEFAULT_BLOCK_RESERVED_WEIGHT;
86
0
    if (!options.block_max_weight) options.block_max_weight = DEFAULT_BLOCK_MAX_WEIGHT;
87
0
    return options;
88
0
}
89
90
BlockCreateOptions MergeMiningOptions(BlockCreateOptions x, const BlockCreateOptions& y)
91
0
{
92
0
    if (!x.block_min_fee_rate) x.block_min_fee_rate = y.block_min_fee_rate;
93
0
    if (!x.print_modified_fee) x.print_modified_fee = y.print_modified_fee;
94
0
    if (!x.block_reserved_weight) x.block_reserved_weight = y.block_reserved_weight;
95
0
    if (!x.block_max_weight) x.block_max_weight = y.block_max_weight;
96
0
    return x;
97
0
}
98
99
} // namespace node