diff --git a/src/main.cpp b/src/main.cpp index a924aff71..8d6d7179d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -883,14 +883,14 @@ bool ContextualCheckTransaction( // Rules that apply to Sapling and later: if (saplingActive) { // Reject transactions with invalid version - if (tx.nVersion < SAPLING_MIN_TX_VERSION) { - return state.DoS( - dosLevelConstricting, - error("ContextualCheckTransaction(): Sapling version too low"), - REJECT_INVALID, "bad-tx-sapling-version-too-low"); - } + if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) { + if (tx.nVersion < SAPLING_MIN_TX_VERSION) { + return state.DoS( + dosLevelConstricting, + error("ContextualCheckTransaction(): Sapling version too low"), + REJECT_INVALID, "bad-tx-sapling-version-too-low"); + } - if (!futureActive) { // Reject transactions with invalid version if (tx.nVersion > SAPLING_MAX_TX_VERSION) { return state.DoS( @@ -898,7 +898,9 @@ bool ContextualCheckTransaction( error("ContextualCheckTransaction(): Sapling version too high"), REJECT_INVALID, "bad-tx-sapling-version-too-high"); } + } + if (!futureActive) { // Reject transactions with invalid version group id if (tx.nVersionGroupId != SAPLING_VERSION_GROUP_ID) { return state.DoS( @@ -1041,6 +1043,13 @@ bool ContextualCheckTransaction( if (futureActive) { // version group is the most recent available version group ID if (tx.nVersionGroupId == ZFUTURE_VERSION_GROUP_ID) { + if (tx.nVersion <= SAPLING_MAX_TX_VERSION) { + return state.DoS( + dosLevelConstricting, + error("ContextualCheckTransaction(): Future version too low"), + REJECT_INVALID, "bad-tx-zfuture-version-too-low"); + } + // Reject transactions with invalid version if (tx.nVersion > SAPLING_MAX_TX_VERSION + 1) { return state.DoS( @@ -1049,13 +1058,7 @@ bool ContextualCheckTransaction( REJECT_INVALID, "bad-tx-zfuture-version-too-high"); } } else if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) { - // Reject transactions with invalid version - if (tx.nVersion > SAPLING_MAX_TX_VERSION) { - return state.DoS( - dosLevelPotentiallyRelaxing, - error("ContextualCheckTransaction(): Sapling version too high"), - REJECT_INVALID, "bad-tx-sapling-version-too-high"); - } + //allow V4 transactions while futureActive } else { return state.DoS( dosLevelPotentiallyRelaxing,