-- |
-- Module      :  Network.Ethereum.Account
-- Copyright   :  Alexander Krupenkin 2018
-- License     :  BSD3
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  unportable
--
-- In Etereun there are two types of accounts:
-- * Externally owned account (EOAs): an account controlled by a private key, and if you own the private key associated with the EOA you have the ability to send ether and messages from it.
-- * Contract: an account that has its own code, and is controlled by code.
--
-- This module exports different kinds of EOAs: default, node managed and local. Node managed accounts
-- use 'Personal' JSON-RPC API for signing transactions. Local account sign transaction locally and
-- use 'sendRawTransaction' method to export transaction to Ethereum network.
--

module Network.Ethereum.Account
    (
    -- * The @Account@ type
      Account(..)

    -- * Default node account
    , DefaultAccount

    -- * Unlockable node account
    , PersonalAccount
    , Personal(..)

    -- * Local key account
    , PrivateKeyAccount
    , PrivateKey(..)

    -- * Transaction paramitrization function and lenses
    , withParam
    , to
    , value
    , gasLimit
    , gasPrice
    , block
    , account

    ) where

import           Network.Ethereum.Account.Class      (Account (..))
import           Network.Ethereum.Account.Default    (DefaultAccount)
import           Network.Ethereum.Account.Internal   (account, block, gasLimit,
                                                      gasPrice, to, value,
                                                      withParam)
import           Network.Ethereum.Account.Personal   (Personal (..),
                                                      PersonalAccount)
import           Network.Ethereum.Account.PrivateKey (PrivateKey (..),
                                                      PrivateKeyAccount)