|
|
@ -1,4 +1,4 @@ |
|
|
|
from decimal import Decimal |
|
|
|
from fractions import Fraction |
|
|
|
from typing import Union |
|
|
|
from typing import Union |
|
|
|
|
|
|
|
|
|
|
|
from slither.exceptions import SlitherError |
|
|
|
from slither.exceptions import SlitherError |
|
|
@ -12,17 +12,17 @@ def convert_string_to_int(val: Union[str, int]) -> int: |
|
|
|
|
|
|
|
|
|
|
|
if "e" in val or "E" in val: |
|
|
|
if "e" in val or "E" in val: |
|
|
|
base, expo = val.split("e") if "e" in val else val.split("E") |
|
|
|
base, expo = val.split("e") if "e" in val else val.split("E") |
|
|
|
base, expo = Decimal(base), int(expo) |
|
|
|
base, expo = Fraction(base), int(expo) |
|
|
|
# The resulting number must be < 2**256-1, otherwise solc |
|
|
|
# The resulting number must be < 2**256-1, otherwise solc |
|
|
|
# Would not be able to compile it |
|
|
|
# Would not be able to compile it |
|
|
|
# 10**77 is the largest exponent that fits |
|
|
|
# 10**77 is the largest exponent that fits |
|
|
|
# See https://github.com/ethereum/solidity/blob/9e61f92bd4d19b430cb8cb26f1c7cf79f1dff380/libsolidity/ast/Types.cpp#L1281-L1290 |
|
|
|
# See https://github.com/ethereum/solidity/blob/9e61f92bd4d19b430cb8cb26f1c7cf79f1dff380/libsolidity/ast/Types.cpp#L1281-L1290 |
|
|
|
if expo > 77: |
|
|
|
if expo > 77: |
|
|
|
if base != Decimal(0): |
|
|
|
if base != Fraction(0): |
|
|
|
raise SlitherError( |
|
|
|
raise SlitherError( |
|
|
|
f"{base}e{expo} is too large to fit in any Solidity integer size" |
|
|
|
f"{base}e{expo} is too large to fit in any Solidity integer size" |
|
|
|
) |
|
|
|
) |
|
|
|
return 0 |
|
|
|
return 0 |
|
|
|
return int(Decimal(base) * Decimal(10**expo)) |
|
|
|
return int(Fraction(base) * Fraction(10**expo)) |
|
|
|
|
|
|
|
|
|
|
|
return int(Decimal(val)) |
|
|
|
return int(Fraction(val)) |
|
|
|