ethereum-analyzer-3.0.0: test/Ethereum/AnalyzerSpec.hs
{-# LANGUAGE OverloadedStrings, FlexibleContexts #-}
module Ethereum.AnalyzerSpec
( spec
) where
import Protolude hiding (show)
import Data.List as DL
import Data.List.Extra as DLE
import Ethereum.Analyzer.EVM
import Ethereum.Analyzer.TestData.Basic
import GHC.Show
import Test.Hspec
spec :: Spec
spec =
describe "disasm" $ do
it "works for hexstring1" $ do
let disasmd1 = show $ showOps $ disasm hexstring1
DL.take 60 disasmd1 `shouldBe`
"[\"0: PUSH [96]\",\"2: PUSH [64]\",\"4: MSTORE\",\"5: PUSH [2]\",\"7:"
DLE.takeEnd 60 disasmd1 `shouldBe`
"]\",\"6989: JUMP\",\"6990: JUMPDEST\",\"6991: SWAP1\",\"6992: JUMP\"]"
it "works for hexstring2" $ do
let disasmd2 = show $ showOps $ disasm hexstring2
disasmd2 `shouldBe` "[\"0: PUSH [96]\"," ++
"\"2: PUSH [64]\"," ++
"\"4: MSTORE\"," ++
"\"5: CALLDATASIZE\"," ++
"\"6: ISZERO\"," ++
"\"7: PUSH [39]\"," ++
"\"9: JUMPI\"," ++
"\"10: PUSH [224]\"," ++
"\"12: PUSH [2]\"," ++
"\"14: EXP\"," ++
"\"15: PUSH [0]\"," ++
"\"17: CALLDATALOAD\"," ++
"\"18: DIV\"," ++
"\"19: PUSH [65,192,225,181]\"," ++
"\"24: DUP2\"," ++
"\"25: EQ\"," ++
"\"26: PUSH [110]\"," ++
"\"28: JUMPI\"," ++
"\"29: DUP1\"," ++
"\"30: PUSH [229,34,83,129]\"," ++
"\"35: EQ\"," ++
"\"36: PUSH [150]\"," ++
"\"38: JUMPI\"," ++
"\"39: JUMPDEST\"," ++
"\"40: PUSH [213]\"," ++
"\"42: PUSH [0]\"," ++
"\"44: CALLVALUE\"," ++
"\"45: GT\"," ++
"\"46: ISZERO\"," ++
"\"47: PUSH [108]\"," ++
"\"49: JUMPI\"," ++
"\"50: CALLVALUE\"," ++
"\"51: PUSH [96]\"," ++
"\"53: SWAP1\"," ++
"\"54: DUP2\"," ++
"\"55: MSTORE\"," ++
"\"56: PUSH [88]\"," ++
"\"58: SWAP1\"," ++
"\"59: PUSH [1]\"," ++
"\"61: PUSH [160]\"," ++
"\"63: PUSH [2]\"," ++
"\"65: EXP\"," ++
"\"66: SUB\"," ++
"\"67: CALLER\"," ++
"\"68: AND\"," ++
"\"69: SWAP1\"," ++
"\"70: PUSH [144,137,8,9,198,84,241,29,110,114,162,143,166,1,73,119,10,13,17,236,108,146,49,157,108,235,43,176,164,234,26,21]\"," ++
"\"103: SWAP1\"," ++
"\"104: PUSH [32]\"," ++
"\"106: SWAP1\"," ++
"\"107: LOG3\"," ++
"\"108: JUMPDEST\"," ++
"\"109: JUMP\"," ++
"\"110: JUMPDEST\"," ++
"\"111: PUSH [213]\"," ++
"\"113: PUSH [0]\"," ++
"\"115: SLOAD\"," ++
"\"116: PUSH [1]\"," ++
"\"118: PUSH [160]\"," ++
"\"120: PUSH [2]\"," ++
"\"122: EXP\"," ++
"\"123: SUB\"," ++
"\"124: SWAP1\"," ++
"\"125: DUP2\"," ++
"\"126: AND\"," ++
"\"127: CALLER\"," ++
"\"128: SWAP2\"," ++
"\"129: SWAP1\"," ++
"\"130: SWAP2\"," ++
"\"131: AND\"," ++
"\"132: EQ\"," ++
"\"133: ISZERO\"," ++
"\"134: PUSH [108]\"," ++
"\"136: JUMPI\"," ++
"\"137: PUSH [0]\"," ++
"\"139: SLOAD\"," ++
"\"140: PUSH [1]\"," ++
"\"142: PUSH [160]\"," ++
"\"144: PUSH [2]\"," ++
"\"146: EXP\"," ++
"\"147: SUB\"," ++
"\"148: AND\"," ++
"\"149: SUICIDE\"," ++
"\"150: JUMPDEST\"," ++
"\"151: PUSH [213]\"," ++
"\"153: PUSH [0]\"," ++
"\"155: SLOAD\"," ++
"\"156: PUSH [1]\"," ++
"\"158: PUSH [160]\"," ++
"\"160: PUSH [2]\"," ++
"\"162: EXP\"," ++
"\"163: SUB\"," ++
"\"164: SWAP1\"," ++
"\"165: DUP2\"," ++
"\"166: AND\"," ++
"\"167: CALLER\"," ++
"\"168: SWAP2\"," ++
"\"169: SWAP1\"," ++
"\"170: SWAP2\"," ++
"\"171: AND\"," ++
"\"172: EQ\"," ++
"\"173: ISZERO\"," ++
"\"174: PUSH [108]\"," ++
"\"176: JUMPI\"," ++
"\"177: PUSH [0]\"," ++
"\"179: DUP1\"," ++
"\"180: SLOAD\"," ++
"\"181: PUSH [1]\"," ++
"\"183: PUSH [160]\"," ++
"\"185: PUSH [2]\"," ++
"\"187: EXP\"," ++
"\"188: SUB\"," ++
"\"189: SWAP1\"," ++
"\"190: DUP2\"," ++
"\"191: AND\"," ++
"\"192: SWAP2\"," ++
"\"193: SWAP1\"," ++
"\"194: ADDRESS\"," ++
"\"195: AND\"," ++
"\"196: BALANCE\"," ++
"\"197: PUSH [96]\"," ++
"\"199: DUP3\"," ++
"\"200: DUP2\"," ++
"\"201: DUP2\"," ++
"\"202: DUP2\"," ++
"\"203: DUP6\"," ++
"\"204: DUP9\"," ++
"\"205: DUP4\"," ++
"\"206: CALL\"," ++
"\"207: POP\"," ++
"\"208: POP\"," ++
"\"209: POP\"," ++
"\"210: POP\"," ++
"\"211: POP\"," ++
"\"212: JUMP\"," ++ "\"213: JUMPDEST\"," ++ "\"214: STOP\"]"