mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 23:18:14 +01:00
'sendrawtransaction' improvements
- Make it report the reject code and reason - Make it possible to re-send transactions that are already in the mempool
This commit is contained in:
@@ -777,25 +777,23 @@ Value sendrawtransaction(const Array& params, bool fHelp)
|
||||
}
|
||||
uint256 hashTx = tx.GetHash();
|
||||
|
||||
bool fHave = false;
|
||||
CCoinsViewCache &view = *pcoinsTip;
|
||||
CCoins existingCoins;
|
||||
{
|
||||
fHave = view.GetCoins(hashTx, existingCoins);
|
||||
if (!fHave) {
|
||||
// push to local node
|
||||
CValidationState state;
|
||||
if (!AcceptToMemoryPool(mempool, state, tx, false, NULL, !fOverrideFees))
|
||||
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX rejected"); // TODO: report validation state
|
||||
bool fHaveMempool = mempool.exists(hashTx);
|
||||
bool fHaveChain = view.GetCoins(hashTx, existingCoins) && existingCoins.nHeight < 1000000000;
|
||||
if (!fHaveMempool && !fHaveChain) {
|
||||
// push to local node and sync with wallets
|
||||
CValidationState state;
|
||||
if (AcceptToMemoryPool(mempool, state, tx, false, NULL, !fOverrideFees))
|
||||
SyncWithWallets(hashTx, tx, NULL);
|
||||
else {
|
||||
if(state.IsInvalid())
|
||||
throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason()));
|
||||
else
|
||||
throw JSONRPCError(RPC_TRANSACTION_ERROR, state.GetRejectReason());
|
||||
}
|
||||
}
|
||||
if (fHave) {
|
||||
if (existingCoins.nHeight < 1000000000)
|
||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "transaction already in block chain");
|
||||
// Not in block, but already in the memory pool; will drop
|
||||
// through to re-relay it.
|
||||
} else {
|
||||
SyncWithWallets(hashTx, tx, NULL);
|
||||
} else if (fHaveChain) {
|
||||
throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain");
|
||||
}
|
||||
RelayTransaction(tx, hashTx);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user