module Ethereum.Analyzer.Decompile ( decompile , decompileHexString ) where import Blockchain.Data.Code import Blockchain.ExtWord import Blockchain.Util import Blockchain.VM.Code import Blockchain.VM.Opcodes import Data.ByteString import Data.HexString decompileHexString :: ByteString -> [(Word256, Operation)] decompileHexString = decompileBS . toBytes . hexString decompile :: Code -> [(Word256, Operation)] decompile (Code bs) = decompileBS bs decompile _ = [] decompileBS :: ByteString -> [(Word256, Operation)] decompileBS bs = let hardlimit = 10000 in decompileBSAt bs 0 hardlimit decompileBSAt :: ByteString -> Word256 -> Int -> [(Word256, Operation)] decompileBSAt "" _ _ = [] decompileBSAt _ _ 0 = [] decompileBSAt bs base limit = (base, op) : decompileBSAt (safeDrop next bs) (base + next) (limit - 1) where (op, next) = getOperationAt' bs 0