{-# 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,
  AllegraEra,
  allegraCDDL,
  blockRule,
  transactionRule,
  auxiliaryScriptsRule,
  auxiliaryDataArrayRule,
  auxiliaryDataRule,
  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 =
  Name
"block"
    Name -> ArrayChoice -> Rule
forall a. IsType0 a => Name -> 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 =
  Name
"transaction"
    Name -> ArrayChoice -> Rule
forall a. IsType0 a => Name -> 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 = Name
"auxiliary_scripts" Name -> ArrayChoice -> Rule
forall a. IsType0 a => Name -> 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 =
  Name
"auxiliary_data_array"
    Name -> ArrayChoice -> Rule
forall a. IsType0 a => Name -> 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 =
  Name
"auxiliary_data"
    Name -> Choice Type2 -> Rule
forall a. IsType0 a => Name -> 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

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 =
  Comment -> Rule -> Rule
forall a. HasComment a => Comment -> a -> a
comment
    Comment
[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
$ Name
"native_script"
      Name -> Choice ArrayChoice -> Rule
forall a. IsType0 a => Name -> a -> Rule
=:= ArrayChoice -> ArrayChoice
arr [GroupDef -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (GroupDef -> Item ArrayChoice) -> GroupDef -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> GroupDef
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 [GroupDef -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (GroupDef -> Item ArrayChoice) -> GroupDef -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> GroupDef
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 [GroupDef -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (GroupDef -> Item ArrayChoice) -> GroupDef -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> GroupDef
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 [GroupDef -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (GroupDef -> Item ArrayChoice) -> GroupDef -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> GroupDef
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 [GroupDef -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (GroupDef -> Item ArrayChoice) -> GroupDef -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> GroupDef
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 [GroupDef -> Item ArrayChoice
forall a e. (IsType0 a, IsGroupOrArrayEntry e) => a -> e
a (GroupDef -> Item ArrayChoice) -> GroupDef -> Item ArrayChoice
forall a b. (a -> b) -> a -> b
$ forall (name :: Symbol) era.
HuddleGroup name era =>
Proxy era -> GroupDef
huddleGroup @"script_invalid_hereafter" Proxy era
p]

scriptNOfKGroup ::
  forall era.
  HuddleRule "native_script" era =>
  Proxy era ->
  GroupDef
scriptNOfKGroup :: forall era. HuddleRule "native_script" era => Proxy era -> GroupDef
scriptNOfKGroup Proxy era
p =
  Name
"script_n_of_k"
    Name -> Group -> GroupDef
=:~ 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 -> GroupDef
scriptInvalidBeforeGroup :: forall era. Era era => Proxy era -> GroupDef
scriptInvalidBeforeGroup Proxy era
p =
  Comment -> GroupDef -> GroupDef
forall a. HasComment a => Comment -> a -> a
comment
    Comment
[str|Timelock validity intervals are half-open intervals [a, b).
        |This field specifies the left (included) endpoint a.
        |]
    (GroupDef -> GroupDef) -> GroupDef -> GroupDef
forall a b. (a -> b) -> a -> b
$ Name
"script_invalid_before"
      Name -> Group -> GroupDef
=:~ 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 -> GroupDef
scriptInvalidHereafterGroup :: forall era. Era era => Proxy era -> GroupDef
scriptInvalidHereafterGroup Proxy era
p =
  Comment -> GroupDef -> GroupDef
forall a. HasComment a => Comment -> a -> a
comment
    Comment
[str|Timelock validity intervals are half-open intervals [a, b).
        |This field specifies the right (excluded) endpoint b.
        |]
    (GroupDef -> GroupDef) -> GroupDef -> GroupDef
forall a b. (a -> b) -> a -> b
$ Name
"script_invalid_hereafter"
      Name -> Group -> GroupDef
=:~ 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 -> GroupDef
huddleGroup = forall era.
HuddleRule "major_protocol_version" era =>
Proxy era -> GroupDef
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 -> GroupDef
huddleGroup = forall era. Era era => Proxy era -> GroupDef
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 Era era => HuddleRule "min_int64" era where
  huddleRule :: Proxy era -> Rule
huddleRule Proxy era
_ = Name
"min_int64" Name -> Integer -> Rule
forall a. IsType0 a => Name -> a -> Rule
=:= (-Integer
9223372036854775808 :: Integer)

instance Era era => HuddleRule "max_int64" era where
  huddleRule :: Proxy era -> Rule
huddleRule Proxy era
_ = Name
"max_int64" Name -> Integer -> Rule
forall a. IsType0 a => Name -> a -> Rule
=:= (Integer
9223372036854775807 :: Integer)

instance Era era => HuddleRule "int64" era where
  huddleRule :: Proxy era -> Rule
huddleRule Proxy era
p = Name
"int64" Name -> Ranged -> Rule
forall a. IsType0 a => Name -> 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

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

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

instance HuddleGroup "script_n_of_k" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> GroupDef
huddleGroup = forall era. HuddleRule "native_script" era => Proxy era -> GroupDef
scriptNOfKGroup @AllegraEra

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

instance HuddleGroup "script_invalid_hereafter" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> GroupDef
huddleGroup = forall era. Era era => Proxy era -> GroupDef
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 -> GroupDef
huddleGroup = forall era. Era era => Proxy era -> GroupDef
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 -> GroupDef
huddleGroup = forall era. Era era => Proxy era -> GroupDef
singleHostAddrGroup @AllegraEra

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

instance HuddleGroup "multi_host_name" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> GroupDef
huddleGroup = forall era. HuddleRule "dns_name" era => Proxy era -> GroupDef
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 -> GroupDef
huddleGroup = forall era.
(HuddleRule "relay" era, HuddleRule "pool_metadata" era,
 HuddleRule1 "set" era) =>
Proxy era -> GroupDef
poolParamsGroup @AllegraEra

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

instance HuddleGroup "pool_retirement_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> GroupDef
huddleGroup = forall era. Era era => Proxy era -> GroupDef
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 -> GroupDef
huddleGroup = forall era.
(HuddleRule "genesis_hash" era,
 HuddleRule "genesis_delegate_hash" era) =>
Proxy era -> GroupDef
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 -> GroupDef
huddleGroup = forall era.
HuddleRule "move_instantaneous_reward" era =>
Proxy era -> GroupDef
moveInstantaneousRewardsCertGroup @AllegraEra

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

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

instance HuddleGroup "delegation_to_stake_pool_cert" AllegraEra where
  huddleGroup :: Proxy AllegraEra -> GroupDef
huddleGroup = forall era. Era era => Proxy era -> GroupDef
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
shelleyWithdrawalsRule @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 =
    Comment -> Rule -> Rule
forall a. HasComment a => Comment -> a -> a
comment
      Comment
[str|Allegra transaction body adds the validity interval start at index 8
          |]
      (Rule -> Rule) -> Rule -> Rule
forall a b. (a -> b) -> a -> b
$ Name
"transaction_body"
        Name -> MapChoice -> Rule
forall a. IsType0 a => Name -> a -> Rule
=:= MapChoice -> MapChoice
mp
          [ Word64 -> Key
idx Word64
0 Key -> GRuleCall -> MapEntry
forall a me. (IsType0 a, IsEntryLike me) => Key -> a -> me
==> forall (name :: Symbol) era a.
(HuddleRule1 name era, IsType0 a) =>
Proxy era -> a -> GRuleCall
huddleRule1 @"set" Proxy AllegraEra
p (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 = Proxy AllegraEra -> Rule
forall era.
(HuddleRule "header" era, HuddleRule "transaction_body" era,
 HuddleRule "transaction_witness_set" era,
 HuddleRule "auxiliary_data" era) =>
Proxy era -> Rule
blockRule

instance HuddleRule1 "set" AllegraEra where
  huddleRule1 :: forall a. IsType0 a => Proxy AllegraEra -> a -> GRuleCall
huddleRule1 Proxy AllegraEra
_ = a -> GRuleCall
forall a. IsType0 a => a -> GRuleCall
untaggedSet