From edcdb15aec9df84312a68762d5ac3882c4e03045 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Fri, 24 Aug 2018 13:09:33 -0500 Subject: [PATCH] Fix duplicate send ID insufficient balance (#1015) --- rai/core_test/rpc.cpp | 15 +++++---------- rai/node/rpc.cpp | 37 +++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 266d1d91d4..8fff07c07d 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -355,8 +355,8 @@ TEST (rpc, send_idempotent) request.put ("wallet", wallet); request.put ("action", "send"); request.put ("source", rai::test_genesis_key.pub.to_account ()); - request.put ("destination", rai::test_genesis_key.pub.to_account ()); - request.put ("amount", "100"); + request.put ("destination", rai::account (0).to_account ()); + request.put ("amount", (rai::genesis_amount - (rai::genesis_amount / 4)).convert_to ()); request.put ("id", "123abc"); test_response response (request, rpc, system.service); while (response.status == 0) @@ -368,7 +368,7 @@ TEST (rpc, send_idempotent) rai::block_hash block; ASSERT_FALSE (block.decode_hex (block_text)); ASSERT_TRUE (system.nodes[0]->ledger.block_exists (block)); - ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount - 100); + ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount / 4); test_response response2 (request, rpc, system.service); while (response2.status == 0) { @@ -376,7 +376,7 @@ TEST (rpc, send_idempotent) } ASSERT_EQ (200, response2.status); ASSERT_EQ (response2.json.get ("block"), block_text); - ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount - 100); + ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount / 4); request.erase ("id"); request.put ("id", "456def"); test_response response3 (request, rpc, system.service); @@ -385,12 +385,7 @@ TEST (rpc, send_idempotent) system.poll (); } ASSERT_EQ (200, response3.status); - std::string block2_text (response3.json.get ("block")); - rai::block_hash block2; - ASSERT_NE (block2, block); - ASSERT_FALSE (block2.decode_hex (block2_text)); - ASSERT_TRUE (system.nodes[0]->ledger.block_exists (block2)); - ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount - 200); + ASSERT_EQ (response3.json.get ("error"), "Insufficient balance"); } TEST (rpc, stop) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index ea23f0543b..92d8242797 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -2606,29 +2606,30 @@ void rai::rpc_handler::send () if (!ec) { boost::optional send_id (request.get_optional ("id")); - if (balance >= amount.number ()) - { - auto rpc_l (shared_from_this ()); - auto response_a (response); - wallet->send_async (source, destination, amount.number (), [response_a](std::shared_ptr block_a) { - if (block_a != nullptr) + auto rpc_l (shared_from_this ()); + auto response_a (response); + wallet->send_async (source, destination, amount.number (), [balance, amount, response_a](std::shared_ptr block_a) { + if (block_a != nullptr) + { + rai::uint256_union hash (block_a->hash ()); + boost::property_tree::ptree response_l; + response_l.put ("block", hash.to_string ()); + response_a (response_l); + } + else + { + if (balance >= amount.number ()) { - rai::uint256_union hash (block_a->hash ()); - boost::property_tree::ptree response_l; - response_l.put ("block", hash.to_string ()); - response_a (response_l); + error_response (response_a, "Error generating block"); } else { - error_response (response_a, "Error generating block"); + std::error_code ec (nano::error_common::insufficient_balance); + error_response (response_a, ec.message ()); } - }, - work == 0, send_id); - } - else - { - ec = nano::error_common::insufficient_balance; - } + } + }, + work == 0, send_id); } } else