Skip to content

Commit

Permalink
Add makeMultiSigScriptMary
Browse files Browse the repository at this point in the history
  • Loading branch information
Jimbo4350 committed Oct 22, 2020
1 parent dfa2649 commit 69da583
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 3 deletions.
5 changes: 4 additions & 1 deletion cardano-api/src/Cardano/API.hs
Expand Up @@ -136,11 +136,14 @@ module Cardano.API (
-- ** Script addresses
-- | Making addresses from scripts.
scriptHashShelley,
scriptHashAllegra,
scriptHashMary,

-- ** Multi-signature scripts
-- | Making multi-signature scripts.
MultiSigScript,
makeMultiSigScriptShelley,
makeMultiSigScriptAllegra,
makeMultiSigScriptMary,

-- * Serialisation
-- | Support for serialising data in JSON, CBOR and text files.
Expand Down
69 changes: 68 additions & 1 deletion cardano-api/src/Cardano/Api/MultiSig.hs
Expand Up @@ -11,7 +11,9 @@ module Cardano.Api.MultiSig
-- | Both 'PaymentCredential's and 'StakeCredential's can use scripts.
-- Shelley supports multi-signatures via scripts.
Script(..),
Hash(ScriptHashShelley, ScriptHashAllegra),
Hash( ScriptHashShelley
, ScriptHashAllegra
, ScriptHashMary),
parseScript,
parseScriptAny,
parseScriptAll,
Expand All @@ -22,12 +24,15 @@ module Cardano.Api.MultiSig
-- | Making addresses from scripts.
scriptHashShelley,
scriptHashAllegra,
scriptHashMary,

-- ** Multi-signature scripts
-- | Making multi-signature scripts.
MultiSigScript(..),
ScriptFeatureInEra(..),
makeMultiSigScriptShelley,
makeMultiSigScriptAllegra,
makeMultiSigScriptMary,
) where

import Cardano.Prelude
Expand Down Expand Up @@ -66,6 +71,8 @@ import qualified Shelley.Spec.Ledger.Scripts as Shelley
data Script era where
ShelleyScript :: Shelley.Script StandardShelley -> Script Shelley
AllegraScript :: Shelley.Script StandardShelley -> Script Allegra
MaryScript :: Shelley.Script StandardShelley -> Script Mary



deriving instance Eq (Script Shelley)
Expand All @@ -74,6 +81,9 @@ deriving instance Show (Script Shelley)
deriving instance Eq (Script Allegra)
deriving instance Show (Script Allegra)

deriving instance Eq (Script Mary)
deriving instance Show (Script Mary)

--deriving instance ToCBOR (Script Shelley) ?

instance HasTypeProxy (Script Shelley) where
Expand Down Expand Up @@ -127,18 +137,51 @@ instance HasTextEnvelope (Script Allegra) where
-- TODO: Need to pattern match on TimeLock script
Shelley.MultiSigScript {} -> "Allegra Multi-signature script"

instance HasTypeProxy (Script Mary) where
data AsType (Script Mary) = AsMaryScript
proxyToAsType _ = AsMaryScript

instance SerialiseAsRawBytes (Hash (Script Mary)) where
serialiseToRawBytes (ScriptHashMary (Shelley.ScriptHash h)) =
Crypto.hashToBytes h

deserialiseFromRawBytes (AsHash AsMaryScript) bs =
ScriptHashMary . Shelley.ScriptHash <$> Crypto.hashFromBytes bs

instance SerialiseAsCBOR (Script Mary) where
serialiseToCBOR (MaryScript s) =
CBOR.serialize' s

deserialiseFromCBOR AsMaryScript bs =
MaryScript <$>
CBOR.decodeAnnotator "MaryScript" fromCBOR (LBS.fromStrict bs)

instance HasTextEnvelope (Script Mary) where
textEnvelopeType _ = "Mary Script"
textEnvelopeDefaultDescr (MaryScript script) =
case script of
-- TODO: Need to pattern match on TimeLock script
Shelley.MultiSigScript {} -> "Mary Multi-signature script"

newtype instance Hash (Script Shelley) = ScriptHashShelley (Shelley.ScriptHash StandardShelley)
deriving (Eq, Ord, Show)

newtype instance Hash (Script Allegra) = ScriptHashAllegra (Shelley.ScriptHash StandardShelley)
deriving (Eq, Ord, Show)


newtype instance Hash (Script Mary) = ScriptHashMary (Shelley.ScriptHash StandardShelley)
deriving (Eq, Ord, Show)

scriptHashShelley :: Script Shelley -> Hash (Script Shelley)
scriptHashShelley (ShelleyScript s) = ScriptHashShelley (Shelley.hashAnyScript s)

scriptHashAllegra :: Script Allegra -> Hash (Script Allegra)
scriptHashAllegra (AllegraScript s) = ScriptHashAllegra (Shelley.hashAnyScript s)

scriptHashMary :: Script Mary -> Hash (Script Mary)
scriptHashMary (MaryScript s) = ScriptHashMary (Shelley.hashAnyScript s)

data MultiSigScript era where
RequireSignature :: Hash PaymentKey
-> ScriptFeatureInEra SignatureFeature era
Expand Down Expand Up @@ -195,6 +238,30 @@ deriving instance Show (ScriptFeatureInEra TimeLocksFeature Mary)
deriving instance Eq (ScriptFeatureInEra TimeLocksFeature Shelley)
deriving instance Show (ScriptFeatureInEra TimeLocksFeature Shelley)

makeMultiSigScriptAllegra :: MultiSigScript Allegra -> Script Allegra
makeMultiSigScriptAllegra = AllegraScript . Shelley.MultiSigScript . go
where
go :: MultiSigScript Allegra -> Shelley.MultiSig StandardShelley
go (RequireSignature (PaymentKeyHash kh) SignaturesInAllegraEra)
= Shelley.RequireSignature (Shelley.coerceKeyRole kh)
go (RequireAllOf s) = Shelley.RequireAllOf (map go s)
go (RequireAnyOf s) = Shelley.RequireAnyOf (map go s)
go (RequireMOf m s) = Shelley.RequireMOf m (map go s)
go (RequireTimeBefore _ TimeLocksInAllegraEra) = error "Needs to be propagated from ledger-specs"
go (RequireTimeAfter _ TimeLocksInAllegraEra) = error "Needs to be propagated from ledger-specs"

makeMultiSigScriptMary :: MultiSigScript Mary -> Script Mary
makeMultiSigScriptMary = MaryScript . Shelley.MultiSigScript . go
where
go :: MultiSigScript Mary -> Shelley.MultiSig StandardShelley
go (RequireSignature (PaymentKeyHash kh) SignaturesInMaryEra)
= Shelley.RequireSignature (Shelley.coerceKeyRole kh)
go (RequireAllOf s) = Shelley.RequireAllOf (map go s)
go (RequireAnyOf s) = Shelley.RequireAnyOf (map go s)
go (RequireMOf m s) = Shelley.RequireMOf m (map go s)
go (RequireTimeBefore _ TimeLocksInMaryEra) = error "Needs to be propagated from ledger-specs"
go (RequireTimeAfter _ TimeLocksInMaryEra) = error "Needs to be propagated from ledger-specs"

makeMultiSigScriptShelley :: MultiSigScript Shelley -> Script Shelley
makeMultiSigScriptShelley = ShelleyScript . Shelley.MultiSigScript . go
where
Expand Down
5 changes: 4 additions & 1 deletion cardano-api/src/Cardano/Api/Typed.hs
Expand Up @@ -171,12 +171,16 @@ module Cardano.Api.Typed (
-- ** Script addresses
-- | Making addresses from scripts.
scriptHashShelley,
scriptHashAllegra,
scriptHashMary,

-- ** Multi-signature scripts
-- | Making multi-signature scripts.
MultiSigScript(..),
ScriptFeatureInEra(..),
makeMultiSigScriptShelley,
makeMultiSigScriptAllegra,
makeMultiSigScriptMary,

-- * Serialisation
-- | Support for serialising data in JSON, CBOR and text files.
Expand Down Expand Up @@ -365,7 +369,6 @@ import qualified Network.URI as URI

import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as Base16
import qualified Data.ByteString.Base58 as Base58
import qualified Data.ByteString.Char8 as BSC
import qualified Data.ByteString.Lazy as LBS
Expand Down

0 comments on commit 69da583

Please sign in to comment.