diff --git a/src/Network/Ethereum/Unit.hs b/src/Network/Ethereum/Unit.hs
--- a/src/Network/Ethereum/Unit.hs
+++ b/src/Network/Ethereum/Unit.hs
@@ -45,9 +45,9 @@
 module Network.Ethereum.Unit (
     Unit(..)
   , Wei
-  , KWei
-  , MWei
-  , GWei
+  , Babbage
+  , Lovelace
+  , Shannon
   , Szabo
   , Finney
   , Ether
@@ -138,26 +138,26 @@
     divider = const 1
     name    = const "wei"
 
--- | KWei unit type
-type KWei = Value U1
+-- | Babbage unit type
+type Babbage = Value U1
 
 instance UnitSpec U1 where
     divider = const 1e3
-    name    = const "kwei"
+    name    = const "babbage"
 
--- | MWei unit type
-type MWei = Value U2
+-- | Lovelace unit type
+type Lovelace = Value U2
 
 instance UnitSpec U2 where
     divider = const 1e6
-    name    = const "mwei"
+    name    = const "lovelace"
 
--- | GWei unit type
-type GWei = Value U3
+-- | Shannon unit type
+type Shannon = Value U3
 
 instance UnitSpec U3 where
     divider = const 1e9
-    name    = const "gwei"
+    name    = const "shannon"
 
 -- | Szabo unit type
 type Szabo = Value U4
diff --git a/src/Network/Ethereum/Web3/Address.hs b/src/Network/Ethereum/Web3/Address.hs
--- a/src/Network/Ethereum/Web3/Address.hs
+++ b/src/Network/Ethereum/Web3/Address.hs
@@ -50,7 +50,7 @@
 fromText :: Text -> Either String Address
 fromText = fmap (Address . fst) . R.hexadecimal <=< check
   where check t | T.take 2 t == "0x" = check (T.drop 2 t)
-                | otherwise = if T.length t == 40 && T.all (flip elem valid) t
+                | otherwise = if T.length t == 40 && T.all (`elem` valid) t
                               then Right t
                               else Left "This is not seems like address."
         valid = ['0'..'9'] ++ ['a'..'f'] ++ ['A'..'F']
diff --git a/src/Network/Ethereum/Web3/Api.hs b/src/Network/Ethereum/Web3/Api.hs
--- a/src/Network/Ethereum/Web3/Api.hs
+++ b/src/Network/Ethereum/Web3/Api.hs
@@ -19,54 +19,66 @@
 
 -- | Returns current node version string.
 web3_clientVersion :: Provider a => Web3 a Text
+{-# INLINE web3_clientVersion #-}
 web3_clientVersion = remote "web3_clientVersion"
 
 -- | Returns Keccak-256 (not the standardized SHA3-256) of the given data.
 web3_sha3 :: Provider a => Text -> Web3 a Text
+{-# INLINE web3_sha3 #-}
 web3_sha3 = remote "web3_sha3"
 
 -- | Returns the balance of the account of given address.
 eth_getBalance :: Provider a => Address -> CallMode -> Web3 a Text
+{-# INLINE eth_getBalance #-}
 eth_getBalance = remote "eth_getBalance"
 
 -- | Creates a filter object, based on filter options, to notify when the
 -- state changes (logs). To check if the state has changed, call
 -- 'getFilterChanges'.
 eth_newFilter :: Provider a => Filter -> Web3 a FilterId
+{-# INLINE eth_newFilter #-}
 eth_newFilter = remote "eth_newFilter"
 
 -- | Polling method for a filter, which returns an array of logs which
 -- occurred since last poll.
 eth_getFilterChanges :: Provider a => FilterId -> Web3 a [Change]
+{-# INLINE eth_getFilterChanges #-}
 eth_getFilterChanges = remote "eth_getFilterChanges"
 
 -- | Uninstalls a filter with given id.
 -- Should always be called when watch is no longer needed.
 eth_uninstallFilter :: Provider a => FilterId -> Web3 a Bool
+{-# INLINE eth_uninstallFilter #-}
 eth_uninstallFilter = remote "eth_uninstallFilter"
 
 -- | Executes a new message call immediately without creating a
 -- transaction on the block chain.
 eth_call :: Provider a => Call -> CallMode -> Web3 a Text
+{-# INLINE eth_call #-}
 eth_call = remote "eth_call"
 
 -- | Creates new message call transaction or a contract creation,
 -- if the data field contains code.
 eth_sendTransaction :: Provider a => Call -> Web3 a Text
+{-# INLINE eth_sendTransaction #-}
 eth_sendTransaction = remote "eth_sendTransaction"
 
 -- | Returns a list of addresses owned by client.
 eth_accounts :: Provider a => Web3 a [Address]
+{-# INLINE eth_accounts #-}
 eth_accounts = remote "eth_accounts"
 
 eth_newBlockFilter :: Provider a => Web3 a Text
+{-# INLINE eth_newBlockFilter #-}
 eth_newBlockFilter = remote "eth_newBlockFilter"
 
 -- | Polling method for a block filter, which returns an array of block hashes
 -- occurred since last poll.
 eth_getBlockFilterChanges :: Provider a => Text -> Web3 a [Text]
+{-# INLINE eth_getBlockFilterChanges #-}
 eth_getBlockFilterChanges = remote "eth_getFilterChanges"
 
 -- | Returns information about a block by hash.
 eth_getBlockByHash :: Provider a => Text -> Web3 a Block
+{-# INLINE eth_getBlockByHash #-}
 eth_getBlockByHash = flip (remote "eth_getBlockByHash") True
diff --git a/src/Network/Ethereum/Web3/Contract.hs b/src/Network/Ethereum/Web3/Contract.hs
--- a/src/Network/Ethereum/Web3/Contract.hs
+++ b/src/Network/Ethereum/Web3/Contract.hs
@@ -36,11 +36,12 @@
 import qualified Data.Text.Lazy.Builder.Int as B
 import qualified Data.Text.Lazy.Builder     as B
 import Control.Concurrent (ThreadId, threadDelay)
-import Data.Maybe (catMaybes, listToMaybe)
+import Data.Maybe (mapMaybe, listToMaybe)
 import Control.Monad.IO.Class (liftIO)
 import Control.Exception (throwIO)
 import Data.Text.Lazy (toStrict)
 import qualified Data.Text as T
+import Control.Monad (when)
 import Data.Monoid ((<>))
 
 import Network.Ethereum.Web3.Provider
@@ -66,7 +67,7 @@
     event :: Provider p
           => Address
           -- ^ Contract address
-          -> (a -> IO EventAction)
+          -> (a -> Web3 p EventAction)
           -- ^ 'Event' handler
           -> Web3 p ThreadId
           -- ^ 'Web3' wrapped event handler spawn ident
@@ -74,7 +75,7 @@
 
 _event :: (Provider p, Event a)
        => Address
-       -> (a -> IO EventAction)
+       -> (a -> Web3 p EventAction)
        -> Web3 p ThreadId
 _event a f = do
     fid <- let ftyp = snd $ let x = undefined :: Event a => a
@@ -83,11 +84,9 @@
 
     forkWeb3 $
         let loop = do liftIO (threadDelay 1000000)
-                      changes <- fmap parseChange <$> eth_getFilterChanges fid
-                      acts <- mapM (liftIO . f) (catMaybes changes)
-                      if any (== TerminateEvent) acts
-                      then return ()
-                      else loop
+                      changes <- eth_getFilterChanges fid
+                      acts <- mapM f (mapMaybe parseChange changes)
+                      when (TerminateEvent `notElem` acts) loop
         in do loop
               eth_uninstallFilter fid
               return ()
diff --git a/src/Network/Ethereum/Web3/Encoding.hs b/src/Network/Ethereum/Web3/Encoding.hs
--- a/src/Network/Ethereum/Web3/Encoding.hs
+++ b/src/Network/Ethereum/Web3/Encoding.hs
@@ -29,10 +29,12 @@
 
     -- | Encode value into abi-encoding represenation
     toData :: a -> Text
+    {-# INLINE toData #-}
     toData = LT.toStrict . toLazyText . toDataBuilder
 
     -- | Parse encoded value
     fromData :: Text -> Maybe a
+    {-# INLINE fromData #-}
     fromData = maybeResult . parse fromDataParser . LT.fromStrict
 
 instance ABIEncoding Bool where
diff --git a/src/Network/Ethereum/Web3/Encoding/Bytes.hs b/src/Network/Ethereum/Web3/Encoding/Bytes.hs
--- a/src/Network/Ethereum/Web3/Encoding/Bytes.hs
+++ b/src/Network/Ethereum/Web3/Encoding/Bytes.hs
@@ -35,7 +35,8 @@
   deriving (Eq, Ord)
 
 update :: BytesN a -> Bytes -> BytesN a
-update _ a = BytesN a
+{-# INLINE update #-}
+update _ = BytesN
 
 instance KnownNat n => EncodingType (BytesN n) where
     typeName  = const "bytes[N]"
@@ -53,10 +54,12 @@
     show = show . BS16.encode . BA.convert . unBytesN
 
 bytesBuilder :: Bytes -> B.Builder
+{-# INLINE bytesBuilder #-}
 bytesBuilder = alignL . B.fromText . T.decodeUtf8
              . BS16.encode . BA.convert
 
 bytesDecode :: T.Text -> Bytes
+{-# INLINE bytesDecode #-}
 bytesDecode = BA.convert . fst . BS16.decode . T.encodeUtf8
 
 -- | Dynamic length byte array
diff --git a/src/Network/Ethereum/Web3/Encoding/Internal.hs b/src/Network/Ethereum/Web3/Encoding/Internal.hs
--- a/src/Network/Ethereum/Web3/Encoding/Internal.hs
+++ b/src/Network/Ethereum/Web3/Encoding/Internal.hs
@@ -74,8 +74,9 @@
 alignR = snd . align
 
 int256HexBuilder :: Integral a => a -> Builder
-int256HexBuilder x | x < 0 = int256HexBuilder (2^256 + fromIntegral x)
-                   | otherwise = alignR (B.hexadecimal x)
+int256HexBuilder x
+  | x < 0 = int256HexBuilder (2^256 + fromIntegral x)
+  | otherwise = alignR (B.hexadecimal x)
 
 int256HexParser :: (Bits a, Integral a) => Parser a
 int256HexParser = do
diff --git a/src/Network/Ethereum/Web3/Encoding/Tuple.hs b/src/Network/Ethereum/Web3/Encoding/Tuple.hs
--- a/src/Network/Ethereum/Web3/Encoding/Tuple.hs
+++ b/src/Network/Ethereum/Web3/Encoding/Tuple.hs
@@ -20,7 +20,7 @@
 newtype Singleton a = Singleton { unSingleton :: a }
 
 instance (EncodingType a, ABIEncoding a) => ABIEncoding (Singleton a) where
-    toDataBuilder = _serialize (1, []) . unSingleton
+    toDataBuilder  = _serialize (1, []) . unSingleton
     fromDataParser = Singleton <$> (withParser sParser >>= dParser)
       where withParser f = f undefined
 
diff --git a/src/Network/Ethereum/Web3/Encoding/TupleTH.hs b/src/Network/Ethereum/Web3/Encoding/TupleTH.hs
--- a/src/Network/Ethereum/Web3/Encoding/TupleTH.hs
+++ b/src/Network/Ethereum/Web3/Encoding/TupleTH.hs
@@ -24,6 +24,7 @@
 import qualified Data.Text.Lazy       as LT
 import Network.Ethereum.Web3.Encoding
 import Data.Attoparsec.Text (Parser)
+import Control.Monad (replicateM)
 import Language.Haskell.TH
 
 -- | Argument offset calculator
@@ -68,10 +69,9 @@
 -- | Generator for tupleP{N} function signature
 mkTuplePType :: Int -> DecQ
 mkTuplePType n = do
-    vars <- sequence (replicate n $ newName "t")
-    let varsT      = fmap varT vars
-        contextT   = fmap (appT [t|ABIEncoding|]) varsT
-                  ++ fmap (appT [t|EncodingType|]) varsT
+    varsT <- fmap varT <$> replicateM n (newName "t")
+    let contextT   = concat
+            [[[t|ABIEncoding $x|], [t|EncodingType $x|]] | x <- varsT]
         varsTupleT = foldl appT (tupleT n) varsT
     sigD (mkName $ "tupleP" ++ show n)
          (forallT [] (cxt contextT) [t|Parser $(varsTupleT)|])
@@ -79,7 +79,7 @@
 -- | Generator for tupleP{N} function
 mkTupleP :: Int -> DecQ
 mkTupleP n = do
-    vars <- sequence (replicate n $ newName "t")
+    vars <- replicateM n (newName "t")
     funD (mkName $ "tupleP" ++ show n) $ pure $
         clause []
                (normalB [|$(varE withPN) $(varE staticPN) >>= $(varE dynamicPN)|])
@@ -127,14 +127,14 @@
 eTupleE 13 = [|(,,,,,,,,,,,,)|]
 eTupleE 14 = [|(,,,,,,,,,,,,,)|]
 eTupleE 15 = [|(,,,,,,,,,,,,,,)|]
-eTupleE _ = error "Unsupported empty tuple"
+eTupleE _ = error "Unsupported tuple size"
 
 mkEncodingInst :: Int -> DecQ
 mkEncodingInst n = do
-    vars <- sequence (replicate n $ newName "t")
+    vars <- replicateM n (newName "t")
     let varsT      = fmap varT vars
-        contextT   = fmap (appT [t|ABIEncoding|]) varsT
-                  ++ fmap (appT [t|EncodingType|]) varsT
+        contextT   = concat
+            [[[t|ABIEncoding $x|], [t|EncodingType $x|]] | x <- varsT]
         varsTupleT = foldl appT (tupleT n) varsT
     instanceD (cxt contextT) (appT [t|ABIEncoding|] varsTupleT)
       [ funD (mkName "toDataBuilder") [
@@ -146,7 +146,7 @@
 
 -- | Make a ABIEncoding tuple instance with given count of arguments
 mkTupleInst :: Int -> Q [Dec]
-mkTupleInst n = sequence $
+mkTupleInst n = sequence
   [ mkTuplePType n
   , mkTupleP n
   , mkEncodingInst n ]
diff --git a/src/Network/Ethereum/Web3/JsonRpc.hs b/src/Network/Ethereum/Web3/JsonRpc.hs
--- a/src/Network/Ethereum/Web3/JsonRpc.hs
+++ b/src/Network/Ethereum/Web3/JsonRpc.hs
@@ -73,19 +73,19 @@
     remote_ f = (\u -> Web3 (decodeResponse =<< f u [])) =<< rpcUri
 
 -- | JSON-RPC request.
-data Request = Request { rqMethod :: Text
-                       , rqId     :: Int
-                       , rqParams :: Value }
+data Request = Request { rqMethod :: !Text
+                       , rqId     :: !Int
+                       , rqParams :: !Value }
 
 instance ToJSON Request where
-    toJSON rq = object $ [ "jsonrpc" .= String "2.0"
-                         , "method"  .= rqMethod rq
-                         , "params"  .= rqParams rq
-                         , "id"      .= rqId rq ]
+    toJSON rq = object [ "jsonrpc" .= String "2.0"
+                       , "method"  .= rqMethod rq
+                       , "params"  .= rqParams rq
+                       , "id"      .= rqId rq ]
 
 -- | JSON-RPC response.
 data Response = Response
-  { rsResult :: Either RpcError Value
+  { rsResult :: !(Either RpcError Value)
   } deriving (Show)
 
 instance FromJSON Response where
diff --git a/src/Network/Ethereum/Web3/TH.hs b/src/Network/Ethereum/Web3/TH.hs
--- a/src/Network/Ethereum/Web3/TH.hs
+++ b/src/Network/Ethereum/Web3/TH.hs
@@ -18,8 +18,8 @@
 --
 -- main = do
 --     runWeb3 $ event "0x..." $
---        \(Action2 n x) -> do print n
---                             print x
+--        \(Action2 n x) -> liftIO $ do print n
+--                                      print x
 --     wait
 --   where wait = threadDelay 1000000 >> wait
 -- @
@@ -51,6 +51,8 @@
 import Network.Ethereum.Web3.Types
 import Network.Ethereum.Unit
 
+import Control.Monad (replicateM)
+
 import Data.Text (Text, isPrefixOf)
 import Data.List (groupBy, sortBy)
 import Data.Monoid (mconcat, (<>))
@@ -76,8 +78,8 @@
 
 -- | Instance declaration with empty context
 instanceD' :: Name -> TypeQ -> [DecQ] -> DecQ
-instanceD' name insType insDecs =
-    instanceD (cxt []) (appT insType (conT name)) insDecs
+instanceD' name insType =
+    instanceD (cxt []) (appT insType (conT name))
 
 -- | Simple data type declaration with one constructor
 dataD' :: Name -> ConQ -> [Name] -> DecQ
@@ -131,7 +133,7 @@
     , funD' (mkName "fromDataParser") [] fromDataP ]
   where
     indexed = map eveArgIndexed args
-    newVars = sequence $ replicate (length args) (newName "t")
+    newVars = replicateM (length args) (newName "t")
 
     parseArg v = bindS (varP v) [|fromDataParser|]
 
@@ -154,7 +156,7 @@
     , funD' (mkName "fromDataParser") []
         [|error "Function from data conversion isn't available!"|] ]
   where
-    newVars = sequence $ replicate paramLen (newName "t")
+    newVars = replicateM paramLen (newName "t")
     sVar    = mkName "a"
     funDtoDataB
         | paramLen == 0 = funD' (mkName "toDataBuilder") [conP funName []] [|ident|]
@@ -189,11 +191,11 @@
            -- ^ Results
            -> Q [Dec]
 funWrapper c name dname args result = do
-    a : b : vars <- sequence $ replicate (length args + 2) (newName "t")
-    let params = appsE $ (conE dname) : fmap varE vars
+    a : b : vars <- replicateM (length args + 2) (newName "t")
+    let params = appsE $ conE dname : fmap varE vars
 
-    sequence $ case c of
-        True ->
+    sequence $ if c
+        then
           [ sigD name $ [t|Provider $p =>
                             $(arrowing $ [t|Address|] : inputT ++ [outputT])
                           |]
@@ -203,7 +205,7 @@
                 _        -> [|call $(varE a) Latest $(params)|]
           ]
 
-        False ->
+        else
           [ sigD name $ [t|(Provider $p, Unit $(varT b)) =>
                             $(arrowing $ [t|Address|] : varT b : inputT ++ [[t|Web3 $p TxHash|]])
                           |]
@@ -222,7 +224,7 @@
 
 -- | Event declarations maker
 mkEvent :: Declaration -> Q [Dec]
-mkEvent eve@(DEvent name inputs _) = sequence $
+mkEvent eve@(DEvent name inputs _) = sequence
     [ dataD' eventName eventFields derivingD
     , instanceD' eventName encodingT (eventEncodigD eventName inputs)
     , instanceD' eventName eventT    (eventFilterD (T.unpack $ eventId eve))
@@ -265,8 +267,8 @@
 
 -- | Declaration parser
 mkDecl :: Declaration -> Q [Dec]
-mkDecl x@(DFunction{}) = mkFun x
-mkDecl x@(DEvent{})    = mkEvent x
+mkDecl x@DFunction{} = mkFun x
+mkDecl x@DEvent{}    = mkEvent x
 mkDecl _ = return []
 
 -- | ABI to declarations converter
diff --git a/src/Network/Ethereum/Web3/Types.hs b/src/Network/Ethereum/Web3/Types.hs
--- a/src/Network/Ethereum/Web3/Types.hs
+++ b/src/Network/Ethereum/Web3/Types.hs
@@ -33,11 +33,11 @@
 
 -- | Some peace of error response
 data Web3Error
-  = JsonRpcFail RpcError
+  = JsonRpcFail !RpcError
   -- ^ JSON-RPC communication error
-  | ParserFail  String
+  | ParserFail  !String
   -- ^ Error in parser state
-  | UserFail    String
+  | UserFail    !String
   -- ^ Common head for user errors
   deriving (Typeable, Show, Eq)
 
@@ -45,9 +45,9 @@
 
 -- | JSON-RPC error message
 data RpcError = RpcError
-  { errCode     :: Int
-  , errMessage  :: Text
-  , errData     :: Maybe Value
+  { errCode     :: !Int
+  , errMessage  :: !Text
+  , errData     :: !(Maybe Value)
   } deriving (Show, Eq)
 
 $(deriveJSON (defaultOptions
@@ -55,10 +55,10 @@
 
 -- | Low-level event filter data structure
 data Filter = Filter
-  { filterAddress   :: Maybe Address
-  , filterTopics    :: Maybe [Maybe Text]
-  , filterFromBlock :: Maybe Text
-  , filterToBlock   :: Maybe Text
+  { filterAddress   :: !(Maybe Address)
+  , filterTopics    :: !(Maybe [Maybe Text])
+  , filterFromBlock :: !(Maybe Text)
+  , filterToBlock   :: !(Maybe Text)
   } deriving Show
 
 $(deriveJSON (defaultOptions
@@ -82,14 +82,14 @@
 
 -- | Changes pulled by low-level call 'eth_getFilterChanges'
 data Change = Change
-  { changeLogIndex         :: Text
-  , changeTransactionIndex :: Text
-  , changeTransactionHash  :: Text
-  , changeBlockHash        :: Text
-  , changeBlockNumber      :: Text
-  , changeAddress          :: Address
-  , changeData             :: Text
-  , changeTopics           :: [Text]
+  { changeLogIndex         :: !Text
+  , changeTransactionIndex :: !Text
+  , changeTransactionHash  :: !Text
+  , changeBlockHash        :: !Text
+  , changeBlockNumber      :: !Text
+  , changeAddress          :: !Address
+  , changeData             :: !Text
+  , changeTopics           :: ![Text]
   } deriving Show
 
 $(deriveJSON (defaultOptions
@@ -97,12 +97,12 @@
 
 -- | The contract call params
 data Call = Call
-  { callFrom    :: Maybe Address
-  , callTo      :: Address
-  , callGas     :: Maybe Text
-  , callGasPrice:: Maybe Text
-  , callValue   :: Maybe Text
-  , callData    :: Maybe Text
+  { callFrom    :: !(Maybe Address)
+  , callTo      :: !Address
+  , callGas     :: !(Maybe Text)
+  , callGasPrice:: !(Maybe Text)
+  , callValue   :: !(Maybe Text)
+  , callData    :: !(Maybe Text)
   } deriving Show
 
 $(deriveJSON (defaultOptions
@@ -121,27 +121,27 @@
 
 -- | Transaction information
 data Transaction = Transaction
-  { txHash              :: TxHash
+  { txHash              :: !TxHash
   -- ^ DATA, 32 Bytes - hash of the transaction.
-  , txNonce             :: Text
+  , txNonce             :: !Text
   -- ^ QUANTITY - the number of transactions made by the sender prior to this one.
-  , txBlockHash         :: Text
+  , txBlockHash         :: !Text
   -- ^ DATA, 32 Bytes - hash of the block where this transaction was in. null when its pending.
-  , txBlockNumber       :: Text
+  , txBlockNumber       :: !Text
   -- ^ QUANTITY - block number where this transaction was in. null when its pending.
-  , txTransactionIndex  :: Text
+  , txTransactionIndex  :: !Text
   -- ^ QUANTITY - integer of the transactions index position in the block. null when its pending.
-  , txFrom              :: Address
+  , txFrom              :: !Address
   -- ^ DATA, 20 Bytes - address of the sender.
-  , txTo                :: Maybe Address
+  , txTo                :: !(Maybe Address)
   -- ^ DATA, 20 Bytes - address of the receiver. null when its a contract creation transaction.
-  , txValue             :: Text
+  , txValue             :: !Text
   -- ^ QUANTITY - value transferred in Wei.
-  , txGasPrice          :: Text
+  , txGasPrice          :: !Text
   -- ^ QUANTITY - gas price provided by the sender in Wei.
-  , txGas               :: Text
+  , txGas               :: !Text
   -- ^ QUANTITY - gas provided by the sender.
-  , txInput             :: Text
+  , txInput             :: !Text
   -- ^ DATA - the data send along with the transaction.
   } deriving Show
 
@@ -150,43 +150,43 @@
 
 -- | Block information
 data Block = Block
-  { blockNumber         :: Text
+  { blockNumber           :: !Text
   -- ^ QUANTITY - the block number. null when its pending block.
-  , blockHash           :: Text
+  , blockHash             :: !Text
   -- ^ DATA, 32 Bytes - hash of the block. null when its pending block.
-  , blockParentHash     :: Text
+  , blockParentHash       :: !Text
   -- ^ DATA, 32 Bytes - hash of the parent block.
-  , blockNonce          :: Maybe Text
+  , blockNonce            :: !(Maybe Text)
   -- ^ DATA, 8 Bytes - hash of the generated proof-of-work. null when its pending block.
-  , blockSha3Uncles     :: Text
+  , blockSha3Uncles       :: !Text
   -- ^ DATA, 32 Bytes - SHA3 of the uncles data in the block.
-  , blockLogsBloom      :: Text
+  , blockLogsBloom        :: !Text
   -- ^ DATA, 256 Bytes - the bloom filter for the logs of the block. null when its pending block.
-  , blockTransactionsRoot :: Text
+  , blockTransactionsRoot :: !Text
   -- ^ DATA, 32 Bytes - the root of the transaction trie of the block.
-  , blockStateRoot      :: Text
+  , blockStateRoot        :: !Text
   -- ^ DATA, 32 Bytes - the root of the final state trie of the block.
-  , blockReceiptRoot    :: Maybe Text
+  , blockReceiptRoot      :: !(Maybe Text)
   -- ^ DATA, 32 Bytes - the root of the receipts trie of the block.
-  , blockMiner          :: Address
+  , blockMiner            :: !Address
   -- ^ DATA, 20 Bytes - the address of the beneficiary to whom the mining rewards were given.
-  , blockDifficulty     :: Text
+  , blockDifficulty       :: !Text
   -- ^ QUANTITY - integer of the difficulty for this block.
-  , blockTotalDifficulty :: Text
+  , blockTotalDifficulty  :: !Text
   -- ^ QUANTITY - integer of the total difficulty of the chain until this block.
-  , blockExtraData      :: Text
+  , blockExtraData        :: !Text
   -- ^ DATA - the "extra data" field of this block.
-  , blockSize           :: Text
+  , blockSize             :: !Text
   -- ^ QUANTITY - integer the size of this block in bytes.
-  , blockGasLimit       :: Text
+  , blockGasLimit         :: !Text
   -- ^ QUANTITY - the maximum gas allowed in this block.
-  , blockGasUsed        :: Text
+  , blockGasUsed          :: !Text
   -- ^ QUANTITY - the total used gas by all transactions in this block.
-  , blockTimestamp      :: Text
+  , blockTimestamp        :: !Text
   -- ^ QUANTITY - the unix timestamp for when the block was collated.
-  , blockTransactions   :: [Transaction]
+  , blockTransactions     :: ![Transaction]
   -- ^ Array of transaction objects.
-  , blockUncles         :: [Text]
+  , blockUncles           :: ![Text]
   -- ^ Array - Array of uncle hashes.
   } deriving Show
 
diff --git a/web3.cabal b/web3.cabal
--- a/web3.cabal
+++ b/web3.cabal
@@ -1,5 +1,5 @@
 name: web3
-version: 0.5.2.1
+version: 0.5.3.0
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -43,7 +43,7 @@
         http-client >=0.4.31.2 && <0.5,
         attoparsec >=0.13.1.0 && <0.14,
         bytestring >=0.10.8.1 && <0.11,
-        cryptonite ==0.19.*,
+        cryptonite ==0.21.*,
         vector >=0.11.0.0 && <0.12,
         memory ==0.13.*,
         aeson >=0.11.2.1 && <0.12,
@@ -64,7 +64,7 @@
         base >=4.9.0.0 && <4.10,
         memory ==0.13.*,
         text >=1.2.2.1 && <1.3,
-        web3 >=0.5.2.1 && <0.6
+        web3 >=0.5.3.0 && <0.6
     default-language: Haskell2010
     default-extensions: OverloadedStrings
     hs-source-dirs: test
