Resolve decimal vs float issues

This commit is contained in:
Eirik Ogilvie-Wigley 2019-06-15 15:03:58 -06:00 committed by Jack Grigg
parent a2db35137b
commit aa4b98a7c3
1 changed files with 76 additions and 76 deletions

View File

@ -4,16 +4,16 @@
#
import argparse
import decimal
import os
import subprocess
import sys
import time
from decimal import Decimal
from slickrpc import Proxy
from slickrpc.exc import RpcException
DEFAULT_FEE = decimal.Decimal('0.0001')
DEFAULT_FEE = Decimal('0.0001')
#
# Smoke test definitions
@ -128,18 +128,15 @@ def run_cmd(results, case, zcash, name, args=[]):
def wait_for_balance(zcash, zaddr, expected=None, timeout=900):
print('Waiting for funds to %s...' % zaddr)
if expected is not None:
print('Expecting %s' % expected)
unconfirmed_balance = zcash.z_getbalance(zaddr, 0)
print('Unconfirmed balance: %s' % unconfirmed_balance)
unconfirmed_balance = Decimal(zcash.z_getbalance(zaddr, 0)).quantize(Decimal('1.00000000'))
print('Expecting: %s; Unconfirmed Balance: %s' % (expected, unconfirmed_balance))
if expected is not None and unconfirmed_balance != expected:
print('WARNING: Unconfirmed balance does not match expected balance')
ttl = timeout
while True:
balance = zcash.z_getbalance(zaddr)
if balance == unconfirmed_balance:
balance = Decimal(zcash.z_getbalance(zaddr)).quantize(Decimal('1.00000000'))
if (expected is not None and balance == unconfirmed_balance) or (expected is None and balance > 0):
print('Received %s' % balance)
return balance
@ -209,7 +206,7 @@ def z_sendmany(results, case, zcash, from_addr, recipients):
def check_z_sendmany(results, case, zcash, from_addr, recipients):
txid = z_sendmany(results, case, zcash, from_addr, recipients)
if txid is None:
return decimal.Decimal('0')
return [Decimal('0')]
return [wait_and_check_balance(results, case, zcash, to_addr, amount) for (to_addr, amount) in recipients]
def check_z_sendmany_parallel(results, zcash, runs):
@ -217,7 +214,7 @@ def check_z_sendmany_parallel(results, zcash, runs):
txids = [(run, z_sendmany(results, run[0], zcash, run[1], run[2])) for run in runs]
# Then wait for balance updates caused by successful transactions
return [
wait_and_check_balance(results, run[0], zcash, to_addr, amount) if txid is not None else decimal.Decimal('0')
wait_and_check_balance(results, run[0], zcash, to_addr, amount) if txid is not None else Decimal('0')
for (run, txid) in txids
for (to_addr, amount) in run[2]]
@ -227,7 +224,7 @@ def z_mergetoaddress(results, case, zcash, from_addrs, to_addr):
def check_z_mergetoaddress(results, case, zcash, from_addrs, to_addr, amount):
txid = z_mergetoaddress(results, case, zcash, from_addrs, to_addr)
if txid is None:
return decimal.Decimal('0')
return Decimal('0')
return wait_and_check_balance(results, case, zcash, to_addr, amount)
def check_z_mergetoaddress_parallel(results, zcash, runs):
@ -235,7 +232,7 @@ def check_z_mergetoaddress_parallel(results, zcash, runs):
txids = [(run, z_mergetoaddress(results, run[0], zcash, run[1], run[2])) for run in runs]
# Then wait for balance updates caused by successful transactions
return [
wait_and_check_balance(results, run[0], zcash, run[2], run[3]) if txid is not None else decimal.Decimal('0')
wait_and_check_balance(results, run[0], zcash, run[2], run[3]) if txid is not None else Decimal('0')
for (run, txid) in txids]
@ -327,10 +324,10 @@ def transaction_chain(zcash):
# Sprout -> taddr
taddr_balance = check_z_sendmany(
results, '4c', zcash, sprout_zaddr_1, [(taddr_1, (starting_balance / 10) * 6)])[0]
results, '4c', zcash, sprout_zaddr_1, [(taddr_1, (starting_balance / Decimal('10')) * Decimal('6'))])[0]
sprout_balance -= taddr_balance + DEFAULT_FEE
balance = run_cmd(results, '5f', zcash, 'z_getbalance', [sprout_zaddr_1])
balance = Decimal(run_cmd(results, '5f', zcash, 'z_getbalance', [sprout_zaddr_1])).quantize(Decimal('1.00000000'))
if balance != sprout_balance:
results['5f'] = False
@ -338,11 +335,11 @@ def transaction_chain(zcash):
# Send it all here because z_sendmany pick a new t-addr for change
sapling_balance = check_z_sendmany(
results, '4f', zcash, taddr_1, [(sapling_zaddr_1, taddr_balance - DEFAULT_FEE)])[0]
taddr_balance = 0
taddr_balance = Decimal('0')
# Sapling -> taddr
taddr_balance = check_z_sendmany(
results, '4i', zcash, sapling_zaddr_1, [(taddr_1, (starting_balance / 10) * 3)])[0]
results, '4i', zcash, sapling_zaddr_1, [(taddr_1, (starting_balance / Decimal('10')) * Decimal('3'))])[0]
sapling_balance -= taddr_balance + DEFAULT_FEE
#
@ -370,16 +367,16 @@ def transaction_chain(zcash):
# Sapling -> multiple Sapling
check_z_sendmany_parallel(results, zcash, [
('4k', sprout_zaddr_2, [
(sprout_zaddr_1, starting_balance / 10),
(sprout_zaddr_3, starting_balance / 10),
(sprout_zaddr_1, starting_balance / Decimal('10')),
(sprout_zaddr_3, starting_balance / Decimal('10')),
]),
('4p', taddr_2, [
(taddr_1, starting_balance / 10),
(taddr_3, taddr_balance - (starting_balance / 10) - DEFAULT_FEE),
(taddr_1, starting_balance / Decimal('10')),
(taddr_3, taddr_balance - (starting_balance / Decimal('10')) - DEFAULT_FEE),
]),
('4t', sapling_zaddr_2, [
(sapling_zaddr_1, starting_balance / 10),
(sapling_zaddr_3, starting_balance / 10),
(sapling_zaddr_1, starting_balance / Decimal('10')),
(sapling_zaddr_3, starting_balance / Decimal('10')),
]),
])
sprout_balance -= DEFAULT_FEE
@ -410,8 +407,8 @@ def transaction_chain(zcash):
# Sprout -> taddr and Sapling
txid = z_sendmany(results, '4n', zcash, sprout_zaddr_2, [
(taddr_2, starting_balance / 10),
(sapling_zaddr_1, starting_balance / 10),
(taddr_2, starting_balance / Decimal('10')),
(sapling_zaddr_1, starting_balance / Decimal('10')),
])
if txid is not None:
print('Should have failed')
@ -419,8 +416,8 @@ def transaction_chain(zcash):
# Sprout -> multiple Sapling
txid = z_sendmany(results, '4o', zcash, sprout_zaddr_2, [
(sapling_zaddr_1, starting_balance / 10),
(sapling_zaddr_2, starting_balance / 10),
(sapling_zaddr_1, starting_balance / Decimal('10')),
(sapling_zaddr_2, starting_balance / Decimal('10')),
])
if txid is not None:
print('Should have failed')
@ -428,8 +425,8 @@ def transaction_chain(zcash):
# taddr -> Sprout and Sapling
txid = z_sendmany(results, '4s', zcash, taddr_2, [
(sprout_zaddr_1, starting_balance / 10),
(sapling_zaddr_1, starting_balance / 10),
(sprout_zaddr_1, starting_balance / Decimal('10')),
(sapling_zaddr_1, starting_balance / Decimal('10')),
])
if txid is not None:
print('Should have failed')
@ -437,8 +434,8 @@ def transaction_chain(zcash):
# Sapling -> multiple Sprout
txid = z_sendmany(results, '4u', zcash, sapling_zaddr_2, [
(sprout_zaddr_1, starting_balance / 10),
(sprout_zaddr_2, starting_balance / 10),
(sprout_zaddr_1, starting_balance / Decimal('10')),
(sprout_zaddr_2, starting_balance / Decimal('10')),
])
if txid is not None:
print('Should have failed')
@ -446,8 +443,8 @@ def transaction_chain(zcash):
# Sapling -> Sapling and Sprout
txid = z_sendmany(results, '4x', zcash, sapling_zaddr_2, [
(sapling_zaddr_1, starting_balance / 10),
(sprout_zaddr_1, starting_balance / 10),
(sapling_zaddr_1, starting_balance / Decimal('10')),
(sprout_zaddr_1, starting_balance / Decimal('10')),
])
if txid is not None:
print('Should have failed')
@ -467,60 +464,60 @@ def transaction_chain(zcash):
# Sapling -> taddr and Sapling
check_z_sendmany_parallel(results, zcash, [
('4m', sprout_zaddr_2, [
(taddr_1, starting_balance / 10),
(sprout_zaddr_1, starting_balance / 10),
(taddr_1, starting_balance / Decimal('10')),
(sprout_zaddr_1, starting_balance / Decimal('10')),
]),
('4w', sapling_zaddr_2, [
(taddr_3, starting_balance / 10),
(sapling_zaddr_1, starting_balance / 10),
(taddr_3, starting_balance / Decimal('10')),
(sapling_zaddr_1, starting_balance / Decimal('10')),
]),
])
sprout_balance -= (starting_balance / 10) + DEFAULT_FEE
sapling_balance -= (starting_balance / 10) + DEFAULT_FEE
taddr_balance += (starting_balance / 10) * 2
sprout_balance -= (starting_balance / Decimal('10')) + DEFAULT_FEE
sapling_balance -= (starting_balance / Decimal('10')) + DEFAULT_FEE
taddr_balance += (starting_balance / Decimal('10')) * Decimal('2')
# taddr and Sprout -> Sprout
# taddr and Sapling -> Sapling
check_z_mergetoaddress_parallel(results, zcash, [
('4dd', [taddr_1, sprout_zaddr_1], sprout_zaddr_2, sprout_balance + (starting_balance / 10) - DEFAULT_FEE),
('4ee', [taddr_3, sapling_zaddr_1], sapling_zaddr_2, sapling_balance + (starting_balance / 10) - DEFAULT_FEE),
('4dd', [taddr_1, sprout_zaddr_1], sprout_zaddr_2, sprout_balance + (starting_balance / Decimal('10')) - DEFAULT_FEE),
('4ee', [taddr_3, sapling_zaddr_1], sapling_zaddr_2, sapling_balance + (starting_balance / Decimal('10')) - DEFAULT_FEE),
])
sprout_balance += (starting_balance / 10) - DEFAULT_FEE
sapling_balance += (starting_balance / 10) - DEFAULT_FEE
taddr_balance -= (starting_balance / 10) * 2
sprout_balance += (starting_balance / Decimal('10')) - DEFAULT_FEE
sapling_balance += (starting_balance / Decimal('10')) - DEFAULT_FEE
taddr_balance -= (starting_balance / Decimal('10')) * Decimal('2')
# Sprout -> multiple taddr
# Sapling -> multiple taddr
check_z_sendmany_parallel(results, zcash, [
('4l', sprout_zaddr_2, [
(taddr_1, (starting_balance / 10)),
(taddr_3, (starting_balance / 10)),
(taddr_1, (starting_balance / Decimal('10'))),
(taddr_3, (starting_balance / Decimal('10'))),
]),
('4v', sapling_zaddr_2, [
(taddr_4, (starting_balance / 10)),
(taddr_5, (starting_balance / 10)),
(taddr_4, (starting_balance / Decimal('10'))),
(taddr_5, (starting_balance / Decimal('10'))),
]),
])
sprout_balance -= ((starting_balance / 10) * 2) + DEFAULT_FEE
sapling_balance -= ((starting_balance / 10) * 2) + DEFAULT_FEE
taddr_balance += (starting_balance / 10) * 4
sprout_balance -= ((starting_balance / Decimal('10')) * Decimal('2')) + DEFAULT_FEE
sapling_balance -= ((starting_balance / Decimal('10')) * Decimal('2')) + DEFAULT_FEE
taddr_balance += (starting_balance / Decimal('10')) * Decimal('4')
# multiple taddr -> Sprout
# multiple taddr -> Sapling
check_z_mergetoaddress_parallel(results, zcash, [
('4z', [taddr_1, taddr_3], sprout_zaddr_2, sprout_balance + ((starting_balance / 10) * 2) - DEFAULT_FEE),
('4bb', [taddr_4, taddr_5], sapling_zaddr_2, sapling_balance + ((starting_balance / 10) * 2) - DEFAULT_FEE),
('4z', [taddr_1, taddr_3], sprout_zaddr_2, sprout_balance + ((starting_balance / Decimal('10')) * Decimal('2')) - DEFAULT_FEE),
('4bb', [taddr_4, taddr_5], sapling_zaddr_2, sapling_balance + ((starting_balance / Decimal('10')) * Decimal('2')) - DEFAULT_FEE),
])
sprout_balance += ((starting_balance / 10) * 2) - DEFAULT_FEE
sapling_balance += ((starting_balance / 10) * 2) - DEFAULT_FEE
taddr_balance -= (starting_balance / 10) * 4
sprout_balance += ((starting_balance / Decimal('10')) * Decimal('2')) - DEFAULT_FEE
sapling_balance += ((starting_balance / Decimal('10')) * Decimal('2')) - DEFAULT_FEE
taddr_balance -= (starting_balance / Decimal('10')) * Decimal('4')
# taddr -> Sprout
check_z_sendmany_parallel(results, zcash, [
('4d', taddr_2, [(sprout_zaddr_3, taddr_balance - DEFAULT_FEE)]),
])
sprout_balance += taddr_balance - DEFAULT_FEE
taddr_balance = 0
taddr_balance = Decimal('0')
# multiple Sprout -> taddr
# multiple Sapling -> taddr
@ -529,26 +526,26 @@ def transaction_chain(zcash):
('', [sapling_zaddr_1, sapling_zaddr_2, sapling_zaddr_3], taddr_2, sapling_balance - DEFAULT_FEE),
])
taddr_balance = sprout_balance + sapling_balance - (2 * DEFAULT_FEE)
sprout_balance = 0
sapling_balance = 0
sprout_balance = Decimal('0')
sapling_balance = Decimal('0')
# taddr -> multiple Sprout
# taddr -> multiple Sapling
taddr_1_balance = zcash.z_getbalance(taddr_1)
taddr_2_balance = zcash.z_getbalance(taddr_2)
taddr_1_balance = Decimal(zcash.z_getbalance(taddr_1)).quantize(Decimal('1.00000000'))
taddr_2_balance = Decimal(zcash.z_getbalance(taddr_2)).quantize(Decimal('1.00000000'))
check_z_sendmany_parallel(results, zcash, [
('4q', taddr_1, [
(sprout_zaddr_1, (starting_balance / 10)),
(sprout_zaddr_2, taddr_1_balance - (starting_balance / 10) - DEFAULT_FEE),
(sprout_zaddr_1, (starting_balance / Decimal('10'))),
(sprout_zaddr_2, taddr_1_balance - (starting_balance / Decimal('10')) - DEFAULT_FEE),
]),
('4r', taddr_2, [
(sapling_zaddr_1, (starting_balance / 10)),
(sapling_zaddr_2, taddr_2_balance - (starting_balance / 10) - DEFAULT_FEE),
(sapling_zaddr_1, (starting_balance / Decimal('10'))),
(sapling_zaddr_2, taddr_2_balance - (starting_balance / Decimal('10')) - DEFAULT_FEE),
]),
])
sprout_balance = taddr_1_balance - DEFAULT_FEE
sapling_balance = taddr_2_balance - DEFAULT_FEE
taddr_balance = 0
taddr_balance = Decimal('0')
# multiple Sprout -> taddr
# multiple Sapling -> taddr
@ -556,21 +553,21 @@ def transaction_chain(zcash):
('', [sprout_zaddr_1, sprout_zaddr_2], taddr_1, sprout_balance - DEFAULT_FEE),
('', [sapling_zaddr_1, sapling_zaddr_2], taddr_2, sapling_balance - DEFAULT_FEE),
])
taddr_balance = sprout_balance + sapling_balance - (2 * DEFAULT_FEE)
sprout_balance = 0
sapling_balance = 0
taddr_balance = sprout_balance + sapling_balance - (Decimal('2') * DEFAULT_FEE)
sprout_balance = Decimal('0')
sapling_balance = Decimal('0')
# z_mergetoaddress taddr -> Sprout
# z_mergetoaddress taddr -> Sapling
taddr_1_balance = zcash.z_getbalance(taddr_1)
taddr_2_balance = zcash.z_getbalance(taddr_2)
taddr_1_balance = Decimal(zcash.z_getbalance(taddr_1)).quantize(Decimal('1.00000000'))
taddr_2_balance = Decimal(zcash.z_getbalance(taddr_2)).quantize(Decimal('1.00000000'))
check_z_mergetoaddress_parallel(results, zcash, [
('4y', [taddr_1], sprout_zaddr_1, taddr_1_balance - DEFAULT_FEE),
('4cc', [taddr_2], sapling_zaddr_1, taddr_2_balance - DEFAULT_FEE),
])
sprout_balance = taddr_1_balance - DEFAULT_FEE
sapling_balance = taddr_2_balance - DEFAULT_FEE
taddr_balance = 0
taddr_balance = Decimal('0')
finally:
#
# End the chain by returning the remaining funds
@ -587,13 +584,16 @@ def transaction_chain(zcash):
print()
print('Waiting for all transactions to be mined')
[wait_for_balance(zcash, addr) for addr in all_addrs]
for addr in all_addrs:
balance = Decimal(zcash.z_getbalance(addr, 0)).quantize(Decimal('1.00000000'))
if balance > 0:
wait_for_balance(zcash, addr, balance)
print()
print('Returning remaining balance minus fees')
for addr in all_addrs:
balance = zcash.z_getbalance(addr)
if balance != 0:
balance = Decimal(zcash.z_getbalance(addr)).quantize(Decimal('1.00000000'))
if balance > 0:
z_sendmany(None, '', zcash, addr, [(chain_end, balance - DEFAULT_FEE)])
return results