Return correct error codes in fundrawtransaction().
The fundrawtransaction() RPC was returning misleading or incorrect error codes (for example RPC_INTERNAL_ERROR when funding the transaction failed). This commit fixes those error codes: - RPC_INTERNAL_ERROR should not be returned for application-level errors, only for genuine internal errors such as corrupted data. That error code has been replaced with RPC_WALLET_ERROR. This commit also updates the test cases to explicitly test the error code.
This commit is contained in:
parent
a012087667
commit
dab804c18a
3 changed files with 16 additions and 47 deletions
|
@ -182,12 +182,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||||
|
|
||||||
try:
|
assert_raises_jsonrpc(-3, "Unexpected key foo", self.nodes[2].fundrawtransaction, rawtx, {'foo':'bar'})
|
||||||
self.nodes[2].fundrawtransaction(rawtx, {'foo': 'bar'})
|
|
||||||
raise AssertionError("Accepted invalid option foo")
|
|
||||||
except JSONRPCException as e:
|
|
||||||
assert("Unexpected key foo" in e.error['message'])
|
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# test a fundrawtransaction with an invalid change address #
|
# test a fundrawtransaction with an invalid change address #
|
||||||
|
@ -200,12 +195,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||||
|
|
||||||
try:
|
assert_raises_jsonrpc(-5, "changeAddress must be a valid bitcoin address", self.nodes[2].fundrawtransaction, rawtx, {'changeAddress':'foobar'})
|
||||||
self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': 'foobar'})
|
|
||||||
raise AssertionError("Accepted invalid bitcoin address")
|
|
||||||
except JSONRPCException as e:
|
|
||||||
assert("changeAddress must be a valid bitcoin address" in e.error['message'])
|
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# test a fundrawtransaction with a provided change address #
|
# test a fundrawtransaction with a provided change address #
|
||||||
|
@ -219,12 +209,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||||
|
|
||||||
change = self.nodes[2].getnewaddress()
|
change = self.nodes[2].getnewaddress()
|
||||||
try:
|
assert_raises_jsonrpc(-8, "changePosition out of bounds", self.nodes[2].fundrawtransaction, rawtx, {'changeAddress':change, 'changePosition':2})
|
||||||
rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 2})
|
|
||||||
except JSONRPCException as e:
|
|
||||||
assert('changePosition out of bounds' == e.error['message'])
|
|
||||||
else:
|
|
||||||
assert(False)
|
|
||||||
rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 0})
|
rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 0})
|
||||||
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
|
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
|
||||||
out = dec_tx['vout'][0]
|
out = dec_tx['vout'][0]
|
||||||
|
@ -333,12 +318,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||||
|
|
||||||
try:
|
assert_raises_jsonrpc(-4, "Insufficient funds", self.nodes[2].fundrawtransaction, rawtx)
|
||||||
rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
|
|
||||||
raise AssertionError("Spent more than available")
|
|
||||||
except JSONRPCException as e:
|
|
||||||
assert("Insufficient" in e.error['message'])
|
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
#compare fee of a standard pubkeyhash transaction
|
#compare fee of a standard pubkeyhash transaction
|
||||||
|
@ -494,21 +474,13 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
rawTx = self.nodes[1].createrawtransaction(inputs, outputs)
|
rawTx = self.nodes[1].createrawtransaction(inputs, outputs)
|
||||||
# fund a transaction that requires a new key for the change output
|
# fund a transaction that requires a new key for the change output
|
||||||
# creating the key must be impossible because the wallet is locked
|
# creating the key must be impossible because the wallet is locked
|
||||||
try:
|
assert_raises_jsonrpc(-4, "Insufficient funds", self.nodes[1].fundrawtransaction, rawtx)
|
||||||
fundedTx = self.nodes[1].fundrawtransaction(rawTx)
|
|
||||||
raise AssertionError("Wallet unlocked without passphrase")
|
|
||||||
except JSONRPCException as e:
|
|
||||||
assert('Keypool ran out' in e.error['message'])
|
|
||||||
|
|
||||||
#refill the keypool
|
#refill the keypool
|
||||||
self.nodes[1].walletpassphrase("test", 100)
|
self.nodes[1].walletpassphrase("test", 100)
|
||||||
self.nodes[1].walletlock()
|
self.nodes[1].walletlock()
|
||||||
|
|
||||||
try:
|
assert_raises_jsonrpc(-13, "walletpassphrase", self.nodes[1].sendtoaddress, self.nodes[0].getnewaddress(), 1.2)
|
||||||
self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1.2)
|
|
||||||
raise AssertionError("Wallet unlocked without passphrase")
|
|
||||||
except JSONRPCException as e:
|
|
||||||
assert('walletpassphrase' in e.error['message'])
|
|
||||||
|
|
||||||
oldBalance = self.nodes[0].getbalance()
|
oldBalance = self.nodes[0].getbalance()
|
||||||
|
|
||||||
|
|
|
@ -61,13 +61,8 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||||
rawtx = self.nodes[2].signrawtransaction(rawtx)
|
rawtx = self.nodes[2].signrawtransaction(rawtx)
|
||||||
|
|
||||||
try:
|
# This will raise an exception since there are missing inputs
|
||||||
rawtx = self.nodes[2].sendrawtransaction(rawtx['hex'])
|
assert_raises_jsonrpc(-25, "Missing inputs", self.nodes[2].sendrawtransaction, rawtx['hex'])
|
||||||
except JSONRPCException as e:
|
|
||||||
assert("Missing inputs" in e.error['message'])
|
|
||||||
else:
|
|
||||||
assert(False)
|
|
||||||
|
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
# RAW TX MULTISIG TESTS #
|
# RAW TX MULTISIG TESTS #
|
||||||
|
@ -161,13 +156,13 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
assert_equal(self.nodes[0].getrawtransaction(txHash, True)["hex"], rawTxSigned['hex'])
|
assert_equal(self.nodes[0].getrawtransaction(txHash, True)["hex"], rawTxSigned['hex'])
|
||||||
|
|
||||||
# 6. invalid parameters - supply txid and string "Flase"
|
# 6. invalid parameters - supply txid and string "Flase"
|
||||||
assert_raises(JSONRPCException, self.nodes[0].getrawtransaction, txHash, "Flase")
|
assert_raises_jsonrpc(-3,"Invalid type", self.nodes[0].getrawtransaction, txHash, "Flase")
|
||||||
|
|
||||||
# 7. invalid parameters - supply txid and empty array
|
# 7. invalid parameters - supply txid and empty array
|
||||||
assert_raises(JSONRPCException, self.nodes[0].getrawtransaction, txHash, [])
|
assert_raises_jsonrpc(-3,"Invalid type", self.nodes[0].getrawtransaction, txHash, [])
|
||||||
|
|
||||||
# 8. invalid parameters - supply txid and empty dict
|
# 8. invalid parameters - supply txid and empty dict
|
||||||
assert_raises(JSONRPCException, self.nodes[0].getrawtransaction, txHash, {})
|
assert_raises_jsonrpc(-3,"Invalid type", self.nodes[0].getrawtransaction, txHash, {})
|
||||||
|
|
||||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 1000}]
|
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 1000}]
|
||||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||||
|
@ -175,13 +170,15 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
decrawtx= self.nodes[0].decoderawtransaction(rawtx)
|
decrawtx= self.nodes[0].decoderawtransaction(rawtx)
|
||||||
assert_equal(decrawtx['vin'][0]['sequence'], 1000)
|
assert_equal(decrawtx['vin'][0]['sequence'], 1000)
|
||||||
|
|
||||||
|
# 9. invalid parameters - sequence number out of range
|
||||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : -1}]
|
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : -1}]
|
||||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||||
assert_raises(JSONRPCException, self.nodes[0].createrawtransaction, inputs, outputs)
|
assert_raises_jsonrpc(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs)
|
||||||
|
|
||||||
|
# 10. invalid parameters - sequence number out of range
|
||||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967296}]
|
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967296}]
|
||||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||||
assert_raises(JSONRPCException, self.nodes[0].createrawtransaction, inputs, outputs)
|
assert_raises_jsonrpc(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs)
|
||||||
|
|
||||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967294}]
|
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967294}]
|
||||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||||
|
|
|
@ -2761,7 +2761,7 @@ UniValue fundrawtransaction(const JSONRPCRequest& request)
|
||||||
string strFailReason;
|
string strFailReason;
|
||||||
|
|
||||||
if (!pwallet->FundTransaction(tx, nFeeOut, overrideEstimatedFeerate, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, setSubtractFeeFromOutputs, reserveChangeKey, changeAddress)) {
|
if (!pwallet->FundTransaction(tx, nFeeOut, overrideEstimatedFeerate, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, setSubtractFeeFromOutputs, reserveChangeKey, changeAddress)) {
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason);
|
throw JSONRPCError(RPC_WALLET_ERROR, strFailReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
|
|
Loading…
Reference in a new issue