diff options
-rw-r--r-- | src/cryptonote_config.h | 1 | ||||
-rw-r--r-- | src/cryptonote_core/tx_pool.cpp | 7 | ||||
-rw-r--r-- | src/wallet/wallet2.cpp | 17 |
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" |