Skip to content

Commit 024dbe9

Browse files
authored
Merge branch 'main' into early-abort-flag
2 parents 73c1c52 + c9d7269 commit 024dbe9

File tree

1 file changed

+16
-21
lines changed

1 file changed

+16
-21
lines changed

src/EVM/SymExec.hs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module EVM.SymExec where
66

77
import Prelude hiding (Foldable(..))
88

9-
import Control.Arrow ((>>>))
109
import Control.Concurrent (forkIO, killThread)
1110
import Control.Concurrent.Async ( mapConcurrently)
1211
import Control.Concurrent.Chan (Chan, newChan, writeChan, readChan)
@@ -16,14 +15,14 @@ import Control.Concurrent.STM.TVar (TVar, newTVarIO, modifyTVar, readTVar, write
1615
import Control.Concurrent.STM.TMVar (TMVar, putTMVar, takeTMVar, newEmptyTMVarIO)
1716
import Control.Monad (when, unless, forM_, forM, forever, void)
1817
import Control.Monad.Loops (whileM)
19-
import Control.Monad.IO.Unlift
18+
import Control.Monad.IO.Unlift (MonadUnliftIO, toIO, withRunInIO)
2019
import Control.Monad.Operational qualified as Operational
2120
import Control.Monad.ST (RealWorld, stToIO, ST)
22-
import Control.Monad.State.Strict
21+
import Control.Monad.State.Strict (liftIO, runStateT)
2322
import Data.ByteString (ByteString)
2423
import Data.ByteString qualified as BS
2524
import Data.DoubleWord (Word256)
26-
import Data.Foldable (Foldable(..))
25+
import Data.Foldable (length, foldl', foldr)
2726
import Data.List (sortBy, sort)
2827
import Data.List.NonEmpty qualified as NE
2928
import Data.Maybe (fromMaybe, listToMaybe, mapMaybe, catMaybes)
@@ -34,38 +33,36 @@ import Data.Set (Set)
3433
import Data.Set qualified as Set
3534
import Data.Text (Text)
3635
import Data.Text qualified as T
36+
import Data.Text.Encoding (encodeUtf8)
3737
import Data.Text.IO qualified as T
3838
import Data.Tree.Zipper qualified as Zipper
3939
import Data.Tuple (swap)
4040
import Data.Vector qualified as V
4141
import Data.Vector.Storable qualified as VS
4242
import Data.Vector.Storable.ByteString (vectorToByteString)
43-
import GHC.Conc (numCapabilities)
44-
import GHC.Natural
43+
import GHC.Conc (numCapabilities, getNumProcessors)
44+
import GHC.Generics (Generic)
45+
import GHC.Num.Natural (Natural)
46+
import Optics.Core
47+
import Options.Generic (ParseField, ParseFields, ParseRecord)
48+
import Text.Printf (printf)
49+
import Witch (into, unsafeInto)
4550

4651
import EVM (makeVm, abstractContract, initialContract, getCodeLocation, isValidJumpDest)
47-
import EVM.Exec
52+
import EVM.Exec (exec)
4853
import EVM.Fetch qualified as Fetch
4954
import EVM.ABI
5055
import EVM.Effects
5156
import EVM.Expr qualified as Expr
5257
import EVM.FeeSchedule (feeSchedule)
5358
import EVM.Format (formatExpr, formatPartial, formatPartialDetailed, showVal, indent, formatBinary, formatProp, formatState, formatError)
5459
import EVM.SMT qualified as SMT
55-
import EVM.Solvers
60+
import EVM.Solvers (SolverGroup, checkSatWithProps)
5661
import EVM.Stepper (Stepper)
5762
import EVM.Stepper qualified as Stepper
58-
import EVM.Traversals
63+
import EVM.Traversals (mapExpr, mapExprM, foldTerm)
5964
import EVM.Types hiding (Comp)
6065
import EVM.Types qualified
61-
import EVM.Expr (maybeConcStoreSimp)
62-
import GHC.Conc (getNumProcessors)
63-
import GHC.Generics (Generic)
64-
import Optics.Core
65-
import Options.Generic (ParseField, ParseFields, ParseRecord)
66-
import Text.Printf (printf)
67-
import Witch (into, unsafeInto)
68-
import Data.Text.Encoding (encodeUtf8)
6966
import EVM.Solidity (WarningData (..))
7067

7168
data LoopHeuristic
@@ -890,7 +887,7 @@ verifyInputsWithHandler solvers opts fetcher preState post cexHandler = do
890887
expandCex :: VM Symbolic -> SMTCex -> SMTCex
891888
expandCex prestate c = c { store = Map.union c.store concretePreStore }
892889
where
893-
concretePreStore = Map.mapMaybe (maybeConcStoreSimp . (.storage))
890+
concretePreStore = Map.mapMaybe (Expr.maybeConcStoreSimp . (.storage))
894891
. Map.filter (\v -> Expr.containsNode isConcreteStore v.storage)
895892
$ (prestate.env.contracts)
896893
isConcreteStore = \case
@@ -1255,7 +1252,7 @@ prettyBuf b = internalError $ "Unexpected symbolic buffer:\n" <> T.unpack (forma
12551252

12561253
calldataFromCex :: App m => SMTCex -> Expr Buf -> Sig -> m (Err ByteString)
12571254
calldataFromCex cex buf sig = do
1258-
let sigKeccak = keccakSig $ encodeUtf8 (callSig sig)
1255+
let sigKeccak = BS.take 4 $ keccakBytes $ encodeUtf8 (callSig sig)
12591256
pure $ (sigKeccak <>) <$> body
12601257
where
12611258
cd = defaultSymbolicValues $ subModel cex buf
@@ -1266,8 +1263,6 @@ calldataFromCex cex buf sig = do
12661263
forceConcrete :: (Expr Buf) -> Err ByteString
12671264
forceConcrete (ConcreteBuf k) = Right k
12681265
forceConcrete _ = Left "Symbolic buffer in calldata, cannot produce concrete model"
1269-
keccakSig :: ByteString -> ByteString
1270-
keccakSig = keccakBytes >>> BS.take 4
12711266

12721267
prettyCalldata :: SMTCex -> Expr Buf -> Text -> [AbiType] -> Text
12731268
prettyCalldata cex buf sig types = headErr errSig (T.splitOn "(" sig) <> "(" <> body <> ")" <> T.pack finalErr

0 commit comments

Comments
 (0)