diff --git a/qa/rpc-tests/listtransactions.py b/qa/rpc-tests/listtransactions.py index 00e17a989..6d14a3344 100755 --- a/qa/rpc-tests/listtransactions.py +++ b/qa/rpc-tests/listtransactions.py @@ -38,28 +38,29 @@ class ListTransactionsTest(BitcoinTestFramework): self.sync_all() check_array_result(self.nodes[0].listtransactions(), {"txid":txid}, - {"category":"send","account":"","amount":Decimal("-0.1"),"confirmations":0}) + {"category":"send","account":"","amount":Decimal("-0.1"),"amountZat":-10000000,"confirmations":0}) check_array_result(self.nodes[1].listtransactions(), {"txid":txid}, - {"category":"receive","account":"","amount":Decimal("0.1"),"confirmations":0}) + {"category":"receive","account":"","amount":Decimal("0.1"),"amountZat":10000000,"confirmations":0}) + # mine a block, confirmations should change: self.nodes[0].generate(1) self.sync_all() check_array_result(self.nodes[0].listtransactions(), {"txid":txid}, - {"category":"send","account":"","amount":Decimal("-0.1"),"confirmations":1}) + {"category":"send","account":"","amount":Decimal("-0.1"),"amountZat":-10000000,"confirmations":1}) check_array_result(self.nodes[1].listtransactions(), {"txid":txid}, - {"category":"receive","account":"","amount":Decimal("0.1"),"confirmations":1}) + {"category":"receive","account":"","amount":Decimal("0.1"),"amountZat":10000000,"confirmations":1}) # send-to-self: txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 0.2) check_array_result(self.nodes[0].listtransactions(), {"txid":txid, "category":"send"}, - {"amount":Decimal("-0.2")}) + {"amount":Decimal("-0.2"),"amountZat":-20000000}) check_array_result(self.nodes[0].listtransactions(), {"txid":txid, "category":"receive"}, - {"amount":Decimal("0.2")}) + {"amount":Decimal("0.2"),"amountZat":20000000}) # sendmany from node1: twice to self, twice to node2: send_to = { self.nodes[0].getnewaddress() : 0.11, @@ -69,28 +70,28 @@ class ListTransactionsTest(BitcoinTestFramework): txid = self.nodes[1].sendmany("", send_to) self.sync_all() check_array_result(self.nodes[1].listtransactions(), - {"category":"send","amount":Decimal("-0.11")}, + {"category":"send","amount":Decimal("-0.11"),"amountZat":-11000000}, {"txid":txid} ) check_array_result(self.nodes[0].listtransactions(), - {"category":"receive","amount":Decimal("0.11")}, + {"category":"receive","amount":Decimal("0.11"),"amountZat":11000000}, {"txid":txid} ) check_array_result(self.nodes[1].listtransactions(), - {"category":"send","amount":Decimal("-0.22")}, + {"category":"send","amount":Decimal("-0.22"),"amountZat":-22000000}, {"txid":txid} ) check_array_result(self.nodes[1].listtransactions(), - {"category":"receive","amount":Decimal("0.22")}, + {"category":"receive","amount":Decimal("0.22"),"amountZat":22000000}, {"txid":txid} ) check_array_result(self.nodes[1].listtransactions(), - {"category":"send","amount":Decimal("-0.33")}, + {"category":"send","amount":Decimal("-0.33"),"amountZat":-33000000}, {"txid":txid} ) check_array_result(self.nodes[0].listtransactions(), - {"category":"receive","amount":Decimal("0.33")}, + {"category":"receive","amount":Decimal("0.33"),"amountZat":33000000}, {"txid":txid, "account" : ""} ) check_array_result(self.nodes[1].listtransactions(), - {"category":"send","amount":Decimal("-0.44")}, + {"category":"send","amount":Decimal("-0.44"),"amountZat":-44000000}, {"txid":txid, "account" : ""} ) check_array_result(self.nodes[1].listtransactions(), - {"category":"receive","amount":Decimal("0.44")}, + {"category":"receive","amount":Decimal("0.44"),"amountZat":44000000}, {"txid":txid, "account" : ""} ) multisig = self.nodes[1].createmultisig(1, [self.nodes[1].getnewaddress()]) @@ -100,9 +101,8 @@ class ListTransactionsTest(BitcoinTestFramework): self.sync_all() assert(len(self.nodes[0].listtransactions("watchonly", 100, 0, False)) == 0) check_array_result(self.nodes[0].listtransactions("watchonly", 100, 0, True), - {"category":"receive","amount":Decimal("0.1")}, + {"category":"receive","amount":Decimal("0.1"),"amountZat":10000000}, {"txid":txid, "account" : "watchonly"} ) if __name__ == '__main__': ListTransactionsTest().main() - diff --git a/qa/rpc-tests/receivedby.py b/qa/rpc-tests/receivedby.py index b19c55e68..e40b4dd6f 100755 --- a/qa/rpc-tests/receivedby.py +++ b/qa/rpc-tests/receivedby.py @@ -6,6 +6,7 @@ # Exercise the listreceivedbyaddress API from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal from decimal import Decimal @@ -71,11 +72,11 @@ class ReceivedByTest(BitcoinTestFramework): self.sync_all() check_array_result(self.nodes[1].listreceivedbyaddress(), {"address":addr}, - {"address":addr, "account":"", "amount":Decimal("0.1"), "confirmations":10, "txids":[txid,]}) + {"address":addr, "account":"", "amount":Decimal("0.1"), "amountZat":10000000, "confirmations":10, "txids":[txid,]}) # With min confidence < 10 check_array_result(self.nodes[1].listreceivedbyaddress(5), {"address":addr}, - {"address":addr, "account":"", "amount":Decimal("0.1"), "confirmations":10, "txids":[txid,]}) + {"address":addr, "account":"", "amount":Decimal("0.1"), "amountZat":10000000, "confirmations":10, "txids":[txid,]}) # With min confidence > 10, should not find Tx check_array_result(self.nodes[1].listreceivedbyaddress(11),{"address":addr},{ },True) @@ -83,7 +84,7 @@ class ReceivedByTest(BitcoinTestFramework): addr = self.nodes[1].getnewaddress() check_array_result(self.nodes[1].listreceivedbyaddress(0,True), {"address":addr}, - {"address":addr, "account":"", "amount":0, "confirmations":0, "txids":[]}) + {"address":addr, "account":"", "amount":0, "confirmations":0, "amountZat":0, "txids":[]}) ''' getreceivedbyaddress Test @@ -95,20 +96,22 @@ class ReceivedByTest(BitcoinTestFramework): # Check balance is 0 because of 0 confirmations balance = self.nodes[1].getreceivedbyaddress(addr) - if balance != Decimal("0.0"): - raise AssertionError("Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) + assert_equal(balance, Decimal("0.0"), "Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) + # Check balance is 0.1 balance = self.nodes[1].getreceivedbyaddress(addr,0) - if balance != Decimal("0.1"): - raise AssertionError("Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) + assert_equal(balance, Decimal("0.1"), "Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) # Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress self.nodes[1].generate(10) self.sync_all() balance = self.nodes[1].getreceivedbyaddress(addr) - if balance != Decimal("0.1"): - raise AssertionError("Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) + assert_equal(balance, Decimal("0.1"), "Wrong balance returned by getreceivedbyaddress, %0.2f"%(balance)) + + # Get balance as integer + balance = self.nodes[1].getreceivedbyaddress(addr, 1, True) + assert_equal(balance, 10000000, "Wrong balance returned by getreceivedbyaddress, %i"%(balance)) ''' listreceivedbyaccount + getreceivedbyaccount Test @@ -117,6 +120,7 @@ class ReceivedByTest(BitcoinTestFramework): addrArr = self.nodes[1].getnewaddress() account = self.nodes[1].getaccount(addrArr) received_by_account_json = get_sub_array_from_array(self.nodes[1].listreceivedbyaccount(),{"account":account}) + if len(received_by_account_json) == 0: raise AssertionError("No accounts found in node") balance_by_account = self.nodes[1].getreceivedbyaccount(account) @@ -129,22 +133,24 @@ class ReceivedByTest(BitcoinTestFramework): {"account":account}, received_by_account_json) - # getreceivedbyaddress should return same balance because of 0 confirmations + # getreceivedbyaccount should return same balance because of 0 confirmations balance = self.nodes[1].getreceivedbyaccount(account) - if balance != balance_by_account: - raise AssertionError("Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) + assert_equal(balance, balance_by_account, "Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) self.nodes[1].generate(10) self.sync_all() # listreceivedbyaccount should return updated account balance check_array_result(self.nodes[1].listreceivedbyaccount(), {"account":account}, - {"account":received_by_account_json["account"], "amount":(received_by_account_json["amount"] + Decimal("0.1"))}) + {"account":received_by_account_json["account"], "amount":(received_by_account_json["amount"] + Decimal("0.1")), "amountZat":30000000}) - # getreceivedbyaddress should return updates balance + # getreceivedbyaccount should return updates balance balance = self.nodes[1].getreceivedbyaccount(account) - if balance != balance_by_account + Decimal("0.1"): - raise AssertionError("Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) + assert_equal(balance, balance_by_account + Decimal("0.1"), "Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) + + # Get balance as integer + balance = self.nodes[1].getreceivedbyaccount(account, 1, True) + assert_equal(balance, 30000000, "Wrong balance returned by getreceivedbyaccount, %i"%(balance)) # Create a new account named "mynewaccount" that has a 0 balance self.nodes[1].getaccountaddress("mynewaccount") @@ -152,14 +158,12 @@ class ReceivedByTest(BitcoinTestFramework): if len(received_by_account_json) == 0: raise AssertionError("No accounts found in node") - # Test includeempty of listreceivedbyaccount - if received_by_account_json["amount"] != Decimal("0.0"): - raise AssertionError("Wrong balance returned by listreceivedbyaccount, %0.2f"%(received_by_account_json["amount"])) + # Test listreceivedbyaccount for 0 amount accounts + assert_equal(received_by_account_json["amount"], Decimal("0.0"), "Wrong balance returned by listreceivedbyaccount, %0.2f"%(received_by_account_json["amount"])) # Test getreceivedbyaccount for 0 amount accounts balance = self.nodes[1].getreceivedbyaccount("mynewaccount") - if balance != Decimal("0.0"): - raise AssertionError("Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) + assert_equal(balance, Decimal("0.0"), "Wrong balance returned by getreceivedbyaccount, %0.2f"%(balance)) if __name__ == '__main__': ReceivedByTest().main() diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py index 6a84c6923..f2c8ea1ce 100755 --- a/qa/rpc-tests/wallet.py +++ b/qa/rpc-tests/wallet.py @@ -226,6 +226,7 @@ class WalletTest (BitcoinTestFramework): if uTx['txid'] == zeroValueTxid: found = True assert_equal(uTx['amount'], Decimal('0.00000000')) + assert_equal(uTx['amountZat'], 0) assert(found) #do some -walletbroadcast tests @@ -269,9 +270,12 @@ class WalletTest (BitcoinTestFramework): self.nodes[0].generate(1) sync_blocks(self.nodes) - #tx should be added to balance because after restarting the nodes tx should be broadcastet - assert_equal(self.nodes[2].getbalance(), Decimal('13.99800000')) #should not be - assert_equal(self.nodes[2].getbalance("*"), Decimal('13.99800000')) #should not be + # tx should be added to balance because after restarting the nodes tx should be broadcast + assert_equal(self.nodes[2].getbalance(), Decimal('13.99800000')) + assert_equal(self.nodes[2].getbalance("*"), Decimal('13.99800000')) + + # check integer balances from getbalance + assert_equal(self.nodes[2].getbalance("*", 1, False, True), 1399800000) # send from node 0 to node 2 taddr mytaddr = self.nodes[2].getnewaddress() @@ -283,6 +287,9 @@ class WalletTest (BitcoinTestFramework): mybalance = self.nodes[2].z_getbalance(mytaddr) assert_equal(mybalance, Decimal('10.0')) + # check integer balances from z_getbalance + assert_equal(self.nodes[2].z_getbalance(mytaddr, 1, True), 1000000000) + mytxdetails = self.nodes[2].gettransaction(mytxid) myvjoinsplits = mytxdetails["vjoinsplit"] assert_equal(0, len(myvjoinsplits)) @@ -385,15 +392,18 @@ class WalletTest (BitcoinTestFramework): txId = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), "2") txObj = self.nodes[0].gettransaction(txId) assert_equal(txObj['amount'], Decimal('-2.00000000')) + assert_equal(txObj['amountZat'], -200000000) txId = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), "0.0001") txObj = self.nodes[0].gettransaction(txId) assert_equal(txObj['amount'], Decimal('-0.00010000')) + assert_equal(txObj['amountZat'], -10000) #check if JSON parser can handle scientific notation in strings txId = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), "1e-4") txObj = self.nodes[0].gettransaction(txId) assert_equal(txObj['amount'], Decimal('-0.00010000')) + assert_equal(txObj['amountZat'], -10000) #this should fail errorString = "" diff --git a/qa/rpc-tests/wallet_listreceived.py b/qa/rpc-tests/wallet_listreceived.py index 52dff938a..7addb4aae 100755 --- a/qa/rpc-tests/wallet_listreceived.py +++ b/qa/rpc-tests/wallet_listreceived.py @@ -15,6 +15,7 @@ my_memo = my_memo + '0'*(1024-len(my_memo)) no_memo = 'f6' + ('0'*1022) # see section 5.5 of the protocol spec fee = Decimal('0.0001') +feeZat = 10000 class ListReceivedTest (BitcoinTestFramework): @@ -106,6 +107,7 @@ class ListReceivedTest (BitcoinTestFramework): assert_equal(1, len(r), "Should have received one (unconfirmed) note") assert_equal(txid, r[0]['txid']) assert_equal(1, r[0]['amount']) + assert_equal(100000000, r[0]['amountZat']) assert_false(r[0]['change'], "Note should not be change") assert_equal(my_memo, r[0]['memo']) assert_equal(0, r[0]['confirmations']) @@ -203,11 +205,13 @@ class ListReceivedTest (BitcoinTestFramework): assert_equal(txid, r[0]['txid']) assert_equal(Decimal('0.4')-fee, r[0]['amount']) + assert_equal(40000000-feeZat, r[0]['amountZat']) assert_true(r[0]['change'], "Note valued at (0.4-fee) should be change") assert_equal(no_memo, r[0]['memo']) # The old note still exists (it's immutable), even though it is spent assert_equal(Decimal('1.0'), r[1]['amount']) + assert_equal(100000000, r[1]['amountZat']) assert_false(r[1]['change'], "Note valued at 1.0 should not be change") assert_equal(my_memo, r[1]['memo']) @@ -217,6 +221,7 @@ class ListReceivedTest (BitcoinTestFramework): assert_equal(1, len(r), "zaddr2 Should have received 1 notes") assert_equal(txid, r[0]['txid']) assert_equal(Decimal('0.6'), r[0]['amount']) + assert_equal(60000000, r[0]['amountZat']) assert_false(r[0]['change'], "Note valued at 0.6 should not be change") assert_equal(no_memo, r[0]['memo']) diff --git a/src/amount.cpp b/src/amount.cpp index 3572e59c8..78e90bc78 100644 --- a/src/amount.cpp +++ b/src/amount.cpp @@ -8,6 +8,7 @@ #include "tinyformat.h" const std::string CURRENCY_UNIT = "ZEC"; +const std::string MINOR_CURRENCY_UNIT = "zatoshis"; CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nSize) { diff --git a/src/amount.h b/src/amount.h index 9913e565e..73f7741c0 100644 --- a/src/amount.h +++ b/src/amount.h @@ -17,6 +17,7 @@ static const CAmount COIN = 100000000; static const CAmount CENT = 1000000; extern const std::string CURRENCY_UNIT; +extern const std::string MINOR_CURRENCY_UNIT; /** No amount larger than this (in satoshi) is valid. * diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index fe084b8f2..4887d0555 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -37,7 +37,9 @@ static const CRPCConvertParam vRPCConvertParams[] = { "sendtoaddress", 4 }, { "settxfee", 0 }, { "getreceivedbyaddress", 1 }, + { "getreceivedbyaddress", 2 }, { "getreceivedbyaccount", 1 }, + { "getreceivedbyaccount", 2 }, { "listreceivedbyaddress", 0 }, { "listreceivedbyaddress", 1 }, { "listreceivedbyaddress", 2 }, @@ -46,6 +48,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "listreceivedbyaccount", 2 }, { "getbalance", 1 }, { "getbalance", 2 }, + { "getbalance", 3 }, { "getblockhash", 0 }, { "move", 2 }, { "move", 3 }, @@ -125,6 +128,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_listunspent", 2 }, { "z_listunspent", 3 }, { "z_getbalance", 1}, + { "z_getbalance", 2}, { "z_gettotalbalance", 0}, { "z_gettotalbalance", 1}, { "z_gettotalbalance", 2}, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ce81fc825..36838401d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -597,15 +597,16 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() < 1 || params.size() > 2) + if (fHelp || params.size() < 1 || params.size() > 3) throw runtime_error( - "getreceivedbyaddress \"zcashaddress\" ( minconf )\n" + "getreceivedbyaddress \"zcashaddress\" ( minconf ) ( inZat )\n" "\nReturns the total amount received by the given Zcash address in transactions with at least minconf confirmations.\n" "\nArguments:\n" "1. \"zcashaddress\" (string, required) The Zcash address for transactions.\n" - "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" + "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" + "3. inZat (bool, optional, default=false) Get the result amount in " + MINOR_CURRENCY_UNIT + " (as an integer).\n" "\nResult:\n" - "amount (numeric) The total amount in " + CURRENCY_UNIT + " received at this address.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + "(or " + MINOR_CURRENCY_UNIT + " if inZat is true) received at this address.\n" "\nExamples:\n" "\nThe amount from transactions with at least 1 confirmation\n" + HelpExampleCli("getreceivedbyaddress", "\"t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1\"") + @@ -648,7 +649,12 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp) nAmount += txout.nValue; } - return ValueFromAmount(nAmount); + // inZat + if (params.size() > 2 && params[2].get_bool()) { + return nAmount; + } + + return ValueFromAmount(nAmount); } @@ -657,15 +663,16 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() < 1 || params.size() > 2) + if (fHelp || params.size() < 1 || params.size() > 3) throw runtime_error( - "getreceivedbyaccount \"account\" ( minconf )\n" + "getreceivedbyaccount \"account\" ( minconf ) ( inZat )\n" "\nDEPRECATED. Returns the total amount received by addresses with in transactions with at least [minconf] confirmations.\n" "\nArguments:\n" "1. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" - "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" + "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" + "3. inZat (bool, optional, default=false) Get the result amount in " + MINOR_CURRENCY_UNIT + " (as an integer).\n" "\nResult:\n" - "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this account.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + "(or " + MINOR_CURRENCY_UNIT + " if inZat is true) received for this account.\n" "\nExamples:\n" "\nAmount received by the default account with at least 1 confirmation\n" + HelpExampleCli("getreceivedbyaccount", "\"\"") + @@ -705,6 +712,11 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp) } } + // inZat + if (params.size() > 2 && params[2].get_bool()) { + return nAmount; + } + return ValueFromAmount(nAmount); } @@ -746,16 +758,17 @@ UniValue getbalance(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() > 3) + if (fHelp || params.size() > 4) throw runtime_error( - "getbalance ( \"account\" minconf includeWatchonly )\n" + "getbalance ( \"account\" minconf includeWatchonly inZat )\n" "\nReturns the server's total available balance.\n" "\nArguments:\n" "1. \"account\" (string, optional) DEPRECATED. If provided, it MUST be set to the empty string \"\" or to the string \"*\", either of which will give the total available balance. Passing any other string will result in an error.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "3. includeWatchonly (bool, optional, default=false) Also include balance in watchonly addresses (see 'importaddress')\n" + "4. inZat (bool, optional, default=false) Get the result amount in " + MINOR_CURRENCY_UNIT + " (as an integer).\n" "\nResult:\n" - "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this account.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + "(or " + MINOR_CURRENCY_UNIT + " if inZat is true) received.\n" "\nExamples:\n" "\nThe total amount in the wallet\n" + HelpExampleCli("getbalance", "") + @@ -803,6 +816,12 @@ UniValue getbalance(const UniValue& params, bool fHelp) nBalance -= s.amount; nBalance -= allFee; } + + // inZat + if (params.size() > 3 && params[3].get_bool()) { + return nBalance; + } + return ValueFromAmount(nBalance); } @@ -810,6 +829,10 @@ UniValue getbalance(const UniValue& params, bool fHelp) CAmount nBalance = GetAccountBalance(strAccount, nMinDepth, filter); + if (params.size() > 3 && params[3].get_bool()) { + return nBalance; + } + return ValueFromAmount(nBalance); } @@ -1229,6 +1252,7 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts) obj.pushKV("address", EncodeDestination(dest)); obj.pushKV("account", strAccount); obj.pushKV("amount", ValueFromAmount(nAmount)); + obj.pushKV("amountZat", nAmount); obj.pushKV("confirmations", (nConf == std::numeric_limits::max() ? 0 : nConf)); UniValue transactions(UniValue::VARR); if (it != mapTally.end()) @@ -1254,6 +1278,7 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts) obj.pushKV("involvesWatchonly", true); obj.pushKV("account", (*it).first); obj.pushKV("amount", ValueFromAmount(nAmount)); + obj.pushKV("amountZat", nAmount); obj.pushKV("confirmations", (nConf == std::numeric_limits::max() ? 0 : nConf)); ret.push_back(obj); } @@ -1283,6 +1308,7 @@ UniValue listreceivedbyaddress(const UniValue& params, bool fHelp) " \"address\" : \"receivingaddress\", (string) The receiving address\n" " \"account\" : \"accountname\", (string) DEPRECATED. The account of the receiving address. The default account is \"\".\n" " \"amount\" : x.xxx, (numeric) The total amount in " + CURRENCY_UNIT + " received by the address\n" + " \"amountZat\" : xxxx (numeric) The amount in " + MINOR_CURRENCY_UNIT + "\n" " \"confirmations\" : n (numeric) The number of confirmations of the most recent transaction included\n" " }\n" " ,...\n" @@ -1319,6 +1345,7 @@ UniValue listreceivedbyaccount(const UniValue& params, bool fHelp) " \"involvesWatchonly\" : true, (bool) Only returned if imported addresses were involved in transaction\n" " \"account\" : \"accountname\", (string) The account name of the receiving account\n" " \"amount\" : x.xxx, (numeric) The total amount received by addresses with this account\n" + " \"amountZat\" : xxxx (numeric) The amount in " + MINOR_CURRENCY_UNIT + "\n" " \"confirmations\" : n (numeric) The number of confirmations of the most recent transaction included\n" " }\n" " ,...\n" @@ -1366,6 +1393,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe MaybePushAddress(entry, s.destination); entry.pushKV("category", "send"); entry.pushKV("amount", ValueFromAmount(-s.amount)); + entry.pushKV("amountZat", -s.amount); entry.pushKV("vout", s.vout); entry.pushKV("fee", ValueFromAmount(-nFee)); if (fLong) @@ -1404,6 +1432,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe entry.pushKV("category", "receive"); } entry.pushKV("amount", ValueFromAmount(r.amount)); + entry.pushKV("amountZat", r.amount); entry.pushKV("vout", r.vout); if (fLong) WalletTxToJSON(wtx, entry); @@ -1425,6 +1454,7 @@ void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, Un entry.pushKV("category", "move"); entry.pushKV("time", acentry.nTime); entry.pushKV("amount", ValueFromAmount(acentry.nCreditDebit)); + entry.pushKV("amountZat", acentry.nCreditDebit); entry.pushKV("otheraccount", acentry.strOtherAccount); entry.pushKV("comment", acentry.strComment); ret.push_back(entry); @@ -1461,6 +1491,7 @@ UniValue listtransactions(const UniValue& params, bool fHelp) " \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and for the\n" " 'move' category for moves outbound. It is positive for the 'receive' category,\n" " and for the 'move' category for inbound funds.\n" + " \"amountZat\": x.xxx, (numeric) The amount in " + MINOR_CURRENCY_UNIT + ". Negative and positive are the same as 'amount' field.\n" " \"vout\" : n, (numeric) the vout value\n" " \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n" " 'send' category of transactions.\n" @@ -1658,6 +1689,7 @@ UniValue listsinceblock(const UniValue& params, bool fHelp) " or 'expired'. Available for 'send' and 'receive' category of transactions.\n" " \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and for the 'move' category for moves \n" " outbound. It is positive for the 'receive' category, and for the 'move' category for inbound funds.\n" + " \"amountZat\": x.xxx, (numeric) The amount in " + MINOR_CURRENCY_UNIT + ". Negative and positive are the same as for the 'amount' field.\n" " \"vout\" : n, (numeric) the vout value\n" " \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the 'send' category of transactions.\n" " \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and 'receive' category of transactions.\n" @@ -1744,6 +1776,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) "{\n" " \"status\" : \"mined|waiting|expiringsoon|expired\", (string) The transaction status, can be 'mined', 'waiting', 'expiringsoon' or 'expired'\n" " \"amount\" : x.xxx, (numeric) The transaction amount in " + CURRENCY_UNIT + "\n" + " \"amountZat\" : x (numeric) The amount in " + MINOR_CURRENCY_UNIT + "\n" " \"confirmations\" : n, (numeric) The number of confirmations\n" " \"blockhash\" : \"hash\", (string) The block hash\n" " \"blockindex\" : xx, (numeric) The block index\n" @@ -1757,6 +1790,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) " \"address\" : \"zcashaddress\", (string) The Zcash address involved in the transaction\n" " \"category\" : \"send|receive\", (string) The category, either 'send' or 'receive'\n" " \"amount\" : x.xxx (numeric) The amount in " + CURRENCY_UNIT + "\n" + " \"amountZat\" : x (numeric) The amount in " + MINOR_CURRENCY_UNIT + "\n" " \"vout\" : n, (numeric) the vout value\n" " }\n" " ,...\n" @@ -1802,6 +1836,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp) CAmount nFee = (wtx.IsFromMe(filter) ? wtx.GetValueOut() - nDebit : 0); entry.pushKV("amount", ValueFromAmount(nNet - nFee)); + entry.pushKV("amountZat", nNet - nFee); if (wtx.IsFromMe(filter)) entry.pushKV("fee", ValueFromAmount(nFee)); @@ -2380,6 +2415,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n" " \"scriptPubKey\" : \"key\", (string) the script key\n" " \"amount\" : x.xxx, (numeric) the transaction amount in " + CURRENCY_UNIT + "\n" + " \"amountZat\" : xxxx (numeric) the transaction amount in " + MINOR_CURRENCY_UNIT + "\n" " \"confirmations\" : n, (numeric) The number of confirmations\n" " \"redeemScript\" : n (string) The redeemScript if scriptPubKey is P2SH\n" " \"spendable\" : xxx (bool) Whether we have the private keys to spend this output\n" @@ -2455,6 +2491,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) entry.pushKV("scriptPubKey", HexStr(scriptPubKey.begin(), scriptPubKey.end())); entry.pushKV("amount", ValueFromAmount(out.tx->vout[out.i].nValue)); + entry.pushKV("amountZat", out.tx->vout[out.i].nValue); entry.pushKV("confirmations", out.nDepth); entry.pushKV("spendable", out.fSpendable); results.push_back(entry); @@ -3353,6 +3390,7 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) "{\n" " \"txid\": \"txid\", (string) the transaction id\n" " \"amount\": xxxxx, (numeric) the amount of value in the note\n" + " \"amountZat\" : xxxx (numeric) The amount in " + MINOR_CURRENCY_UNIT + "\n" " \"memo\": xxxxx, (string) hexadecimal string representation of memo field\n" " \"confirmations\" : n, (numeric) the number of confirmations\n" " \"blockheight\": n, (numeric) The block height containing the transaction\n" @@ -3407,6 +3445,7 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) UniValue obj(UniValue::VOBJ); obj.pushKV("txid", entry.jsop.hash.ToString()); obj.pushKV("amount", ValueFromAmount(CAmount(entry.note.value()))); + obj.pushKV("amountZat", CAmount(entry.note.value())); std::string data(entry.memo.begin(), entry.memo.end()); obj.pushKV("memo", HexStr(data)); obj.pushKV("jsindex", entry.jsop.js); @@ -3428,6 +3467,7 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) UniValue obj(UniValue::VOBJ); obj.pushKV("txid", entry.op.hash.ToString()); obj.pushKV("amount", ValueFromAmount(CAmount(entry.note.value()))); + obj.pushKV("amountZat", CAmount(entry.note.value())); obj.pushKV("memo", HexStr(entry.memo)); obj.pushKV("outindex", (int)entry.op.n); obj.pushKV("confirmations", entry.confirmations); @@ -3451,17 +3491,18 @@ UniValue z_getbalance(const UniValue& params, bool fHelp) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size()==0 || params.size() >2) + if (fHelp || params.size() == 0 || params.size() > 3) throw runtime_error( - "z_getbalance \"address\" ( minconf )\n" + "z_getbalance \"address\" ( minconf inZat )\n" "\nReturns the balance of a taddr or zaddr belonging to the node's wallet.\n" "\nCAUTION: If the wallet has only an incoming viewing key for this address, then spends cannot be" "\ndetected, and so the returned balance may be larger than the actual balance.\n" "\nArguments:\n" "1. \"address\" (string) The selected address. It may be a transparent or private address.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" + "3. inZat (bool, optional, default=false) Get the result amount in " + MINOR_CURRENCY_UNIT + " (as an integer).\n" "\nResult:\n" - "amount (numeric) The total amount in " + CURRENCY_UNIT + " received for this address.\n" + "amount (numeric) The total amount in " + CURRENCY_UNIT + "(or " + MINOR_CURRENCY_UNIT + " if inZat is true) received at this address.\n" "\nExamples:\n" "\nThe total amount received by address \"myaddress\"\n" + HelpExampleCli("z_getbalance", "\"myaddress\"") + @@ -3503,6 +3544,11 @@ UniValue z_getbalance(const UniValue& params, bool fHelp) nBalance = getBalanceZaddr(fromaddress, nMinDepth, false); } + // inZat + if (params.size() > 2 && params[2].get_bool()) { + return nBalance; + } + return ValueFromAmount(nBalance); }