From b67a992278eab31fb25174fa27da607efdbabe3e Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Sat, 5 Mar 2022 05:31:11 -0800 Subject: [PATCH 1/8] Added a multi-sig validator at Agora.MultiSig --- agora.cabal | 1 + bench/Main.hs | 11 +++++++++ src/Agora/MultiSig.hs | 52 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/Agora/MultiSig.hs diff --git a/agora.cabal b/agora.cabal index 1a68b80..4e3240f 100644 --- a/agora.cabal +++ b/agora.cabal @@ -116,6 +116,7 @@ library import: lang, deps exposed-modules: Agora.AuthorityToken + Agora.MultiSig Agora.SafeMoney Agora.SafeMoney.QQ Agora.Stake diff --git a/bench/Main.hs b/bench/Main.hs index 150f528..c2fb603 100644 --- a/bench/Main.hs +++ b/bench/Main.hs @@ -16,6 +16,10 @@ import Agora.AuthorityToken ( AuthorityToken (AuthorityToken), authorityTokenPolicy, ) +import Agora.MultiSig ( + MultiSig (..), + multiSigValidator, + ) import Agora.SafeMoney (LQ) import Agora.Stake ( Stake (Stake), @@ -34,9 +38,16 @@ benchmarks = benchGroup "full_scripts" [ bench "authorityTokenPolicy" $ authorityTokenPolicy authorityToken + , bench "multiSigValidator" $ multiSigValidator multiSig , bench "stakePolicy" $ stakePolicy (Stake @LQ) , bench "stakeValidator" $ stakeValidator (Stake @LQ) ] authorityToken :: AuthorityToken authorityToken = AuthorityToken (Value.assetClass "" "") + +multiSig :: MultiSig (s :: S) +multiSig = MultiSig + { keys = PSNil + , minSigs = 0 + } \ No newline at end of file diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs new file mode 100644 index 0000000..bb570bd --- /dev/null +++ b/src/Agora/MultiSig.hs @@ -0,0 +1,52 @@ +{- | +Module : Agora.MultiSig +Maintainer : riley_kilgore@outlook.com +Description: A basic N of M multisignature validator. +-} +module Agora.MultiSig ( + multiSigValidator, + MultiSig (..), +) where + +import Plutarch.Api.V1 ( + PPubKeyHash, + PScriptContext (..), + ) +import Plutarch.Monadic qualified as P + +-------------------------------------------------------------------------------- + +import Agora.Utils (passert) + +-------------------------------------------------------------------------------- + +import GHC.Generics qualified as GHC +import Generics.SOP (Generic) +import Prelude + +-------------------------------------------------------------------------------- + +{- | A MultiSig represents a proof that a particular set of signatures + are present on a transaction. +-} +data MultiSig (s :: S) = MultiSig + { keys :: PList PPubKeyHash s + -- ^ List of PubKeyHashes that must be present in the list of signatories. + , minSigs :: Integer + } deriving stock (GHC.Generic) + deriving anyclass (Generic) + +-------------------------------------------------------------------------------- + +-- | Validator given 'MultiSig' params. +multiSigValidator :: MultiSig s -> Term s (PData :--> PData :--> PScriptContext :--> PUnit) +multiSigValidator params = + plam $ \_datum _redeemer ctx' -> P.do + ctx <- pletFields @'["txInfo", "purpose"] ctx' + let signatories = pfield @"signatories" # ctx.txInfo + passert "The amount of required signatures is not met." + ((fromInteger params.minSigs) #<= (plength #$ pfilter + # (plam $ \a -> + (pelem # pdata a # pfromData signatories)) + # pcon params.keys)) + (pconstant ()) \ No newline at end of file From 0b8f51bfe3db2b8d56d6cba50af0bb28916c1782 Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Sat, 5 Mar 2022 05:51:31 -0800 Subject: [PATCH 2/8] Made a small change requested by hlint --- src/Agora/MultiSig.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index bb570bd..021ea1a 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -46,7 +46,7 @@ multiSigValidator params = let signatories = pfield @"signatories" # ctx.txInfo passert "The amount of required signatures is not met." ((fromInteger params.minSigs) #<= (plength #$ pfilter - # (plam $ \a -> - (pelem # pdata a # pfromData signatories)) + # (plam \a -> + pelem # pdata a # pfromData signatories) # pcon params.keys)) (pconstant ()) \ No newline at end of file From b15c956dd3d1c9fee9792239c7fea6f7fa707ee6 Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Sat, 5 Mar 2022 05:57:27 -0800 Subject: [PATCH 3/8] hlint happiness prevents building.. --- src/Agora/MultiSig.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index 021ea1a..bb570bd 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -46,7 +46,7 @@ multiSigValidator params = let signatories = pfield @"signatories" # ctx.txInfo passert "The amount of required signatures is not met." ((fromInteger params.minSigs) #<= (plength #$ pfilter - # (plam \a -> - pelem # pdata a # pfromData signatories) + # (plam $ \a -> + (pelem # pdata a # pfromData signatories)) # pcon params.keys)) (pconstant ()) \ No newline at end of file From 21541f3ba8fd99444f83bc7e19a2a4b8da45c74b Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Tue, 8 Mar 2022 06:15:20 -0800 Subject: [PATCH 4/8] Added changes to address comments --- bench/Main.hs | 13 +------- src/Agora/MultiSig.hs | 73 ++++++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/bench/Main.hs b/bench/Main.hs index c2fb603..d10619b 100644 --- a/bench/Main.hs +++ b/bench/Main.hs @@ -16,10 +16,6 @@ import Agora.AuthorityToken ( AuthorityToken (AuthorityToken), authorityTokenPolicy, ) -import Agora.MultiSig ( - MultiSig (..), - multiSigValidator, - ) import Agora.SafeMoney (LQ) import Agora.Stake ( Stake (Stake), @@ -38,16 +34,9 @@ benchmarks = benchGroup "full_scripts" [ bench "authorityTokenPolicy" $ authorityTokenPolicy authorityToken - , bench "multiSigValidator" $ multiSigValidator multiSig , bench "stakePolicy" $ stakePolicy (Stake @LQ) , bench "stakeValidator" $ stakeValidator (Stake @LQ) ] authorityToken :: AuthorityToken -authorityToken = AuthorityToken (Value.assetClass "" "") - -multiSig :: MultiSig (s :: S) -multiSig = MultiSig - { keys = PSNil - , minSigs = 0 - } \ No newline at end of file +authorityToken = AuthorityToken (Value.assetClass "" "") \ No newline at end of file diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index bb570bd..a56bfe5 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -1,10 +1,11 @@ {- | Module : Agora.MultiSig Maintainer : riley_kilgore@outlook.com -Description: A basic N of M multisignature validator. +Description: A basic N of M multisignature validation function. -} module Agora.MultiSig ( - multiSigValidator, + validatedByMultisig, + pvalidatedByMultisig, MultiSig (..), ) where @@ -12,16 +13,18 @@ import Plutarch.Api.V1 ( PPubKeyHash, PScriptContext (..), ) +import Plutarch.DataRepr ( + PDataFields, + PIsDataReprInstances (PIsDataReprInstances), + ) import Plutarch.Monadic qualified as P --------------------------------------------------------------------------------- - -import Agora.Utils (passert) +import Plutus.V1.Ledger.Crypto (PubKeyHash) -------------------------------------------------------------------------------- import GHC.Generics qualified as GHC -import Generics.SOP (Generic) +import Generics.SOP (Generic, I (I)) import Prelude -------------------------------------------------------------------------------- @@ -29,24 +32,58 @@ import Prelude {- | A MultiSig represents a proof that a particular set of signatures are present on a transaction. -} -data MultiSig (s :: S) = MultiSig - { keys :: PList PPubKeyHash s +data MultiSig = MultiSig + { keys :: [PubKeyHash] -- ^ List of PubKeyHashes that must be present in the list of signatories. , minSigs :: Integer } deriving stock (GHC.Generic) deriving anyclass (Generic) --------------------------------------------------------------------------------- +newtype PMultiSig (s :: S) = PMultiSig + { getMultiSig :: + Term s (PDataRecord '[ "pkeys" ':= PBuiltinList (PAsData PPubKeyHash) + , "pminSigs" ':= PInteger]) + } + deriving stock (GHC.Generic) + deriving anyclass (Generic) + deriving anyclass (PIsDataRepr) + deriving + (PlutusType, PIsData, PDataFields) + via (PIsDataReprInstances PMultiSig) --- | Validator given 'MultiSig' params. -multiSigValidator :: MultiSig s -> Term s (PData :--> PData :--> PScriptContext :--> PUnit) -multiSigValidator params = - plam $ \_datum _redeemer ctx' -> P.do +-------------------------------------------------------------------------------- +pubKeysToPPubKeys :: + 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 @"pkeys" @(PBuiltinList (PAsData PPubKeyHash)) + # (pdata $ pcon (pubKeysToPPubKeys m.keys)) + #$ pdcons @"pminSigs" @PInteger # (pdata $ fromInteger m.minSigs) # pdnil) + +validatedByMultisig :: MultiSig -> Term s (PScriptContext :--> PBool) +validatedByMultisig params = + plam $ \ctx' -> P.do + pvalidatedByMultisig # (multisigToPMultisig params) # ctx' + +pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool) +pvalidatedByMultisig = + plam $ \multi' ctx' -> P.do ctx <- pletFields @'["txInfo", "purpose"] ctx' + multi <- pletFields @'["pkeys", "pminSigs"] multi' let signatories = pfield @"signatories" # ctx.txInfo - passert "The amount of required signatures is not met." - ((fromInteger params.minSigs) #<= (plength #$ pfilter + pif + ((pfromData multi.pminSigs) #<= (plength #$ pfilter # (plam $ \a -> - (pelem # pdata a # pfromData signatories)) - # pcon params.keys)) - (pconstant ()) \ No newline at end of file + (pelem # a # pfromData signatories)) + # multi.pkeys)) + (pcon PTrue) + perror \ No newline at end of file From 439f1b92093090f18c7f60f507182f0a6f3eaada Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Wed, 9 Mar 2022 12:52:32 -0800 Subject: [PATCH 5/8] Addressed PR comments. --- src/Agora/MultiSig.hs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index a56bfe5..cbc0e35 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -41,8 +41,8 @@ data MultiSig = MultiSig newtype PMultiSig (s :: S) = PMultiSig { getMultiSig :: - Term s (PDataRecord '[ "pkeys" ':= PBuiltinList (PAsData PPubKeyHash) - , "pminSigs" ':= PInteger]) + Term s (PDataRecord '[ "keys" ':= PBuiltinList (PAsData PPubKeyHash) + , "minSigs" ':= PInteger]) } deriving stock (GHC.Generic) deriving anyclass (Generic) @@ -65,9 +65,9 @@ pubKeysToPPubKeys xs = case xs of multisigToPMultisig :: forall s. MultiSig -> Term s PMultiSig multisigToPMultisig m = - pcon $ PMultiSig (pdcons @"pkeys" @(PBuiltinList (PAsData PPubKeyHash)) + pcon $ PMultiSig (pdcons @"keys" @(PBuiltinList (PAsData PPubKeyHash)) # (pdata $ pcon (pubKeysToPPubKeys m.keys)) - #$ pdcons @"pminSigs" @PInteger # (pdata $ fromInteger m.minSigs) # pdnil) + #$ pdcons @"minSigs" @PInteger # (pdata $ fromInteger m.minSigs) # pdnil) validatedByMultisig :: MultiSig -> Term s (PScriptContext :--> PBool) validatedByMultisig params = @@ -78,12 +78,9 @@ pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool) pvalidatedByMultisig = plam $ \multi' ctx' -> P.do ctx <- pletFields @'["txInfo", "purpose"] ctx' - multi <- pletFields @'["pkeys", "pminSigs"] multi' + multi <- pletFields @'["keys", "minSigs"] multi' let signatories = pfield @"signatories" # ctx.txInfo - pif - ((pfromData multi.pminSigs) #<= (plength #$ pfilter - # (plam $ \a -> - (pelem # a # pfromData signatories)) - # multi.pkeys)) - (pcon PTrue) - perror \ No newline at end of file + ((pfromData multi.minSigs) #<= (plength #$ pfilter + # (plam $ \a -> + (pelem # a # pfromData signatories)) + # multi.keys)) \ No newline at end of file From 61b3d599c8b62dac441dd77790f15701a7cf82d5 Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Wed, 9 Mar 2022 14:34:27 -0800 Subject: [PATCH 6/8] Automated MultiSig -> PMultiSig --- src/Agora/MultiSig.hs | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index cbc0e35..e811e0a 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -3,6 +3,8 @@ Module : Agora.MultiSig Maintainer : riley_kilgore@outlook.com Description: A basic N of M multisignature validation function. -} +{-# LANGUAGE TemplateHaskell #-} + module Agora.MultiSig ( validatedByMultisig, pvalidatedByMultisig, @@ -14,12 +16,18 @@ import Plutarch.Api.V1 ( PScriptContext (..), ) import Plutarch.DataRepr ( + DerivePConstantViaData (DerivePConstantViaData), PDataFields, PIsDataReprInstances (PIsDataReprInstances), ) +import Plutarch.Lift ( + PLifted, + PUnsafeLiftDecl, + ) import Plutarch.Monadic qualified as P import Plutus.V1.Ledger.Crypto (PubKeyHash) +import qualified PlutusTx -------------------------------------------------------------------------------- @@ -39,6 +47,9 @@ data MultiSig = MultiSig } deriving stock (GHC.Generic) deriving anyclass (Generic) +PlutusTx.makeLift ''MultiSig +PlutusTx.unstableMakeIsData ''MultiSig + newtype PMultiSig (s :: S) = PMultiSig { getMultiSig :: Term s (PDataRecord '[ "keys" ':= PBuiltinList (PAsData PPubKeyHash) @@ -51,28 +62,15 @@ newtype PMultiSig (s :: S) = PMultiSig (PlutusType, PIsData, PDataFields) via (PIsDataReprInstances PMultiSig) --------------------------------------------------------------------------------- -pubKeysToPPubKeys :: - 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 +instance PUnsafeLiftDecl PMultiSig where type PLifted PMultiSig = MultiSig +deriving via (DerivePConstantViaData MultiSig PMultiSig) instance (PConstant MultiSig) -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 params = plam $ \ctx' -> P.do - pvalidatedByMultisig # (multisigToPMultisig params) # ctx' + pvalidatedByMultisig # (pconstant params) # ctx' pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool) pvalidatedByMultisig = From 9f390c8be5193191dabe3f0fc7787badf2e0af39 Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Thu, 10 Mar 2022 06:16:33 -0800 Subject: [PATCH 7/8] Modified formatting, hopefully passes CI --- bench/Main.hs | 2 +- src/Agora/MultiSig.hs | 176 ++++++++++++++++++++++-------------------- 2 files changed, 93 insertions(+), 85 deletions(-) diff --git a/bench/Main.hs b/bench/Main.hs index d10619b..150f528 100644 --- a/bench/Main.hs +++ b/bench/Main.hs @@ -39,4 +39,4 @@ benchmarks = ] authorityToken :: AuthorityToken -authorityToken = AuthorityToken (Value.assetClass "" "") \ No newline at end of file +authorityToken = AuthorityToken (Value.assetClass "" "") diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index e811e0a..acbb4e9 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -1,84 +1,92 @@ -{- | -Module : Agora.MultiSig -Maintainer : riley_kilgore@outlook.com -Description: A basic N of M multisignature validation function. --} -{-# LANGUAGE TemplateHaskell #-} - -module Agora.MultiSig ( - validatedByMultisig, - pvalidatedByMultisig, - MultiSig (..), -) where - -import Plutarch.Api.V1 ( - PPubKeyHash, - PScriptContext (..), - ) -import Plutarch.DataRepr ( - DerivePConstantViaData (DerivePConstantViaData), - PDataFields, - PIsDataReprInstances (PIsDataReprInstances), - ) -import Plutarch.Lift ( - PLifted, - PUnsafeLiftDecl, - ) -import Plutarch.Monadic qualified as P - -import Plutus.V1.Ledger.Crypto (PubKeyHash) -import qualified PlutusTx - --------------------------------------------------------------------------------- - -import GHC.Generics qualified as GHC -import Generics.SOP (Generic, I (I)) -import Prelude - --------------------------------------------------------------------------------- - -{- | A MultiSig represents a proof that a particular set of signatures - are present on a transaction. --} -data MultiSig = MultiSig - { keys :: [PubKeyHash] - -- ^ List of PubKeyHashes that must be present in the list of signatories. - , minSigs :: Integer - } deriving stock (GHC.Generic) - deriving anyclass (Generic) - -PlutusTx.makeLift ''MultiSig -PlutusTx.unstableMakeIsData ''MultiSig - -newtype PMultiSig (s :: S) = PMultiSig - { getMultiSig :: - Term s (PDataRecord '[ "keys" ':= PBuiltinList (PAsData PPubKeyHash) - , "minSigs" ':= PInteger]) - } - deriving stock (GHC.Generic) - deriving anyclass (Generic) - deriving anyclass (PIsDataRepr) - deriving - (PlutusType, PIsData, PDataFields) - via (PIsDataReprInstances PMultiSig) - -instance PUnsafeLiftDecl PMultiSig where type PLifted PMultiSig = MultiSig -deriving via (DerivePConstantViaData MultiSig PMultiSig) instance (PConstant MultiSig) - --------------------------------------------------------------------------------- - -validatedByMultisig :: MultiSig -> Term s (PScriptContext :--> PBool) -validatedByMultisig params = - plam $ \ctx' -> P.do - pvalidatedByMultisig # (pconstant params) # ctx' - -pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool) -pvalidatedByMultisig = - plam $ \multi' ctx' -> P.do - ctx <- pletFields @'["txInfo", "purpose"] ctx' - multi <- pletFields @'["keys", "minSigs"] multi' - let signatories = pfield @"signatories" # ctx.txInfo - ((pfromData multi.minSigs) #<= (plength #$ pfilter - # (plam $ \a -> - (pelem # a # pfromData signatories)) - # multi.keys)) \ No newline at end of file +{-# LANGUAGE TemplateHaskell #-} + +{- | +Module : Agora.MultiSig +Maintainer : riley_kilgore@outlook.com +Description: A basic N of M multisignature validation function. +-} +module Agora.MultiSig ( + validatedByMultisig, + pvalidatedByMultisig, + MultiSig (..), +) where + +import Plutarch.Api.V1 ( + PPubKeyHash, + PScriptContext (..), + ) +import Plutarch.DataRepr ( + DerivePConstantViaData (DerivePConstantViaData), + PDataFields, + PIsDataReprInstances (PIsDataReprInstances), + ) +import Plutarch.Lift ( + PLifted, + PUnsafeLiftDecl, + ) +import Plutarch.Monadic qualified as P + +import Plutus.V1.Ledger.Crypto (PubKeyHash) +import PlutusTx qualified + +-------------------------------------------------------------------------------- + +import GHC.Generics qualified as GHC +import Generics.SOP (Generic, I (I)) +import Prelude + +-------------------------------------------------------------------------------- + +{- | A MultiSig represents a proof that a particular set of signatures + are present on a transaction. +-} +data MultiSig = MultiSig + { keys :: [PubKeyHash] + -- ^ List of PubKeyHashes that must be present in the list of signatories. + , minSigs :: Integer + } + deriving stock (GHC.Generic) + deriving anyclass (Generic) + +PlutusTx.makeLift ''MultiSig +PlutusTx.unstableMakeIsData ''MultiSig + +newtype PMultiSig (s :: S) = PMultiSig + { getMultiSig :: + Term + s + ( PDataRecord + '[ "keys" ':= PBuiltinList (PAsData PPubKeyHash) + , "minSigs" ':= PInteger + ] + ) + } + deriving stock (GHC.Generic) + deriving anyclass (Generic) + deriving anyclass (PIsDataRepr) + deriving + (PlutusType, PIsData, PDataFields) + via (PIsDataReprInstances PMultiSig) + +instance PUnsafeLiftDecl PMultiSig where type PLifted PMultiSig = MultiSig +deriving via (DerivePConstantViaData MultiSig PMultiSig) instance (PConstant MultiSig) + +-------------------------------------------------------------------------------- + +validatedByMultisig :: MultiSig -> Term s (PScriptContext :--> PBool) +validatedByMultisig params = pvalidatedByMultisig # pconstant params + +pvalidatedByMultisig :: Term s (PMultiSig :--> PScriptContext :--> PBool) +pvalidatedByMultisig = + plam $ \multi' ctx' -> P.do + ctx <- pletFields @'["txInfo", "purpose"] ctx' + multi <- pletFields @'["keys", "minSigs"] multi' + let signatories = pfield @"signatories" # ctx.txInfo + ( (pfromData multi.minSigs) + #<= ( plength #$ pfilter + # ( plam $ \a -> + (pelem # a # pfromData signatories) + ) + # multi.keys + ) + ) From e46ee6405e8e436bcc9d5d5e56a4dde7349c0785 Mon Sep 17 00:00:00 2001 From: Riley Kilgore Date: Thu, 10 Mar 2022 06:24:13 -0800 Subject: [PATCH 8/8] Trying to make hlint happy --- src/Agora/MultiSig.hs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Agora/MultiSig.hs b/src/Agora/MultiSig.hs index acbb4e9..e074bfe 100644 --- a/src/Agora/MultiSig.hs +++ b/src/Agora/MultiSig.hs @@ -82,11 +82,11 @@ pvalidatedByMultisig = ctx <- pletFields @'["txInfo", "purpose"] ctx' multi <- pletFields @'["keys", "minSigs"] multi' let signatories = pfield @"signatories" # ctx.txInfo - ( (pfromData multi.minSigs) - #<= ( plength #$ pfilter - # ( plam $ \a -> - (pelem # a # pfromData signatories) - ) - # multi.keys - ) - ) + (pfromData multi.minSigs) + #<= ( plength #$ pfilter + # plam + ( \a -> + pelem # a # pfromData signatories + ) + # multi.keys + )