Skip to content

Commit

Permalink
Added ABI parser; Added Filter creator from Event defs
Browse files Browse the repository at this point in the history
  • Loading branch information
akru committed Oct 4, 2016
1 parent c64544e commit 5745999
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 1 deletion.
1 change: 1 addition & 0 deletions .ghci
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:set prompt "> "
60 changes: 60 additions & 0 deletions src/Network/Ethereum/ContractAbi.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{-# LANGUAGE TemplateHaskell #-}
-- |
-- Module : Network.Ethereum.ContractAbi
-- Copyright : Alexander Krupenkin 2016
-- License : BSD3
--
-- Maintainer : mail@akru.me
-- Stability : experimental
-- Portability : POSIX / WIN32
--
-- Ethereum smart contract utils.
--
module Network.Ethereum.ContractAbi where

import qualified Data.Text as T
import Data.Char (toLower)
import Data.Monoid ((<>))
import Data.Text (Text)
import Data.Aeson.TH

data FunctionArg = FunctionArgs
{ funArgName :: Text
, funArgType :: Text
} deriving Show

$(deriveJSON (defaultOptions { fieldLabelModifier = map toLower . drop 6 }) ''FunctionArg)

data EventArg = EventArg
{ eveArgName :: Text
, eveArgType :: Text
, eveArgIndexed :: Bool
} deriving Show

$(deriveJSON (defaultOptions { fieldLabelModifier = map toLower . drop 6 }) ''EventArg)

data Method = Constructor { conInputs :: [FunctionArg] }

| Function { funName :: Text
, funInputs :: [FunctionArg]
, funOutputs :: Maybe [FunctionArg] }

| Event { eveName :: Text
, eveInputs :: [EventArg]
, eveAnonymous :: Bool }
deriving Show

$(deriveJSON (defaultOptions {
sumEncoding = defaultTaggedObject { tagFieldName = "type" }
, constructorTagModifier = map toLower
, fieldLabelModifier = map toLower . drop 3 }) ''Method)

type ContractABI = [Method]

events :: ContractABI -> [Method]
events = filter (\x -> case x of Event _ _ _ -> True; _ -> False)

eventSignature :: Method -> Text
eventSignature event = eveName event <> "(" <> args event <> ")"
where args = T.init . foldMap (<> ",") . inputTypes
inputTypes = fmap eveArgType . filter eveArgIndexed . eveInputs
2 changes: 1 addition & 1 deletion src/Network/Ethereum/Web3/Api.hs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ getBalance = remote "eth_getBalance"

data Filter = Filter
{ filterAddress :: Maybe Text
, filterTopics :: Maybe Value
, filterTopics :: Maybe [Maybe Text]
, filterFromBlock :: Maybe Text
, filterToBlock :: Maybe Text
} deriving Show
Expand Down
28 changes: 28 additions & 0 deletions src/Network/Ethereum/Web3/Util.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-- |
-- Module : Network.Ethereum.Web3.Utils
-- Copyright : Alexander Krupenkin 2016
-- License : BSD3
--
-- Maintainer : mail@akru.me
-- Stability : experimental
-- Portability : POSIX / WIN32
--
-- Web3 utility.
--
module Network.Ethereum.Web3.Util where

import Network.Ethereum.ContractAbi (Method, eventSignature)
import Network.Ethereum.Web3.Api (Filter(..), sha3)
import Network.Ethereum.Web3.Types (Web3)
import Data.HexString (toText, fromBytes)
import Data.Text.Encoding (encodeUtf8)
import Data.Monoid ((<>))
import Data.Text (Text)

type Address = Text

eventFilter :: Address -> Method -> Web3 Filter
eventFilter addr event = do
topic0 <- sha3 (hex $ eventSignature event)
return (Filter (Just addr) (Just [Just topic0, Nothing]) Nothing Nothing)
where hex = ("0x" <>) . toText . fromBytes . encodeUtf8
3 changes: 3 additions & 0 deletions web3.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,17 @@ source-repository head
library
hs-source-dirs: src
exposed-modules: Network.Ethereum.Web3
, Network.Ethereum.ContractAbi
other-modules: Network.Ethereum.Web3.Api
, Network.Ethereum.Web3.Util
, Network.Ethereum.Web3.Types
, Network.Ethereum.Web3.JsonRpc
build-depends: base >= 4.5 && <4.10
, mtl
, text
, aeson
, vector
, hexstring
, bytestring
, http-client
, transformers
Expand Down

0 comments on commit 5745999

Please sign in to comment.