packages feed

haskoin-core-1.2.2: src/Haskoin/Network/Constants.hs

{-# 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 = CURRENT_PACKAGE_VERSION
#else
versionString = "Unavailable"
#endif

-- | Query known networks by name.
netByName :: String -> Maybe Network
netByName str = find ((== str) . (.name)) allNets

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

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

-- | RegTest for Bitcoin SegWit network.
btcRegTest :: Network
btcRegTest =
  Network
    { name = "btcreg",
      addrPrefix = 111,
      scriptPrefix = 196,
      secretPrefix = 239,
      xPubPrefix = 0x043587cf,
      xPrvPrefix = 0x04358394,
      magic = 0xfabfb5da,
      genesisHeader =
        BlockHeader
          -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
          0x01
          "0000000000000000000000000000000000000000000000000000000000000000"
          "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          1296688602
          0x207fffff
          2,
      maxBlockSize = 1000000,
      maxSatoshi = 2100000000000000,
      userAgent = "/haskoin-btc-regtest:" <> versionString <> "/",
      defaultPort = 18444,
      minDiffBlocks = True,
      powNoRetarget = True,
      powLimit =
        0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      bip34Block =
        ( 100000000,
          "0000000000000000000000000000000000000000000000000000000000000000"
        ),
      bip65Height = 1351,
      bip66Height = 1251,
      targetTimespan = 14 * 24 * 60 * 60,
      targetSpacing = 10 * 60,
      checkpoints = [],
      seeds = ["localhost"],
      bip44Coin = 1,
      sigHashForkId = Nothing,
      edaHeight = Nothing,
      daaHeight = Nothing,
      asertActivationTime = Nothing,
      asertHalfLife = 0,
      segWit = True,
      cashAddrPrefix = Nothing,
      bech32Prefix = Just "bcrt",
      replaceByFee = True,
      halvingInterval = 150
    }

-- | Bitcoin Cash network. Symbol: BCH.
bch :: Network
bch =
  Network
    { name = "bch",
      addrPrefix = 0,
      scriptPrefix = 5,
      secretPrefix = 128,
      xPubPrefix = 0x0488b21e,
      xPrvPrefix = 0x0488ade4,
      magic = 0xe3e1f3e8,
      genesisHeader =
        BlockHeader
          0x01
          "0000000000000000000000000000000000000000000000000000000000000000"
          "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          1231006505
          0x1d00ffff
          2083236893,
      -- Hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
      maxBlockSize = 32000000,
      maxSatoshi = 2100000000000000,
      userAgent = "/haskoin-bch:" <> versionString <> "/",
      defaultPort = 8333,
      minDiffBlocks = False,
      powNoRetarget = False,
      powLimit =
        0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      bip34Block =
        ( 227931,
          "000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"
        ),
      bip65Height = 388381,
      bip66Height = 363725,
      targetTimespan = 14 * 24 * 60 * 60,
      targetSpacing = 10 * 60,
      checkpoints =
        [ ( 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"
          )
        ],
      seeds =
        [ "seed.bitcoinabc.org",
          "seed-bch.bitcoinforks.org",
          "btccash-seeder.bitcoinunlimited.info",
          "seed.bchd.cash",
          "seed.bch.loping.net",
          "dnsseed.electroncash.de"
        ],
      bip44Coin = 145,
      sigHashForkId = Just 0,
      edaHeight = Just 478559,
      daaHeight = Just 404031,
      asertActivationTime = Just 1605441600,
      asertHalfLife = 60 * 60 * 10,
      segWit = False,
      cashAddrPrefix = Just "bitcoincash",
      bech32Prefix = Nothing,
      replaceByFee = False,
      halvingInterval = 210000
    }

-- | Testnet for Bitcoin Cash network.
bchTest4 :: Network
bchTest4 =
  Network
    { name = "bchtest4",
      addrPrefix = 111,
      scriptPrefix = 196,
      secretPrefix = 239,
      xPubPrefix = 0x043587cf,
      xPrvPrefix = 0x04358394,
      magic = 0xe2b7daaf,
      genesisHeader =
        BlockHeader
          0x01
          "0000000000000000000000000000000000000000000000000000000000000000"
          "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          1597811185
          0x1d00ffff
          114152193,
      -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
      maxBlockSize = 2000000,
      maxSatoshi = 2100000000000000,
      userAgent = "/haskoin-bch-test4:" <> versionString <> "/",
      defaultPort = 28333,
      minDiffBlocks = True,
      powNoRetarget = False,
      powLimit =
        0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      bip34Block =
        ( 2,
          "00000000b0c65b1e03baace7d5c093db0d6aac224df01484985ffd5e86a1a20c"
        ),
      bip65Height = 3,
      bip66Height = 4,
      targetTimespan = 14 * 24 * 60 * 60,
      targetSpacing = 10 * 60,
      checkpoints =
        [ ( 5000,
            "000000009f092d074574a216faec682040a853c4f079c33dfd2c3ef1fd8108c4"
          ),
          -- Axion activation

          ( 16845,
            "00000000fb325b8f34fe80c96a5f708a08699a68bbab82dba4474d86bd743077"
          ),
          ( 38000,
            "000000000015197537e59f339e3b1bbf81a66f691bd3d7aa08560fc7bf5113fb"
          ),
          ( 54700,
            "00000000009af4379d87f17d0f172ee4769b48839a5a3a3e81d69da4322518b8"
          )
        ],
      seeds =
        [ "testnet4-seed-bch.bitcoinforks.org",
          "testnet4-seed-bch.toom.im",
          "seed.tbch4.loping.net",
          "testnet4-seed.flowee.cash"
        ],
      bip44Coin = 1,
      sigHashForkId = Just 0,
      edaHeight = Just 7,
      daaHeight = Just 3000,
      asertActivationTime = Just 1605441600,
      asertHalfLife = 60 * 60,
      segWit = False,
      cashAddrPrefix = Just "bchtest",
      bech32Prefix = Nothing,
      replaceByFee = False,
      halvingInterval = 210000
    }

-- | Testnet for Bitcoin Cash network.
bchTest :: Network
bchTest =
  Network
    { name = "bchtest",
      addrPrefix = 111,
      scriptPrefix = 196,
      secretPrefix = 239,
      xPubPrefix = 0x043587cf,
      xPrvPrefix = 0x04358394,
      magic = 0xf4e5f3f4,
      genesisHeader =
        BlockHeader
          0x01
          "0000000000000000000000000000000000000000000000000000000000000000"
          "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          1296688602
          486604799
          414098458,
      -- Hash 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
      maxBlockSize = 32000000,
      maxSatoshi = 2100000000000000,
      userAgent = "/haskoin-bch-test:" <> versionString <> "/",
      defaultPort = 18333,
      minDiffBlocks = True,
      powNoRetarget = False,
      powLimit =
        0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      bip34Block =
        ( 21111,
          "0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"
        ),
      bip65Height = 581885,
      bip66Height = 330776,
      targetTimespan = 14 * 24 * 60 * 60,
      targetSpacing = 10 * 60,
      checkpoints =
        [ ( 546,
            "000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"
          ),
          -- UAHF fork block.

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

          ( 1188697,
            "0000000000170ed0918077bde7b4d36cc4c91be69fa09211f748240dabe047fb"
          )
        ],
      seeds =
        [ "testnet-seed.bitcoinabc.org",
          "testnet-seed-bch.bitcoinforks.org",
          "testnet-seed.bchd.cash",
          "seed.tbch.loping.net"
        ],
      bip44Coin = 1,
      sigHashForkId = Just 0,
      edaHeight = Just 1155876,
      daaHeight = Just 1188697,
      asertActivationTime = Just 1605441600,
      asertHalfLife = 60 * 60,
      segWit = False,
      cashAddrPrefix = Just "bchtest",
      bech32Prefix = Nothing,
      replaceByFee = False,
      halvingInterval = 210000
    }

-- | RegTest for Bitcoin Cash network.
bchRegTest :: Network
bchRegTest =
  Network
    { name = "bchreg",
      addrPrefix = 111,
      scriptPrefix = 196,
      secretPrefix = 239,
      xPubPrefix = 0x043587cf,
      xPrvPrefix = 0x04358394,
      magic = 0xdab5bffa,
      genesisHeader =
        BlockHeader
          -- 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
          0x01
          "0000000000000000000000000000000000000000000000000000000000000000"
          "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
          1296688602
          0x207fffff
          2,
      maxBlockSize = 1000000,
      maxSatoshi = 2100000000000000,
      userAgent = "/haskoin-bch-regtest:" <> versionString <> "/",
      defaultPort = 18444,
      minDiffBlocks = True,
      powNoRetarget = True,
      powLimit =
        0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
      bip34Block =
        ( 100000000,
          "0000000000000000000000000000000000000000000000000000000000000000"
        ),
      bip65Height = 1351,
      bip66Height = 1251,
      targetTimespan = 14 * 24 * 60 * 60,
      targetSpacing = 10 * 60,
      checkpoints =
        [ ( 0,
            "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"
          )
        ],
      seeds = ["localhost"],
      bip44Coin = 1,
      sigHashForkId = Just 0,
      edaHeight = Nothing,
      daaHeight = Just 0,
      asertActivationTime = Just 1605441600,
      asertHalfLife = 2 * 24 * 60 * 60,
      segWit = False,
      cashAddrPrefix = Just "bchreg",
      bech32Prefix = Nothing,
      replaceByFee = False,
      halvingInterval = 150
    }

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