13
13
#include " txmempool.h"
14
14
#include " util.h"
15
15
#include " utilmoneystr.h"
16
+ #include < memory>
16
17
17
18
CPrivateSendClient privateSendClient;
18
19
@@ -1198,6 +1199,8 @@ bool CPrivateSendClient::MakeCollateralAmounts(const CompactTallyItem& tallyItem
1198
1199
// Create denominations by looping through inputs grouped by addresses
1199
1200
bool CPrivateSendClient::CreateDenominated ()
1200
1201
{
1202
+ LOCK2 (cs_main, pwalletMain->cs_wallet );
1203
+
1201
1204
std::vector<CompactTallyItem> vecTally;
1202
1205
if (!pwalletMain->SelectCoinsGrouppedByAddresses (vecTally)) {
1203
1206
LogPrint (" privatesend" , " CPrivateSendClient::CreateDenominated -- SelectCoinsGrouppedByAddresses can't find any inputs!\n " );
@@ -1241,7 +1244,7 @@ bool CPrivateSendClient::CreateDenominated(const CompactTallyItem& tallyItem, bo
1241
1244
// ****** Add denoms ************ /
1242
1245
1243
1246
// make our denom addresses
1244
- CReserveKey reservekeyDenom (pwalletMain) ;
1247
+ std::vector<std::shared_ptr< CReserveKey>> reservekeyDenomVec ;
1245
1248
1246
1249
// try few times - skipping smallest denoms first if there are too much already, if failed - use them
1247
1250
int nOutputsTotal = 0 ;
@@ -1268,22 +1271,23 @@ bool CPrivateSendClient::CreateDenominated(const CompactTallyItem& tallyItem, bo
1268
1271
1269
1272
int nOutputs = 0 ;
1270
1273
1271
- // add each output up to 10 times until it can't be added again
1274
+ // add each output up to 11 times until it can't be added again
1272
1275
while (nValueLeft - nDenomValue >= 0 && nOutputs <= 10 ) {
1273
1276
CScript scriptDenom;
1274
1277
CPubKey vchPubKey;
1275
1278
// use a unique change address
1276
- assert (reservekeyDenom.GetReservedKey (vchPubKey)); // should never fail, as we just unlocked
1279
+ std::shared_ptr<CReserveKey> reservekeyDenom = std::make_shared<CReserveKey>(pwalletMain);
1280
+ reservekeyDenomVec.push_back (reservekeyDenom);
1281
+
1282
+ assert (reservekeyDenom->GetReservedKey (vchPubKey)); // should never fail, as we just unlocked
1277
1283
scriptDenom = GetScriptForDestination (vchPubKey.GetID ());
1278
- // TODO: do not keep reservekeyDenom here
1279
- reservekeyDenom.KeepKey ();
1280
1284
1281
1285
vecSend.push_back ((CRecipient){ scriptDenom, nDenomValue, false });
1282
1286
1283
1287
// increment outputs and subtract denomination amount
1284
1288
nOutputs++;
1285
1289
nValueLeft -= nDenomValue;
1286
- LogPrintf (" CreateDenominated1: nOutputsTotal: %d, nOutputs: %d, nValueLeft: %f\n " , nOutputsTotal, nOutputs, (float )nValueLeft/COIN);
1290
+ LogPrintf (" CreateDenominated1: totalOutputs: %d, nOutputsTotal: %d, nOutputs: %d, nValueLeft: %f\n " , nOutputsTotal + nOutputs , nOutputsTotal, nOutputs, (float )nValueLeft/COIN);
1287
1291
}
1288
1292
1289
1293
nOutputsTotal += nOutputs;
@@ -1316,13 +1320,17 @@ bool CPrivateSendClient::CreateDenominated(const CompactTallyItem& tallyItem, bo
1316
1320
nFeeRet, nChangePosRet, strFail, &coinControl, true , ONLY_NONDENOMINATED_NOT1000IFMN);
1317
1321
if (!fSuccess ) {
1318
1322
LogPrintf (" CPrivateSendClient::CreateDenominated -- Error: %s\n " , strFail);
1319
- // TODO: return reservekeyDenom here
1323
+ for (auto key : reservekeyDenomVec)
1324
+ key->ReturnKey ();
1320
1325
reservekeyCollateral.ReturnKey ();
1326
+ LogPrintf (" CPrivateSendClient::CreateDenominated -- %d keys returned\n " , reservekeyDenomVec.size () + 1 );
1321
1327
return false ;
1322
1328
}
1323
1329
1324
- // TODO: keep reservekeyDenom here
1330
+ for (auto key : reservekeyDenomVec)
1331
+ key->KeepKey ();
1325
1332
reservekeyCollateral.KeepKey ();
1333
+ LogPrintf (" CPrivateSendClient::CreateDenominated -- %d keys keeped\n " , reservekeyDenomVec.size () + 1 );
1326
1334
1327
1335
if (!pwalletMain->CommitTransaction (wtx, reservekeyChange)) {
1328
1336
LogPrintf (" CPrivateSendClient::CreateDenominated -- CommitTransaction failed!\n " );
0 commit comments