Added a multi-sig validator at Agora.MultiSig

This commit is contained in:
Riley Kilgore 2022-03-05 05:31:11 -08:00
parent e81f0910b7
commit b67a992278
3 changed files with 64 additions and 0 deletions

View file

@ -116,6 +116,7 @@ library
import: lang, deps
exposed-modules:
Agora.AuthorityToken
Agora.MultiSig
Agora.SafeMoney
Agora.SafeMoney.QQ
Agora.Stake

View file

@ -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
}

52
src/Agora/MultiSig.hs Normal file
View file

@ -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 ())