diff --git a/lib/Echidna.hs b/lib/Echidna.hs index 6c32cd966..2eabd85e2 100644 --- a/lib/Echidna.hs +++ b/lib/Echidna.hs @@ -15,7 +15,7 @@ import EVM (cheatCode) import EVM.ABI (AbiValue(AbiAddress)) import EVM.Dapp (DappInfo(..), dappInfo) import EVM.Fetch qualified -import EVM.Solidity (SolcContract(..), BuildOutput) +import EVM.Solidity (BuildOutput) import EVM.Types hiding (Env) import Echidna.ABI @@ -72,8 +72,7 @@ prepareContract env solFiles specifiedContract seed = do (forceAddr vm.state.contract) funs - eventMap = Map.unions $ map (.eventMap) contracts - world = mkWorld solConf eventMap signatureMap specifiedContract slitherInfo + world = mkWorld solConf signatureMap specifiedContract slitherInfo contracts deployedAddresses = Set.fromList $ AbiAddress . forceAddr <$> Map.keys vm.env.contracts constants = enhanceConstants slitherInfo diff --git a/lib/Echidna/Solidity.hs b/lib/Echidna/Solidity.hs index 2c4de3628..d485e0399 100644 --- a/lib/Echidna/Solidity.hs +++ b/lib/Echidna/Solidity.hs @@ -39,7 +39,7 @@ import Echidna.ABI , commonTypeSizes, mkValidAbiInt, mkValidAbiUInt ) import Echidna.Deploy (deployContracts, deployBytecodes) import Echidna.Etheno (loadEthenoBatch) -import Echidna.Events (EventMap, extractEvents) +import Echidna.Events (extractEvents) import Echidna.Exec (execTx, initialVM) import Echidna.SourceAnalysis.Slither import Echidna.Symbolic (forceAddr) @@ -296,18 +296,19 @@ loadSpecified env name cs = do -- for running a 'Campaign' against the tests found. mkWorld :: SolConf - -> EventMap -> SignatureMap -> Maybe ContractName -> SlitherInfo + -> [SolcContract] -> World -mkWorld SolConf{sender, testMode} eventMap sigMap maybeContract slitherInfo = +mkWorld SolConf{sender, testMode} sigMap maybeContract slitherInfo contracts = let + eventMap = Map.unions $ map (.eventMap) contracts payableSigs = filterResults maybeContract slitherInfo.payableFunctions as = if isAssertionMode testMode then filterResults maybeContract slitherInfo.asserts else [] cs = if isDapptestMode testMode then [] else filterResults maybeContract slitherInfo.constantFunctions \\ as (highSignatureMap, lowSignatureMap) = prepareHashMaps cs as $ - filterFallbacks maybeContract slitherInfo.fallbackDefined slitherInfo.receiveDefined sigMap + filterFallbacks slitherInfo.fallbackDefined slitherInfo.receiveDefined contracts sigMap in World { senders = sender , highSignatureMap , lowSignatureMap @@ -325,16 +326,19 @@ filterResults (Just contractName) rs = filterResults Nothing rs = hashSig <$> (concat . Map.elems) rs filterFallbacks - :: Maybe ContractName - -> [ContractName] + :: [ContractName] -> [ContractName] + -> [SolcContract] -> SignatureMap -> SignatureMap -filterFallbacks _ [] [] sm = Map.map f sm - where f ss = NE.fromList $ case NE.filter (/= fallback) ss of +filterFallbacks la lb contracts = Map.mapWithKey f + where + f k ss | k `elem` keysToIgnore = ss + f _ ss = NE.fromList $ case NE.filter (/= fallback) ss of [] -> [fallback] -- No other alternative ss' -> ss' -filterFallbacks _ _ _ sm = sm + keysToIgnore = concatMap contractNameToCodehashes (la ++ lb) + contractNameToCodehashes name = map (.runtimeCodehash) $ filter (\c -> last (T.splitOn ":" c.contractName) == name) contracts prepareHashMaps :: [FunctionSelector]