{-# LANGUAGE CPP #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoFieldSelectors #-}

-- |
-- 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.Network.Constants
  ( -- * 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.Network.Common
import Haskoin.Network.Data
import Haskoin.Transaction
import Text.Read

-- | Version of Haskoin Core package.
versionString :: (IsString a) => a

#ifdef CURRENT_PACKAGE_VERSION
versionString :: forall a. IsString a => 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
. (.name)) [Network]
allNets

-- | Bitcoin SegWit network. Symbol: BTC.
btc :: Network
btc :: Network
btc =
  Network
    { $sel:name:Network :: String
name = String
"btc",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
0,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
5,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
128,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x0488b21e,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x0488ade4,
      $sel:magic:Network :: Word32
magic = Word32
0xf9beb4d9,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1231006505
          Word32
0x1d00ffff
          Word32
2083236893,
      -- Hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
1000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent =
        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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
8333,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
False,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
False,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
227931,
          BlockHash
"000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
388381,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
363725,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints =
        [ ( 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"
          )
        ],
      $sel:seeds:Network :: [String]
seeds =
        [ 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
        ],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
0,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = Integer
0,
      $sel:segWit:Network :: Bool
segWit = Bool
True,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bc",
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
True,
      $sel:halvingInterval:Network :: Word32
halvingInterval = Word32
210000
    }

-- | Testnet for Bitcoin SegWit network.
btcTest :: Network
btcTest :: Network
btcTest =
  Network
    { $sel:name:Network :: String
name = String
"btctest",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
111,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
196,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
239,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x043587cf,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x04358394,
      $sel:magic:Network :: Word32
magic = Word32
0x0b110907,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1296688602
          Word32
486604799
          Word32
414098458,
      -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
1000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent = 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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
18333,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
True,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
False,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
21111,
          BlockHash
"0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
581885,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
330776,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints =
        [ ( Word32
546,
            BlockHash
"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"
          )
        ],
      $sel:seeds:Network :: [String]
seeds =
        [ String
"testnet-seed.bitcoin.jonasschnelli.ch",
          String
"seed.tbtc.petertodd.org",
          String
"seed.testnet.bitcoin.sprovoost.nl",
          String
"testnet-seed.bluematt.me"
        ],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
1,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = Integer
0,
      $sel:segWit:Network :: Bool
segWit = Bool
True,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"tb",
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
True,
      $sel:halvingInterval:Network :: Word32
halvingInterval = Word32
210000
    }

-- | RegTest for Bitcoin SegWit network.
btcRegTest :: Network
btcRegTest :: Network
btcRegTest =
  Network
    { $sel:name:Network :: String
name = String
"btcreg",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
111,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
196,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
239,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x043587cf,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x04358394,
      $sel:magic:Network :: Word32
magic = Word32
0xfabfb5da,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1296688602
          Word32
0x207fffff
          Word32
2,
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
1000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent = 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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
18444,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
True,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
True,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
100000000,
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
1351,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
1251,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints = [],
      $sel:seeds:Network :: [String]
seeds = [String
"localhost"],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
1,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = Integer
0,
      $sel:segWit:Network :: Bool
segWit = Bool
True,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bcrt",
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
True,
      $sel:halvingInterval:Network :: Word32
halvingInterval = Word32
150
    }

-- | Bitcoin Cash network. Symbol: BCH.
bch :: Network
bch :: Network
bch =
  Network
    { $sel:name:Network :: String
name = String
"bch",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
0,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
5,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
128,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x0488b21e,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x0488ade4,
      $sel:magic:Network :: Word32
magic = Word32
0xe3e1f3e8,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1231006505
          Word32
0x1d00ffff
          Word32
2083236893,
      -- Hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
32000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent = 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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
8333,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
False,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
False,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
227931,
          BlockHash
"000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
388381,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
363725,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints =
        [ ( 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"
          )
        ],
      $sel:seeds:Network :: [String]
seeds =
        [ 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"
        ],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
145,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
478559,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
404031,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = 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,
      $sel:segWit:Network :: Bool
segWit = Bool
False,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bitcoincash",
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
False,
      $sel:halvingInterval:Network :: Word32
halvingInterval = Word32
210000
    }

-- | Testnet for Bitcoin Cash network.
bchTest4 :: Network
bchTest4 :: Network
bchTest4 =
  Network
    { $sel:name:Network :: String
name = String
"bchtest4",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
111,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
196,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
239,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x043587cf,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x04358394,
      $sel:magic:Network :: Word32
magic = Word32
0xe2b7daaf,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1597811185
          Word32
0x1d00ffff
          Word32
114152193,
      -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
2000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent = 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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
28333,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
True,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
False,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
2,
          BlockHash
"00000000b0c65b1e03baace7d5c093db0d6aac224df01484985ffd5e86a1a20c"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
3,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
4,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints =
        [ ( Word32
5000,
            BlockHash
"000000009f092d074574a216faec682040a853c4f079c33dfd2c3ef1fd8108c4"
          ),
          -- Axion activation

          ( Word32
16845,
            BlockHash
"00000000fb325b8f34fe80c96a5f708a08699a68bbab82dba4474d86bd743077"
          ),
          ( Word32
38000,
            BlockHash
"000000000015197537e59f339e3b1bbf81a66f691bd3d7aa08560fc7bf5113fb"
          ),
          ( Word32
54700,
            BlockHash
"00000000009af4379d87f17d0f172ee4769b48839a5a3a3e81d69da4322518b8"
          )
        ],
      $sel:seeds:Network :: [String]
seeds =
        [ String
"testnet4-seed-bch.bitcoinforks.org",
          String
"testnet4-seed-bch.toom.im",
          String
"seed.tbch4.loping.net",
          String
"testnet4-seed.flowee.cash"
        ],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
1,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
7,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
3000,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = Integer
60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
60,
      $sel:segWit:Network :: Bool
segWit = Bool
False,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bchtest",
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
False,
      $sel:halvingInterval:Network :: Word32
halvingInterval = Word32
210000
    }

-- | Testnet for Bitcoin Cash network.
bchTest :: Network
bchTest :: Network
bchTest =
  Network
    { $sel:name:Network :: String
name = String
"bchtest",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
111,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
196,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
239,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x043587cf,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x04358394,
      $sel:magic:Network :: Word32
magic = Word32
0xf4e5f3f4,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1296688602
          Word32
486604799
          Word32
414098458,
      -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
32000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent = 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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
18333,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
True,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
False,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
21111,
          BlockHash
"0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
581885,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
330776,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints =
        [ ( Word32
546,
            BlockHash
"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"
          ),
          -- UAHF fork block.

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

          ( Word32
1188697,
            BlockHash
"0000000000170ed0918077bde7b4d36cc4c91be69fa09211f748240dabe047fb"
          )
        ],
      $sel:seeds:Network :: [String]
seeds =
        [ String
"testnet-seed.bitcoinabc.org",
          String
"testnet-seed-bch.bitcoinforks.org",
          String
"testnet-seed.bchd.cash",
          String
"seed.tbch.loping.net"
        ],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
1,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1155876,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1188697,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = Integer
60 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
60,
      $sel:segWit:Network :: Bool
segWit = Bool
False,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bchtest",
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
False,
      $sel:halvingInterval:Network :: Word32
halvingInterval = Word32
210000
    }

-- | RegTest for Bitcoin Cash network.
bchRegTest :: Network
bchRegTest :: Network
bchRegTest =
  Network
    { $sel:name:Network :: String
name = String
"bchreg",
      $sel:addrPrefix:Network :: Word8
addrPrefix = Word8
111,
      $sel:scriptPrefix:Network :: Word8
scriptPrefix = Word8
196,
      $sel:secretPrefix:Network :: Word8
secretPrefix = Word8
239,
      $sel:xPubPrefix:Network :: Word32
xPubPrefix = Word32
0x043587cf,
      $sel:xPrvPrefix:Network :: Word32
xPrvPrefix = Word32
0x04358394,
      $sel:magic:Network :: Word32
magic = Word32
0xdab5bffa,
      $sel:genesisHeader:Network :: BlockHeader
genesisHeader =
        Word32
-> BlockHash
-> Hash256
-> Word32
-> Word32
-> Word32
-> BlockHeader
BlockHeader
          -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
          Word32
0x01
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
          Hash256
"3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          Word32
1296688602
          Word32
0x207fffff
          Word32
2,
      $sel:maxBlockSize:Network :: Int
maxBlockSize = Int
1000000,
      $sel:maxSatoshi:Network :: Word64
maxSatoshi = Word64
2100000000000000,
      $sel:userAgent:Network :: ByteString
userAgent = 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
"/",
      $sel:defaultPort:Network :: Int
defaultPort = Int
18444,
      $sel:minDiffBlocks:Network :: Bool
minDiffBlocks = Bool
True,
      $sel:powNoRetarget:Network :: Bool
powNoRetarget = Bool
True,
      $sel:powLimit:Network :: Integer
powLimit =
        Integer
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      $sel:bip34Block:Network :: (Word32, BlockHash)
bip34Block =
        ( Word32
100000000,
          BlockHash
"0000000000000000000000000000000000000000000000000000000000000000"
        ),
      $sel:bip65Height:Network :: Word32
bip65Height = Word32
1351,
      $sel:bip66Height:Network :: Word32
bip66Height = Word32
1251,
      $sel:targetTimespan:Network :: Word32
targetTimespan = 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,
      $sel:targetSpacing:Network :: Word32
targetSpacing = Word32
10 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
60,
      $sel:checkpoints:Network :: [(Word32, BlockHash)]
checkpoints =
        [ ( Word32
0,
            BlockHash
"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"
          )
        ],
      $sel:seeds:Network :: [String]
seeds = [String
"localhost"],
      $sel:bip44Coin:Network :: Word32
bip44Coin = Word32
1,
      $sel:sigHashForkId:Network :: Maybe Word32
sigHashForkId = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0,
      $sel:edaHeight:Network :: Maybe Word32
edaHeight = Maybe Word32
forall a. Maybe a
Nothing,
      $sel:daaHeight:Network :: Maybe Word32
daaHeight = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
0,
      $sel:asertActivationTime:Network :: Maybe Word32
asertActivationTime = Word32 -> Maybe Word32
forall a. a -> Maybe a
Just Word32
1605441600,
      $sel:asertHalfLife:Network :: Integer
asertHalfLife = 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,
      $sel:segWit:Network :: Bool
segWit = Bool
False,
      $sel:cashAddrPrefix:Network :: Maybe Text
cashAddrPrefix = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"bchreg",
      $sel:bech32Prefix:Network :: Maybe Text
bech32Prefix = Maybe Text
forall a. Maybe a
Nothing,
      $sel:replaceByFee:Network :: Bool
replaceByFee = Bool
False,
      $sel:halvingInterval:Network :: Word32
halvingInterval = 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]