From 17b249b42a7726c24da4247ead2f03b5bc80bb78 Mon Sep 17 00:00:00 2001 From: miketout Date: Sat, 3 Jun 2023 12:48:34 -0700 Subject: [PATCH 1/4] Quantum sync fix --- src/pbaas/notarization.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pbaas/notarization.cpp b/src/pbaas/notarization.cpp index 41c8c8306f6..22cab269a61 100644 --- a/src/pbaas/notarization.cpp +++ b/src/pbaas/notarization.cpp @@ -10520,6 +10520,7 @@ bool PreCheckFinalizeNotarization(const CTransaction &tx, int32_t outNum, CValid !proofDescr.challengeOutputs[0].GetOutputTransaction(tipTx, tipBlockHash, false) || tipBlockHash.IsNull() || (tipTxBlockIt = mapBlockIndex.find(tipBlockHash)) == mapBlockIndex.end() || + !chainActive.Contains(tipTxBlockIt->second) || tipTxBlockIt->second->GetHeight() > (height - 1) || tipTxBlockIt->second->GetHeight() < pCurNotarizationBlkIndex->GetHeight() || tipTx.vout.size() <= proofDescr.challengeOutputs[0].n || @@ -10534,7 +10535,7 @@ bool PreCheckFinalizeNotarization(const CTransaction &tx, int32_t outNum, CValid continue; } LogPrint("notarization", "%s: notarization finalization tip transaction not in prior chain at height %u\n", __func__, height); - if (confirmNeedsEvidence && (!PBAAS_TESTMODE || chainActive[height - 1]->nTime >= PBAAS_TESTFORK3_TIME)) + if (confirmNeedsEvidence && (!PBAAS_TESTMODE || chainActive[height - 1]->nTime >= PBAAS_TESTFORK4_TIME)) { return state.Error("Invalid confirmation evidence 1"); } From 3f358b4a1a10a55bdc203de53d273f9376bfe1e8 Mon Sep 17 00:00:00 2001 From: miketout Date: Sat, 3 Jun 2023 13:12:32 -0700 Subject: [PATCH 2/4] Additional quantum sync improvement --- src/pbaas/notarization.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/pbaas/notarization.cpp b/src/pbaas/notarization.cpp index 22cab269a61..f57d4e3faa0 100644 --- a/src/pbaas/notarization.cpp +++ b/src/pbaas/notarization.cpp @@ -10236,8 +10236,9 @@ bool PreCheckFinalizeNotarization(const CTransaction &tx, int32_t outNum, CValid CTransaction finalizedTx; uint256 txBlockHash; CPBaaSNotarization notarization; + BlockMap::iterator notaTxBlockIt; - if (!(currentFinalization.GetOutputTransaction(tx, finalizedTx, txBlockHash) && + if (!(currentFinalization.GetOutputTransaction(tx, finalizedTx, txBlockHash, false) && finalizedTx.vout[currentFinalization.output.n].scriptPubKey.IsPayToCryptoCondition(p) && p.IsValid() && (p.evalCode == EVAL_ACCEPTEDNOTARIZATION || p.evalCode == EVAL_EARNEDNOTARIZATION) && @@ -10251,6 +10252,14 @@ bool PreCheckFinalizeNotarization(const CTransaction &tx, int32_t outNum, CValid return state.Error("Invalid notarization output for finalization"); } + if (!(!txBlockHash.IsNull() && + (notaTxBlockIt = mapBlockIndex.find(txBlockHash)) != mapBlockIndex.end() && + chainActive.Contains(notaTxBlockIt->second)) && + (!PBAAS_TESTMODE || chainActive[height - 1]->nTime >= PBAAS_TESTFORK4_TIME)) + { + return state.Error("Uncommitted notarization output is invalid for finalization"); + } + for (int i = outNum + 1; i < tx.vout.size(); i++) { if (i == currentFinalization.output.n) From 5b739a12de50960d68bcc95630f9ebf5030403cb Mon Sep 17 00:00:00 2001 From: miketout Date: Sat, 3 Jun 2023 14:09:08 -0700 Subject: [PATCH 3/4] Cleanup, name change --- src/pbaas/crosschainrpc.cpp | 2 +- src/pbaas/reserves.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pbaas/crosschainrpc.cpp b/src/pbaas/crosschainrpc.cpp index c3dd7932268..b0b0c70b1f5 100644 --- a/src/pbaas/crosschainrpc.cpp +++ b/src/pbaas/crosschainrpc.cpp @@ -971,7 +971,7 @@ CCurrencyDefinition::CCurrencyDefinition(const UniValue &obj) : } } - if (nVersion != PBAAS_VERSION_INVALID && IsFractional()) + if (nVersion != PBAAS_VERSION_INVALID) { if (minPreconvertArr.isArray() && minPreconvertArr.size() && minPreconvertArr.size() != currencyArr.size()) { diff --git a/src/pbaas/reserves.cpp b/src/pbaas/reserves.cpp index 783d9a1e935..ad40942afbf 100644 --- a/src/pbaas/reserves.cpp +++ b/src/pbaas/reserves.cpp @@ -4676,13 +4676,13 @@ bool CReserveTransactionDescriptor::AddReserveTransferImportOutputs(const CCurre return false; } - uint160 convertFromID = curTransfer.FirstCurrency(); + uint160 convertFromCur = curTransfer.FirstCurrency(); // source currency must be in definition auto currencyMap = importCurrencyDef.GetCurrenciesMap(); - if (((!isFractional && convertFromID != importCurrencyDef.launchSystemID) || - (isFractional && !currencyMap.count(convertFromID)))&& - !(updatedPostLaunch && currencyMap.count(convertFromID))) + if (!(updatedPostLaunch && currencyMap.count(convertFromCur)) && + ((!isFractional && convertFromCur != importCurrencyDef.launchSystemID) || + (isFractional && !currencyMap.count(convertFromCur)))) { printf("%s: Invalid conversion %s. Source currency must be included in definition currencies\n", __func__, curTransfer.ToUniValue().write().c_str()); LogPrintf("%s: Invalid conversion %s. Source currency must be included in definition currencies\n", __func__, curTransfer.ToUniValue().write().c_str()); @@ -4690,7 +4690,7 @@ bool CReserveTransactionDescriptor::AddReserveTransferImportOutputs(const CCurre } // get currency index - auto curIndexIt = currencyIndexMap.find(convertFromID); + auto curIndexIt = currencyIndexMap.find(convertFromCur); if (curIndexIt == currencyIndexMap.end()) { printf("%s: Invalid currency for conversion %s\n", __func__, curTransfer.ToUniValue().write().c_str()); From d196f4534829fe235c29f053fc3dd84e514d3901 Mon Sep 17 00:00:00 2001 From: miketout Date: Sat, 3 Jun 2023 14:55:47 -0700 Subject: [PATCH 4/4] Improve min/max preconvert checks post upgrade --- src/pbaas/notarization.cpp | 4 +++- src/pbaas/reserves.cpp | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pbaas/notarization.cpp b/src/pbaas/notarization.cpp index f57d4e3faa0..86d5ca66b57 100644 --- a/src/pbaas/notarization.cpp +++ b/src/pbaas/notarization.cpp @@ -1319,8 +1319,10 @@ bool CPBaaSNotarization::NextNotarizationInfo(const CCurrencyDefinition &sourceS minPreMap = CCurrencyValueMap(destCurrency.currencies, destCurrency.minPreconvert).CanonicalMap(); } + bool improvedMinCheck = ConnectedChains.CheckZeroViaOnlyPostLaunch(currentHeight); if (forcedRefund || - (minPreMap.valueMap.size() && preConvertedMap < minPreMap) || + (minPreMap.valueMap.size() && + ((!improvedMinCheck && preConvertedMap < minPreMap) || (improvedMinCheck && (preConvertedMap - minPreMap).HasNegative()))) || (destCurrency.IsFractional() && (CCurrencyValueMap(destCurrency.currencies, newNotarization.currencyState.reserveIn) + newPreConversionReservesIn).CanonicalMap().valueMap.size() != destCurrency.currencies.size())) diff --git a/src/pbaas/reserves.cpp b/src/pbaas/reserves.cpp index ad40942afbf..1c1af586536 100644 --- a/src/pbaas/reserves.cpp +++ b/src/pbaas/reserves.cpp @@ -4332,7 +4332,10 @@ bool CReserveTransactionDescriptor::AddReserveTransferImportOutputs(const CCurre std::vector({curTransfer.FirstValue() - CReserveTransactionDescriptor::CalculateConversionFee(curTransfer.FirstValue())})); CCurrencyValueMap newTotalReserves = CCurrencyValueMap(importCurrencyState.currencies, updatedPostLaunch ? importCurrencyState.reserveIn : importCurrencyState.primaryCurrencyIn) + newReserveIn + preConvertedReserves; - if (newTotalReserves > CCurrencyValueMap(importCurrencyDef.currencies, importCurrencyDef.maxPreconvert)) + if ((!updatedPostLaunch && + newTotalReserves > CCurrencyValueMap(importCurrencyDef.currencies, importCurrencyDef.maxPreconvert)) || + (updatedPostLaunch && + (CCurrencyValueMap(importCurrencyDef.currencies, importCurrencyDef.maxPreconvert) - newTotalReserves).HasNegative())) { LogPrint("defi", "%s: refunding pre-conversion over maximum: %s\n", __func__, curTransfer.ToUniValue().write(1,2).c_str()); curTransfer = curTransfer.GetRefundTransfer();