@@ -1149,14 +1149,21 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
1149
1149
// make sure we haven't exceeded max mempool size.
1150
1150
LimitMempoolSize (m_pool, m_active_chainstate.CoinsTip ());
1151
1151
1152
+ std::vector<uint256> all_package_wtxids;
1153
+ all_package_wtxids.reserve (workspaces.size ());
1154
+ std::transform (workspaces.cbegin (), workspaces.cend (), std::back_inserter (all_package_wtxids),
1155
+ [](const auto & ws) { return ws.m_ptx ->GetWitnessHash (); });
1152
1156
// Find the wtxids of the transactions that made it into the mempool. Allow partial submission,
1153
1157
// but don't report success unless they all made it into the mempool.
1154
1158
for (Workspace& ws : workspaces) {
1155
1159
const auto effective_feerate = args.m_package_feerates ? ws.m_package_feerate :
1156
1160
CFeeRate{ws.m_modified_fees , static_cast <uint32_t >(ws.m_vsize )};
1161
+ const auto effective_feerate_wtxids = args.m_package_feerates ? all_package_wtxids :
1162
+ std::vector<uint256>({ws.m_ptx ->GetWitnessHash ()});
1157
1163
if (m_pool.exists (GenTxid::Wtxid (ws.m_ptx ->GetWitnessHash ()))) {
1158
1164
results.emplace (ws.m_ptx ->GetWitnessHash (),
1159
- MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ), ws.m_vsize , ws.m_base_fees , effective_feerate));
1165
+ MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ), ws.m_vsize ,
1166
+ ws.m_base_fees , effective_feerate, effective_feerate_wtxids));
1160
1167
GetMainSignals ().TransactionAddedToMempool (ws.m_ptx , m_pool.GetAndIncrementSequence ());
1161
1168
} else {
1162
1169
all_submitted = false ;
@@ -1185,16 +1192,19 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
1185
1192
if (!ConsensusScriptChecks (args, ws)) return MempoolAcceptResult::Failure (ws.m_state );
1186
1193
1187
1194
const CFeeRate effective_feerate{ws.m_modified_fees , static_cast <uint32_t >(ws.m_vsize )};
1195
+ const std::vector<uint256> single_wtxid{ws.m_ptx ->GetWitnessHash ()};
1188
1196
// Tx was accepted, but not added
1189
1197
if (args.m_test_accept ) {
1190
- return MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ), ws.m_vsize , ws.m_base_fees , effective_feerate);
1198
+ return MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ), ws.m_vsize ,
1199
+ ws.m_base_fees , effective_feerate, single_wtxid);
1191
1200
}
1192
1201
1193
1202
if (!Finalize (args, ws)) return MempoolAcceptResult::Failure (ws.m_state );
1194
1203
1195
1204
GetMainSignals ().TransactionAddedToMempool (ptx, m_pool.GetAndIncrementSequence ());
1196
1205
1197
- return MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ), ws.m_vsize , ws.m_base_fees , effective_feerate);
1206
+ return MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ), ws.m_vsize , ws.m_base_fees ,
1207
+ effective_feerate, single_wtxid);
1198
1208
}
1199
1209
1200
1210
PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions (const std::vector<CTransactionRef>& txns, ATMPArgs& args)
@@ -1252,6 +1262,10 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
1252
1262
return PackageMempoolAcceptResult (package_state, package_feerate, std::move (results));
1253
1263
}
1254
1264
1265
+ std::vector<uint256> all_package_wtxids;
1266
+ all_package_wtxids.reserve (workspaces.size ());
1267
+ std::transform (workspaces.cbegin (), workspaces.cend (), std::back_inserter (all_package_wtxids),
1268
+ [](const auto & ws) { return ws.m_ptx ->GetWitnessHash (); });
1255
1269
for (Workspace& ws : workspaces) {
1256
1270
ws.m_package_feerate = package_feerate;
1257
1271
if (!PolicyScriptChecks (args, ws)) {
@@ -1263,11 +1277,12 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
1263
1277
if (args.m_test_accept ) {
1264
1278
const auto effective_feerate = args.m_package_feerates ? ws.m_package_feerate :
1265
1279
CFeeRate{ws.m_modified_fees , static_cast <uint32_t >(ws.m_vsize )};
1266
- // When test_accept=true, transactions that pass PolicyScriptChecks are valid because there are
1267
- // no further mempool checks (passing PolicyScriptChecks implies passing ConsensusScriptChecks).
1280
+ const auto effective_feerate_wtxids = args. m_package_feerates ? all_package_wtxids :
1281
+ std::vector<uint256>{ws. m_ptx -> GetWitnessHash ()};
1268
1282
results.emplace (ws.m_ptx ->GetWitnessHash (),
1269
1283
MempoolAcceptResult::Success (std::move (ws.m_replaced_transactions ),
1270
- ws.m_vsize , ws.m_base_fees , effective_feerate));
1284
+ ws.m_vsize , ws.m_base_fees , effective_feerate,
1285
+ effective_feerate_wtxids));
1271
1286
}
1272
1287
}
1273
1288
0 commit comments