mirror of https://github.com/crytic/slither
Improve constant folding (Fix #820)
parent
a988d9c89e
commit
e2fd9d2c19
@ -0,0 +1,25 @@ |
|||||||
|
from decimal import Decimal |
||||||
|
|
||||||
|
from slither.exceptions import SlitherError |
||||||
|
|
||||||
|
|
||||||
|
def convert_string_to_int(val: str) -> int: |
||||||
|
if val.startswith("0x") or val.startswith("0X"): |
||||||
|
return int(val, 16) |
||||||
|
|
||||||
|
if "e" in val or "E" in val: |
||||||
|
base, expo = val.split("e") if "e" in val else val.split("E") |
||||||
|
base, expo = Decimal(base), int(expo) |
||||||
|
# The resulting number must be < 2**256-1, otherwise solc |
||||||
|
# Would not be able to compile it |
||||||
|
# 10**77 is the largest exponent that fits |
||||||
|
# See https://github.com/ethereum/solidity/blob/9e61f92bd4d19b430cb8cb26f1c7cf79f1dff380/libsolidity/ast/Types.cpp#L1281-L1290 |
||||||
|
if expo > 77: |
||||||
|
if base != Decimal(0): |
||||||
|
raise SlitherError( |
||||||
|
f"{base}e{expo} is too large to fit in any Solidity integer size" |
||||||
|
) |
||||||
|
return 0 |
||||||
|
return int(Decimal(base) * Decimal(10 ** expo)) |
||||||
|
|
||||||
|
return int(Decimal(val)) |
Loading…
Reference in new issue