{-# LANGUAGE CPP               #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-|
Module      : Haskoin.Constants
Copyright   : No rights reserved
License     : MIT
Maintainer  : jprupp@protonmail.ch
Stability   : experimental
Portability : POSIX

Network constants for various networks, including Bitcoin SegWit (BTC), Bitcoin
Cash (BCH), and corresponding public test and private regression test networks.
-}
module Haskoin.Constants
    ( -- * Constants
      Network(..)
    , btc
    , btcTest
    , btcRegTest
    , bch
    , bchTest
    , bchRegTest
    , allNets
    , netByName
    , netByIdent
    ) where

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

-- | Version of Haskoin Core package.
versionString :: IsString a => a
#ifdef CURRENT_PACKAGE_VERSION
versionString :: a
versionString = CURRENT_PACKAGE_VERSION
#else
versionString = "Unavailable"
#endif

-- | Constants for network.
data Network = Network
    { -- | lowercase alphanumeric and dashes
      Network -> String
getNetworkName              :: !String
      -- | network Haskell identifier
    , Network -> String
getNetworkIdent             :: !String
      -- | prefix for 'Base58' P2PKH addresses
    , Network -> Word8
getAddrPrefix               :: !Word8
      -- | prefix for 'Base58' P2SH addresses
    , Network -> Word8
getScriptPrefix             :: !Word8
      -- | prefix for WIF private key
    , Network -> Word8
getSecretPrefix             :: !Word8
      -- | prefix for extended public key
    , Network -> Word32
getExtPubKeyPrefix          :: !Word32
      -- | prefix for extended private key
    , Network -> Word32
getExtSecretPrefix          :: !Word32
      -- | network magic
    , Network -> Word32
getNetworkMagic             :: !Word32
      -- | genesis block header
    , Network -> BlockHeader
getGenesisHeader            :: !BlockHeader
      -- | maximum block size in bytes
    , Network -> Int
getMaxBlockSize             :: !Int
      -- | maximum amount of satoshi
    , Network -> Word64
getMaxSatoshi               :: !Word64
      -- | user agent string
    , Network -> ByteString
getHaskoinUserAgent         :: !ByteString
      -- | default port for P2P connections
    , Network -> Int
getDefaultPort              :: !Int
      -- | allow min difficulty blocks (testnet)
    , Network -> Bool
getAllowMinDifficultyBlocks :: !Bool
      -- | do not retarget difficulty (regtest)
    , Network -> Bool
getPowNoRetargetting        :: !Bool
      -- | proof-of-work target higest possible value
    , Network -> Integer
getPowLimit                 :: !Integer
      -- | block at which BIP34 activates
    , Network -> (Word32, BlockHash)
getBip34Block               :: !(BlockHeight, BlockHash)
      -- | block at which BIP65 activates
    , Network -> Word32
getBip65Height              :: !BlockHeight
      -- | block at which BIP66 activates
    , Network -> Word32
getBip66Height              :: !BlockHeight
      -- | time between difficulty retargets
    , Network -> Word32
getTargetTimespan           :: !Word32
      -- | time between blocks
    , Network -> Word32
getTargetSpacing            :: !Word32
      -- | checkpoints
    , Network -> [(Word32, BlockHash)]
getCheckpoints              :: ![(BlockHeight, BlockHash)]
      -- | BIP44 derivation path root
    , Network -> Word32
getBip44Coin                :: !Word32
      -- | peer-to-peer network seeds
    , Network -> [String]
getSeeds                    :: ![String]
      -- | fork id for replay protection
    , Network -> Maybe Word32
getSigHashForkId            :: !(Maybe Word32)
      -- | EDA start block height
    , Network -> Maybe Word32
getEdaBlockHeight           :: !(Maybe Word32)
      -- | DAA start block height
    , Network -> Maybe Word32
getDaaBlockHeight           :: !(Maybe Word32)
      -- | asert3-2d algorithm activation time
      -- TODO: Replace with block height after fork
    , Network -> Maybe Word32
getAsertActivationTime      :: !(Maybe Word32)
      -- | asert3-2d algorithm halflife (not used for non-BCH networks)
    , Network -> Integer
getAsertHalfLife            :: !Integer
      -- | segregated witness active
    , Network -> Bool
getSegWit                   :: !Bool
      -- | 'CashAddr' prefix (for Bitcoin Cash)
    , Network -> Maybe Text
getCashAddrPrefix           :: !(Maybe Text)
      -- | 'Bech32' prefix (for SegWit network)
    , Network -> Maybe Text
getBech32Prefix             :: !(Maybe Text)
      -- | Replace-By-Fee (BIP-125)
    , Network -> Bool
getReplaceByFee             :: !Bool
      -- | Subsidy halving interval
    , Network -> Word32
getHalvingInterval          :: !Word32
    } deriving (Network -> Network -> Bool
(Network -> Network -> Bool)
-> (Network -> Network -> Bool) -> Eq Network
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Network -> Network -> Bool
$c/= :: Network -> Network -> Bool
== :: Network -> Network -> Bool
$c== :: Network -> Network -> Bool
Eq, (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
$cto :: forall x. Rep Network x -> Network
$cfrom :: forall x. Network -> Rep Network x
Generic, Network -> ()
(Network -> ()) -> NFData Network
forall a. (a -> ()) -> NFData a
rnf :: Network -> ()
$crnf :: Network -> ()
NFData)

instance Serialize Network where
    put :: Putter Network
put net :: Network
net =
        Putter Word32
putWord32be Putter Word32 -> Putter Word32
forall a b. (a -> b) -> a -> b
$ Network -> Word32
getNetworkMagic Network
net
    get :: Get Network
get = do
        Word32
magic <- Get Word32
getWord32be
        case (Network -> Bool) -> [Network] -> Maybe Network
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
magic) (Word32 -> Bool) -> (Network -> Word32) -> Network -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Network -> Word32
getNetworkMagic) [Network]
allNets of
            Nothing  -> String -> Get Network
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Get Network) -> String -> Get Network
forall a b. (a -> b) -> a -> b
$ "Network magic unknown: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Word32 -> String
forall a. Show a => a -> String
show Word32
magic
            Just net :: Network
net -> Network -> Get Network
forall (m :: * -> *) a. Monad m => a -> m a
return Network
net

instance Show Network where
    show :: Network -> String
show = Network -> String
getNetworkIdent

instance Read Network where
    readPrec :: ReadPrec Network
readPrec = do
        Ident str :: String
str <- ReadPrec Lexeme
lexP
        ReadPrec Network
-> (Network -> ReadPrec Network)
-> Maybe Network
-> ReadPrec Network
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ReadPrec Network
forall a. ReadPrec a
pfail Network -> ReadPrec Network
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Maybe Network
netByIdent String
str)

instance IsString Network where
    fromString :: String -> Network
fromString = Network -> Maybe Network -> Network
forall a. a -> Maybe a -> a
fromMaybe (String -> Network
forall a. HasCallStack => String -> a
error "Network name invalid") (Maybe Network -> Network)
-> (String -> Maybe Network) -> String -> Network
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe Network
netByName

-- | Query known networks by name.
netByName :: String -> Maybe Network
netByName :: String -> Maybe Network
netByName str :: String
str = (Network -> Bool) -> [Network] -> Maybe Network
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
str) (String -> Bool) -> (Network -> String) -> Network -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Network -> String
getNetworkName) [Network]
allNets

-- | Query known networks by Haskell identifier.
netByIdent :: String -> Maybe Network
netByIdent :: String -> Maybe Network
netByIdent str :: String
str = (Network -> Bool) -> [Network] -> Maybe Network
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
str) (String -> Bool) -> (Network -> String) -> Network -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Network -> String
getNetworkIdent) [Network]
allNets

-- | Bitcoin SegWit network. Symbol: BTC.
btc :: Network
btc :: Network
btc =
    $WNetwork :: String
-> String
-> Word8
-> Word8
-> Word8
-> Word32
-> Word32
-> Word32
-> BlockHeader
-> Int
-> Word64
-> ByteString
-> Int
-> Bool
-> Bool
-> Integer
-> (Word32, BlockHash)
-> Word32
-> Word32
-> Word32
-> Word32
-> [(Word32, BlockHash)]
-> Word32
-> [String]
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Integer
-> Bool
-> Maybe Text
-> Maybe Text
-> Bool
-> Word32
-> Network
Network
    { getNetworkName :: String
getNetworkName = "btc"
    , getNetworkIdent :: String
getNetworkIdent = "btc"
    , getAddrPrefix :: Word8
getAddrPrefix = 0
    , getScriptPrefix :: Word8
getScriptPrefix = 5
    , getSecretPrefix :: Word8
getSecretPrefix = 128
    , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = 0x0488b21e
    , getExtSecretPrefix :: Word32
getExtSecretPrefix = 0x0488ade4
    , getNetworkMagic :: Word32
getNetworkMagic = 0xf9beb4d9
    , getGenesisHeader :: BlockHeader
getGenesisHeader =
          Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
              0x01
              "0000000000000000000000000000000000000000000000000000000000000000"
              "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
              1231006505
              0x1d00ffff
              2083236893
            -- Hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
    , getMaxBlockSize :: Int
getMaxBlockSize = 1000000
    , getMaxSatoshi :: Word64
getMaxSatoshi = 2100000000000000
    , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent =
          "/haskoin-btc:" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
forall a. IsString a => a
versionString ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> "/"
    , getDefaultPort :: Int
getDefaultPort = 8333
    , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
False
    , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
    , getPowLimit :: Integer
getPowLimit =
          0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    , getBip34Block :: (Word32, BlockHash)
getBip34Block =
          ( 227931
          , "000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8")
    , getBip65Height :: Word32
getBip65Height = 388381
    , getBip66Height :: Word32
getBip66Height = 363725
    , getTargetTimespan :: Word32
getTargetTimespan = 14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getTargetSpacing :: Word32
getTargetSpacing = 10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
          [ ( 11111
            , "0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")
          , ( 33333
            , "000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")
          , ( 74000
            , "0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")
          , ( 105000
            , "00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")
          , ( 134444
            , "00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")
          , ( 168000
            , "000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")
          , ( 193000
            , "000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")
          , ( 210000
            , "000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")
          , ( 216116
            , "00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")
          , ( 225430
            , "00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")
          , ( 250000
            , "000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")
          , ( 279000
            , "0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")
          , ( 295000
            , "00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")
          ]
    , getSeeds :: [String]
getSeeds =
          [ "seed.bitcoin.sipa.be" -- Pieter Wuille
          , "dnsseed.bluematt.me" -- Matt Corallo
          , "dnsseed.bitcoin.dashjr.org" -- Luke Dashjr
          , "seed.bitcoinstats.com" -- Chris Decker
          , "seed.bitcoin.jonasschnelli.ch" -- Jonas Schnelli
          , "seed.btc.petertodd.org" -- Peter Todd
          , "seed.bitcoin.sprovoost.nl" -- Sjors Provoost
          , "dnsseed.emzy.de" -- Stephan Oeste
          , "seed.bitcoin.wiz.biz" -- Jason Maurice
          ]
    , getBip44Coin :: Word32
getBip44Coin = 0
    , getSigHashForkId :: Maybe Word32
getSigHashForkId = Maybe Word32
forall a. Maybe a
Nothing
    , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Maybe Word32
forall a. Maybe a
Nothing
    , getAsertHalfLife :: Integer
getAsertHalfLife = 0
    , getSegWit :: Bool
getSegWit = Bool
True
    , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Maybe Text
forall a. Maybe a
Nothing
    , getBech32Prefix :: Maybe Text
getBech32Prefix = Text -> Maybe Text
forall a. a -> Maybe a
Just "bc"
    , getReplaceByFee :: Bool
getReplaceByFee = Bool
True
    , getHalvingInterval :: Word32
getHalvingInterval = 210000
    }

-- | Testnet for Bitcoin SegWit network.
btcTest :: Network
btcTest :: Network
btcTest =
    $WNetwork :: String
-> String
-> Word8
-> Word8
-> Word8
-> Word32
-> Word32
-> Word32
-> BlockHeader
-> Int
-> Word64
-> ByteString
-> Int
-> Bool
-> Bool
-> Integer
-> (Word32, BlockHash)
-> Word32
-> Word32
-> Word32
-> Word32
-> [(Word32, BlockHash)]
-> Word32
-> [String]
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Integer
-> Bool
-> Maybe Text
-> Maybe Text
-> Bool
-> Word32
-> Network
Network
    { getNetworkName :: String
getNetworkName = "btctest"
    , getNetworkIdent :: String
getNetworkIdent = "btcTest"
    , getAddrPrefix :: Word8
getAddrPrefix = 111
    , getScriptPrefix :: Word8
getScriptPrefix = 196
    , getSecretPrefix :: Word8
getSecretPrefix = 239
    , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = 0x043587cf
    , getExtSecretPrefix :: Word32
getExtSecretPrefix = 0x04358394
    , getNetworkMagic :: Word32
getNetworkMagic = 0x0b110907
    , getGenesisHeader :: BlockHeader
getGenesisHeader =
          Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
              0x01
              "0000000000000000000000000000000000000000000000000000000000000000"
              "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
              1296688602
              486604799
              414098458
            -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
    , getMaxBlockSize :: Int
getMaxBlockSize = 1000000
    , getMaxSatoshi :: Word64
getMaxSatoshi = 2100000000000000
    , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = "/haskoin-btc-test:" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
forall a. IsString a => a
versionString ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> "/"
    , getDefaultPort :: Int
getDefaultPort = 18333
    , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
    , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
    , getPowLimit :: Integer
getPowLimit =
          0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    , getBip34Block :: (Word32, BlockHash)
getBip34Block =
          ( 21111
          , "0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8")
    , getBip65Height :: Word32
getBip65Height = 581885
    , getBip66Height :: Word32
getBip66Height = 330776
    , getTargetTimespan :: Word32
getTargetTimespan = 14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getTargetSpacing :: Word32
getTargetSpacing = 10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
          [ ( 546
            , "000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")
          ]
    , getSeeds :: [String]
getSeeds =
          [ "testnet-seed.bitcoin.jonasschnelli.ch"
          , "seed.tbtc.petertodd.org"
          , "seed.testnet.bitcoin.sprovoost.nl"
          , "testnet-seed.bluematt.me"
          ]
    , getBip44Coin :: Word32
getBip44Coin = 1
    , getSigHashForkId :: Maybe Word32
getSigHashForkId = Maybe Word32
forall a. Maybe a
Nothing
    , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Maybe Word32
forall a. Maybe a
Nothing
    , getAsertHalfLife :: Integer
getAsertHalfLife = 0
    , getSegWit :: Bool
getSegWit = Bool
True
    , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Maybe Text
forall a. Maybe a
Nothing
    , getBech32Prefix :: Maybe Text
getBech32Prefix = Text -> Maybe Text
forall a. a -> Maybe a
Just "tb"
    , getReplaceByFee :: Bool
getReplaceByFee = Bool
True
    , getHalvingInterval :: Word32
getHalvingInterval = 210000
    }

-- | RegTest for Bitcoin SegWit network.
btcRegTest :: Network
btcRegTest :: Network
btcRegTest =
    $WNetwork :: String
-> String
-> Word8
-> Word8
-> Word8
-> Word32
-> Word32
-> Word32
-> BlockHeader
-> Int
-> Word64
-> ByteString
-> Int
-> Bool
-> Bool
-> Integer
-> (Word32, BlockHash)
-> Word32
-> Word32
-> Word32
-> Word32
-> [(Word32, BlockHash)]
-> Word32
-> [String]
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Integer
-> Bool
-> Maybe Text
-> Maybe Text
-> Bool
-> Word32
-> Network
Network
    { getNetworkName :: String
getNetworkName = "btcreg"
    , getNetworkIdent :: String
getNetworkIdent = "btcRegTest"
    , getAddrPrefix :: Word8
getAddrPrefix = 111
    , getScriptPrefix :: Word8
getScriptPrefix = 196
    , getSecretPrefix :: Word8
getSecretPrefix = 239
    , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = 0x043587cf
    , getExtSecretPrefix :: Word32
getExtSecretPrefix = 0x04358394
    , getNetworkMagic :: Word32
getNetworkMagic = 0xfabfb5da
    , getGenesisHeader :: BlockHeader
getGenesisHeader =
          Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
           -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
              0x01
              "0000000000000000000000000000000000000000000000000000000000000000"
              "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
              1296688602
              0x207fffff
              2
    , getMaxBlockSize :: Int
getMaxBlockSize = 1000000
    , getMaxSatoshi :: Word64
getMaxSatoshi = 2100000000000000
    , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = "/haskoin-btc-regtest:" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
forall a. IsString a => a
versionString ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> "/"
    , getDefaultPort :: Int
getDefaultPort = 18444
    , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
    , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
True
    , getPowLimit :: Integer
getPowLimit =
          0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    , getBip34Block :: (Word32, BlockHash)
getBip34Block =
          ( 100000000
          , "0000000000000000000000000000000000000000000000000000000000000000")
    , getBip65Height :: Word32
getBip65Height = 1351
    , getBip66Height :: Word32
getBip66Height = 1251
    , getTargetTimespan :: Word32
getTargetTimespan = 14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getTargetSpacing :: Word32
getTargetSpacing = 10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints = []
    , getSeeds :: [String]
getSeeds = ["localhost"]
    , getBip44Coin :: Word32
getBip44Coin = 1
    , getSigHashForkId :: Maybe Word32
getSigHashForkId = Maybe Word32
forall a. Maybe a
Nothing
    , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Maybe Word32
forall a. Maybe a
Nothing
    , getAsertHalfLife :: Integer
getAsertHalfLife = 0
    , getSegWit :: Bool
getSegWit = Bool
True
    , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Maybe Text
forall a. Maybe a
Nothing
    , getBech32Prefix :: Maybe Text
getBech32Prefix = Text -> Maybe Text
forall a. a -> Maybe a
Just "bcrt"
    , getReplaceByFee :: Bool
getReplaceByFee = Bool
True
    , getHalvingInterval :: Word32
getHalvingInterval = 150
    }

-- | Bitcoin Cash network. Symbol: BCH.
bch :: Network
bch :: Network
bch =
    $WNetwork :: String
-> String
-> Word8
-> Word8
-> Word8
-> Word32
-> Word32
-> Word32
-> BlockHeader
-> Int
-> Word64
-> ByteString
-> Int
-> Bool
-> Bool
-> Integer
-> (Word32, BlockHash)
-> Word32
-> Word32
-> Word32
-> Word32
-> [(Word32, BlockHash)]
-> Word32
-> [String]
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Integer
-> Bool
-> Maybe Text
-> Maybe Text
-> Bool
-> Word32
-> Network
Network
    { getNetworkName :: String
getNetworkName = "bch"
    , getNetworkIdent :: String
getNetworkIdent = "bch"
    , getAddrPrefix :: Word8
getAddrPrefix = 0
    , getScriptPrefix :: Word8
getScriptPrefix = 5
    , getSecretPrefix :: Word8
getSecretPrefix = 128
    , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = 0x0488b21e
    , getExtSecretPrefix :: Word32
getExtSecretPrefix = 0x0488ade4
    , getNetworkMagic :: Word32
getNetworkMagic = 0xe3e1f3e8
    , getGenesisHeader :: BlockHeader
getGenesisHeader =
          Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
              0x01
              "0000000000000000000000000000000000000000000000000000000000000000"
              "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
              1231006505
              0x1d00ffff
              2083236893
            -- Hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
    , getMaxBlockSize :: Int
getMaxBlockSize = 32000000
    , getMaxSatoshi :: Word64
getMaxSatoshi = 2100000000000000
    , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = "/haskoin-bch:" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
forall a. IsString a => a
versionString ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> "/"
    , getDefaultPort :: Int
getDefaultPort = 8333
    , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
False
    , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
    , getPowLimit :: Integer
getPowLimit =
          0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    , getBip34Block :: (Word32, BlockHash)
getBip34Block =
          ( 227931
          , "000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8")
    , getBip65Height :: Word32
getBip65Height = 388381
    , getBip66Height :: Word32
getBip66Height = 363725
    , getTargetTimespan :: Word32
getTargetTimespan = 14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getTargetSpacing :: Word32
getTargetSpacing = 10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
          [ ( 11111
            , "0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")
          , ( 33333
            , "000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")
          , ( 74000
            , "0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")
          , ( 105000
            , "00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")
          , ( 134444
            , "00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")
          , ( 168000
            , "000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")
          , ( 193000
            , "000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")
          , ( 210000
            , "000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")
          , ( 216116
            , "00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")
          , ( 225430
            , "00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")
          , ( 250000
            , "000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")
          , ( 279000
            , "0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")
          , ( 295000
            , "00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")
            -- UAHF fork block.
          , ( 478559
            , "000000000000000000651ef99cb9fcbe0dadde1d424bd9f15ff20136191a5eec")
            -- Nov, 13 DAA activation block.
          , ( 504031
            , "0000000000000000011ebf65b60d0a3de80b8175be709d653b4c1a1beeb6ab9c")
          ]
    , getSeeds :: [String]
getSeeds =
          [ "seed.bitcoinabc.org"
          , "seed-bch.bitcoinforks.org"
          , "btccash-seeder.bitcoinunlimited.info"
          , "seed.bchd.cash"
          , "seed.bch.loping.net"
          , "dnsseed.electroncash.de"
          ]
    , getBip44Coin :: Word32
getBip44Coin = 145
    , getSigHashForkId :: Maybe Word32
getSigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 0
    , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 478559
    , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 404031
    , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 1605441600
    , getAsertHalfLife :: Integer
getAsertHalfLife = 60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* 60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* 10
    , getSegWit :: Bool
getSegWit = Bool
False
    , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just "bitcoincash"
    , getBech32Prefix :: Maybe Text
getBech32Prefix = Maybe Text
forall a. Maybe a
Nothing
    , getReplaceByFee :: Bool
getReplaceByFee = Bool
False
    , getHalvingInterval :: Word32
getHalvingInterval = 210000
    }

-- | Testnet for Bitcoin Cash network.
bchTest :: Network
bchTest :: Network
bchTest =
    $WNetwork :: String
-> String
-> Word8
-> Word8
-> Word8
-> Word32
-> Word32
-> Word32
-> BlockHeader
-> Int
-> Word64
-> ByteString
-> Int
-> Bool
-> Bool
-> Integer
-> (Word32, BlockHash)
-> Word32
-> Word32
-> Word32
-> Word32
-> [(Word32, BlockHash)]
-> Word32
-> [String]
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Integer
-> Bool
-> Maybe Text
-> Maybe Text
-> Bool
-> Word32
-> Network
Network
    { getNetworkName :: String
getNetworkName = "bchtest"
    , getNetworkIdent :: String
getNetworkIdent = "bchTest"
    , getAddrPrefix :: Word8
getAddrPrefix = 111
    , getScriptPrefix :: Word8
getScriptPrefix = 196
    , getSecretPrefix :: Word8
getSecretPrefix = 239
    , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = 0x043587cf
    , getExtSecretPrefix :: Word32
getExtSecretPrefix = 0x04358394
    , getNetworkMagic :: Word32
getNetworkMagic = 0xf4e5f3f4
    , getGenesisHeader :: BlockHeader
getGenesisHeader =
          Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
              0x01
              "0000000000000000000000000000000000000000000000000000000000000000"
              "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
              1296688602
              486604799
              414098458
            -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
    , getMaxBlockSize :: Int
getMaxBlockSize = 32000000
    , getMaxSatoshi :: Word64
getMaxSatoshi = 2100000000000000
    , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = "/haskoin-bch-test:" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
forall a. IsString a => a
versionString ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> "/"
    , getDefaultPort :: Int
getDefaultPort = 18333
    , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
    , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
    , getPowLimit :: Integer
getPowLimit =
          0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    , getBip34Block :: (Word32, BlockHash)
getBip34Block =
          ( 21111
          , "0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8")
    , getBip65Height :: Word32
getBip65Height = 581885
    , getBip66Height :: Word32
getBip66Height = 330776
    , getTargetTimespan :: Word32
getTargetTimespan = 14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getTargetSpacing :: Word32
getTargetSpacing = 10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
          [ ( 546
            , "000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")
            -- UAHF fork block.
          , ( 1155876
            , "00000000000e38fef93ed9582a7df43815d5c2ba9fd37ef70c9a0ea4a285b8f5")
            -- Nov, 13. DAA activation block.
          , ( 1188697
            , "0000000000170ed0918077bde7b4d36cc4c91be69fa09211f748240dabe047fb")
          ]
    , getSeeds :: [String]
getSeeds =
          [ "testnet-seed.bitcoinabc.org"
          , "testnet-seed-bch.bitcoinforks.org"
          , "testnet-seed.bchd.cash"
          , "seed.tbch.loping.net"
          ]
    , getBip44Coin :: Word32
getBip44Coin = 1
    , getSigHashForkId :: Maybe Word32
getSigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 0
    , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 1155876
    , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 1188697
    , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 1605441600
    , getAsertHalfLife :: Integer
getAsertHalfLife = 60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* 60
    , getSegWit :: Bool
getSegWit = Bool
False
    , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just "bchtest"
    , getBech32Prefix :: Maybe Text
getBech32Prefix = Maybe Text
forall a. Maybe a
Nothing
    , getReplaceByFee :: Bool
getReplaceByFee = Bool
False
    , getHalvingInterval :: Word32
getHalvingInterval = 210000
    }

-- | RegTest for Bitcoin Cash network.
bchRegTest :: Network
bchRegTest :: Network
bchRegTest =
    $WNetwork :: String
-> String
-> Word8
-> Word8
-> Word8
-> Word32
-> Word32
-> Word32
-> BlockHeader
-> Int
-> Word64
-> ByteString
-> Int
-> Bool
-> Bool
-> Integer
-> (Word32, BlockHash)
-> Word32
-> Word32
-> Word32
-> Word32
-> [(Word32, BlockHash)]
-> Word32
-> [String]
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Maybe Word32
-> Integer
-> Bool
-> Maybe Text
-> Maybe Text
-> Bool
-> Word32
-> Network
Network
    { getNetworkName :: String
getNetworkName = "bchreg"
    , getNetworkIdent :: String
getNetworkIdent = "bchRegTest"
    , getAddrPrefix :: Word8
getAddrPrefix = 111
    , getScriptPrefix :: Word8
getScriptPrefix = 196
    , getSecretPrefix :: Word8
getSecretPrefix = 239
    , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = 0x043587cf
    , getExtSecretPrefix :: Word32
getExtSecretPrefix = 0x04358394
    , getNetworkMagic :: Word32
getNetworkMagic = 0xdab5bffa
    , getGenesisHeader :: BlockHeader
getGenesisHeader =
          Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
           -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
              0x01
              "0000000000000000000000000000000000000000000000000000000000000000"
              "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
              1296688602
              0x207fffff
              2
    , getMaxBlockSize :: Int
getMaxBlockSize = 1000000
    , getMaxSatoshi :: Word64
getMaxSatoshi = 2100000000000000
    , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = "/haskoin-bch-regtest:" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
forall a. IsString a => a
versionString ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> "/"
    , getDefaultPort :: Int
getDefaultPort = 18444
    , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
    , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
True
    , getPowLimit :: Integer
getPowLimit =
          0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    , getBip34Block :: (Word32, BlockHash)
getBip34Block =
          ( 100000000
          , "0000000000000000000000000000000000000000000000000000000000000000")
    , getBip65Height :: Word32
getBip65Height = 1351
    , getBip66Height :: Word32
getBip66Height = 1251
    , getTargetTimespan :: Word32
getTargetTimespan = 14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getTargetSpacing :: Word32
getTargetSpacing = 10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* 60
    , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
          [ ( 0
            , "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")
          ]
    , getSeeds :: [String]
getSeeds = ["localhost"]
    , getBip44Coin :: Word32
getBip44Coin = 1
    , getSigHashForkId :: Maybe Word32
getSigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 0
    , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Maybe Word32
forall a. Maybe a
Nothing
    , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 0
    , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just 1605441600
    , getAsertHalfLife :: Integer
getAsertHalfLife = 2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* 24 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* 60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* 60
    , getSegWit :: Bool
getSegWit = Bool
False
    , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just "bchreg"
    , getBech32Prefix :: Maybe Text
getBech32Prefix = Maybe Text
forall a. Maybe a
Nothing
    , getReplaceByFee :: Bool
getReplaceByFee = Bool
False
    , getHalvingInterval :: Word32
getHalvingInterval = 150
    }

-- | List of all networks supported by this library.
allNets :: [Network]
allNets :: [Network]
allNets = [Network
btc, Network
bch, Network
btcTest, Network
bchTest, Network
btcRegTest, Network
bchRegTest]