aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cryptonote_config.h1
-rw-r--r--src/cryptonote_core/tx_pool.cpp7
-rw-r--r--src/wallet/wallet2.cpp17
3 files changed, 22 insertions, 3 deletions
diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h
index 1ac8ab328..fd52f2e87 100644
--- a/src/cryptonote_config.h
+++ b/src/cryptonote_config.h
@@ -57,6 +57,7 @@
// COIN - number of smallest units in one coin
#define COIN ((uint64_t)1000000000000) // pow(10, 12)
#define DEFAULT_FEE ((uint64_t)100000000000) // 5 * pow(10, 11)
+#define FEE_PER_KB ((uint64_t)10000000000) // pow(10, 10)
#define ORPHANED_BLOCKS_MAX_COUNT 100
diff --git a/src/cryptonote_core/tx_pool.cpp b/src/cryptonote_core/tx_pool.cpp
index 81f932014..f623037ee 100644
--- a/src/cryptonote_core/tx_pool.cpp
+++ b/src/cryptonote_core/tx_pool.cpp
@@ -86,9 +86,12 @@ namespace cryptonote
}
uint64_t fee = inputs_amount - outputs_amount;
- if (!kept_by_block && fee < DEFAULT_FEE)
+ uint64_t needed_fee = blob_size / 1024;
+ needed_fee += (blob_size % 1024) ? 1 : 0;
+ needed_fee *= FEE_PER_KB;
+ if (!kept_by_block && fee < needed_fee)
{
- LOG_PRINT_L1("transaction fee is not enough: " << print_money(fee) << ", minumim fee: " << print_money(DEFAULT_FEE));
+ LOG_PRINT_L1("transaction fee is not enough: " << print_money(fee) << ", minumim fee: " << print_money(needed_fee));
tvc.m_verifivation_failed = true;
return false;
}
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 5af9a71bd..31345879b 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -954,7 +954,22 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions(std::vector<crypto
{
cryptonote::transaction tx;
pending_tx ptx;
- transfer(dst_vector, fake_outs_count, unlock_time, fee, extra, tx, ptx);
+
+ // loop until fee is met without increasing tx size to next KB boundary.
+ uint64_t needed_fee = 0;
+ do
+ {
+ transfer(dst_vector, fake_outs_count, unlock_time, fee, extra, tx, ptx);
+ auto txBlob = t_serializable_object_to_blob(ptx.tx);
+ uint64_t txSize = txBlob.size();
+ uint64_t numKB = txSize / 1024;
+ if (txSize % 1024)
+ {
+ numKB++;
+ }
+ needed_fee = numKB * FEE_PER_KB;
+ } while (ptx.fee < needed_fee);
+
ptx_vector.push_back(ptx);
// mark transfers to be used as "spent"