Automated MultiSig -> PMultiSig

This commit is contained in:
Riley Kilgore 2022-03-09 14:34:27 -08:00
parent c98b3b9c89
commit 9d1952e981

View file

@ -3,6 +3,8 @@ Module : Agora.MultiSig
Maintainer : riley_kilgore@outlook.com Maintainer : riley_kilgore@outlook.com
Description: A basic N of M multisignature validation function. Description: A basic N of M multisignature validation function.
-} -}
{-# LANGUAGE TemplateHaskell #-}
module Agora.MultiSig ( module Agora.MultiSig (
validatedByMultisig, validatedByMultisig,
pvalidatedByMultisig, pvalidatedByMultisig,
@ -14,12 +16,18 @@ import Plutarch.Api.V1 (
PScriptContext (..), PScriptContext (..),
) )
import Plutarch.DataRepr ( import Plutarch.DataRepr (
DerivePConstantViaData (DerivePConstantViaData),
PDataFields, PDataFields,
PIsDataReprInstances (PIsDataReprInstances), PIsDataReprInstances (PIsDataReprInstances),
) )
import Plutarch.Lift (
PLifted,
PUnsafeLiftDecl,
)
import Plutarch.Monadic qualified as P import Plutarch.Monadic qualified as P
import Plutus.V1.Ledger.Crypto (PubKeyHash) import Plutus.V1.Ledger.Crypto (PubKeyHash)
import qualified PlutusTx
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -39,6 +47,9 @@ data MultiSig = MultiSig
} deriving stock (GHC.Generic) } deriving stock (GHC.Generic)
deriving anyclass (Generic) deriving anyclass (Generic)
PlutusTx.makeLift ''MultiSig
PlutusTx.unstableMakeIsData ''MultiSig
newtype PMultiSig (s :: S) = PMultiSig newtype PMultiSig (s :: S) = PMultiSig
{ getMultiSig :: { getMultiSig ::
Term s (PDataRecord '[ "keys" ':= PBuiltinList (PAsData PPubKeyHash) Term s (PDataRecord '[ "keys" ':= PBuiltinList (PAsData PPubKeyHash)
@ -51,28 +62,15 @@ newtype PMultiSig (s :: S) = PMultiSig
(PlutusType, PIsData, PDataFields) (PlutusType, PIsData, PDataFields)
via (PIsDataReprInstances PMultiSig) via (PIsDataReprInstances PMultiSig)
-------------------------------------------------------------------------------- instance PUnsafeLiftDecl PMultiSig where type PLifted PMultiSig = MultiSig
pubKeysToPPubKeys :: deriving via (DerivePConstantViaData MultiSig PMultiSig) instance (PConstant MultiSig)
forall s. [PubKeyHash] -> PBuiltinList (PAsData PPubKeyHash) s
pubKeysToPPubKeys xs = case xs of
x:xs' ->
let x' :: Term s (PAsData PPubKeyHash)
x' = pconstantData x
in
PCons x' (pcon $ pubKeysToPPubKeys xs')
[] ->
PNil
multisigToPMultisig :: forall s. MultiSig -> Term s PMultiSig --------------------------------------------------------------------------------
multisigToPMultisig m =
pcon $ PMultiSig (pdcons @"keys" @(PBuiltinList (PAsData PPubKeyHash))
# (pdata $ pcon (pubKeysToPPubKeys m.keys))
#$ pdcons @"minSigs" @PInteger # (pdata $ fromInteger m.minSigs) # pdnil)
validatedByMultisig :: MultiSig -> Term s (PScriptContext :--> PBool) validatedByMultisig :: MultiSig -> Term s (PScriptContext :--> PBool)
validatedByMultisig params = validatedByMultisig params =
plam $ \ctx' -> P.do plam $ \ctx' -> P.do
pvalidatedByMultisig # (multisigToPMultisig params) # ctx' pvalidatedByMultisig # (pconstant params) # ctx'
pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool) pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool)
pvalidatedByMultisig = pvalidatedByMultisig =