{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE NoFieldSelectors #-}

module Haskoin.Network.Data
  ( Network (..),
  )
where

import Control.DeepSeq
import Data.Binary (Binary (..))
import Data.ByteString (ByteString)
import Data.Serialize (Serialize (..))
import Data.Text (Text)
import Data.Word (Word32, Word64, Word8)
import GHC.Generics (Generic)
import Haskoin.Block.Common

-- | Network definition.
data Network = Network
  { -- | lowercase alphanumeric and dashes
    Network -> String
name :: !String,
    -- | prefix for 'Base58' P2PKH addresses
    Network -> Word8
addrPrefix :: !Word8,
    -- | prefix for 'Base58' P2SH addresses
    Network -> Word8
scriptPrefix :: !Word8,
    -- | prefix for WIF private key
    Network -> Word8
secretPrefix :: !Word8,
    -- | prefix for extended public key
    Network -> Word32
xPubPrefix :: !Word32,
    -- | prefix for extended private key
    Network -> Word32
xPrvPrefix :: !Word32,
    -- | network magic
    Network -> Word32
magic :: !Word32,
    -- | genesis block header
    Network -> BlockHeader
genesisHeader :: !BlockHeader,
    -- | maximum block size in bytes
    Network -> Int
maxBlockSize :: !Int,
    -- | maximum amount of satoshi
    Network -> Word64
maxSatoshi :: !Word64,
    -- | user agent string
    Network -> ByteString
userAgent :: !ByteString,
    -- | default port for P2P connections
    Network -> Int
defaultPort :: !Int,
    -- | allow min difficulty blocks (testnet)
    Network -> Bool
minDiffBlocks :: !Bool,
    -- | do not retarget difficulty (regtest)
    Network -> Bool
powNoRetarget :: !Bool,
    -- | proof-of-work target higest possible value
    Network -> Integer
powLimit :: !Integer,
    -- | block at which BIP34 activates
    Network -> (Word32, BlockHash)
bip34Block :: !(BlockHeight, BlockHash),
    -- | block at which BIP65 activates
    Network -> Word32
bip65Height :: !BlockHeight,
    -- | block at which BIP66 activates
    Network -> Word32
bip66Height :: !BlockHeight,
    -- | time between difficulty retargets
    Network -> Word32
targetTimespan :: !Word32,
    -- | time between blocks
    Network -> Word32
targetSpacing :: !Word32,
    -- | checkpoints
    Network -> [(Word32, BlockHash)]
checkpoints :: ![(BlockHeight, BlockHash)],
    -- | BIP44 derivation path root
    Network -> Word32
bip44Coin :: !Word32,
    -- | peer-to-peer network seeds
    Network -> [String]
seeds :: ![String],
    -- | fork id for replay protection
    Network -> Maybe Word32
sigHashForkId :: !(Maybe Word32),
    -- | EDA start block height
    Network -> Maybe Word32
edaHeight :: !(Maybe Word32),
    -- | DAA start block height
    Network -> Maybe Word32
daaHeight :: !(Maybe Word32),
    -- | asert3-2d algorithm activation time
    -- TODO: Replace with block height after fork
    Network -> Maybe Word32
asertActivationTime :: !(Maybe Word32),
    -- | asert3-2d algorithm halflife (not used for non-BCH networks)
    Network -> Integer
asertHalfLife :: !Integer,
    -- | segregated witness active
    Network -> Bool
segWit :: !Bool,
    -- | 'CashAddr' prefix (for Bitcoin Cash)
    Network -> Maybe Text
cashAddrPrefix :: !(Maybe Text),
    -- | 'Bech32' prefix (for SegWit network)
    Network -> Maybe Text
bech32Prefix :: !(Maybe Text),
    -- | Replace-By-Fee (BIP-125)
    Network -> Bool
replaceByFee :: !Bool,
    -- | Subsidy halving interval
    Network -> Word32
halvingInterval :: !Word32
  }
  deriving (Network -> Network -> Bool
(Network -> Network -> Bool)
-> (Network -> Network -> Bool) -> Eq Network
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Network -> Network -> Bool
== :: Network -> Network -> Bool
$c/= :: Network -> Network -> Bool
/= :: Network -> Network -> Bool
Eq, Int -> Network -> ShowS
[Network] -> ShowS
Network -> String
(Int -> Network -> ShowS)
-> (Network -> String) -> ([Network] -> ShowS) -> Show Network
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Network -> ShowS
showsPrec :: Int -> Network -> ShowS
$cshow :: Network -> String
show :: Network -> String
$cshowList :: [Network] -> ShowS
showList :: [Network] -> ShowS
Show, ReadPrec [Network]
ReadPrec Network
Int -> ReadS Network
ReadS [Network]
(Int -> ReadS Network)
-> ReadS [Network]
-> ReadPrec Network
-> ReadPrec [Network]
-> Read Network
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Network
readsPrec :: Int -> ReadS Network
$creadList :: ReadS [Network]
readList :: ReadS [Network]
$creadPrec :: ReadPrec Network
readPrec :: ReadPrec Network
$creadListPrec :: ReadPrec [Network]
readListPrec :: ReadPrec [Network]
Read, (forall x. Network -> Rep Network x)
-> (forall x. Rep Network x -> Network) -> Generic Network
forall x. Rep Network x -> Network
forall x. Network -> Rep Network x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Network -> Rep Network x
from :: forall x. Network -> Rep Network x
$cto :: forall x. Rep Network x -> Network
to :: forall x. Rep Network x -> Network
Generic, Network -> ()
(Network -> ()) -> NFData Network
forall a. (a -> ()) -> NFData a
$crnf :: Network -> ()
rnf :: Network -> ()
NFData)