Changeset View
Changeset View
Standalone View
Standalone View
src/rpc/rawtransaction.cpp
Show First 20 Lines • Show All 1,150 Lines • ▼ Show 20 Lines | return RPCHelpMan{ | ||||
CTxMemPool &mempool = EnsureMemPool(node); | CTxMemPool &mempool = EnsureMemPool(node); | ||||
int64_t virtual_size = GetVirtualTransactionSize(*tx); | int64_t virtual_size = GetVirtualTransactionSize(*tx); | ||||
Amount max_raw_tx_fee = max_raw_tx_fee_rate.GetFee(virtual_size); | Amount max_raw_tx_fee = max_raw_tx_fee_rate.GetFee(virtual_size); | ||||
UniValue result(UniValue::VARR); | UniValue result(UniValue::VARR); | ||||
UniValue result_0(UniValue::VOBJ); | UniValue result_0(UniValue::VOBJ); | ||||
result_0.pushKV("txid", txid.GetHex()); | result_0.pushKV("txid", txid.GetHex()); | ||||
TxValidationState state; | |||||
bool test_accept_res; | |||||
Amount fee = Amount::zero(); | |||||
ChainstateManager &chainman = EnsureChainman(node); | ChainstateManager &chainman = EnsureChainman(node); | ||||
test_accept_res = WITH_LOCK( | const MempoolAcceptResult accept_result = WITH_LOCK( | ||||
cs_main, return AcceptToMemoryPool( | cs_main, | ||||
chainman.ActiveChainstate(), config, mempool, | return AcceptToMemoryPool( | ||||
state, std::move(tx), false /* bypass_limits */, | chainman.ActiveChainstate(), config, mempool, std::move(tx), | ||||
true /* test_accept */, &fee)); | false /* bypass_limits */, true /* test_accept */)); | ||||
// Only return the fee and size if the transaction would pass ATMP. | // Only return the fee and size if the transaction would pass ATMP. | ||||
// These can be used to calculate the feerate. | // These can be used to calculate the feerate. | ||||
if (test_accept_res) { | if (accept_result.m_result_type == | ||||
MempoolAcceptResult::ResultType::VALID) { | |||||
const Amount fee = accept_result.m_base_fees.value(); | |||||
// Check that fee does not exceed maximum fee | // Check that fee does not exceed maximum fee | ||||
if (max_raw_tx_fee != Amount::zero() && fee > max_raw_tx_fee) { | if (max_raw_tx_fee != Amount::zero() && fee > max_raw_tx_fee) { | ||||
result_0.pushKV("allowed", false); | result_0.pushKV("allowed", false); | ||||
result_0.pushKV("reject-reason", "max-fee-exceeded"); | result_0.pushKV("reject-reason", "max-fee-exceeded"); | ||||
} else { | } else { | ||||
result_0.pushKV("allowed", true); | result_0.pushKV("allowed", true); | ||||
result_0.pushKV("size", virtual_size); | result_0.pushKV("size", virtual_size); | ||||
UniValue fees(UniValue::VOBJ); | UniValue fees(UniValue::VOBJ); | ||||
fees.pushKV("base", fee); | fees.pushKV("base", fee); | ||||
result_0.pushKV("fees", fees); | result_0.pushKV("fees", fees); | ||||
} | } | ||||
result.push_back(std::move(result_0)); | result.push_back(std::move(result_0)); | ||||
} else { | } else { | ||||
result_0.pushKV("allowed", false); | result_0.pushKV("allowed", false); | ||||
const TxValidationState state = accept_result.m_state; | |||||
if (state.GetResult() == | if (state.GetResult() == | ||||
TxValidationResult::TX_MISSING_INPUTS) { | TxValidationResult::TX_MISSING_INPUTS) { | ||||
result_0.pushKV("reject-reason", "missing-inputs"); | result_0.pushKV("reject-reason", "missing-inputs"); | ||||
} else { | } else { | ||||
result_0.pushKV("reject-reason", state.GetRejectReason()); | result_0.pushKV("reject-reason", state.GetRejectReason()); | ||||
} | } | ||||
result.push_back(std::move(result_0)); | result.push_back(std::move(result_0)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,051 Lines • Show Last 20 Lines |