Skip to content

Commit 257b1b7

Browse files
Merge branch 'dashpay:develop' into develop
2 parents c97367f + 66c1774 commit 257b1b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+278
-283
lines changed

configure.ac

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,12 @@ if test "$use_hardening" != "no"; then
10371037
AX_CHECK_LINK_FLAG([-Wl,-z,now], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"], [], [$LDFLAG_WERROR])
10381038
AX_CHECK_LINK_FLAG([-Wl,-z,separate-code], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,separate-code"], [], [$LDFLAG_WERROR])
10391039
AX_CHECK_LINK_FLAG([-fPIE -pie], [PIE_FLAGS="-fPIE"; HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"], [], [$CXXFLAG_WERROR])
1040+
1041+
case $host in
1042+
*mingw*)
1043+
AC_CHECK_LIB([ssp], [main], [], [AC_MSG_ERROR([libssp missing])])
1044+
;;
1045+
esac
10401046
fi
10411047

10421048
dnl These flags are specific to ld64, and may cause issues with other linkers.

contrib/guix/manifest.scm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,8 +431,12 @@ inspecting signatures in Mach-O binaries.")
431431
`(append ,flags
432432
;; https://gcc.gnu.org/install/configure.html
433433
(list "--enable-threads=posix",
434-
"--enable-default-ssp=yes",
435-
building-on)))))))
434+
building-on)))
435+
((#:make-flags flags)
436+
;; Uses the SSP functions from glibc instead of from libssp.so.
437+
;; Our 'symbol-check' script will complain if we link against libssp.so,
438+
;; and thus will ensure that this works properly.
439+
`(cons "gcc_cv_libc_provides_ssp=yes" ,flags))))))
436440

437441
(define-public linux-base-gcc
438442
(package

doc/release-notes-6686.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Updated RPCs
2+
------------
3+
4+
* The `instantsendtoaddress` RPC was deprecated in Dash Core v0.15 and is now removed.

src/chainparams.cpp

Lines changed: 10 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ class CMainParams : public CChainParams {
193193
consensus.V19Height = 1899072; // 0000000000000015e32e73052d663626327004c81c5c22cb8b42c361015c0eae
194194
consensus.V20Height = 1987776; // 000000000000001bf41cff06b76780050682ca29e61a91c391893d4745579777
195195
consensus.MN_RRHeight = 2128896; // 0000000000000009a9696da93d3807eb14eb00a4ff449206d689156a21b27f26
196-
consensus.MinBIP9WarningHeight = 2128896 + 2016; // mn_rr activation height + miner confirmation window
196+
consensus.WithdrawalsHeight = 2201472; // 00000000000000210518749e17c00b035a2a4982c906236c28c41ea2231bf7ef
197+
consensus.MinBIP9WarningHeight = 2201472 + 2016; // withdrawals activation height + miner confirmation window
197198
consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20
198199
consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day
199200
consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes
@@ -208,15 +209,6 @@ class CMainParams : public CChainParams {
208209
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
209210
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
210211

211-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].bit = 11;
212-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nStartTime = 1728864000; // October 14, 2024
213-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nTimeout = 1760400000; // October 14, 2025
214-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nWindowSize = 4032;
215-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdStart = 3226; // 80% of 4032
216-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdMin = 2420; // 60% of 4032
217-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nFalloffCoeff = 5; // this corresponds to 10 periods
218-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true;
219-
220212
consensus.vDeployments[Consensus::DEPLOYMENT_V23].bit = 12;
221213
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nStartTime = 1751328000; // July 1, 2025
222214
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nTimeout = 1782864000; // July 1, 2026
@@ -399,7 +391,8 @@ class CTestNetParams : public CChainParams {
399391
consensus.V19Height = 850100; // 000004728b8ff2a16b9d4eebb0fd61eeffadc9c7fe4b0ec0b5a739869401ab5b
400392
consensus.V20Height = 905100; // 0000020c5e0f86f385cbf8e90210de9a9fd63633f01433bf47a6b3227a2851fd
401393
consensus.MN_RRHeight = 1066900; // 000000d05d445958a9a4ad6bdc0f4bfb25af124b2326060703373ff2d3b397e9
402-
consensus.MinBIP9WarningHeight = 1066900 + 2016; // mn_rr activation height + miner confirmation window
394+
consensus.WithdrawalsHeight = 1148500; // 000000212a6fec2ee2af040c6d7a176360b154cbaa998888170cfd9ae7dd632d
395+
consensus.MinBIP9WarningHeight = 1148500 + 2016; // withdrawals activation height + miner confirmation window
403396
consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20
404397
consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day
405398
consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes
@@ -414,15 +407,6 @@ class CTestNetParams : public CChainParams {
414407
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
415408
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
416409

417-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].bit = 11;
418-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nStartTime = 1728864000; // October 14, 2024
419-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
420-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nWindowSize = 100;
421-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdStart = 80; // 80% of 100
422-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdMin = 60; // 60% of 100
423-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nFalloffCoeff = 5; // this corresponds to 10 periods
424-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true;
425-
426410
consensus.vDeployments[Consensus::DEPLOYMENT_V23].bit = 12;
427411
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nStartTime = 1751328000; // July 1, 2025
428412
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
@@ -580,7 +564,8 @@ class CDevNetParams : public CChainParams {
580564
consensus.V19Height = 2; // V19 activated immediately on devnet
581565
consensus.V20Height = 2; // V20 activated immediately on devnet
582566
consensus.MN_RRHeight = 2; // MN_RR activated immediately on devnet
583-
consensus.MinBIP9WarningHeight = 2 + 2016; // v19 activation height + miner confirmation window
567+
consensus.WithdrawalsHeight = 2; // withdrawals activated immediately on devnet
568+
consensus.MinBIP9WarningHeight = 2 + 2016; // withdrawals activation height + miner confirmation window
584569
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1
585570
consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day
586571
consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes
@@ -595,15 +580,6 @@ class CDevNetParams : public CChainParams {
595580
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
596581
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
597582

598-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].bit = 11;
599-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nStartTime = 1704067200; // January 1, 2024
600-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
601-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nWindowSize = 120;
602-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdStart = 80; // 80% of 100
603-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdMin = 60; // 60% of 100
604-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nFalloffCoeff = 5; // this corresponds to 10 periods
605-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true;
606-
607583
consensus.vDeployments[Consensus::DEPLOYMENT_V23].bit = 12;
608584
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nStartTime = 1751328000; // July 1, 2025
609585
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
@@ -822,8 +798,9 @@ class CRegTestParams : public CChainParams {
822798
consensus.DIP0024Height = 1; // Always have dip0024 quorums unless overridden
823799
consensus.DIP0024QuorumsHeight = 1; // Always have dip0024 quorums unless overridden
824800
consensus.V19Height = 1; // Always active unless overriden
825-
consensus.V20Height = 900;
826-
consensus.MN_RRHeight = 900;
801+
consensus.V20Height = consensus.DIP0003Height; // Active not earlier than dip0003. Functional tests (DashTestFramework) uses height 100 (same as coinbase maturity)
802+
consensus.MN_RRHeight = consensus.V20Height; // MN_RR does not really have effect before v20 activation
803+
consensus.WithdrawalsHeight = 600;
827804
consensus.MinBIP9WarningHeight = 0;
828805
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1
829806
consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day
@@ -840,15 +817,6 @@ class CRegTestParams : public CChainParams {
840817
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
841818
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
842819

843-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].bit = 11;
844-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nStartTime = 0;
845-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
846-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nWindowSize = 200;
847-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdStart = 200 / 5 * 4; // 80% of window size
848-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nThresholdMin = 200 / 5 * 3; // 60% of window size
849-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].nFalloffCoeff = 5; // this corresponds to 10 periods
850-
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true;
851-
852820
consensus.vDeployments[Consensus::DEPLOYMENT_V23].bit = 12;
853821
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nStartTime = 0;
854822
consensus.vDeployments[Consensus::DEPLOYMENT_V23].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
@@ -958,6 +926,7 @@ class CRegTestParams : public CChainParams {
958926
UpdateLLMQTestParametersFromArgs(args, Consensus::LLMQType::LLMQ_TEST_PLATFORM);
959927
UpdateLLMQInstantSendDIP0024FromArgs(args);
960928
assert(consensus.V20Height >= consensus.DIP0003Height);
929+
assert(consensus.MN_RRHeight >= consensus.V20Height);
961930
}
962931

963932
/**

src/consensus/params.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ enum BuriedDeployment : int16_t {
3434
DEPLOYMENT_V19,
3535
DEPLOYMENT_V20,
3636
DEPLOYMENT_MN_RR,
37+
DEPLOYMENT_WITHDRAWALS,
3738
};
38-
constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_MN_RR; }
39+
constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_WITHDRAWALS; }
3940

4041
enum DeploymentPos : uint16_t {
4142
DEPLOYMENT_TESTDUMMY,
42-
DEPLOYMENT_WITHDRAWALS, // Deployment of Fix for quorum selection for withdrawals
4343
DEPLOYMENT_V23, // Deployment of doubling withdrawal limit, extended addresses
4444
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in deploymentinfo.cpp
4545
MAX_VERSION_BITS_DEPLOYMENTS
@@ -147,6 +147,8 @@ struct Params {
147147
int V20Height;
148148
/** Block height at which MN_RR (Deployment of Masternode Reward Location Reallocation) becomes active */
149149
int MN_RRHeight;
150+
/** Block height at which WITHDRAWALS (Deployment of quorum fix and higher limits for withdrawals) becomes active */
151+
int WithdrawalsHeight;
150152
/** Don't warn about unknown BIP 9 activations below this height.
151153
* This prevents us from warning about the CSV and DIP activations. */
152154
int MinBIP9WarningHeight;
@@ -214,6 +216,8 @@ struct Params {
214216
return V20Height;
215217
case DEPLOYMENT_MN_RR:
216218
return MN_RRHeight;
219+
case DEPLOYMENT_WITHDRAWALS:
220+
return WithdrawalsHeight;
217221
} // no default case, so the compiler can warn about missing cases
218222
return std::numeric_limits<int>::max();
219223
}

src/deploymentinfo.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_B
1111
/*.name =*/ "testdummy",
1212
/*.gbt_force =*/ true,
1313
},
14-
{
15-
/*.name =*/"withdrawals",
16-
/*.gbt_force =*/true,
17-
},
1814
{
1915
/*.name =*/"v23",
2016
/*.gbt_force =*/true,
@@ -53,6 +49,8 @@ std::string DeploymentName(Consensus::BuriedDeployment dep)
5349
return "v20";
5450
case Consensus::DEPLOYMENT_MN_RR:
5551
return "mn_rr";
52+
case Consensus::DEPLOYMENT_WITHDRAWALS:
53+
return "withdrawals";
5654
} // no default case, so the compiler can warn about missing cases
5755
return "";
5856
}

src/evo/creditpool.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ CCreditPoolDiff::CCreditPoolDiff(CCreditPool starter, const CBlockIndex* pindexP
243243
assert(pindexPrev);
244244

245245
if (DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_MN_RR)) {
246-
// We consider V20 active if mn_rr is active
246+
// If credit pool exists, it means v20 is activated
247247
platformReward = PlatformShare(GetMasternodePayment(pindexPrev->nHeight + 1, blockSubsidy, /*fV20Active=*/ true));
248248
}
249249
}

src/evo/deterministicmns.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ bool CDeterministicMNList::IsMNValid(const uint256& proTxHash) const
6969
if (p == nullptr) {
7070
return false;
7171
}
72-
return IsMNValid(**p);
72+
return !(*p)->pdmnState->IsBanned();
7373
}
7474

7575
bool CDeterministicMNList::IsMNPoSeBanned(const uint256& proTxHash) const
@@ -78,17 +78,7 @@ bool CDeterministicMNList::IsMNPoSeBanned(const uint256& proTxHash) const
7878
if (p == nullptr) {
7979
return false;
8080
}
81-
return IsMNPoSeBanned(**p);
82-
}
83-
84-
bool CDeterministicMNList::IsMNValid(const CDeterministicMN& dmn)
85-
{
86-
return !IsMNPoSeBanned(dmn);
87-
}
88-
89-
bool CDeterministicMNList::IsMNPoSeBanned(const CDeterministicMN& dmn)
90-
{
91-
return dmn.pdmnState->IsBanned();
81+
return (*p)->pdmnState->IsBanned();
9282
}
9383

9484
CDeterministicMNCPtr CDeterministicMNList::GetMN(const uint256& proTxHash) const
@@ -103,7 +93,7 @@ CDeterministicMNCPtr CDeterministicMNList::GetMN(const uint256& proTxHash) const
10393
CDeterministicMNCPtr CDeterministicMNList::GetValidMN(const uint256& proTxHash) const
10494
{
10595
auto dmn = GetMN(proTxHash);
106-
if (dmn && !IsMNValid(*dmn)) {
96+
if (dmn && dmn->pdmnState->IsBanned()) {
10797
return nullptr;
10898
}
10999
return dmn;
@@ -127,7 +117,7 @@ CDeterministicMNCPtr CDeterministicMNList::GetMNByCollateral(const COutPoint& co
127117
CDeterministicMNCPtr CDeterministicMNList::GetValidMNByCollateral(const COutPoint& collateralOutpoint) const
128118
{
129119
auto dmn = GetMNByCollateral(collateralOutpoint);
130-
if (dmn && !IsMNValid(*dmn)) {
120+
if (dmn && dmn->pdmnState->IsBanned()) {
131121
return nullptr;
132122
}
133123
return dmn;

src/evo/deterministicmns.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ class CDeterministicMNList
221221

222222
[[nodiscard]] size_t GetValidMNsCount() const
223223
{
224-
return ranges::count_if(mnMap, [](const auto& p) { return IsMNValid(*p.second); });
224+
return ranges::count_if(mnMap, [](const auto& p) { return !p.second->pdmnState->IsBanned(); });
225225
}
226226

227227
[[nodiscard]] size_t GetAllEvoCount() const
@@ -231,14 +231,15 @@ class CDeterministicMNList
231231

232232
[[nodiscard]] size_t GetValidEvoCount() const
233233
{
234-
return ranges::count_if(mnMap,
235-
[](const auto& p) { return p.second->nType == MnType::Evo && IsMNValid(*p.second); });
234+
return ranges::count_if(mnMap, [](const auto& p) {
235+
return p.second->nType == MnType::Evo && !p.second->pdmnState->IsBanned();
236+
});
236237
}
237238

238239
[[nodiscard]] size_t GetValidWeightedMNsCount() const
239240
{
240241
return std::accumulate(mnMap.begin(), mnMap.end(), 0, [](auto res, const auto& p) {
241-
if (!IsMNValid(*p.second)) return res;
242+
if (p.second->pdmnState->IsBanned()) return res;
242243
return res + GetMnType(p.second->nType).voting_weight;
243244
});
244245
}
@@ -253,7 +254,7 @@ class CDeterministicMNList
253254
void ForEachMN(bool onlyValid, Callback&& cb) const
254255
{
255256
for (const auto& p : mnMap) {
256-
if (!onlyValid || IsMNValid(*p.second)) {
257+
if (!onlyValid || !p.second->pdmnState->IsBanned()) {
257258
cb(*p.second);
258259
}
259260
}
@@ -270,7 +271,7 @@ class CDeterministicMNList
270271
void ForEachMNShared(bool onlyValid, Callback&& cb) const
271272
{
272273
for (const auto& p : mnMap) {
273-
if (!onlyValid || IsMNValid(*p.second)) {
274+
if (!onlyValid || !p.second->pdmnState->IsBanned()) {
274275
cb(p.second);
275276
}
276277
}
@@ -301,8 +302,6 @@ class CDeterministicMNList
301302

302303
[[nodiscard]] bool IsMNValid(const uint256& proTxHash) const;
303304
[[nodiscard]] bool IsMNPoSeBanned(const uint256& proTxHash) const;
304-
static bool IsMNValid(const CDeterministicMN& dmn);
305-
static bool IsMNPoSeBanned(const CDeterministicMN& dmn);
306305

307306
[[nodiscard]] bool HasMN(const uint256& proTxHash) const
308307
{

src/httpserver.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ static bool InitHTTPAllowList()
179179
rpc_allow_subnets.push_back(CSubNet{LookupHost("127.0.0.1", false).value(), 8}); // always allow IPv4 local subnet
180180
rpc_allow_subnets.push_back(CSubNet{LookupHost("::1", false).value()}); // always allow IPv6 localhost
181181
for (const std::string& strAllow : gArgs.GetArgs("-rpcallowip")) {
182-
CSubNet subnet;
183-
LookupSubNet(strAllow, subnet);
182+
const CSubNet subnet{LookupSubNet(strAllow)};
184183
if (!subnet.IsValid()) {
185184
uiInterface.ThreadSafeMessageBox(
186185
strprintf(Untranslated("Invalid -rpcallowip subnet specification: %s. Valid are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24)."), strAllow),

0 commit comments

Comments
 (0)