{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

module Test.Cardano.Ledger.Shelley.Serialisation.Golden.Genesis (
  tests,

  -- * Individual properties
  golden_json_ShelleyGenesis,
  golden_cbor_ShelleyGenesis,
) where

import Cardano.Ledger.BaseTypes (knownNonZeroBounded, textToDns, textToUrl)
import Cardano.Ledger.Binary (Tokens (..))
import qualified Cardano.Ledger.Binary.Plain as Plain
import Cardano.Ledger.Core (emptyPParams, ppDL, ppMaxBBSizeL, ppMaxBHSizeL)
import Cardano.Ledger.Keys (KeyRoleVRF (..), VRFVerKeyHash (..), hashKey)
import Cardano.Ledger.Shelley (ShelleyEra)
import qualified Cardano.Ledger.Shelley.API as L
import Cardano.Ledger.Shelley.Genesis
import Cardano.Protocol.Crypto (StandardCrypto, hashVerKeyVRF)
import Cardano.Slotting.Slot (EpochSize (..))
import Control.Monad
import Data.Aeson hiding (Encoding)
import qualified Data.ByteString.Char8 as BS (pack)
import qualified Data.ListMap as LM
import qualified Data.Map.Strict as Map
import Data.Maybe (fromJust)
import Data.Scientific (Scientific)
import qualified Data.Sequence.Strict as StrictSeq
import qualified Data.Set as Set
import Data.Time.Clock.POSIX (posixSecondsToUTCTime)
import Lens.Micro
import Paths_cardano_ledger_shelley_test (getDataFileName)
import Test.Cardano.Ledger.Binary.TreeDiff (CBORBytes (CBORBytes), ansiDocToString, diffExpr)
import Test.Cardano.Ledger.Core.KeyPair (vKey)
import qualified Test.Cardano.Ledger.Shelley.Examples.Cast as Cast
import Test.Cardano.Ledger.Shelley.Generator.Core (VRFKeyPair (..))
import Test.Cardano.Ledger.Shelley.Utils (
  RawSeed (..),
  mkKeyPair,
  mkVRFKeyPair,
  unsafeBoundRational,
 )
import Test.Tasty
import Test.Tasty.HUnit (Assertion, assertFailure, testCase, (@?=))

goldenTestJSON :: ToJSON a => a -> FilePath -> Assertion
goldenTestJSON :: forall a. ToJSON a => a -> FilePath -> Assertion
goldenTestJSON a
actual FilePath
expectedFile =
  case ByteString -> Either FilePath Value
forall a. FromJSON a => ByteString -> Either FilePath a
eitherDecode' (a -> ByteString
forall a. ToJSON a => a -> ByteString
encode a
actual) of
    Left FilePath
err -> FilePath -> Assertion
forall a. HasCallStack => FilePath -> a
error FilePath
err
    Right (Value
val :: Value) -> do
      Value
expected <- (FilePath -> Value)
-> (Value -> Value) -> Either FilePath Value -> Value
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either FilePath -> Value
forall a. HasCallStack => FilePath -> a
error Value -> Value
forall a. a -> a
id (Either FilePath Value -> Value)
-> IO (Either FilePath Value) -> IO Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FilePath -> IO (Either FilePath Value)
forall a. FromJSON a => FilePath -> IO (Either FilePath a)
eitherDecodeFileStrict FilePath
expectedFile
      Value
val Value -> Value -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= Value
expected

golden_json_ShelleyGenesis :: Assertion
golden_json_ShelleyGenesis :: Assertion
golden_json_ShelleyGenesis =
  ShelleyGenesis -> FilePath -> Assertion
forall a. ToJSON a => a -> FilePath -> Assertion
goldenTestJSON ShelleyGenesis
example (FilePath -> Assertion) -> IO FilePath -> Assertion
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< FilePath -> IO FilePath
getDataFileName FilePath
"test/Golden/ShelleyGenesis"
  where
    example :: ShelleyGenesis
    example :: ShelleyGenesis
example = ShelleyGenesis
exampleShelleyGenesis

golden_cbor_ShelleyGenesis :: Assertion
golden_cbor_ShelleyGenesis :: Assertion
golden_cbor_ShelleyGenesis =
  Bool -> Assertion -> Assertion
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ByteString
received ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
/= ByteString
expected) (Assertion -> Assertion) -> Assertion -> Assertion
forall a b. (a -> b) -> a -> b
$
    FilePath -> Assertion
forall a. HasCallStack => FilePath -> IO a
assertFailure (FilePath -> Assertion)
-> (Doc AnsiStyle -> FilePath) -> Doc AnsiStyle -> Assertion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> FilePath
ansiDocToString (Doc AnsiStyle -> Assertion) -> Doc AnsiStyle -> Assertion
forall a b. (a -> b) -> a -> b
$
      CBORBytes -> CBORBytes -> Doc AnsiStyle
forall a. ToExpr a => a -> a -> Doc AnsiStyle
diffExpr (ByteString -> CBORBytes
CBORBytes ByteString
expected) (ByteString -> CBORBytes
CBORBytes ByteString
received)
  where
    example :: ShelleyGenesis
    example :: ShelleyGenesis
example = ShelleyGenesis
exampleShelleyGenesis

    received :: ByteString
received = (Tokens -> Tokens) -> ByteString
forall a. ToCBOR a => a -> ByteString
Plain.serialize' Tokens -> Tokens
expectedTokens
    expected :: ByteString
expected = ShelleyGenesis -> ByteString
forall a. ToCBOR a => a -> ByteString
Plain.serialize' ShelleyGenesis
example

    expectedTokens :: Tokens -> Tokens
expectedTokens =
      Word -> Tokens -> Tokens
TkListLen Word
15
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
3
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
2009
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
44
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
83589000000000000 -- sgSystemStart
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
4036000900 -- sgNetworkMagic
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0 -- sgNetworkId
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
259
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1000 -- sgActiveSlotsCoeff
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
120842 -- sgSecurityParam
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1215 -- sgEpochLength
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
8541 -- sgSlotsPerKESPeriod
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
28899 -- sgMaxKESEvolutions
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
8000000 -- sgSlotLength
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
16991 -- sgUpdateQuorum
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
71 -- sgMaxLovelaceSupply
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
17 -- sgProtocolParams
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
239857
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
2048
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
17569
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
100
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkTag Word
30
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkTag Word
30
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkTag Word
30
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkTag Word
30
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
19
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1000
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkMapLen Word
1 -- sgGenDelegs
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"8\231\197\152j4\243\&4\225\155q,\n\165%\DC4m\171\143\SI\248\137\178\173\SYN\137BA"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"\230\150\r\214q\238\141s\222\SUB\131\209\&4[f\DC1e\220\221\235\169\150#\190\239/\NAKz"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"\252\227\FSo1\135S\RS\228\163\154\167C\194M\"'_AZ\136\149\233\205\"\195\f\138%\205\239\r"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkMapLen Word
1 -- sgInitialFunds
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"\NUL\225\186\222*\185FZ$\253^\170Ks\136\&09\ETB3\143\133:H\177\SUB_\201\150J\245\202\147\251e\SYN\235\222=\NAK\v>*\203\EM\tS'0\222\&3\131/\251\"\156\178\r"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
12157196
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2 -- sgStaking
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkMapLen Word
1 -- sgsPools
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"\245\131\164^IG\193\STX\t\ESC\150\ETB\SO\245\SO\240\207\142\219bfa\147\162\SYN2G\187"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
9 -- PoolParams
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"N\DC3\f\v\222\183v\142\223.\143\133\NUL\DEL\213 s\227\220\CANq\244\196\DEL\157\252\169."
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"h\249\207\211:\200\240D\250\204fM\181\170\ESCs\192\176\245C[\133\231\181 \187/\SUB\146\240)\153"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
5
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkTag Word
30
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
4
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"\224N\136\204-'\195d\170\249\ACKH\168}\251\149\248\238\DLE;\166\DEL\161\241/^\134\196*"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes ByteString
"N\136\204-'\195d\170\249\ACKH\168}\251\149\248\238\DLE;\166\DEL\161\241/^\134\196*"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
3
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
4
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
0
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1234
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes ByteString
"\NUL\NUL\NUL\NUL"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes ByteString
"\184\r\SOH \NUL\NUL\n\NUL\NUL\NUL\NUL\NUL#\SOH\NUL\NUL"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
3
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
1
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tokens -> Tokens
TkNull
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Tokens -> Tokens
TkString Text
"cool.domain.com"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Tokens -> Tokens
TkInt Int
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Tokens -> Tokens
TkString Text
"cool.domain.com"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkListLen Word
2
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Tokens -> Tokens
TkString Text
"best.pool.com"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes ByteString
"100ab{}100ab{}"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Tokens -> Tokens
TkMapLen Word
1 -- sgsStake
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes
          ByteString
"\131\161\146\222\192\232\218!\136\229 \208\197\&6\166\154t|\241s\163\223\SYN\166\218\169M\134"
        (Tokens -> Tokens) -> (Tokens -> Tokens) -> Tokens -> Tokens
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Tokens -> Tokens
TkBytes ByteString
"d\158\218\130\191dM4\166\146_$\234LL6\210~Q\222\ESCD\239G\227V\v\231"

-- TODO - return a CBOR diff in the case of failure

tests :: TestTree
tests :: TestTree
tests =
  FilePath -> [TestTree] -> TestTree
testGroup
    FilePath
"Shelley Genesis golden tests"
    [ FilePath -> Assertion -> TestTree
testCase FilePath
"ShelleyGenesis JSON golden test" Assertion
golden_json_ShelleyGenesis
    , FilePath -> Assertion -> TestTree
testCase FilePath
"ShelleyGenesis CBOR golden test" Assertion
golden_cbor_ShelleyGenesis
    ]

exampleShelleyGenesis :: ShelleyGenesis
exampleShelleyGenesis :: ShelleyGenesis
exampleShelleyGenesis =
  ShelleyGenesis
    { sgSystemStart :: UTCTime
sgSystemStart = POSIXTime -> UTCTime
posixSecondsToUTCTime (POSIXTime -> UTCTime) -> POSIXTime -> UTCTime
forall a b. (a -> b) -> a -> b
$ Integer -> POSIXTime
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Integer
1234566789 :: Integer)
    , sgNetworkMagic :: Word32
sgNetworkMagic = Word32
4036000900
    , sgNetworkId :: Network
sgNetworkId = Network
L.Testnet
    , sgActiveSlotsCoeff :: PositiveUnitInterval
sgActiveSlotsCoeff = Rational -> PositiveUnitInterval
forall r.
(HasCallStack, Typeable r, BoundedRational r) =>
Rational -> r
unsafeBoundRational Rational
0.259
    , sgSecurityParam :: NonZero Word64
sgSecurityParam = forall (n :: Natural) a.
(KnownNat n, 1 <= n, WithinBounds n a, Num a) =>
NonZero a
knownNonZeroBounded @120842
    , sgEpochLength :: EpochSize
sgEpochLength = Word64 -> EpochSize
EpochSize Word64
1215
    , sgSlotsPerKESPeriod :: Word64
sgSlotsPerKESPeriod = Word64
8541
    , sgMaxKESEvolutions :: Word64
sgMaxKESEvolutions = Word64
28899
    , sgSlotLength :: NominalDiffTimeMicro
sgSlotLength = NominalDiffTimeMicro
8
    , sgUpdateQuorum :: Word64
sgUpdateQuorum = Word64
16991
    , sgMaxLovelaceSupply :: Word64
sgMaxLovelaceSupply = Word64
71
    , sgProtocolParams :: PParams ShelleyEra
sgProtocolParams =
        forall era. EraPParams era => PParams era
emptyPParams @ShelleyEra
          PParams ShelleyEra
-> (PParams ShelleyEra -> PParams ShelleyEra) -> PParams ShelleyEra
forall a b. a -> (a -> b) -> b
& (UnitInterval -> Identity UnitInterval)
-> PParams ShelleyEra -> Identity (PParams ShelleyEra)
forall era.
(EraPParams era, ProtVerAtMost era 6) =>
Lens' (PParams era) UnitInterval
Lens' (PParams ShelleyEra) UnitInterval
ppDL ((UnitInterval -> Identity UnitInterval)
 -> PParams ShelleyEra -> Identity (PParams ShelleyEra))
-> UnitInterval -> PParams ShelleyEra -> PParams ShelleyEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Rational -> UnitInterval
forall r.
(HasCallStack, Typeable r, BoundedRational r) =>
Rational -> r
unsafeBoundRational (Scientific -> Rational
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Scientific
1.9e-2 :: Scientific))
          PParams ShelleyEra
-> (PParams ShelleyEra -> PParams ShelleyEra) -> PParams ShelleyEra
forall a b. a -> (a -> b) -> b
& (Word32 -> Identity Word32)
-> PParams ShelleyEra -> Identity (PParams ShelleyEra)
forall era. EraPParams era => Lens' (PParams era) Word32
Lens' (PParams ShelleyEra) Word32
ppMaxBBSizeL ((Word32 -> Identity Word32)
 -> PParams ShelleyEra -> Identity (PParams ShelleyEra))
-> Word32 -> PParams ShelleyEra -> PParams ShelleyEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Word32
239857
          PParams ShelleyEra
-> (PParams ShelleyEra -> PParams ShelleyEra) -> PParams ShelleyEra
forall a b. a -> (a -> b) -> b
& (Word16 -> Identity Word16)
-> PParams ShelleyEra -> Identity (PParams ShelleyEra)
forall era. EraPParams era => Lens' (PParams era) Word16
Lens' (PParams ShelleyEra) Word16
ppMaxBHSizeL ((Word16 -> Identity Word16)
 -> PParams ShelleyEra -> Identity (PParams ShelleyEra))
-> Word16 -> PParams ShelleyEra -> PParams ShelleyEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Word16
17569
    , sgGenDelegs :: Map (KeyHash 'Genesis) GenDelegPair
sgGenDelegs = [(KeyHash 'Genesis, GenDelegPair)]
-> Map (KeyHash 'Genesis) GenDelegPair
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(KeyHash 'Genesis
genesisVerKeyHash, GenDelegPair
genDelegPair)]
    , sgInitialFunds :: ListMap Addr Coin
sgInitialFunds = [(Addr, Coin)] -> ListMap Addr Coin
forall k v. [(k, v)] -> ListMap k v
LM.ListMap [(Addr
initialFundedAddress, Coin
initialFunds)]
    , sgStaking :: ShelleyGenesisStaking
sgStaking = ShelleyGenesisStaking
staking
    }
  where
    -- hash of the genesis verification key
    genesisVerKeyHash :: L.KeyHash 'L.Genesis
    genesisVerKeyHash :: KeyHash 'Genesis
genesisVerKeyHash = Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash 'Genesis
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"38e7c5986a34f334e19b712c0aa525146dab8f0ff889b2ad16894241"
    -- hash of the delegators verififation key
    genDelegPair :: GenDelegPair
genDelegPair = KeyHash 'GenesisDelegate
-> VRFVerKeyHash 'GenDelegVRF -> GenDelegPair
L.GenDelegPair KeyHash 'GenesisDelegate
delegVerKeyHash VRFVerKeyHash 'GenDelegVRF
delegVrfKeyHash
    delegVerKeyHash :: L.KeyHash 'L.GenesisDelegate
    delegVerKeyHash :: KeyHash 'GenesisDelegate
delegVerKeyHash = Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash 'GenesisDelegate
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"e6960dd671ee8d73de1a83d1345b661165dcddeba99623beef2f157a"
    delegVrfKeyHash :: VRFVerKeyHash 'GenDelegVRF
    delegVrfKeyHash :: VRFVerKeyHash 'GenDelegVRF
delegVrfKeyHash = Hash HASH KeyRoleVRF -> VRFVerKeyHash 'GenDelegVRF
forall (r :: KeyRoleVRF). Hash HASH KeyRoleVRF -> VRFVerKeyHash r
VRFVerKeyHash Hash HASH KeyRoleVRF
"fce31c6f3187531ee4a39aa743c24d22275f415a8895e9cd22c30c8a25cdef0d"
    initialFundedAddress :: L.Addr
    initialFundedAddress :: Addr
initialFundedAddress =
      Network -> PaymentCredential -> StakeReference -> Addr
L.Addr
        Network
L.Testnet
        PaymentCredential
forall {kr :: KeyRole}. Credential kr
paymentCredential
        (StakeCredential -> StakeReference
L.StakeRefBase StakeCredential
forall {kr :: KeyRole}. Credential kr
stakingCredential)
      where
        paymentCredential :: Credential kr
paymentCredential =
          KeyHash kr -> Credential kr
forall (kr :: KeyRole). KeyHash kr -> Credential kr
L.KeyHashObj (KeyHash kr -> Credential kr) -> KeyHash kr -> Credential kr
forall a b. (a -> b) -> a -> b
$
            Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash kr
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash
              Hash ADDRHASH (VerKeyDSIGN DSIGN)
"e1bade2ab9465a24fd5eaa4b7388303917338f853a48b11a5fc9964a"
        stakingCredential :: Credential kr
stakingCredential =
          KeyHash kr -> Credential kr
forall (kr :: KeyRole). KeyHash kr -> Credential kr
L.KeyHashObj (KeyHash kr -> Credential kr) -> KeyHash kr -> Credential kr
forall a b. (a -> b) -> a -> b
$
            Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash kr
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash
              Hash ADDRHASH (VerKeyDSIGN DSIGN)
"f5ca93fb6516ebde3d150b3e2acb1909532730de33832ffb229cb20d"
    initialFunds :: L.Coin
    initialFunds :: Coin
initialFunds = Integer -> Coin
L.Coin Integer
12157196
    relays :: StrictSeq StakePoolRelay
relays =
      [StakePoolRelay] -> StrictSeq StakePoolRelay
forall a. [a] -> StrictSeq a
StrictSeq.fromList
        [ StrictMaybe Port
-> StrictMaybe IPv4 -> StrictMaybe IPv6 -> StakePoolRelay
L.SingleHostAddr
            (Port -> StrictMaybe Port
forall a. a -> StrictMaybe a
L.SJust (Port -> StrictMaybe Port) -> Port -> StrictMaybe Port
forall a b. (a -> b) -> a -> b
$ Word16 -> Port
L.Port Word16
1234)
            (IPv4 -> StrictMaybe IPv4
forall a. a -> StrictMaybe a
L.SJust (IPv4 -> StrictMaybe IPv4) -> IPv4 -> StrictMaybe IPv4
forall a b. (a -> b) -> a -> b
$ FilePath -> IPv4
forall a. Read a => FilePath -> a
read FilePath
"0.0.0.0")
            (IPv6 -> StrictMaybe IPv6
forall a. a -> StrictMaybe a
L.SJust (IPv6 -> StrictMaybe IPv6) -> IPv6 -> StrictMaybe IPv6
forall a b. (a -> b) -> a -> b
$ FilePath -> IPv6
forall a. Read a => FilePath -> a
read FilePath
"2001:db8:a::123")
        , StrictMaybe Port -> DnsName -> StakePoolRelay
L.SingleHostName StrictMaybe Port
forall a. StrictMaybe a
L.SNothing (Maybe DnsName -> DnsName
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DnsName -> DnsName) -> Maybe DnsName -> DnsName
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Maybe DnsName
forall (m :: * -> *). MonadFail m => Int -> Text -> m DnsName
textToDns Int
64 Text
"cool.domain.com")
        , DnsName -> StakePoolRelay
L.MultiHostName (Maybe DnsName -> DnsName
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DnsName -> DnsName) -> Maybe DnsName -> DnsName
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Maybe DnsName
forall (m :: * -> *). MonadFail m => Int -> Text -> m DnsName
textToDns Int
64 Text
"cool.domain.com")
        ]
    poolParams :: L.PoolParams
    poolParams :: PoolParams
poolParams =
      L.PoolParams
        { ppId :: KeyHash 'StakePool
L.ppId = VKey 'StakePool -> KeyHash 'StakePool
forall (kd :: KeyRole). VKey kd -> KeyHash kd
hashKey (VKey 'StakePool -> KeyHash 'StakePool)
-> ((SignKeyDSIGN DSIGN, VKey 'StakePool) -> VKey 'StakePool)
-> (SignKeyDSIGN DSIGN, VKey 'StakePool)
-> KeyHash 'StakePool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SignKeyDSIGN DSIGN, VKey 'StakePool) -> VKey 'StakePool
forall a b. (a, b) -> b
snd ((SignKeyDSIGN DSIGN, VKey 'StakePool) -> KeyHash 'StakePool)
-> (SignKeyDSIGN DSIGN, VKey 'StakePool) -> KeyHash 'StakePool
forall a b. (a -> b) -> a -> b
$ RawSeed -> (SignKeyDSIGN DSIGN, VKey 'StakePool)
forall (kd :: KeyRole). RawSeed -> (SignKeyDSIGN DSIGN, VKey kd)
mkKeyPair (Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> RawSeed
RawSeed Word64
1 Word64
0 Word64
0 Word64
0 Word64
1)
        , ppVrf :: VRFVerKeyHash 'StakePoolVRF
L.ppVrf =
            forall c (r :: KeyRoleVRF).
Crypto c =>
VerKeyVRF (VRF c) -> VRFVerKeyHash r
hashVerKeyVRF @StandardCrypto (VerKeyVRF PraosVRF -> VRFVerKeyHash 'StakePoolVRF)
-> (VRFKeyPair StandardCrypto -> VerKeyVRF PraosVRF)
-> VRFKeyPair StandardCrypto
-> VRFVerKeyHash 'StakePoolVRF
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VRFKeyPair StandardCrypto -> VerKeyVRF PraosVRF
VRFKeyPair StandardCrypto -> VerKeyVRF (VRF StandardCrypto)
forall c. VRFKeyPair c -> VerKeyVRF (VRF c)
vrfVerKey (VRFKeyPair StandardCrypto -> VRFVerKeyHash 'StakePoolVRF)
-> VRFKeyPair StandardCrypto -> VRFVerKeyHash 'StakePoolVRF
forall a b. (a -> b) -> a -> b
$ forall c. Crypto c => RawSeed -> VRFKeyPair c
mkVRFKeyPair @StandardCrypto (Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> RawSeed
RawSeed Word64
1 Word64
0 Word64
0 Word64
0 Word64
2)
        , ppPledge :: Coin
L.ppPledge = Integer -> Coin
L.Coin Integer
1
        , ppCost :: Coin
L.ppCost = Integer -> Coin
L.Coin Integer
5
        , ppMargin :: UnitInterval
L.ppMargin = Rational -> UnitInterval
forall r.
(HasCallStack, Typeable r, BoundedRational r) =>
Rational -> r
unsafeBoundRational Rational
0.25
        , ppRewardAccount :: RewardAccount
L.ppRewardAccount = Network -> StakeCredential -> RewardAccount
L.RewardAccount Network
L.Testnet StakeCredential
Cast.aliceSHK
        , ppOwners :: Set (KeyHash 'Staking)
L.ppOwners = KeyHash 'Staking -> Set (KeyHash 'Staking)
forall a. a -> Set a
Set.singleton (KeyHash 'Staking -> Set (KeyHash 'Staking))
-> KeyHash 'Staking -> Set (KeyHash 'Staking)
forall a b. (a -> b) -> a -> b
$ VKey 'Staking -> KeyHash 'Staking
forall (kd :: KeyRole). VKey kd -> KeyHash kd
hashKey (KeyPair 'Staking -> VKey 'Staking
forall (kd :: KeyRole). KeyPair kd -> VKey kd
vKey KeyPair 'Staking
Cast.aliceStake)
        , ppRelays :: StrictSeq StakePoolRelay
L.ppRelays = StrictSeq StakePoolRelay
relays
        , ppMetadata :: StrictMaybe PoolMetadata
L.ppMetadata =
            PoolMetadata -> StrictMaybe PoolMetadata
forall a. a -> StrictMaybe a
L.SJust (PoolMetadata -> StrictMaybe PoolMetadata)
-> PoolMetadata -> StrictMaybe PoolMetadata
forall a b. (a -> b) -> a -> b
$
              L.PoolMetadata
                { pmUrl :: Url
L.pmUrl = Maybe Url -> Url
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Url -> Url) -> Maybe Url -> Url
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Maybe Url
forall (m :: * -> *). MonadFail m => Int -> Text -> m Url
textToUrl Int
64 Text
"best.pool.com"
                , pmHash :: ByteString
L.pmHash = FilePath -> ByteString
BS.pack FilePath
"100ab{}100ab{}"
                }
        }
    staking :: ShelleyGenesisStaking
staking =
      ShelleyGenesisStaking
        { sgsPools :: ListMap (KeyHash 'StakePool) PoolParams
sgsPools =
            [(KeyHash 'StakePool, PoolParams)]
-> ListMap (KeyHash 'StakePool) PoolParams
forall k v. [(k, v)] -> ListMap k v
LM.ListMap
              [ (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash 'StakePool
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"f583a45e4947c102091b96170ef50ef0cf8edb62666193a2163247bb", PoolParams
poolParams)
              ]
        , sgsStake :: ListMap (KeyHash 'Staking) (KeyHash 'StakePool)
sgsStake =
            [(KeyHash 'Staking, KeyHash 'StakePool)]
-> ListMap (KeyHash 'Staking) (KeyHash 'StakePool)
forall k v. [(k, v)] -> ListMap k v
LM.ListMap
              [
                ( Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash 'Staking
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"83a192dec0e8da2188e520d0c536a69a747cf173a3df16a6daa94d86"
                , Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash 'StakePool
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
L.KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"649eda82bf644d34a6925f24ea4c4c36d27e51de1b44ef47e3560be7"
                )
              ]
        }