{-# 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.Binary          (Binary (..))
import           Data.ByteString      (ByteString)
import           Data.Bytes.Get
import           Data.Bytes.Put
import           Data.Bytes.Serial
import           Data.List
import           Data.Maybe
import           Data.Serialize       (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 Serial Network where
    serialize :: Network -> m ()
serialize net :: Network
net =
        Word32 -> m ()
forall (m :: * -> *). MonadPut m => Word32 -> m ()
putWord32be (Word32 -> m ()) -> Word32 -> m ()
forall a b. (a -> b) -> a -> b
$ Network -> Word32
getNetworkMagic Network
net
    deserialize :: m Network
deserialize = do
        Word32
magic <- m Word32
forall (m :: * -> *). MonadGet m => m 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 -> m Network
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> m Network) -> String -> m 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 -> m Network
forall (m :: * -> *) a. Monad m => a -> m a
return Network
net

instance Binary Network where
    put :: Network -> Put
put = Network -> Put
forall a (m :: * -> *). (Serial a, MonadPut m) => a -> m ()
serialize
    get :: Get Network
get = Get Network
forall a (m :: * -> *). (Serial a, MonadGet m) => m a
deserialize

instance Serialize Network where
    put :: Putter Network
put = Putter Network
forall a (m :: * -> *). (Serial a, MonadPut m) => a -> m ()
serialize
    get :: Get Network
get = Get Network
forall a (m :: * -> *). (Serial a, MonadGet m) => m a
deserialize

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]