|
|
@ -10,6 +10,7 @@
|
|
|
|
#include "db.h"
|
|
|
|
#include "db.h"
|
|
|
|
#include "init.h"
|
|
|
|
#include "init.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "main.h"
|
|
|
|
|
|
|
|
#include "net.h"
|
|
|
|
#include "wallet.h"
|
|
|
|
#include "wallet.h"
|
|
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace std;
|
|
|
@ -454,17 +455,29 @@ Value sendrawtransaction(const Array& params, bool fHelp)
|
|
|
|
catch (std::exception &e) {
|
|
|
|
catch (std::exception &e) {
|
|
|
|
throw JSONRPCError(-22, "TX decode failed");
|
|
|
|
throw JSONRPCError(-22, "TX decode failed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint256 hashTx = tx.GetHash();
|
|
|
|
|
|
|
|
|
|
|
|
// push to local node
|
|
|
|
// See if the transaction is already in a block
|
|
|
|
CTxDB txdb("r");
|
|
|
|
// or in the memory pool:
|
|
|
|
if (!tx.AcceptToMemoryPool(txdb))
|
|
|
|
CTransaction existingTx;
|
|
|
|
throw JSONRPCError(-22, "TX rejected");
|
|
|
|
uint256 hashBlock = 0;
|
|
|
|
|
|
|
|
if (GetTransaction(hashTx, existingTx, hashBlock))
|
|
|
|
SyncWithWallets(tx, NULL, true);
|
|
|
|
{
|
|
|
|
|
|
|
|
if (hashBlock != 0)
|
|
|
|
|
|
|
|
throw JSONRPCError(-5, string("transaction already in block ")+hashBlock.GetHex());
|
|
|
|
|
|
|
|
// Not in block, but already in the memory pool; will drop
|
|
|
|
|
|
|
|
// through to re-relay it.
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// push to local node
|
|
|
|
|
|
|
|
CTxDB txdb("r");
|
|
|
|
|
|
|
|
if (!tx.AcceptToMemoryPool(txdb))
|
|
|
|
|
|
|
|
throw JSONRPCError(-22, "TX rejected");
|
|
|
|
|
|
|
|
|
|
|
|
// relay to network
|
|
|
|
SyncWithWallets(tx, NULL, true);
|
|
|
|
CInv inv(MSG_TX, tx.GetHash());
|
|
|
|
}
|
|
|
|
RelayInventory(inv);
|
|
|
|
RelayMessage(CInv(MSG_TX, hashTx), tx);
|
|
|
|
|
|
|
|
|
|
|
|
return tx.GetHash().GetHex();
|
|
|
|
return hashTx.GetHex();
|
|
|
|
}
|
|
|
|
}
|
|
|
|