Auto merge of #3592 - Eirik0:z-sendmany-better-error, r=bitcartel
Better error message when sending to both sprout and sapling When trying to send to both Sprout and Sapling (not currently supported with z_sendmany) we were getting the following error in our operation result: `general exception: boost::bad_get: failed value get using boost::get`. This PR changes this to fail with a better error message before the async operation begins: ``` error code: -8 error message: Cannot send to both Sprout and Sapling addresses using z_sendmany ```
This commit is contained in:
commit
527b7feef5
|
@ -4,6 +4,7 @@
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.authproxy import JSONRPCException
|
||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
start_nodes,
|
start_nodes,
|
||||||
|
@ -144,5 +145,18 @@ class WalletSaplingTest(BitcoinTestFramework):
|
||||||
self.nodes[2].z_importkey(sk1, "yes")
|
self.nodes[2].z_importkey(sk1, "yes")
|
||||||
assert_equal(self.nodes[2].z_getbalance(saplingAddr1), Decimal('5'))
|
assert_equal(self.nodes[2].z_getbalance(saplingAddr1), Decimal('5'))
|
||||||
|
|
||||||
|
# Make sure we get a useful error when trying to send to both sprout and sapling
|
||||||
|
node4_sproutaddr = self.nodes[3].z_getnewaddress('sprout')
|
||||||
|
node4_saplingaddr = self.nodes[3].z_getnewaddress('sapling')
|
||||||
|
try:
|
||||||
|
self.nodes[1].z_sendmany(
|
||||||
|
taddr1,
|
||||||
|
[{'address': node4_sproutaddr, 'amount': 2.5}, {'address': node4_saplingaddr, 'amount': 2.4999}],
|
||||||
|
1, 0.0001
|
||||||
|
)
|
||||||
|
raise AssertionError("Should have thrown an exception")
|
||||||
|
except JSONRPCException as e:
|
||||||
|
assert_equal("Cannot send to both Sprout and Sapling addresses using z_sendmany", e.error['message'])
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
WalletSaplingTest().main()
|
WalletSaplingTest().main()
|
||||||
|
|
|
@ -3687,6 +3687,9 @@ UniValue z_sendmany(const UniValue& params, bool fHelp)
|
||||||
std::vector<SendManyRecipient> zaddrRecipients;
|
std::vector<SendManyRecipient> zaddrRecipients;
|
||||||
CAmount nTotalOut = 0;
|
CAmount nTotalOut = 0;
|
||||||
|
|
||||||
|
bool containsSproutOutput = false;
|
||||||
|
bool containsSaplingOutput = false;
|
||||||
|
|
||||||
for (const UniValue& o : outputs.getValues()) {
|
for (const UniValue& o : outputs.getValues()) {
|
||||||
if (!o.isObject())
|
if (!o.isObject())
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected object");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected object");
|
||||||
|
@ -3710,6 +3713,16 @@ UniValue z_sendmany(const UniValue& params, bool fHelp)
|
||||||
bool toSprout = !toSapling;
|
bool toSprout = !toSapling;
|
||||||
noSproutAddrs = noSproutAddrs && toSapling;
|
noSproutAddrs = noSproutAddrs && toSapling;
|
||||||
|
|
||||||
|
containsSproutOutput |= toSprout;
|
||||||
|
containsSaplingOutput |= toSapling;
|
||||||
|
|
||||||
|
// Sending to both Sprout and Sapling is currently unsupported using z_sendmany
|
||||||
|
if (containsSproutOutput && containsSaplingOutput) {
|
||||||
|
throw JSONRPCError(
|
||||||
|
RPC_INVALID_PARAMETER,
|
||||||
|
"Cannot send to both Sprout and Sapling addresses using z_sendmany");
|
||||||
|
}
|
||||||
|
|
||||||
// If we are sending from a shielded address, all recipient
|
// If we are sending from a shielded address, all recipient
|
||||||
// shielded addresses must be of the same type.
|
// shielded addresses must be of the same type.
|
||||||
if (fromSprout && toSapling) {
|
if (fromSprout && toSapling) {
|
||||||
|
|
Loading…
Reference in New Issue