{-# 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 (
    Network(..),
    -- * Constants
    btc,
    btcTest,
    btcRegTest,
    bch,
    bchTest,
    bchTest4,
    bchRegTest,
    allNets,
    netByName,
) 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
import Haskoin.Data
import Haskoin.Network.Common
import Haskoin.Transaction
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

-- | Query known networks by name.
netByName :: String -> Maybe Network
netByName :: String -> Maybe Network
netByName 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

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

-- | Testnet for Bitcoin SegWit network.
btcTest :: Network
btcTest :: Network
btcTest =
    Network :: 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 = String
"btctest"
        , getAddrPrefix :: Word8
getAddrPrefix = Word8
111
        , getScriptPrefix :: Word8
getScriptPrefix = Word8
196
        , getSecretPrefix :: Word8
getSecretPrefix = Word8
239
        , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = Word32
0x043587cf
        , getExtSecretPrefix :: Word32
getExtSecretPrefix = Word32
0x04358394
        , getNetworkMagic :: Word32
getNetworkMagic = Word32
0x0b110907
        , getGenesisHeader :: BlockHeader
getGenesisHeader =
            Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
                Word32
0x01
                BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
                ([TxHash] -> Hash256
buildMerkleRoot [Tx -> TxHash
txHash Tx
genesisTx])
                Word32
1296688602
                Word32
486604799
                Word32
414098458
        , -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
          getMaxBlockSize :: Int
getMaxBlockSize = Int
1000000
        , getMaxSatoshi :: Word64
getMaxSatoshi = Word64
2100000000000000
        , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = ByteString
"/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
<> ByteString
"/"
        , getDefaultPort :: Int
getDefaultPort = Int
18333
        , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
        , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
        , getPowLimit :: Integer
getPowLimit =
            Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        , getBip34Block :: (Word32, BlockHash)
getBip34Block =
            ( Word32
21111
            , BlockHash
"0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"
            )
        , getBip65Height :: Word32
getBip65Height = Word32
581885
        , getBip66Height :: Word32
getBip66Height = Word32
330776
        , getTargetTimespan :: Word32
getTargetTimespan = Word32
14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getTargetSpacing :: Word32
getTargetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
            [
                ( Word32
546
                , BlockHash
"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"
                )
            ]
        , getSeeds :: [String]
getSeeds =
            [ String
"testnet-seed.bitcoin.jonasschnelli.ch"
            , String
"seed.tbtc.petertodd.org"
            , String
"seed.testnet.bitcoin.sprovoost.nl"
            , String
"testnet-seed.bluematt.me"
            ]
        , getBip44Coin :: Word32
getBip44Coin = Word32
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 = Integer
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 Text
"tb"
        , getReplaceByFee :: Bool
getReplaceByFee = Bool
True
        , getHalvingInterval :: Word32
getHalvingInterval = Word32
210000
        }

-- | RegTest for Bitcoin SegWit network.
btcRegTest :: Network
btcRegTest :: Network
btcRegTest =
    Network :: 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 = String
"btcreg"
        , getAddrPrefix :: Word8
getAddrPrefix = Word8
111
        , getScriptPrefix :: Word8
getScriptPrefix = Word8
196
        , getSecretPrefix :: Word8
getSecretPrefix = Word8
239
        , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = Word32
0x043587cf
        , getExtSecretPrefix :: Word32
getExtSecretPrefix = Word32
0x04358394
        , getNetworkMagic :: Word32
getNetworkMagic = Word32
0xfabfb5da
        , getGenesisHeader :: BlockHeader
getGenesisHeader =
            Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
                -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
                Word32
0x01
                BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
                ([TxHash] -> Hash256
buildMerkleRoot [Tx -> TxHash
txHash Tx
genesisTx])
                Word32
1296688602
                Word32
0x207fffff
                Word32
2
        , getMaxBlockSize :: Int
getMaxBlockSize = Int
1000000
        , getMaxSatoshi :: Word64
getMaxSatoshi = Word64
2100000000000000
        , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = ByteString
"/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
<> ByteString
"/"
        , getDefaultPort :: Int
getDefaultPort = Int
18444
        , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
        , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
True
        , getPowLimit :: Integer
getPowLimit =
            Integer
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        , getBip34Block :: (Word32, BlockHash)
getBip34Block =
            ( Word32
100000000
            , BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
            )
        , getBip65Height :: Word32
getBip65Height = Word32
1351
        , getBip66Height :: Word32
getBip66Height = Word32
1251
        , getTargetTimespan :: Word32
getTargetTimespan = Word32
14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getTargetSpacing :: Word32
getTargetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints = []
        , getSeeds :: [String]
getSeeds = [String
"localhost"]
        , getBip44Coin :: Word32
getBip44Coin = Word32
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 = Integer
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 Text
"bcrt"
        , getReplaceByFee :: Bool
getReplaceByFee = Bool
True
        , getHalvingInterval :: Word32
getHalvingInterval = Word32
150
        }

-- | Bitcoin Cash network. Symbol: BCH.
bch :: Network
bch :: Network
bch =
    Network :: 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 = String
"bch"
        , getAddrPrefix :: Word8
getAddrPrefix = Word8
0
        , getScriptPrefix :: Word8
getScriptPrefix = Word8
5
        , getSecretPrefix :: Word8
getSecretPrefix = Word8
128
        , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = Word32
0x0488b21e
        , getExtSecretPrefix :: Word32
getExtSecretPrefix = Word32
0x0488ade4
        , getNetworkMagic :: Word32
getNetworkMagic = Word32
0xe3e1f3e8
        , getGenesisHeader :: BlockHeader
getGenesisHeader =
            Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
                Word32
0x01
                BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
                ([TxHash] -> Hash256
buildMerkleRoot [Tx -> TxHash
txHash Tx
genesisTx])
                Word32
1231006505
                Word32
0x1d00ffff
                Word32
2083236893
        , -- Hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
          getMaxBlockSize :: Int
getMaxBlockSize = Int
32000000
        , getMaxSatoshi :: Word64
getMaxSatoshi = Word64
2100000000000000
        , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = ByteString
"/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
<> ByteString
"/"
        , getDefaultPort :: Int
getDefaultPort = Int
8333
        , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
False
        , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
        , getPowLimit :: Integer
getPowLimit =
            Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        , getBip34Block :: (Word32, BlockHash)
getBip34Block =
            ( Word32
227931
            , BlockHash
"000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"
            )
        , getBip65Height :: Word32
getBip65Height = Word32
388381
        , getBip66Height :: Word32
getBip66Height = Word32
363725
        , getTargetTimespan :: Word32
getTargetTimespan = Word32
14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getTargetSpacing :: Word32
getTargetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
            [
                ( Word32
11111
                , BlockHash
"0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"
                )
            ,
                ( Word32
33333
                , BlockHash
"000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"
                )
            ,
                ( Word32
74000
                , BlockHash
"0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"
                )
            ,
                ( Word32
105000
                , BlockHash
"00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"
                )
            ,
                ( Word32
134444
                , BlockHash
"00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"
                )
            ,
                ( Word32
168000
                , BlockHash
"000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"
                )
            ,
                ( Word32
193000
                , BlockHash
"000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"
                )
            ,
                ( Word32
210000
                , BlockHash
"000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"
                )
            ,
                ( Word32
216116
                , BlockHash
"00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"
                )
            ,
                ( Word32
225430
                , BlockHash
"00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"
                )
            ,
                ( Word32
250000
                , BlockHash
"000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"
                )
            ,
                ( Word32
279000
                , BlockHash
"0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"
                )
            ,
                ( Word32
295000
                , BlockHash
"00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983"
                )
            , -- UAHF fork block.

                ( Word32
478559
                , BlockHash
"000000000000000000651ef99cb9fcbe0dadde1d424bd9f15ff20136191a5eec"
                )
            , -- Nov, 13 DAA activation block.

                ( Word32
504031
                , BlockHash
"0000000000000000011ebf65b60d0a3de80b8175be709d653b4c1a1beeb6ab9c"
                )
            ]
        , getSeeds :: [String]
getSeeds =
            [ String
"seed.bitcoinabc.org"
            , String
"seed-bch.bitcoinforks.org"
            , String
"btccash-seeder.bitcoinunlimited.info"
            , String
"seed.bchd.cash"
            , String
"seed.bch.loping.net"
            , String
"dnsseed.electroncash.de"
            ]
        , getBip44Coin :: Word32
getBip44Coin = Word32
145
        , getSigHashForkId :: Maybe Word32
getSigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0
        , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
478559
        , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
404031
        , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600
        , getAsertHalfLife :: Integer
getAsertHalfLife = Integer
60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
10
        , getSegWit :: Bool
getSegWit = Bool
False
        , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bitcoincash"
        , getBech32Prefix :: Maybe Text
getBech32Prefix = Maybe Text
forall a. Maybe a
Nothing
        , getReplaceByFee :: Bool
getReplaceByFee = Bool
False
        , getHalvingInterval :: Word32
getHalvingInterval = Word32
210000
        }

-- | Testnet for Bitcoin Cash network.
bchTest4 :: Network
bchTest4 :: Network
bchTest4 =
    Network :: 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 = String
"bchtest4"
        , getAddrPrefix :: Word8
getAddrPrefix = Word8
111
        , getScriptPrefix :: Word8
getScriptPrefix = Word8
196
        , getSecretPrefix :: Word8
getSecretPrefix = Word8
239
        , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = Word32
0x043587cf
        , getExtSecretPrefix :: Word32
getExtSecretPrefix = Word32
0x04358394
        , getNetworkMagic :: Word32
getNetworkMagic = Word32
0xe2b7daaf
        , getGenesisHeader :: BlockHeader
getGenesisHeader =
            Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
                Word32
0x01
                BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
                ([TxHash] -> Hash256
buildMerkleRoot [Tx -> TxHash
txHash Tx
genesisTx])
                Word32
1597811185
                Word32
0x1d00ffff
                Word32
114152193
        , -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
          getMaxBlockSize :: Int
getMaxBlockSize = Int
2000000
        , getMaxSatoshi :: Word64
getMaxSatoshi = Word64
2100000000000000
        , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = ByteString
"/haskoin-bch-test4:" 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
<> ByteString
"/"
        , getDefaultPort :: Int
getDefaultPort = Int
28333
        , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
        , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
        , getPowLimit :: Integer
getPowLimit =
            Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        , getBip34Block :: (Word32, BlockHash)
getBip34Block =
            ( Word32
2
            , BlockHash
"00000000b0c65b1e03baace7d5c093db0d6aac224df01484985ffd5e86a1a20c"
            )
        , getBip65Height :: Word32
getBip65Height = Word32
3
        , getBip66Height :: Word32
getBip66Height = Word32
4
        , getTargetTimespan :: Word32
getTargetTimespan = Word32
14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getTargetSpacing :: Word32
getTargetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
            [
                ( Word32
5000
                , BlockHash
"000000009f092d074574a216faec682040a853c4f079c33dfd2c3ef1fd8108c4"
                )
            , -- Axion activation

                ( Word32
16845
                , BlockHash
"00000000fb325b8f34fe80c96a5f708a08699a68bbab82dba4474d86bd743077"
                )
            ,
                ( Word32
38000
                , BlockHash
"000000000015197537e59f339e3b1bbf81a66f691bd3d7aa08560fc7bf5113fb"
                )
            ,
                ( Word32
54700
                , BlockHash
"00000000009af4379d87f17d0f172ee4769b48839a5a3a3e81d69da4322518b8"
                )
            ]
        , getSeeds :: [String]
getSeeds =
            [ String
"testnet4-seed-bch.bitcoinforks.org"
            , String
"testnet4-seed-bch.toom.im"
            , String
"seed.tbch4.loping.net"
            , String
"testnet4-seed.flowee.cash"
            ]
        , getBip44Coin :: Word32
getBip44Coin = Word32
1
        , getSigHashForkId :: Maybe Word32
getSigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0
        , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
7
        , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
3000
        , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600
        , getAsertHalfLife :: Integer
getAsertHalfLife = Integer
60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
60
        , getSegWit :: Bool
getSegWit = Bool
False
        , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bchtest"
        , getBech32Prefix :: Maybe Text
getBech32Prefix = Maybe Text
forall a. Maybe a
Nothing
        , getReplaceByFee :: Bool
getReplaceByFee = Bool
False
        , getHalvingInterval :: Word32
getHalvingInterval = Word32
210000
        }

-- | Testnet for Bitcoin Cash network.
bchTest :: Network
bchTest :: Network
bchTest =
    Network :: 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 = String
"bchtest"
        , getAddrPrefix :: Word8
getAddrPrefix = Word8
111
        , getScriptPrefix :: Word8
getScriptPrefix = Word8
196
        , getSecretPrefix :: Word8
getSecretPrefix = Word8
239
        , getExtPubKeyPrefix :: Word32
getExtPubKeyPrefix = Word32
0x043587cf
        , getExtSecretPrefix :: Word32
getExtSecretPrefix = Word32
0x04358394
        , getNetworkMagic :: Word32
getNetworkMagic = Word32
0xf4e5f3f4
        , getGenesisHeader :: BlockHeader
getGenesisHeader =
            Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
                Word32
0x01
                BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
                ([TxHash] -> Hash256
buildMerkleRoot [Tx -> TxHash
txHash Tx
genesisTx])
                Word32
1296688602
                Word32
486604799
                Word32
414098458
        , -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
          getMaxBlockSize :: Int
getMaxBlockSize = Int
32000000
        , getMaxSatoshi :: Word64
getMaxSatoshi = Word64
2100000000000000
        , getHaskoinUserAgent :: ByteString
getHaskoinUserAgent = ByteString
"/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
<> ByteString
"/"
        , getDefaultPort :: Int
getDefaultPort = Int
18333
        , getAllowMinDifficultyBlocks :: Bool
getAllowMinDifficultyBlocks = Bool
True
        , getPowNoRetargetting :: Bool
getPowNoRetargetting = Bool
False
        , getPowLimit :: Integer
getPowLimit =
            Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        , getBip34Block :: (Word32, BlockHash)
getBip34Block =
            ( Word32
21111
            , BlockHash
"0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"
            )
        , getBip65Height :: Word32
getBip65Height = Word32
581885
        , getBip66Height :: Word32
getBip66Height = Word32
330776
        , getTargetTimespan :: Word32
getTargetTimespan = Word32
14 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
24 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getTargetSpacing :: Word32
getTargetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60
        , getCheckpoints :: [(Word32, BlockHash)]
getCheckpoints =
            [
                ( Word32
546
                , BlockHash
"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"
                )
            , -- UAHF fork block.

                ( Word32
1155876
                , BlockHash
"00000000000e38fef93ed9582a7df43815d5c2ba9fd37ef70c9a0ea4a285b8f5"
                )
            , -- Nov, 13. DAA activation block.

                ( Word32
1188697
                , BlockHash
"0000000000170ed0918077bde7b4d36cc4c91be69fa09211f748240dabe047fb"
                )
            ]
        , getSeeds :: [String]
getSeeds =
            [ String
"testnet-seed.bitcoinabc.org"
            , String
"testnet-seed-bch.bitcoinforks.org"
            , String
"testnet-seed.bchd.cash"
            , String
"seed.tbch.loping.net"
            ]
        , getBip44Coin :: Word32
getBip44Coin = Word32
1
        , getSigHashForkId :: Maybe Word32
getSigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0
        , getEdaBlockHeight :: Maybe Word32
getEdaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1155876
        , getDaaBlockHeight :: Maybe Word32
getDaaBlockHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1188697
        , getAsertActivationTime :: Maybe Word32
getAsertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600
        , getAsertHalfLife :: Integer
getAsertHalfLife = Integer
60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
60
        , getSegWit :: Bool
getSegWit = Bool
False
        , getCashAddrPrefix :: Maybe Text
getCashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bchtest"
        , getBech32Prefix :: Maybe Text
getBech32Prefix = Maybe Text
forall a. Maybe a
Nothing
        , getReplaceByFee :: Bool
getReplaceByFee = Bool
False
        , getHalvingInterval :: Word32
getHalvingInterval = Word32
210000
        }

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

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