web3-0.4.0.0: src/Network/Ethereum/Web3/Encoding.hs
-- |
-- Module : Network.Ethereum.Web3.Encoding
-- Copyright : Alexander Krupenkin 2016
-- License : BSD3
--
-- Maintainer : mail@akru.me
-- Stability : experimental
-- Portability : portable
--
-- Web3 ABI encoding data support.
--
module Network.Ethereum.Web3.Encoding (ABIEncoding(..)) where
import Data.Text.Lazy.Builder (Builder, toLazyText, fromText, fromLazyText)
import Data.Attoparsec.Text.Lazy (parse, maybeResult, Parser)
import qualified Network.Ethereum.Web3.Address as A
import qualified Data.Attoparsec.Text as P
import qualified Data.Text.Lazy as LT
import qualified Data.Text as T
import Network.Ethereum.Web3.Encoding.Internal
import Network.Ethereum.Web3.Address (Address)
import Data.Monoid ((<>))
import Data.Text (Text)
-- | Contract ABI data codec
class ABIEncoding a where
toDataBuilder :: a -> Builder
fromDataParser :: Parser a
-- | Encode value into abi-encoding represenation
toData :: a -> Text
toData = LT.toStrict . toLazyText . toDataBuilder
-- | Parse encoded value
fromData :: Text -> Maybe a
fromData = maybeResult . parse fromDataParser . LT.fromStrict
instance ABIEncoding Bool where
toDataBuilder = int256HexBuilder . fromEnum
fromDataParser = fmap toEnum int256HexParser
instance ABIEncoding Integer where
toDataBuilder = int256HexBuilder
fromDataParser = int256HexParser
instance ABIEncoding Int where
toDataBuilder = int256HexBuilder
fromDataParser = int256HexParser
instance ABIEncoding Word where
toDataBuilder = int256HexBuilder
fromDataParser = int256HexParser
instance ABIEncoding Text where
toDataBuilder = textBuilder
fromDataParser = textParser
instance ABIEncoding Address where
toDataBuilder = alignR . fromText . A.toText
fromDataParser = either error id . A.fromText
<$> (P.take 24 *> P.take 40)
instance ABIEncoding a => ABIEncoding [a] where
toDataBuilder x = int256HexBuilder (length x)
<> foldMap toDataBuilder x
fromDataParser = do len <- int256HexParser
take len <$> P.many1 fromDataParser