From 48a82fa9939cf76eb97ff0e9bf9a46dea781541b Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Wed, 8 May 2019 12:12:14 +0100 Subject: [PATCH] Make claimpegin fail in the case of a double claim Currently it will commit to the transaction without it being able to enter the mempool. This makes the block creation code include the tx into the block and create an invalid block. --- src/wallet/rpcwallet.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b442265440..360651ebbb 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5317,6 +5317,15 @@ UniValue claimpegin(const JSONRPCRequest& request) throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); } + // To check if it's not double spending an existing pegin UTXO, we check mempool acceptance. + CValidationState acceptState; + bool accepted = ::AcceptToMemoryPool(mempool, acceptState, MakeTransactionRef(mtx), nullptr /* pfMissingInputs */, + nullptr /* plTxnReplaced */, false /* bypass_limits */, maxTxFee, true /* test_accept */); + if (!accepted) { + std::string strError = strprintf("Error: The transaction was rejected! Reason given: %s", FormatStateMessage(acceptState)); + throw JSONRPCError(RPC_WALLET_ERROR, strError); + } + // Send it CValidationState state; mapValue_t mapValue;