Skip to content

Commit

Permalink
add extra signatures to Read hierarchy
Browse files Browse the repository at this point in the history
  • Loading branch information
paolino committed Sep 30, 2022
1 parent 55f1cc4 commit 438b783
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/wallet/cardano-wallet.cabal
Expand Up @@ -364,6 +364,7 @@ library
Cardano.Wallet.Read.Primitive.Tx.Babbage
Cardano.Wallet.Read.Primitive.Tx.Byron
Cardano.Wallet.Read.Primitive.Tx.Features.Certificates
Cardano.Wallet.Read.Primitive.Tx.Features.ExtraSigs
Cardano.Wallet.Read.Primitive.Tx.Features.Integrity
Cardano.Wallet.Read.Primitive.Tx.Features.Mint
Cardano.Wallet.Read.Primitive.Tx.Features.Validity
Expand All @@ -373,6 +374,7 @@ library
Cardano.Wallet.Read.Tx.CBOR
Cardano.Wallet.Read.Tx.Certificates
Cardano.Wallet.Read.Tx.Eras
Cardano.Wallet.Read.Tx.ExtraSigs
Cardano.Wallet.Read.Tx.Hash
Cardano.Wallet.Read.Tx.Integrity
Cardano.Wallet.Read.Tx.Mint
Expand Down
@@ -0,0 +1,58 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE TypeFamilies #-}

-- |
-- Copyright: © 2020-2022 IOHK
-- License: Apache-2.0
--

module Cardano.Wallet.Read.Primitive.Tx.Features.ExtraSigs
( extraSigs )

where

import Prelude

import Cardano.Crypto.Hash
( Hash (..) )
import Cardano.Ledger.Crypto
( StandardCrypto )
import Cardano.Ledger.Keys
( KeyHash (..), KeyRole (..) )
import Cardano.Wallet.Read.Eras
( EraFun (..), K (..) )
import Cardano.Wallet.Read.Tx.ExtraSigs
( ExtraSigs (..) )
import Data.ByteString.Short
( fromShort )
import Data.Foldable
( toList )
import Data.Functor
( (<&>) )
import Data.Set
( Set )

import qualified Cardano.Wallet.Primitive.Types.Hash as W

extraSigs :: EraFun ExtraSigs (K [W.Hash "ExtraSigners"])
extraSigs = EraFun
{ byronFun = noExtraSigs
, shelleyFun = noExtraSigs
, allegraFun = noExtraSigs
, maryFun = noExtraSigs
, alonzoFun = yesExtraSigs
, babbageFun = yesExtraSigs
}
where
noExtraSigs = const $ K []
yesExtraSigs (ExtraSigs es) = K $ getExtraSigs es

getExtraSigs
:: Set (KeyHash 'Witness StandardCrypto)
-> [W.Hash "ExtraSigners"]
getExtraSigs es =
toList es <&> \(KeyHash (UnsafeHash h)) -> W.Hash $ fromShort h


62 changes: 62 additions & 0 deletions lib/wallet/src/Cardano/Wallet/Read/Tx/ExtraSigs.hs
@@ -0,0 +1,62 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

-- |
-- Copyright: © 2020-2022 IOHK
-- License: Apache-2.0
--
-- Raw extra signers required data extraction from 'Tx'
--

module Cardano.Wallet.Read.Tx.ExtraSigs where

import Prelude

import Cardano.Api
( AllegraEra, AlonzoEra, BabbageEra, ByronEra, MaryEra, ShelleyEra )
import Cardano.Ledger.Crypto
( StandardCrypto )
import Cardano.Ledger.Keys
( KeyHash, KeyRole (..) )
import Cardano.Wallet.Read.Eras
( EraFun (..) )
import Cardano.Wallet.Read.Tx
( Tx (..) )
import Cardano.Wallet.Read.Tx.Eras
( onTx )
import Data.Set
( Set )
import GHC.Records
( HasField (..) )

import qualified Cardano.Ledger.Alonzo.Tx as AL

type family ExtraSigsType era where
ExtraSigsType ByronEra = ()
ExtraSigsType ShelleyEra = ()
ExtraSigsType AllegraEra = ()
ExtraSigsType MaryEra = ()
ExtraSigsType AlonzoEra = Set (KeyHash 'Witness StandardCrypto)
ExtraSigsType BabbageEra = Set (KeyHash 'Witness StandardCrypto)

newtype ExtraSigs era = ExtraSigs (ExtraSigsType era)

deriving instance Show (ExtraSigsType era) => Show (ExtraSigs era)
deriving instance Eq (ExtraSigsType era) => Eq (ExtraSigs era)

getEraExtraSigs :: EraFun Tx ExtraSigs
getEraExtraSigs
= EraFun
{ byronFun = \_ -> ExtraSigs ()
, shelleyFun = \_ -> ExtraSigs ()
, allegraFun = \_ -> ExtraSigs ()
, maryFun = \_ -> ExtraSigs ()
, alonzoFun = onTx $ \(AL.ValidatedTx b _ _ _)
-> ExtraSigs $ getField @"reqSignerHashes" b
, babbageFun = onTx $ \(AL.ValidatedTx b _ _ _)
-> ExtraSigs $ getField @"reqSignerHashes" b
}

0 comments on commit 438b783

Please sign in to comment.