web3-0.8.0.0: unit/Network/Ethereum/Web3/Test/EventSpec.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.Ethereum.Web3.Test.EventSpec where
import Data.Tagged (Tagged)
import Generics.SOP (Generic)
import qualified GHC.Generics as GHC (Generic)
import Test.Hspec (Spec, describe, it, shouldBe)
import Data.Solidity.Abi (AbiGet, AbiType (..))
import Data.Solidity.Event (IndexedEvent (..), decodeEvent)
import Data.Solidity.Prim (Address, UIntN)
import Network.Ethereum.Api.Types (Change (..))
spec :: Spec
spec = eventTest
eventTest :: Spec
eventTest =
describe "event tests" $ do
it "can decode simple storage" $
let change = Change { changeLogIndex = Just "0x2"
, changeTransactionIndex = Just "0x2"
, changeTransactionHash = Just "0xe8cac6af0ceb3cecbcb2a5639361fc9811b1aa753672cf7c7e8b528df53e0e94"
, changeBlockHash = Just "0x0c7e1701858232ac210e3bcc8ab3b33cc6b08025692b22abb39059dc41f6a76e"
, changeBlockNumber = Just 0
, changeAddress = "0x617e5941507aab5d2d8bcb56cb8c6ce2eeb16b21"
, changeData = "0x000000000000000000000000000000000000000000000000000000000000000a"
, changeTopics = ["0xa32bc18230dd172221ac5c4821a5f1f1a831f27b1396d244cdd891c58f132435"]
}
in decodeEvent change `shouldBe` Right (NewCount 10)
it "can decode erc20" $
let ercchange = Change { changeLogIndex = Just "0x2"
, changeTransactionIndex = Just "0x2"
, changeTransactionHash = Just "0xe8cac6af0ceb3cecbcb2a5639361fc9811b1aa753672cf7c7e8b528df53e0e94"
, changeBlockHash = Just "0x0c7e1701858232ac210e3bcc8ab3b33cc6b08025692b22abb39059dc41f6a76e"
, changeBlockNumber = Just 0
, changeAddress = "0x617e5941507aab5d2d8bcb56cb8c6ce2eeb16b21"
, changeData = "0x000000000000000000000000000000000000000000000000000000000000000a"
, changeTopics = [ "0xb32bc18230dd172221ac5c4821a5f1f1a831f27b1396d244cdd891c58f132435"
, "0x0000000000000000000000000000000000000000000000000000000000000001"
, "0x0000000000000000000000000000000000000000000000000000000000000002"
]
}
in decodeEvent ercchange `shouldBe` Right (Transfer "0x0000000000000000000000000000000000000001" 10 "0x0000000000000000000000000000000000000002")
-- SimpleStorage Event Types
data NewCount = NewCount (UIntN 256) deriving (Eq, Show, GHC.Generic)
instance Generic NewCount
data NewCountIndexed = NewCountIndexed deriving (Eq, Show, GHC.Generic)
instance Generic NewCountIndexed
instance AbiType NewCountIndexed where
isDynamic = const False
instance AbiGet NewCountIndexed
data NewCountNonIndexed = NewCountNonIndexed (Tagged 1 (UIntN 256)) deriving (Eq, Show, GHC.Generic)
instance Generic NewCountNonIndexed
instance AbiType NewCountNonIndexed where
isDynamic = const False
instance AbiGet NewCountNonIndexed
instance IndexedEvent NewCountIndexed NewCountNonIndexed NewCount where
isAnonymous = const False
-- WeirdERC20 Event Types (Transfer type wrong order for testing purposes)
data Transfer = Transfer Address (UIntN 256) Address deriving (Eq, Show, GHC.Generic)
instance Generic Transfer
data TransferIndexed = TransferIndexed (Tagged 1 Address) (Tagged 3 Address) deriving (Eq, Show, GHC.Generic)
instance Generic TransferIndexed
instance AbiType TransferIndexed where
isDynamic = const False
instance AbiGet TransferIndexed
data TransferNonIndexed = TransferNonIndexed (Tagged 2 (UIntN 256)) deriving (Eq, Show, GHC.Generic)
instance Generic TransferNonIndexed
instance AbiType TransferNonIndexed where
isDynamic = const False
instance AbiGet TransferNonIndexed
instance IndexedEvent TransferIndexed TransferNonIndexed Transfer where
isAnonymous = const False