{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Allegra.HuddleSpec (
  module Cardano.Ledger.Shelley.HuddleSpec,
  allegraCDDL,
  blockRule,
  transactionRule,
  auxiliaryScriptsRule,
  auxiliaryDataArrayRule,
  auxiliaryDataRule,
  minInt64Rule,
  maxInt64Rule,
  int64Rule,
  nativeScriptRule,
  scriptNOfKGroup,
  scriptInvalidBeforeGroup,
  scriptInvalidHereafterGroup,
) where

import Cardano.Ledger.Allegra (AllegraEra)
import Cardano.Ledger.Shelley.HuddleSpec
import Codec.CBOR.Cuddle.Huddle
import Data.Proxy (Proxy (..))
import Text.Heredoc
import Prelude hiding ((/))

allegraCDDL :: Huddle
allegraCDDL :: Huddle
allegraCDDL =
  [HuddleItem] -> Huddle
collectFrom
    [ Rule -> HuddleItem
HIRule (Rule -> HuddleItem) -> Rule -> HuddleItem
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"block" (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @AllegraEra)
    , Rule -> HuddleItem
HIRule (Rule -> HuddleItem) -> Rule -> HuddleItem
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction" (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @AllegraEra)
    ]

blockRule ::
  forall era.
  ( HuddleRule "header" era
  , HuddleRule "transaction_body" era
  , HuddleRule "transaction_witness_set" era
  , HuddleRule "auxiliary_data" era
  ) =>
  Proxy era ->
  Rule
blockRule :: forall era.
(HuddleRule "header" era, HuddleRule "transaction_body" era,
 HuddleRule "transaction_witness_set" era,
 HuddleRule "auxiliary_data" era) =>
Proxy era -> Rule
blockRule Proxy era
p =
  Text
"block"
    Text -> ArrayChoice -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= ArrayChoice -> ArrayChoice
arr
      [ Rule -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Rule -> Item ArrayChoice) -> Rule -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"header" Proxy era
p
      , Key
"transaction_bodies" Key -> ArrayChoice -> ArrayEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> ArrayChoice -> ArrayChoice
arr [Word64
0 Word64 -> ArrayEntry -> ArrayEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_body" Proxy era
p)]
      , Key
"transaction_witness_sets" Key -> ArrayChoice -> ArrayEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> ArrayChoice -> ArrayChoice
arr [Word64
0 Word64 -> ArrayEntry -> ArrayEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_witness_set" Proxy era
p)]
      , Key
"auxiliary_data_set"
          Key -> MapChoice -> ArrayEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> MapChoice -> MapChoice
mp
            [ Word64
0
                Word64 -> MapEntry -> MapEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> Key
forall r. IsType0 r => r -> Key
asKey (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_index" Proxy era
p)
                Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"auxiliary_data" Proxy era
p
            ]
      ]

transactionRule ::
  forall era.
  ( HuddleRule "transaction_body" era
  , HuddleRule "transaction_witness_set" era
  , HuddleRule "auxiliary_data" era
  ) =>
  Proxy era ->
  Rule
transactionRule :: forall era.
(HuddleRule "transaction_body" era,
 HuddleRule "transaction_witness_set" era,
 HuddleRule "auxiliary_data" era) =>
Proxy era -> Rule
transactionRule Proxy era
p =
  Text
"transaction"
    Text -> ArrayChoice -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= ArrayChoice -> ArrayChoice
arr
      [ Rule -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Rule -> Item ArrayChoice) -> Rule -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_body" Proxy era
p
      , Rule -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Rule -> Item ArrayChoice) -> Rule -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_witness_set" Proxy era
p
      , Choice Type2 -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"auxiliary_data" Proxy era
p Rule -> Value Void -> Choice Type2
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ Value Void
VNil)
      ]

auxiliaryScriptsRule :: forall era. HuddleRule "native_script" era => Proxy era -> Rule
auxiliaryScriptsRule :: forall era. HuddleRule "native_script" era => Proxy era -> Rule
auxiliaryScriptsRule Proxy era
p = Text
"auxiliary_scripts" Text -> ArrayChoice -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= ArrayChoice -> ArrayChoice
arr [Word64
0 Word64 -> ArrayEntry -> ArrayEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"native_script" Proxy era
p)]

auxiliaryDataArrayRule ::
  forall era. HuddleRule "auxiliary_scripts" era => Proxy era -> Rule
auxiliaryDataArrayRule :: forall era. HuddleRule "auxiliary_scripts" era => Proxy era -> Rule
auxiliaryDataArrayRule Proxy era
p =
  Text
"auxiliary_data_array"
    Text -> ArrayChoice -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= ArrayChoice -> ArrayChoice
arr
      [ Key
"transaction_metadata" Key -> Rule -> ArrayEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"metadata" Proxy era
p
      , Key
"auxiliary_scripts" Key -> Rule -> ArrayEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"auxiliary_scripts" Proxy era
p
      ]

auxiliaryDataRule ::
  forall era. HuddleRule "auxiliary_data_array" era => Proxy era -> Rule
auxiliaryDataRule :: forall era.
HuddleRule "auxiliary_data_array" era =>
Proxy era -> Rule
auxiliaryDataRule Proxy era
p =
  Text
"auxiliary_data"
    Text -> Choice Type2 -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"metadata" Proxy era
p
    Rule -> Rule -> Choice Type2
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"auxiliary_data_array" Proxy era
p

minInt64Rule :: Rule
minInt64Rule :: Rule
minInt64Rule = Text
"min_int64" Text -> Integer -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= (-Integer
9223372036854775808 :: Integer)

maxInt64Rule :: Rule
maxInt64Rule :: Rule
maxInt64Rule = Text
"max_int64" Text -> Integer -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= (Integer
9223372036854775807 :: Integer)

int64Rule ::
  forall era. (HuddleRule "min_int64" era, HuddleRule "max_int64" era) => Proxy era -> Rule
int64Rule :: forall era.
(HuddleRule "min_int64" era, HuddleRule "max_int64" era) =>
Proxy era -> Rule
int64Rule Proxy era
p = Text
"int64" Text -> Ranged -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"min_int64" Proxy era
p Rule -> Rule -> Ranged
forall a b. (IsRangeBound a, IsRangeBound b) => a -> b -> Ranged
... forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"max_int64" Proxy era
p

nativeScriptRule ::
  forall era.
  ( HuddleGroup "script_pubkey" era
  , HuddleGroup "script_all" era
  , HuddleGroup "script_any" era
  , HuddleGroup "script_n_of_k" era
  , HuddleGroup "script_invalid_before" era
  , HuddleGroup "script_invalid_hereafter" era
  ) =>
  Proxy era ->
  Rule
nativeScriptRule :: forall era.
(HuddleGroup "script_pubkey" era, HuddleGroup "script_all" era,
 HuddleGroup "script_any" era, HuddleGroup "script_n_of_k" era,
 HuddleGroup "script_invalid_before" era,
 HuddleGroup "script_invalid_hereafter" era) =>
Proxy era -> Rule
nativeScriptRule Proxy era
p =
  Text -> Rule -> Rule
forall a. HasField' "description" a (Maybe Text) => Text -> a -> a
comment
    Text
[str|Allegra introduces timelock support for native scripts.
        |
        |Timelock validity intervals are half-open intervals [a, b).
        |  script_invalid_before: specifies the left (included) endpoint a.
        |  script_invalid_hereafter: specifies the right (excluded) endpoint b.
        |
        |Note: Allegra switched to int64 for script_n_of_k thresholds.
        |]
    (Rule -> Rule) -> Rule -> Rule
forall a b. (a -> b) -> a -> b
$ Text
"native_script"
      Text -> Choice ArrayChoice -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= ArrayChoice -> ArrayChoice
arr [Named Group -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Named Group -> Item ArrayChoice)
-> Named Group -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> Named Group
huddleGroup @"script_pubkey" Proxy era
p]
      ArrayChoice -> ArrayChoice -> Choice ArrayChoice
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ ArrayChoice -> ArrayChoice
arr [Named Group -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Named Group -> Item ArrayChoice)
-> Named Group -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> Named Group
huddleGroup @"script_all" Proxy era
p]
      Choice ArrayChoice -> ArrayChoice -> Choice ArrayChoice
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ ArrayChoice -> ArrayChoice
arr [Named Group -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Named Group -> Item ArrayChoice)
-> Named Group -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> Named Group
huddleGroup @"script_any" Proxy era
p]
      Choice ArrayChoice -> ArrayChoice -> Choice ArrayChoice
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ ArrayChoice -> ArrayChoice
arr [Named Group -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Named Group -> Item ArrayChoice)
-> Named Group -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> Named Group
huddleGroup @"script_n_of_k" Proxy era
p]
      Choice ArrayChoice -> ArrayChoice -> Choice ArrayChoice
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ ArrayChoice -> ArrayChoice
arr [Named Group -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Named Group -> Item ArrayChoice)
-> Named Group -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> Named Group
huddleGroup @"script_invalid_before" Proxy era
p]
      Choice ArrayChoice -> ArrayChoice -> Choice ArrayChoice
forall a c b.
(IsChoosable a c, IsChoosable b c) =>
a -> b -> Choice c
/ ArrayChoice -> ArrayChoice
arr [Named Group -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (Named Group -> Item ArrayChoice)
-> Named Group -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> Named Group
huddleGroup @"script_invalid_hereafter" Proxy era
p]

scriptNOfKGroup ::
  forall era.
  (HuddleRule "int64" era, HuddleRule "native_script" era) =>
  Proxy era ->
  Named Group
scriptNOfKGroup :: forall era.
(HuddleRule "int64" era, HuddleRule "native_script" era) =>
Proxy era -> Named Group
scriptNOfKGroup Proxy era
p =
  Text
"script_n_of_k"
    Text -> Group -> Named Group
=:~ Group -> Group
grp
      [ Item Group
ArrayEntry
3
      , Key
"n" Key -> Rule -> ArrayEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"int64" Proxy era
p
      , ArrayChoice -> Item Group
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (ArrayChoice -> Item Group) -> ArrayChoice -> Item Group
forall a b. (a -> b) -> a -> b
$ ArrayChoice -> ArrayChoice
arr [Word64
0 Word64 -> ArrayEntry -> ArrayEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"native_script" Proxy era
p)]
      ]

scriptInvalidBeforeGroup ::
  forall era. Era era => Proxy era -> Named Group
scriptInvalidBeforeGroup :: forall era. Era era => Proxy era -> Named Group
scriptInvalidBeforeGroup Proxy era
p =
  Text -> Named Group -> Named Group
forall a. HasField' "description" a (Maybe Text) => Text -> a -> a
comment
    Text
[str|Timelock validity intervals are half-open intervals [a, b).
        |This field specifies the left (included) endpoint a.
        |]
    (Named Group -> Named Group) -> Named Group -> Named Group
forall a b. (a -> b) -> a -> b
$ Text
"script_invalid_before"
      Text -> Group -> Named Group
=:~ Group -> Group
grp [Item Group
ArrayEntry
4, Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"slot" Proxy era
p)]

scriptInvalidHereafterGroup ::
  forall era. Era era => Proxy era -> Named Group
scriptInvalidHereafterGroup :: forall era. Era era => Proxy era -> Named Group
scriptInvalidHereafterGroup Proxy era
p =
  Text -> Named Group -> Named Group
forall a. HasField' "description" a (Maybe Text) => Text -> a -> a
comment
    Text
[str|Timelock validity intervals are half-open intervals [a, b).
        |This field specifies the right (excluded) endpoint b.
        |]
    (Named Group -> Named Group) -> Named Group -> Named Group
forall a b. (a -> b) -> a -> b
$ Text
"script_invalid_hereafter"
      Text -> Group -> Named Group
=:~ Group -> Group
grp [Item Group
ArrayEntry
5, Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"slot" Proxy era
p)]

instance HuddleRule "major_protocol_version" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
majorProtocolVersionRule @AllegraEra

instance HuddleGroup "protocol_version" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
HuddleRule "major_protocol_version" era =>
Proxy era -> Named Group
shelleyProtocolVersionGroup @AllegraEra

instance HuddleRule "protocol_param_update" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleGroup "protocol_version" era => Proxy era -> Rule
protocolParamUpdateRule @AllegraEra

instance HuddleRule "proposed_protocol_parameter_updates" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleRule "genesis_hash" era,
 HuddleRule "protocol_param_update" era) =>
Proxy era -> Rule
proposedProtocolParameterUpdatesRule @AllegraEra

instance HuddleRule "update" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
HuddleRule "proposed_protocol_parameter_updates" era =>
Proxy era -> Rule
updateRule @AllegraEra

instance HuddleRule "genesis_hash" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
genesisHashRule @AllegraEra

instance HuddleGroup "operational_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
shelleyOperationalCertGroup @AllegraEra

instance HuddleRule "header_body" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleGroup "operational_cert" era,
 HuddleGroup "protocol_version" era) =>
Proxy era -> Rule
headerBodyRule @AllegraEra

instance HuddleRule "header" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleRule "header_body" era => Proxy era -> Rule
headerRule @AllegraEra

instance HuddleRule "min_int64" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule Proxy AllegraEra
_ = Rule
minInt64Rule

instance HuddleRule "max_int64" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule Proxy AllegraEra
_ = Rule
maxInt64Rule

instance HuddleRule "int64" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleRule "min_int64" era, HuddleRule "max_int64" era) =>
Proxy era -> Rule
int64Rule @AllegraEra

instance HuddleGroup "script_all" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
HuddleRule "native_script" era =>
Proxy era -> Named Group
scriptAllGroup @AllegraEra

instance HuddleGroup "script_any" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
HuddleRule "native_script" era =>
Proxy era -> Named Group
scriptAnyGroup @AllegraEra

instance HuddleGroup "script_n_of_k" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
(HuddleRule "int64" era, HuddleRule "native_script" era) =>
Proxy era -> Named Group
scriptNOfKGroup @AllegraEra

instance HuddleGroup "script_invalid_before" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
scriptInvalidBeforeGroup @AllegraEra

instance HuddleGroup "script_invalid_hereafter" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
scriptInvalidHereafterGroup @AllegraEra

instance HuddleRule "native_script" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleGroup "script_pubkey" era, HuddleGroup "script_all" era,
 HuddleGroup "script_any" era, HuddleGroup "script_n_of_k" era,
 HuddleGroup "script_invalid_before" era,
 HuddleGroup "script_invalid_hereafter" era) =>
Proxy era -> Rule
nativeScriptRule @AllegraEra

instance HuddleRule "vkeywitness" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
vkeywitnessRule @AllegraEra

instance HuddleRule "bootstrap_witness" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
bootstrapWitnessRule @AllegraEra

instance HuddleRule "transaction_witness_set" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleRule "vkeywitness" era, HuddleRule "native_script" era,
 HuddleRule "bootstrap_witness" era) =>
Proxy era -> Rule
transactionWitnessSetRule @AllegraEra

instance HuddleGroup "script_pubkey" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
scriptPubkeyGroup @AllegraEra

instance HuddleRule "transaction_id" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
transactionIdRule @AllegraEra

instance HuddleRule "transaction_input" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleRule "transaction_id" era => Proxy era -> Rule
transactionInputRule @AllegraEra

instance HuddleRule "transaction_output" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
transactionOutputRule @AllegraEra

instance HuddleRule "dns_name" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule Proxy AllegraEra
_ = Rule
dnsNameRule

instance HuddleRule "url" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule Proxy AllegraEra
_ = Rule
urlRule

instance HuddleRule "pool_metadata" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleRule "url" era => Proxy era -> Rule
poolMetadataRule @AllegraEra

instance HuddleGroup "single_host_addr" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
singleHostAddrGroup @AllegraEra

instance HuddleGroup "single_host_name" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. HuddleRule "dns_name" era => Proxy era -> Named Group
singleHostNameGroup @AllegraEra

instance HuddleGroup "multi_host_name" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. HuddleRule "dns_name" era => Proxy era -> Named Group
multiHostNameGroup @AllegraEra

instance HuddleRule "relay" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleGroup "single_host_addr" era,
 HuddleGroup "single_host_name" era,
 HuddleGroup "multi_host_name" era) =>
Proxy era -> Rule
relayRule @AllegraEra

instance HuddleGroup "pool_params" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
(HuddleRule "relay" era, HuddleRule "pool_metadata" era) =>
Proxy era -> Named Group
poolParamsGroup @AllegraEra

instance HuddleGroup "pool_registration_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
HuddleGroup "pool_params" era =>
Proxy era -> Named Group
poolRegistrationCertGroup @AllegraEra

instance HuddleGroup "pool_retirement_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
poolRetirementCertGroup @AllegraEra

instance HuddleRule "genesis_delegate_hash" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
genesisDelegateHashRule @AllegraEra

instance HuddleGroup "genesis_delegation_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
(HuddleRule "genesis_hash" era,
 HuddleRule "genesis_delegate_hash" era) =>
Proxy era -> Named Group
genesisDelegationCertGroup @AllegraEra

instance HuddleRule "delta_coin" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule Proxy AllegraEra
_ = Rule
deltaCoinRule

instance HuddleRule "move_instantaneous_reward" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleRule "delta_coin" era => Proxy era -> Rule
moveInstantaneousRewardRule @AllegraEra

instance HuddleGroup "move_instantaneous_rewards_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era.
HuddleRule "move_instantaneous_reward" era =>
Proxy era -> Named Group
moveInstantaneousRewardsCertGroup @AllegraEra

instance HuddleGroup "account_registration_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
accountRegistrationCertGroup @AllegraEra

instance HuddleGroup "account_unregistration_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
accountUnregistrationCertGroup @AllegraEra

instance HuddleGroup "delegation_to_stake_pool_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> Named Group
huddleGroup = forall era. Era era => Proxy era -> Named Group
delegationToStakePoolCertGroup @AllegraEra

instance HuddleRule "certificate" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleGroup "account_registration_cert" era,
 HuddleGroup "account_unregistration_cert" era,
 HuddleGroup "delegation_to_stake_pool_cert" era,
 HuddleGroup "pool_registration_cert" era,
 HuddleGroup "pool_retirement_cert" era,
 HuddleGroup "genesis_delegation_cert" era,
 HuddleGroup "move_instantaneous_rewards_cert" era) =>
Proxy era -> Rule
certificateRule @AllegraEra

instance HuddleRule "withdrawals" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. Era era => Proxy era -> Rule
withdrawalsRule @AllegraEra

instance HuddleRule "auxiliary_scripts" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleRule "native_script" era => Proxy era -> Rule
auxiliaryScriptsRule @AllegraEra

instance HuddleRule "auxiliary_data_array" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era. HuddleRule "auxiliary_scripts" era => Proxy era -> Rule
auxiliaryDataArrayRule @AllegraEra

instance HuddleRule "auxiliary_data" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
HuddleRule "auxiliary_data_array" era =>
Proxy era -> Rule
auxiliaryDataRule @AllegraEra

instance HuddleRule "transaction_body" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule Proxy AllegraEra
p =
    Text -> Rule -> Rule
forall a. HasField' "description" a (Maybe Text) => Text -> a -> a
comment
      Text
[str|Allegra transaction body adds the validity interval start at index 8
          |]
      (Rule -> Rule) -> Rule -> Rule
forall a b. (a -> b) -> a -> b
$ Text
"transaction_body"
        Text -> MapChoice -> Rule
forall a. IsType0 a => Text -> a -> Rule
=:= MapChoice -> MapChoice
mp
          [ Word64 -> Key
idx Word64
0 Key -> GRuleCall -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> Rule -> GRuleCall
forall a. IsType0 a => a -> GRuleCall
untaggedSet (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_input" Proxy AllegraEra
p)
          , Word64 -> Key
idx Word64
1 Key -> ArrayChoice -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> ArrayChoice -> ArrayChoice
arr [Word64
0 Word64 -> ArrayEntry -> ArrayEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"transaction_output" Proxy AllegraEra
p)]
          , Word64 -> Key
idx Word64
2 Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"coin" Proxy AllegraEra
p
          , MapEntry -> MapEntry
forall a. CanQuantify a => a -> a
opt (Word64 -> Key
idx Word64
3 Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"slot" Proxy AllegraEra
p)
          , MapEntry -> MapEntry
forall a. CanQuantify a => a -> a
opt (Word64 -> Key
idx Word64
4 Key -> ArrayChoice -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> ArrayChoice -> ArrayChoice
arr [Word64
0 Word64 -> ArrayEntry -> ArrayEntry
forall a. CanQuantify a => Word64 -> a -> a
<+ Rule -> ArrayEntry
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"certificate" Proxy AllegraEra
p)])
          , MapEntry -> MapEntry
forall a. CanQuantify a => a -> a
opt (Word64 -> Key
idx Word64
5 Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"withdrawals" Proxy AllegraEra
p)
          , MapEntry -> MapEntry
forall a. CanQuantify a => a -> a
opt (Word64 -> Key
idx Word64
6 Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"update" Proxy AllegraEra
p)
          , MapEntry -> MapEntry
forall a. CanQuantify a => a -> a
opt (Word64 -> Key
idx Word64
7 Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"auxiliary_data_hash" Proxy AllegraEra
p)
          , MapEntry -> MapEntry
forall a. CanQuantify a => a -> a
opt (Word64 -> Key
idx Word64
8 Key -> Rule -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era.
HuddleRule name era =>
Proxy era -> Rule
huddleRule @"slot" Proxy AllegraEra
p)
          ]

instance HuddleRule "transaction" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleRule "transaction_body" era,
 HuddleRule "transaction_witness_set" era,
 HuddleRule "auxiliary_data" era) =>
Proxy era -> Rule
transactionRule @AllegraEra

instance HuddleRule "block" AllegraEra where
  huddleRule :: Proxy AllegraEra -> Rule
huddleRule = forall era.
(HuddleRule "header" era, HuddleRule "transaction_body" era,
 HuddleRule "transaction_witness_set" era,
 HuddleRule "auxiliary_data" era) =>
Proxy era -> Rule
blockRule @AllegraEra