diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index ba7e3cff004..569c8483738 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -395,27 +395,47 @@ static void MutateTxAddOutMultiSig(CMutableTransaction& tx, const std::string& s static void MutateTxAddOutData(CMutableTransaction& tx, const std::string& strInput) { CAmount value = 0; + + // separate [VALUE:]DATA[:ASSET] in string + std::vector vStrInputParts; + boost::split(vStrInputParts, strInput, boost::is_any_of(":")); - // separate [VALUE:]DATA in string - size_t pos = strInput.find(':'); - - if (pos==0) + // Check that there are enough parameters + if (vStrInputParts[0].empty()) throw std::runtime_error("TX output value not specified"); - if (pos != std::string::npos) { - // Extract and validate VALUE - value = ExtractAndValidateValue(strInput.substr(0, pos)); - } - - // extract and validate DATA - std::string strData = strInput.substr(pos + 1, std::string::npos); - - if (!IsHex(strData)) - throw std::runtime_error("invalid TX output data"); + if (vStrInputParts.size()>3) + throw std::runtime_error("too many separators"); + + std::vector data; + CAsset asset(Params().GetConsensus().pegged_asset); + + if (vStrInputParts.size()==1) { + std::string strData = vStrInputParts[0]; + if (!IsHex(strData)) + throw std::runtime_error("invalid TX output data"); + data = ParseHex(strData); - std::vector data = ParseHex(strData); + } else { + value = ExtractAndValidateValue(vStrInputParts[0]); + std::string strData = vStrInputParts[1]; + if (!IsHex(strData)) + throw std::runtime_error("invalid TX output data"); + data = ParseHex(strData); + + if (vStrInputParts.size()==3) { + std::string strAsset = vStrInputParts[2]; + if (!IsHex(strAsset)) + throw std::runtime_error("invalid TX output asset type"); + + asset.SetHex(strAsset); + if (asset.IsNull()) { + throw std::runtime_error("invalid TX output asset type"); + } + } + } - CTxOut txout(Params().GetConsensus().pegged_asset, value, CScript() << OP_RETURN << data); + CTxOut txout(asset, value, CScript() << OP_RETURN << data); tx.vout.push_back(txout); } diff --git a/src/validation.cpp b/src/validation.cpp index 60eaad461c0..18bb507caa4 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3962,6 +3962,9 @@ std::vector GenerateCoinbaseCommitment(CBlock& block, const CBloc bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev, int64_t nAdjustedTime) { + assert(pindexPrev != NULL); + const int nHeight = pindexPrev->nHeight + 1; + // Check proof of work if (!CheckChallenge(block, *pindexPrev, consensusParams)) return state.DoS(100, false, REJECT_INVALID, "bad-diffbits", false, "incorrect proof of work"); @@ -3971,7 +3974,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta return state.Invalid(false, REJECT_INVALID, "time-too-old", "block's timestamp is too early"); // Check height in header against prev - if ((uint32_t)pindexPrev->nHeight + 1 != block.nHeight) + if ((uint32_t)nHeight != block.nHeight) return state.Invalid(error("%s: block height in header is incorrect", __func__), REJECT_INVALID, "bad-header-height"); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5930bb2e148..27863d1cc65 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3752,7 +3752,7 @@ UniValue claimpegin(const JSONRPCRequest& request) "\nResult:\n" "\"txid\" (string) Txid of the resulting sidechain transaction\n" "\nExamples:\n" - + HelpExampleCli("claimpegin", "\"0200000002b80a99d63ca943d72141750d983a3eeda3a5c5a92aa962884ffb141eb49ffb4f000000006a473044022031ffe1d76decdfbbdb7e2ee6010e865a5134137c261e1921da0348b95a207f9e02203596b065c197e31bcc2f80575154774ac4e80acd7d812c91d93c4ca6a3636f27012102d2130dfbbae9bd27eee126182a39878ac4e117d0850f04db0326981f43447f9efeffffffb80a99d63ca943d72141750d983a3eeda3a5c5a92aa962884ffb141eb49ffb4f010000006b483045022100cf041ce0eb249ae5a6bc33c71c156549c7e5ad877ae39e2e3b9c8f1d81ed35060220472d4e4bcc3b7c8d1b34e467f46d80480959183d743dad73b1ed0e93ec9fd14f012103e73e8b55478ab9c5de22e2a9e73c3e6aca2c2e93cd2bad5dc4436a9a455a5c44feffffff0200e1f5050000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87e86cbe00000000001976a914a25fe72e7139fd3f61936b228d657b2548b3936a88acc0020000\", \"00000020976e918ed537b0f99028648f2a25c0bd4513644fb84d9cbe1108b4df6b8edf6ba715c424110f0934265bf8c5763d9cc9f1675a0f728b35b9bc5875f6806be3d19cd5b159ffff7f2000000000020000000224eab3da09d99407cb79f0089e3257414c4121cb85a320e1fd0f88678b6b798e0713a8d66544b6f631f9b6d281c71633fb91a67619b189a06bab09794d5554a60105\" \"0014058c769ffc7d12c35cddec87384506f536383f9c\"") + + HelpExampleCli("claimpegin", "\"0200000002b80a99d63ca943d72141750d983a3eeda3a5c5a92aa962884ffb141eb49ffb4f000000006a473044022031ffe1d76decdfbbdb7e2ee6010e865a5134137c261e1921da0348b95a207f9e02203596b065c197e31bcc2f80575154774ac4e80acd7d812c91d93c4ca6a3636f27012102d2130dfbbae9bd27eee126182a39878ac4e117d0850f04db0326981f43447f9efeffffffb80a99d63ca943d72141750d983a3eeda3a5c5a92aa962884ffb141eb49ffb4f010000006b483045022100cf041ce0eb249ae5a6bc33c71c156549c7e5ad877ae39e2e3b9c8f1d81ed35060220472d4e4bcc3b7c8d1b34e467f46d80480959183d743dad73b1ed0e93ec9fd14f012103e73e8b55478ab9c5de22e2a9e73c3e6aca2c2e93cd2bad5dc4436a9a455a5c44feffffff0200e1f5050000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87e86cbe00000000001976a914a25fe72e7139fd3f61936b228d657b2548b3936a88acc0020000\" \"00000020976e918ed537b0f99028648f2a25c0bd4513644fb84d9cbe1108b4df6b8edf6ba715c424110f0934265bf8c5763d9cc9f1675a0f728b35b9bc5875f6806be3d19cd5b159ffff7f2000000000020000000224eab3da09d99407cb79f0089e3257414c4121cb85a320e1fd0f88678b6b798e0713a8d66544b6f631f9b6d281c71633fb91a67619b189a06bab09794d5554a60105\" \"0014058c769ffc7d12c35cddec87384506f536383f9c\"") + HelpExampleRpc("claimpegin", "\"0200000002b80a99d63ca943d72141750d983a3eeda3a5c5a92aa962884ffb141eb49ffb4f000000006a473044022031ffe1d76decdfbbdb7e2ee6010e865a5134137c261e1921da0348b95a207f9e02203596b065c197e31bcc2f80575154774ac4e80acd7d812c91d93c4ca6a3636f27012102d2130dfbbae9bd27eee126182a39878ac4e117d0850f04db0326981f43447f9efeffffffb80a99d63ca943d72141750d983a3eeda3a5c5a92aa962884ffb141eb49ffb4f010000006b483045022100cf041ce0eb249ae5a6bc33c71c156549c7e5ad877ae39e2e3b9c8f1d81ed35060220472d4e4bcc3b7c8d1b34e467f46d80480959183d743dad73b1ed0e93ec9fd14f012103e73e8b55478ab9c5de22e2a9e73c3e6aca2c2e93cd2bad5dc4436a9a455a5c44feffffff0200e1f5050000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87e86cbe00000000001976a914a25fe72e7139fd3f61936b228d657b2548b3936a88acc0020000\", \"00000020976e918ed537b0f99028648f2a25c0bd4513644fb84d9cbe1108b4df6b8edf6ba715c424110f0934265bf8c5763d9cc9f1675a0f728b35b9bc5875f6806be3d19cd5b159ffff7f2000000000020000000224eab3da09d99407cb79f0089e3257414c4121cb85a320e1fd0f88678b6b798e0713a8d66544b6f631f9b6d281c71633fb91a67619b189a06bab09794d5554a60105\", \"0014058c769ffc7d12c35cddec87384506f536383f9c\"") );