Use Decimal instead of float (fix #450)

pull/454/head
Josselin 5 years ago
parent b4249cdc68
commit d95a57f157
  1. 10
      slither/slithir/variables/constant.py
  2. 6
      slither/utils/arithmetic.py

@ -1,3 +1,5 @@
from decimal import Decimal
from .variable import SlithIRVariable from .variable import SlithIRVariable
from slither.core.solidity_types.elementary_type import ElementaryType, Int, Uint from slither.core.solidity_types.elementary_type import ElementaryType, Int, Uint
from slither.utils.arithmetic import convert_subdenomination from slither.utils.arithmetic import convert_subdenomination
@ -23,12 +25,12 @@ class Constant(SlithIRVariable):
else: else:
if 'e' in val: if 'e' in val:
base, expo = val.split('e') base, expo = val.split('e')
self._val = int(float(base)* (10 ** int(expo))) self._val = int(Decimal(base) * (10 ** int(expo)))
elif 'E' in val: elif 'E' in val:
base, expo = val.split('E') base, expo = val.split('E')
self._val = int(float(base) * (10 ** int(expo))) self._val = int(Decimal(base) * (10 ** int(expo)))
else: else:
self._val = int(float(val)) self._val = int(Decimal(val))
elif type.type == 'bool': elif type.type == 'bool':
self._val = (val == 'true') | (val == 'True') self._val = (val == 'true') | (val == 'True')
else: else:
@ -36,7 +38,7 @@ class Constant(SlithIRVariable):
else: else:
if val.isdigit(): if val.isdigit():
self._type = ElementaryType('uint256') self._type = ElementaryType('uint256')
self._val = int(val) self._val = int(Decimal(val))
else: else:
self._type = ElementaryType('string') self._type = ElementaryType('string')
self._val = val self._val = val

@ -1,3 +1,5 @@
from decimal import Decimal
from slither.exceptions import SlitherException from slither.exceptions import SlitherException
@ -5,9 +7,9 @@ def convert_subdenomination(value, sub):
# to allow 0.1 ether conversion # to allow 0.1 ether conversion
if value[0:2] == "0x": if value[0:2] == "0x":
value = float(int(value, 16)) value = Decimal(int(value, 16))
else: else:
value = float(value) value = Decimal(value)
if sub == 'wei': if sub == 'wei':
return int(value) return int(value)
if sub == 'szabo': if sub == 'szabo':

Loading…
Cancel
Save