diff --git a/src/evo/assetlocktx.cpp b/src/evo/assetlocktx.cpp index cba0bdc55534..2e391388f55b 100644 --- a/src/evo/assetlocktx.cpp +++ b/src/evo/assetlocktx.cpp @@ -26,7 +26,7 @@ using node::BlockManager; /** * Asset Lock Transaction */ -bool CheckAssetLockTx(const CTransaction& tx, TxValidationState& state) +bool CheckAssetLockTx(const CTransaction& tx, TxValidationState& state, bool is_v24_active) { if (tx.nType != TRANSACTION_ASSET_LOCK) { return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-type"); @@ -56,6 +56,9 @@ bool CheckAssetLockTx(const CTransaction& tx, TxValidationState& state) if (opt_assetLockTx->getVersion() == 0 || opt_assetLockTx->getVersion() > CAssetLockPayload::CURRENT_VERSION) { return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-version"); } + if (!is_v24_active && opt_assetLockTx->getVersion() == CAssetLockPayload::CURRENT_VERSION) { + return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-version-2"); + } if (opt_assetLockTx->getCreditOutputs().empty()) { return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-emptycreditoutputs"); @@ -68,8 +71,14 @@ bool CheckAssetLockTx(const CTransaction& tx, TxValidationState& state) } creditOutputsAmount += out.nValue; - if (!out.scriptPubKey.IsPayToPublicKeyHash()) { - return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-pubKeyHash"); + if (opt_assetLockTx->getVersion() >= 2) { + if (!out.scriptPubKey.IsPayToPublicKeyHash() && !out.scriptPubKey.IsPayToScriptHash()) { + return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-script-pubkey"); + } + } else { + if (!out.scriptPubKey.IsPayToPublicKeyHash()) { + return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-assetlocktx-pubKeyHash"); + } } } if (creditOutputsAmount != returnAmount) { diff --git a/src/evo/assetlocktx.h b/src/evo/assetlocktx.h index 6a00f605f2c0..09462734e1e4 100644 --- a/src/evo/assetlocktx.h +++ b/src/evo/assetlocktx.h @@ -28,7 +28,8 @@ class BlockManager; class CAssetLockPayload { public: - static constexpr uint8_t CURRENT_VERSION = 1; + static constexpr uint8_t INITIAL_VERSION = 1; + static constexpr uint8_t CURRENT_VERSION = 2; static constexpr auto SPECIALTX_TYPE = TRANSACTION_ASSET_LOCK; private: @@ -36,8 +37,8 @@ class CAssetLockPayload std::vector creditOutputs; public: - explicit CAssetLockPayload(const std::vector& creditOutputs) : - creditOutputs(creditOutputs) + explicit CAssetLockPayload(const std::vector& creditOutputs, uint8_t nVersion = CURRENT_VERSION) : + nVersion(nVersion), creditOutputs(creditOutputs) {} CAssetLockPayload() = default; @@ -154,7 +155,7 @@ class CAssetUnlockPayload } }; -bool CheckAssetLockTx(const CTransaction& tx, TxValidationState& state); +bool CheckAssetLockTx(const CTransaction& tx, TxValidationState& state, bool is_v24_active = false); bool CheckAssetUnlockTx(const node::BlockManager& blockman, const llmq::CQuorumManager& qman, const CTransaction& tx, gsl::not_null pindexPrev, const std::optional& indexes, TxValidationState& state); bool GetAssetUnlockFee(const CTransaction& tx, CAmount& txfee, TxValidationState& state); diff --git a/src/evo/core_write.cpp b/src/evo/core_write.cpp index 1ccfc998840b..1f019b1cfecb 100644 --- a/src/evo/core_write.cpp +++ b/src/evo/core_write.cpp @@ -16,7 +16,9 @@ #include #include +#include #include +#include