Return a more informative error message when trying to spend coinbase; select non-coinbase inputs when sending to a transparent output if needed For #1373 and #1519 Code change: - Extra parameter added to AvailableCoins to include or exclude Coinbase coins. Default value of parameter is 'true' as current behaviour is to include Coinbase coins. - SelectCoins, used for sending taddr->taddr, will now exclude Coinbase coins. Unit test: Tried to write a test to focus on the extra parameter added to AvailableCoins but could not. Empirical testing on Testnet: Current behaviour is that upstream RPC commands sendfrom and sendtoaddress try to spend coinbase coins returned by AvailableCoins. So the user will see: ``` ./zcash-cli sendtoaddress mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 1000.0 error: {"code":-6,"message":"Insufficient funds"} ./zcash-cli sendtoaddress mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 0.00003000 error: {"code":-4,"message":"Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."} ./zcash-cli sendfrom "" mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 0.00003000 error: {"code":-4,"message":"Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."} ``` After fix is applied: ``` ./zcash-cli sendtoaddress mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 1000.0 error: {"code":-6,"message":"Insufficient funds"} ./zcash-cli sendtoaddress mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 0.00003000 error: {"code":-4,"message":"Coinbase funds can only be sent to a zaddr"} ``` When non-coinbase UTXOs exist, they will now be selected and used: ``` ./zcash-cli z_sendmany tnPJZHeVxegCg91utaquBRPEDBGjozfz9iLDHt7zvphFbZdspNgkTVLCGjDcadQBKNyUwKs8pNjDXuEZKrE1aNLpFwHgz4t '[{"address":"mx5fTRhLZwbYE7ZqhAPueZgQGSnwTbdvKU", "amount":0.01}]' ./zcash-cli sendtoaddress mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 1000.0 error: {"code":-6,"message":"Insufficient funds"} ./zcash-cli sendtoaddress mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 0.00003000 9818e543ac2f689d4ce8b52087607d73fecd771d45d316a1d9db092f0485aff2 ./zcash-cli sendfrom "" mrEGRmGJhmwAa4MQjzGd86ry63vrvovu9b 0.00003000 899f2894823f51f15fc73b5e0871ac943edbe0ff88e1635f86906087b72caf30 ```
117 lines
2.8 KiB
Bash
Executable File
117 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e -o pipefail
|
|
|
|
CURDIR=$(cd $(dirname "$0"); pwd)
|
|
# Get BUILDDIR and REAL_BITCOIND
|
|
. "${CURDIR}/tests-config.sh"
|
|
|
|
export BITCOINCLI=${BUILDDIR}/qa/pull-tester/run-bitcoin-cli
|
|
export BITCOIND=${REAL_BITCOIND}
|
|
|
|
#Run the tests
|
|
|
|
testScripts=(
|
|
'wallet_protectcoinbase.py'
|
|
'wallet.py'
|
|
'wallet_nullifiers.py'
|
|
'listtransactions.py'
|
|
'mempool_resurrect_test.py'
|
|
'txn_doublespend.py'
|
|
'txn_doublespend.py --mineblock'
|
|
'getchaintips.py'
|
|
'rawtransactions.py'
|
|
'rest.py'
|
|
'mempool_spendcoinbase.py'
|
|
'mempool_coinbase_spends.py'
|
|
'httpbasics.py'
|
|
'zapwallettxes.py'
|
|
'proxy_test.py'
|
|
'merkle_blocks.py'
|
|
'signrawtransactions.py'
|
|
'walletbackup.py'
|
|
'zcjoinsplit.py'
|
|
'zcjoinsplitdoublespend.py'
|
|
);
|
|
testScriptsExt=(
|
|
'bipdersig-p2p.py'
|
|
'bipdersig.py'
|
|
'getblocktemplate_longpoll.py'
|
|
'getblocktemplate_proposals.py'
|
|
'pruning.py'
|
|
'forknotify.py'
|
|
'hardforkdetection.py'
|
|
'invalidateblock.py'
|
|
'keypool.py'
|
|
'receivedby.py'
|
|
'reindex.py'
|
|
'rpcbind_test.py'
|
|
# 'script_test.py'
|
|
'smartfees.py'
|
|
'maxblocksinflight.py'
|
|
'invalidblockrequest.py'
|
|
'rawtransactions.py'
|
|
# 'forknotify.py'
|
|
'p2p-acceptblock.py'
|
|
);
|
|
|
|
extArg="-extended"
|
|
passOn=${@#$extArg}
|
|
|
|
successCount=0
|
|
declare -a failures
|
|
|
|
function runTestScript
|
|
{
|
|
local testName="$1"
|
|
shift
|
|
|
|
echo -e "=== Running testscript ${testName} ==="
|
|
|
|
if eval "$@" | sed 's/^/ /'
|
|
then
|
|
successCount=$(expr $successCount + 1)
|
|
echo "--- Success: ${testName} ---"
|
|
else
|
|
failures[${#failures[@]}]="$testName"
|
|
echo "!!! FAIL: ${testName} !!!"
|
|
fi
|
|
|
|
echo
|
|
}
|
|
|
|
if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then
|
|
for (( i = 0; i < ${#testScripts[@]}; i++ ))
|
|
do
|
|
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "$1" == "${testScripts[$i]}" ] || [ "$1.py" == "${testScripts[$i]}" ]
|
|
then
|
|
runTestScript \
|
|
"${testScripts[$i]}" \
|
|
"${BUILDDIR}/qa/rpc-tests/${testScripts[$i]}" \
|
|
--srcdir "${BUILDDIR}/src" ${passOn}
|
|
fi
|
|
done
|
|
for (( i = 0; i < ${#testScriptsExt[@]}; i++ ))
|
|
do
|
|
if [ "$1" == $extArg ] || [ "$1" == "${testScriptsExt[$i]}" ] || [ "$1.py" == "${testScriptsExt[$i]}" ]
|
|
then
|
|
runTestScript \
|
|
"${testScriptsExt[$i]}" \
|
|
"${BUILDDIR}/qa/rpc-tests/${testScriptsExt[$i]}" \
|
|
--srcdir "${BUILDDIR}/src" ${passOn}
|
|
fi
|
|
done
|
|
|
|
echo -e "\n\nTests completed: $(expr $successCount + ${#failures[@]})"
|
|
echo "successes $successCount; failures: ${#failures[@]}"
|
|
|
|
if [ ${#failures[@]} -gt 0 ]
|
|
then
|
|
echo -e "\nFailing tests: ${failures[*]}"
|
|
exit 1
|
|
else
|
|
exit 0
|
|
fi
|
|
else
|
|
echo "No rpc tests to run. Wallet, utils, and bitcoind must all be enabled"
|
|
fi
|