From 3937a3a67bc8e5dc637a26801dbdc90bc9505d7f Mon Sep 17 00:00:00 2001 From: gladcow Date: Thu, 9 Apr 2020 16:04:31 +0300 Subject: [PATCH] change double input values to satoshis --- .../peerplays_sidechain/bitcoin_utils.cpp | 1 + .../sidechain_net_handler_bitcoin.hpp | 2 +- .../sidechain_net_handler_bitcoin.cpp | 24 ++++++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp b/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp index 77e40bfc..4e16b0b1 100644 --- a/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp +++ b/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp index ad3f9392..d49e49cb 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp @@ -20,7 +20,7 @@ class btc_txout { public: std::string txid_; unsigned int out_num_; - double amount_; + uint64_t amount_; }; class bitcoin_rpc_client { diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index ffbb7c19..ca6abfc3 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -585,7 +585,9 @@ std::vector bitcoin_rpc_client::listunspent(const uint32_t minconf, c btc_txout txo; txo.txid_ = entry.second.get_child("txid").get_value(); txo.out_num_ = entry.second.get_child("vout").get_value(); - txo.amount_ = entry.second.get_child("amount").get_value(); + string amount = entry.second.get_child("amount").get_value(); + amount.erase(std::remove(amount.begin(), amount.end(), '.'), amount.end()); + txo.amount_ = std::stoll(amount); result.push_back(txo); } } @@ -623,7 +625,9 @@ std::vector bitcoin_rpc_client::listunspent_by_address_and_amount(con btc_txout txo; txo.txid_ = entry.second.get_child("txid").get_value(); txo.out_num_ = entry.second.get_child("vout").get_value(); - txo.amount_ = entry.second.get_child("amount").get_value(); + string amount = entry.second.get_child("amount").get_value(); + amount.erase(std::remove(amount.begin(), amount.end(), '.'), amount.end()); + txo.amount_ = std::stoll(amount); result.push_back(txo); } } @@ -1348,8 +1352,7 @@ std::string sidechain_net_handler_bitcoin::create_primary_wallet_transaction() { uint64_t min_fee_rate = 1000; fee_rate = std::max(fee_rate, min_fee_rate); - double min_amount = ((double)fee_rate / 100000000.0); // Account only for relay fee for now - double total_amount = 0.0; + uint64_t total_amount = 0.0; std::vector inputs = bitcoin_client->listunspent_by_address_and_amount(prev_pw_address, 0); if (inputs.size() == 0) { @@ -1360,14 +1363,14 @@ std::string sidechain_net_handler_bitcoin::create_primary_wallet_transaction() { total_amount += utx.amount_; } - if (min_amount >= total_amount) { + if (fee_rate >= total_amount) { elog("Failed not enough BTC to transfer from ${fa}", ("fa", prev_pw_address)); return ""; } } fc::flat_map outputs; - outputs[active_pw_address] = total_amount - min_amount; + outputs[active_pw_address] = double(total_amount - fee_rate) / 100000000.0; return create_transaction(inputs, outputs); } @@ -1430,8 +1433,7 @@ std::string sidechain_net_handler_bitcoin::create_withdrawal_transaction(const s uint64_t min_fee_rate = 1000; fee_rate = std::max(fee_rate, min_fee_rate); - double min_amount = ((double)(swwo.withdraw_amount.value + fee_rate) / 100000000.0); // Account only for relay fee for now - double total_amount = 0.0; + uint64_t total_amount = 0; std::vector inputs = bitcoin_client->listunspent_by_address_and_amount(pw_address, 0); if (inputs.size() == 0) { @@ -1442,7 +1444,7 @@ std::string sidechain_net_handler_bitcoin::create_withdrawal_transaction(const s total_amount += utx.amount_; } - if (min_amount > total_amount) { + if (fee_rate > total_amount) { elog("Failed not enough BTC to spend for ${pw}", ("pw", pw_address)); return ""; } @@ -1450,8 +1452,8 @@ std::string sidechain_net_handler_bitcoin::create_withdrawal_transaction(const s fc::flat_map outputs; outputs[swwo.withdraw_address] = swwo.withdraw_amount.value / 100000000.0; - if ((total_amount - min_amount) > 0.0) { - outputs[pw_address] = total_amount - min_amount; + if ((total_amount - fee_rate) > 0.0) { + outputs[pw_address] = double(total_amount - fee_rate) / 100000000.0; } return create_transaction(inputs, outputs);