Skip to content

Commit

Permalink
Revert "Feature: Add P2SH support - Core Protocol Development Proposa…
Browse files Browse the repository at this point in the history
…l 001 (PR RavenProject#873)" (RavenProject#1010)

This reverts commit a7e305b.
  • Loading branch information
hans-schmidt authored and HyperPeek committed May 21, 2021
1 parent 9cf0e4b commit 04eba4f
Show file tree
Hide file tree
Showing 33 changed files with 246 additions and 1,047 deletions.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

This issue tracker is only for technical issues related to Ravencoin.

General Ravencoin questions and/or support requests and are best directed to the [Ravencoin Discord](https://discord.gg/GwtXdyc).
General Ravencoin questions and/or support requests and are best directed to the [Ravencoin Discord](https://discord.gg/jn6uhur)).

For reporting security issues, please direct message one of the core developers in discord.

Expand Down
1 change: 0 additions & 1 deletion src/Makefile.test.include
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.r
RAVEN_TESTS =\
test/assets/asset_tests.cpp \
test/assets/serialization_tests.cpp \
test/assets/asset_p2sh_tests.cpp \
test/assets/asset_tx_tests.cpp \
test/assets/cache_tests.cpp \
test/assets/asset_reissue_tests.cpp \
Expand Down
45 changes: 13 additions & 32 deletions src/assets/assets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3169,9 +3169,8 @@ bool IsScriptNewAsset(const CScript& scriptPubKey)
bool IsScriptNewAsset(const CScript& scriptPubKey, int& nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex)) {
bool fIsOwner =false;
if (scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex)) {
return nType == TX_NEW_ASSET && !fIsOwner;
}
return false;
Expand All @@ -3186,9 +3185,8 @@ bool IsScriptNewUniqueAsset(const CScript& scriptPubKey)
bool IsScriptNewUniqueAsset(const CScript &scriptPubKey, int &nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (!scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex))
if (!scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex))
return false;

CNewAsset asset;
Expand All @@ -3212,9 +3210,8 @@ bool IsScriptNewMsgChannelAsset(const CScript& scriptPubKey)
bool IsScriptNewMsgChannelAsset(const CScript &scriptPubKey, int &nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (!scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex))
if (!scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex))
return false;

CNewAsset asset;
Expand All @@ -3239,9 +3236,8 @@ bool IsScriptOwnerAsset(const CScript& scriptPubKey)
bool IsScriptOwnerAsset(const CScript& scriptPubKey, int& nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner =false;
if (scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex)) {
if (scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex)) {
return nType == TX_NEW_ASSET && fIsOwner;
}

Expand All @@ -3257,9 +3253,8 @@ bool IsScriptReissueAsset(const CScript& scriptPubKey)
bool IsScriptReissueAsset(const CScript& scriptPubKey, int& nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner =false;
if (scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex)) {
if (scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex)) {
return nType == TX_REISSUE_ASSET;
}

Expand All @@ -3275,9 +3270,8 @@ bool IsScriptTransferAsset(const CScript& scriptPubKey)
bool IsScriptTransferAsset(const CScript& scriptPubKey, int& nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex)) {
if (scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex)) {
return nType == TX_TRANSFER_ASSET;
}

Expand All @@ -3293,9 +3287,8 @@ bool IsScriptNewQualifierAsset(const CScript& scriptPubKey)
bool IsScriptNewQualifierAsset(const CScript &scriptPubKey, int &nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (!scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex))
if (!scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex))
return false;

CNewAsset asset;
Expand All @@ -3319,9 +3312,8 @@ bool IsScriptNewRestrictedAsset(const CScript& scriptPubKey)
bool IsScriptNewRestrictedAsset(const CScript &scriptPubKey, int &nStartingIndex)
{
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (!scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, nStartingIndex))
if (!scriptPubKey.IsAssetScript(nType, fIsOwner, nStartingIndex))
return false;

CNewAsset asset;
Expand Down Expand Up @@ -3514,15 +3506,12 @@ bool GetAssetData(const CScript& script, CAssetOutputEntry& data)
std::string assetName = "";

int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (!script.IsAssetScript(nType, nScriptType, fIsOwner)) {
if (!script.IsAssetScript(nType, fIsOwner)) {
return false;
}

txnouttype type = txnouttype(nType);
txnouttype scriptType = txnouttype(nScriptType);
data.scriptType = scriptType;

// Get the New Asset or Transfer Asset from the scriptPubKey
if (type == TX_NEW_ASSET && !fIsOwner) {
Expand Down Expand Up @@ -4450,13 +4439,13 @@ void GetTxOutAssetTypes(const std::vector<CTxOut>& vout, int& issues, int& reiss
}
}

bool ParseAssetScript(CScript scriptPubKey, uint160 &hashBytes, int& nScriptType, std::string &assetName, CAmount &assetAmount) {
bool ParseAssetScript(CScript scriptPubKey, uint160 &hashBytes, std::string &assetName, CAmount &assetAmount) {
int nType;
bool fIsOwner;
int _nStartingPoint;
std::string _strAddress;
bool isAsset = false;
if (scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner, _nStartingPoint)) {
if (scriptPubKey.IsAssetScript(nType, fIsOwner, _nStartingPoint)) {
if (nType == TX_NEW_ASSET) {
if (fIsOwner) {
if (OwnerAssetFromScript(scriptPubKey, assetName, _strAddress)) {
Expand Down Expand Up @@ -4500,16 +4489,8 @@ bool ParseAssetScript(CScript scriptPubKey, uint160 &hashBytes, int& nScriptType
// LogPrintf("%s : Found no asset in script: %s", __func__, HexStr(scriptPubKey));
}
if (isAsset) {
if (nScriptType == TX_SCRIPTHASH) {
hashBytes = uint160(std::vector <unsigned char>(scriptPubKey.begin()+2, scriptPubKey.begin()+22));
} else if (nScriptType == TX_PUBKEYHASH) {
hashBytes = uint160(std::vector <unsigned char>(scriptPubKey.begin()+3, scriptPubKey.begin()+23));
} else {
return false;
}

// LogPrintf("%s : Found assets in script at address %s : %s (%s)", __func__, _strAddress, assetName, assetAmount);

hashBytes = uint160(std::vector <unsigned char>(scriptPubKey.begin()+3, scriptPubKey.begin()+23));
return true;
}
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/assets/assets.h
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ bool VerifyWalletHasAsset(const std::string& asset_name, std::pair<int, std::str
#endif

/** Helper method for extracting address bytes, asset name and amount from an asset script */
bool ParseAssetScript(CScript scriptPubKey, uint160 &hashBytes, int& nScriptType, std::string &assetName, CAmount &assetAmount);
bool ParseAssetScript(CScript scriptPubKey, uint160 &hashBytes, std::string &assetName, CAmount &assetAmount);

/** Helper method for extracting #TAGS from a verifier string */
void ExtractVerifierStringQualifiers(const std::string& verifier, std::set<std::string>& qualifiers);
Expand Down
2 changes: 1 addition & 1 deletion src/assets/messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ bool ScanForMessageChannels(std::string& strError)
}

for (auto out : ptx->vout) {
int nType = 0;
int nType = -1;
bool fOwner = false;
if (vpwallets[0]->IsMine(out) == ISMINE_SPENDABLE) { // Is the out mine
if (out.scriptPubKey.IsAssetScript(nType, fOwner)) {
Expand Down
3 changes: 1 addition & 2 deletions src/bloom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,8 @@ bool CBloomFilter::IsRelevantAndUpdate(const CTransaction& tx)
else if ((nFlags & BLOOM_UPDATE_MASK) == BLOOM_UPDATE_P2PUBKEY_ONLY)
{
txnouttype type;
txnouttype scriptType;
std::vector<std::vector<unsigned char> > vSolutions;
if (Solver(txout.scriptPubKey, type, scriptType, vSolutions) &&
if (Solver(txout.scriptPubKey, type, vSolutions) &&
(type == TX_PUBKEY || type == TX_MULTISIG))
insert(COutPoint(hash, i));
}
Expand Down
28 changes: 5 additions & 23 deletions src/chainparams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,13 +161,7 @@ class CMainParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nTimeout = 1628877600; // UTC: Fri Aug 13 2021 18:00:00
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nOverrideRuleChangeActivationThreshold = 1411; // Approx 70% of 2016
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nOverrideMinerConfirmationWindow = 2016;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].bit = 11;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nStartTime = 1682956800; // UTC: Mon Mai 01 2023 18:00:00
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nTimeout = 1714579200; // UTC: Wed Mai 01 2024 18:00:00
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideRuleChangeActivationThreshold = 2016; // 100% required, hardly happens
// consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideRuleChangeActivationThreshold = 1411; // Approx 70% of 2016
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideMinerConfirmationWindow = 2016;



// The best chain should have at least this much work
consensus.nMinimumChainWork = uint256S("000000000000000000000000000000000000000000000020d4ac871fb7009b63"); // Block 1186833
Expand Down Expand Up @@ -221,8 +215,7 @@ class CMainParams : public CChainParams {
{ 740000, uint256S("0x00000000000027d11bf1e7a3b57d3c89acc1722f39d6e08f23ac3a07e16e3172")},
{ 909251, uint256S("0x000000000000694c9a363eff06518aa7399f00014ce667b9762f9a4e7a49f485")},
{ 1040000, uint256S("0x000000000000138e2690b06b1ddd8cf158c3a5cf540ee5278debdcdffcf75839")},
{ 1186833, uint256S("0x0000000000000d4840d4de1f7d943542c2aed532bd5d6527274fc0142fa1a410")},
{ 1610000, uint256S("0x000000000001f1a67604ace3320cf722039f1b706b46a4d95e1d8502729b3046")}
{ 1186833, uint256S("0x0000000000000d4840d4de1f7d943542c2aed532bd5d6527274fc0142fa1a410")}
}
};

Expand Down Expand Up @@ -330,11 +323,6 @@ class CTestNetParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nTimeout = 1628877600; // UTC: Fri Aug 13 2021 18:00:00
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nOverrideRuleChangeActivationThreshold = 1411; // Approx 70% of 2016
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nOverrideMinerConfirmationWindow = 2016;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].bit = 11;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nStartTime = 1619971200; // UTC: Sun May 02 2021 18:00:00
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nTimeout = 1651507200; // UTC: Mon May 02 2022 18:00:00
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideRuleChangeActivationThreshold = 1411; // Approx 70% of 2016
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideMinerConfirmationWindow = 2016;

// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000168050db560b4");
Expand Down Expand Up @@ -448,8 +436,7 @@ class CTestNetParams : public CChainParams {
{ 225, uint256S("0x000003465e3e0167322eb8269ce91246bbc211e293bc5fbf6f0a0d12c1ccb363")},
{223408, uint256S("0x000000012a0c09dd6456ab19018cc458648dec762b04f4ddf8ef8108eae69db9")},
{232980, uint256S("0x000000007b16ae547fce76c3308dbeec2090cde75de74ab5dfcd6f60d13f089b")},
{257610, uint256S("0x000000006272208605c4df3b54d4d5515759105e7ffcb258e8cd8077924ffef1")},
{587000, uint256S("0x000000040ca00d88c1c3be8fb298365304a6fa13af95b8fa2a689ad6736e37f6")}
{257610, uint256S("0x000000006272208605c4df3b54d4d5515759105e7ffcb258e8cd8077924ffef1")}
}
};

Expand Down Expand Up @@ -544,8 +531,8 @@ class CRegTestParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].bit = 8;
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].nStartTime = 0;
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].nTimeout = 999999999999ULL;
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].nOverrideRuleChangeActivationThreshold = 108;
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].nOverrideMinerConfirmationWindow = 144;
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].nOverrideRuleChangeActivationThreshold = 208;
consensus.vDeployments[Consensus::DEPLOYMENT_TRANSFER_SCRIPT_SIZE].nOverrideMinerConfirmationWindow = 288;
consensus.vDeployments[Consensus::DEPLOYMENT_ENFORCE_VALUE].bit = 9;
consensus.vDeployments[Consensus::DEPLOYMENT_ENFORCE_VALUE].nStartTime = 0;
consensus.vDeployments[Consensus::DEPLOYMENT_ENFORCE_VALUE].nTimeout = 999999999999ULL;
Expand All @@ -556,11 +543,6 @@ class CRegTestParams : public CChainParams {
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nTimeout = 999999999999ULL;
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nOverrideRuleChangeActivationThreshold = 400;
consensus.vDeployments[Consensus::DEPLOYMENT_COINBASE_ASSETS].nOverrideMinerConfirmationWindow = 500;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].bit = 11;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nStartTime = 0;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nTimeout = 999999999999ULL;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideRuleChangeActivationThreshold = 108;
consensus.vDeployments[Consensus::DEPLOYMENT_P2SH_ASSETS].nOverrideMinerConfirmationWindow = 144;

// The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x00");
Expand Down
1 change: 0 additions & 1 deletion src/consensus/params.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ enum DeploymentPos
DEPLOYMENT_TRANSFER_SCRIPT_SIZE,
DEPLOYMENT_ENFORCE_VALUE,
DEPLOYMENT_COINBASE_ASSETS,
DEPLOYMENT_P2SH_ASSETS,
// DEPLOYMENT_CSV, // Deployment of BIP68, BIP112, and BIP113.
// DEPLOYMENT_SEGWIT, // Deployment of BIP141, BIP143, and BIP147.
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
Expand Down
14 changes: 3 additions & 11 deletions src/consensus/tx_verify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -655,16 +655,10 @@ bool Consensus::CheckTxAssets(const CTransaction& tx, CValidationState& state, c
i++;
bool fIsAsset = false;
int nType = 0;
int nScriptType = 0;
bool fIsOwner = false;
if (txout.scriptPubKey.IsAssetScript(nType, nScriptType, fIsOwner))
if (txout.scriptPubKey.IsAssetScript(nType, fIsOwner))
fIsAsset = true;

if (fIsAsset && nScriptType == TX_SCRIPTHASH) {
if (!AreP2SHAssetsAllowed())
return state.DoS(0, false, REJECT_INVALID, "bad-txns-p2sh-assets-not-active");
}

if (assetCache) {
if (fIsAsset && !AreAssetsDeployed())
return state.DoS(100, false, REJECT_INVALID, "bad-txns-is-asset-and-asset-not-active");
Expand Down Expand Up @@ -693,8 +687,7 @@ bool Consensus::CheckTxAssets(const CTransaction& tx, CValidationState& state, c
CAssetTransfer transfer;
std::string address = "";
if (!TransferAssetFromScript(txout.scriptPubKey, transfer, address))
return state.DoS(100, false, REJECT_INVALID, "bad-tx-asset-transfer-bad-deserialize", false, "",
tx.GetHash());
return state.DoS(100, false, REJECT_INVALID, "bad-tx-asset-transfer-bad-deserialize", false, "", tx.GetHash());

if (!ContextualCheckTransferAsset(assetCache, transfer, address, strError))
return state.DoS(100, false, REJECT_INVALID, strError, false, "", tx.GetHash());
Expand Down Expand Up @@ -835,9 +828,8 @@ bool Consensus::CheckTxAssets(const CTransaction& tx, CValidationState& state, c
} else {
for (auto out : tx.vout) {
int nType;
int nScriptType;
bool _isOwner;
if (out.scriptPubKey.IsAssetScript(nType, nScriptType, _isOwner)) {
if (out.scriptPubKey.IsAssetScript(nType, _isOwner)) {
if (nType != TX_TRANSFER_ASSET) {
return state.DoS(100, false, REJECT_INVALID, "bad-txns-bad-asset-transaction", false, "", tx.GetHash());
}
Expand Down
3 changes: 1 addition & 2 deletions src/core_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,14 @@ void ScriptPubKeyToUniv(const CScript& scriptPubKey,
UniValue& out, bool fIncludeHex)
{
txnouttype type;
txnouttype scriptType;
std::vector<CTxDestination> addresses;
int nRequired;

out.pushKV("asm", ScriptToAsmStr(scriptPubKey));
if (fIncludeHex)
out.pushKV("hex", HexStr(scriptPubKey.begin(), scriptPubKey.end()));

if (!ExtractDestinations(scriptPubKey, type, scriptType, addresses, nRequired)) {
if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
out.pushKV("type", GetTxnOutputType(type));
return;
}
Expand Down
12 changes: 5 additions & 7 deletions src/policy/policy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ bool IsDust(const CTxOut& txout, const CFeeRate& dustRelayFeeIn)
return (txout.nValue < GetDustThreshold(txout, dustRelayFeeIn));
}

bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, txnouttype& scriptType, const bool witnessEnabled) {
bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, const bool witnessEnabled) {
std::vector<std::vector<unsigned char> > vSolutions;
if (!Solver(scriptPubKey, whichType, scriptType, vSolutions))
if (!Solver(scriptPubKey, whichType, vSolutions))
return false;


Expand Down Expand Up @@ -123,9 +123,8 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason, const bool witnes
unsigned int nDataOut = 0;
unsigned int nAssetDataOut = 0;
txnouttype whichType;
txnouttype scriptType;
for (const CTxOut& txout : tx.vout) {
if (!::IsStandard(txout.scriptPubKey, whichType, scriptType, witnessEnabled)) {
if (!::IsStandard(txout.scriptPubKey, whichType, witnessEnabled)) {
reason = "scriptpubkey";
return false;
}
Expand Down Expand Up @@ -185,13 +184,12 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)

std::vector<std::vector<unsigned char> > vSolutions;
txnouttype whichType;
txnouttype scriptType;
// get the scriptPubKey corresponding to this input:
const CScript& prevScript = prev.scriptPubKey;
if (!Solver(prevScript, whichType, scriptType, vSolutions))
if (!Solver(prevScript, whichType, vSolutions))
return false;

if (whichType == TX_SCRIPTHASH || scriptType == TX_SCRIPTHASH)
if (whichType == TX_SCRIPTHASH)
{
std::vector<std::vector<unsigned char> > stack;
// convert the scriptSig into a stack, so we can inspect the redeemScript
Expand Down
2 changes: 1 addition & 1 deletion src/policy/policy.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ CAmount GetDustThreshold(const CTxOut& txout, const CFeeRate& dustRelayFee);

bool IsDust(const CTxOut& txout, const CFeeRate& dustRelayFee);

bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, txnouttype& scriptType, const bool witnessEnabled = false);
bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, const bool witnessEnabled = false);
/**
* Check for standard transaction types
* @return True if all outputs (scriptPubKeys) use only standard transaction forms
Expand Down
Loading

0 comments on commit 04eba4f

Please sign in to comment.