@@ -20,7 +20,8 @@ import Data.Maybe (fromMaybe, fromJust)
2020import Data.Text qualified as T
2121import Data.Vector qualified as V
2222import Data.Vector.Unboxed.Mutable qualified as VMut
23- import System.Process (readProcessWithExitCode )
23+ import System.Environment (lookupEnv , getEnvironment )
24+ import System.Process qualified as P
2425
2526import EVM (bytecode , replaceCodeOfSelf , loadContract , exec1 , vmOpIx , clearTStorages )
2627import EVM.ABI
@@ -178,13 +179,21 @@ execTxWith executeTx tx = do
178179 runFully -- resume execution
179180
180181 -- Execute a FFI call
181- Just (PleaseDoFFI (cmd : args) continuation) -> do
182- (_, stdout, _) <- liftIO $ readProcessWithExitCode cmd args " "
182+ Just (PleaseDoFFI (cmd : args) envs continuation) -> do
183+ existingEnv <- liftIO getEnvironment
184+ let mergedEnv = Map. toList $ Map. union envs $ Map. fromList existingEnv
185+ let process = (P. proc cmd args) { P. env = Just mergedEnv }
186+ (_, stdout, _) <- liftIO $ P. readCreateProcessWithExitCode process " "
183187 let encodedResponse = encodeAbiValue $
184188 AbiTuple (V. fromList [AbiBytesDynamic . hexText . T. pack $ stdout])
185189 fromEVM (continuation encodedResponse)
186190 runFully
187191
192+ Just (PleaseReadEnv var continuation) -> do
193+ value <- liftIO $ lookupEnv var
194+ fromEVM (continuation $ fromMaybe " " value)
195+ runFully -- resume execution
196+
188197 -- No queries to answer, the tx is fully executed and the result is final
189198 _ -> pure vmResult
190199
0 commit comments