{
CCurrencyDefinition oneDef = currencyDefCache[oneCurrencyOut.first];
- // if the destination is the not the source currency, and
- // the destination is not another blockchain that controls the source currency, store in reserve
- if (lastChainDef.systemID != ASSETCHAINS_CHAINID || oneDef.systemID != lastChainDef.systemID)
+ // if the destination is this chain, or
+ // the destination is another blockchain that does not control source currency, store in reserve
+ if (oneDef.systemID == ASSETCHAINS_CHAINID || oneDef.systemID != lastChainDef.systemID)
{
CAmount nativeOut = oneDef.GetID() == ASSETCHAINS_CHAINID ? oneCurrencyOut.second : 0;
}
supplyAfterBuy = supply + addSupply;
- assert(supplyAfterSell >= 0);
+ assert(supplyAfterBuy >= 0);
reserveAfterBuy = bigSupply.GetLow64() + addNormalizedReserves;
assert(reserveAfterBuy >= 0);
}
else if (fractionalInIT != fractionalInMap.end())
{
- arith_uint256 bigReserveDelta(fractionalOutIT->second.first);
- reserveDelta = ((bigReserveDelta + arith_uint256(fractionalOutIT->second.second)) >> 1).GetLow64();
+ arith_uint256 bigReserveDelta(fractionalInIT->second.first);
+ reserveDelta = ((bigReserveDelta + arith_uint256(fractionalInIT->second.second)) >> 1).GetLow64();
assert(inputFraction > 0);
rates[i] = ((arith_uint256(inputReserve + reserveDelta) * bigSatoshi) / arith_uint256(inputFraction)).GetLow64();
}
else
{
- // when minting currency, we source fees from source native coin
- if (curTransfer.flags & (curTransfer.MINT_CURRENCY | curTransfer.PREALLOCATE))
+ // when minting new currency or burning a fractional for conversion to a reserve,
+ // we only add fees
+ if ((curTransfer.flags & (curTransfer.MINT_CURRENCY | curTransfer.PREALLOCATE)))
{
nativeIn += curTransfer.nFees;
}
AddReserveInput(curTransfer.currencyID, curTransfer.nValue + curTransfer.nFees);
}
}
- if (!(curTransfer.flags & curTransfer.PRECONVERT))
+ if (!(curTransfer.flags & (curTransfer.PRECONVERT)))
{
transferFees.valueMap[curTransfer.currencyID] += curTransfer.nFees;
}
LogPrintf("%s: Conversion must be between a fractional currency and one of its reserves\n", __func__);
return false;
}
-
+
CCurrencyDefinition &fractionalCurrency = toFractional ? currencyDest : sourceCurrency;
CCurrencyDefinition &reserveCurrency = toFractional ? sourceCurrency : currencyDest;
int reserveIdx = currencyIndexMap[reserveCurrency.GetID()];
}
else
{
- // input comes from non-fee outputs
+ valueOut = curTransfer.nValue;
+
if (toFractional)
{
- reserveConverted.valueMap[curTransfer.currencyID] += curTransfer.nValue;
- newCurrencyConverted = importCurrencyState.ReserveToNativeRaw(curTransfer.nValue, importCurrencyState.conversionPrice[reserveIdx]);
+ reserveConverted.valueMap[curTransfer.currencyID] += valueOut;
+ newCurrencyConverted = importCurrencyState.ReserveToNativeRaw(valueOut, importCurrencyState.conversionPrice[reserveIdx]);
}
else
{
- fractionalConverted.valueMap[curTransfer.destCurrencyID] += curTransfer.nValue;
- newCurrencyConverted = importCurrencyState.NativeToReserveRaw(curTransfer.nValue, importCurrencyState.conversionPrice[reserveIdx]);
+ fractionalConverted.valueMap[curTransfer.destCurrencyID] += valueOut;
+ newCurrencyConverted = importCurrencyState.NativeToReserveRaw(valueOut, importCurrencyState.conversionPrice[reserveIdx]);
}
if (curTransfer.destCurrencyID == systemDestID)
else
{
AddReserveOutConverted(curTransfer.destCurrencyID, newCurrencyConverted + feesConverted);
+
+ // we need to consider our source currency as burned
+ if (curTransfer.currencyID == systemDestID)
+ {
+ nativeIn -= valueOut;
+ }
+ else
+ {
+ AddReserveInput(curTransfer.currencyID, -valueOut);
+ }
}
if ((newCurrencyConverted | feesConverted) && curTransfer.destCurrencyID == systemDestID)
ReserveOutputs.valueMap[oneInOut.first] = oneInOut.second.reserveOut;
}
}
- ReserveInputs.valueMap[importCurrencyDef.systemID] += nativeIn;
- ReserveOutputs.valueMap[importCurrencyDef.systemID] += nativeOut;
+ if (nativeIn)
+ {
+ ReserveInputs.valueMap[importCurrencyDef.systemID] += nativeIn;
+ }
+ if (nativeOut)
+ {
+ ReserveOutputs.valueMap[importCurrencyDef.systemID] += nativeOut;
+ }
CCrossChainExport ccx(systemDestID, numTransfers, ReserveInputs, transferFees);
if (ReserveInputs - ReserveOutputs < ccx.CalculateImportFee())
{