Skip to content

Commit d341976

Browse files
JBetzMixa84
andcommitted
Interpret fee amount parameters in reference fee unit (#15)
* Interpret minrelaytxfee in abstract reference fee unit * Interpret maxtxfee in abstract reference fee unit * Remove erroneous exchange rate conversions * Bugfix: get fee asset from transaction rather than non-existent mem pool entry This reverts commit 4a6152b. --------- Co-authored-by: Mihailo Milenkovic <[email protected]>
1 parent 658274b commit d341976

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

src/node/transaction.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
55

66
#include <consensus/validation.h>
7+
#include <exchangerates.h>
78
#include <index/txindex.h>
89
#include <net.h>
910
#include <net_processing.h>
@@ -74,6 +75,11 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
7475
const MempoolAcceptResult result = node.chainman->ProcessTransaction(tx, /*test_accept=*/ true);
7576
if (result.m_result_type != MempoolAcceptResult::ResultType::VALID) {
7677
return HandleATMPError(result.m_state, err_string);
78+
} else if (g_con_any_asset_fees) {
79+
CAmount mBaseFeesValue = ExchangeRateMap::GetInstance().CalculateExchangeValue(result.m_base_fees.value(), tx->GetFeeAsset(::policyAsset));
80+
if (mBaseFeesValue > max_tx_fee) {
81+
return TransactionError::MAX_FEE_EXCEEDED;
82+
}
7783
} else if (result.m_base_fees.value() > max_tx_fee) {
7884
return TransactionError::MAX_FEE_EXCEEDED;
7985
}

src/primitives/transaction.h

+11
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,17 @@ class CTransaction
580580
{
581581
return !witness.IsNull();
582582
}
583+
584+
const CAsset& GetFeeAsset(CAsset& default_asset) const
585+
{
586+
CAsset& feeAsset = default_asset;
587+
for (size_t i = 0; i < vout.size(); i++) {
588+
if (vout[i].IsFee()) {
589+
feeAsset = vout[i].nAsset.GetAsset();
590+
}
591+
}
592+
return feeAsset;
593+
}
583594
};
584595

585596
/** A mutable version of CTransaction. */

src/validation.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,11 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
926926

927927
// No transactions are allowed below minRelayTxFee except from disconnected
928928
// blocks
929-
if (!bypass_limits && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state)) return false;
929+
CAmount totalFees = ws.m_modified_fees;
930+
if (g_con_any_asset_fees) {
931+
totalFees = ExchangeRateMap::GetInstance().CalculateExchangeValue(totalFees, feeAsset);
932+
}
933+
if (!bypass_limits && !CheckFeeRate(ws.m_vsize, totalFees, state)) return false;
930934

931935
ws.m_iters_conflicting = m_pool.GetIterSet(ws.m_conflicts);
932936
// Calculate in-mempool ancestors, up to a limit.

src/wallet/spend.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <blind.h> // ELEMENTS: for MAX_RANGEPROOF_SIZE
66
#include <consensus/amount.h>
77
#include <consensus/validation.h>
8+
#include <exchangerates.h>
89
#include <interfaces/chain.h>
910
#include <issuance.h> // ELEMENTS: for GenerateAssetEntropy and others
1011
#include <policy/policy.h>
@@ -1691,7 +1692,14 @@ static bool CreateTransactionInternal(
16911692
return false;
16921693
}
16931694

1694-
if (nFeeRet > wallet.m_default_max_tx_fee) {
1695+
if (g_con_any_asset_fees) {
1696+
ExchangeRateMap& exchangeRateMap = ExchangeRateMap::GetInstance();
1697+
CAmount nFeeRetValue = exchangeRateMap.CalculateExchangeValue(nFeeRet, coin_selection_params.m_fee_asset);
1698+
if (nFeeRetValue > wallet.m_default_max_tx_fee) {
1699+
error = TransactionErrorString(TransactionError::MAX_FEE_EXCEEDED);
1700+
return false;
1701+
}
1702+
} else if (nFeeRet > wallet.m_default_max_tx_fee) {
16951703
error = TransactionErrorString(TransactionError::MAX_FEE_EXCEEDED);
16961704
return false;
16971705
}

0 commit comments

Comments
 (0)