From f631ccef3bb6996a90ebbe4f695598ede9c2b259 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Wed, 4 Mar 2020 11:08:41 -0500 Subject: [PATCH] WIP: Support _sat for satoshi level denominations --- src/rpc/server.cpp | 12 +++++++++++- src/test/rpc_tests.cpp | 11 +++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index 436b23990b9..3ccf565f4fc 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -134,9 +134,19 @@ CAmount AmountFromValue(const UniValue& value) { if (!value.isNum() && !value.isStr()) throw JSONRPCError(RPC_TYPE_ERROR, "Amount is not a number or string"); + std::string val_string = value.getValStr(); + + // Look for _sat denomination + int sat_pos = val_string.find("_sat"); + if (val_string.size() >= 4 && ((unsigned int)sat_pos == val_string.size() - 4)) { + val_string = val_string.substr(0, sat_pos); + } CAmount amount; - if (!ParseFixedPoint(value.getValStr(), 8, &amount)) + if (!ParseFixedPoint(val_string, 8, &amount)) throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount"); + if (sat_pos != std::string::npos) { + amount /= COIN; + } if (!MoneyRange(amount)) throw JSONRPCError(RPC_TYPE_ERROR, "Amount out of range"); return amount; diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index ff483989258..e0b88371ad9 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -213,6 +213,17 @@ BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values) BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e+11")), UniValue); //overflow error BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e11")), UniValue); //overflow error signless BOOST_CHECK_THROW(AmountFromValue(ValueFromString("93e+9")), UniValue); //overflow error + + // _sat values + BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0_sat")), 0LL); + BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1_sat")), 1LL); + BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("10_sat")), 10LL); + BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("100_sat")), 100LL); + BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("123_sat")), 123LL); + + BOOST_CHECK_THROW(AmountFromValue(ValueFromString("123_sat_1")), UniValue); + BOOST_CHECK_THROW(AmountFromValue(ValueFromString("2100000000000001_sat")), UniValue); + BOOST_CHECK_THROW(AmountFromValue(ValueFromString("123_sat_sat")), UniValue); } BOOST_AUTO_TEST_CASE(json_parse_errors)