Added a multi-sig validator at Agora.MultiSig
This commit is contained in:
parent
a895a60c8a
commit
5482a5c4ca
3 changed files with 64 additions and 0 deletions
|
|
@ -116,6 +116,7 @@ library
|
||||||
import: lang, deps
|
import: lang, deps
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
Agora.AuthorityToken
|
Agora.AuthorityToken
|
||||||
|
Agora.MultiSig
|
||||||
Agora.SafeMoney
|
Agora.SafeMoney
|
||||||
Agora.SafeMoney.QQ
|
Agora.SafeMoney.QQ
|
||||||
Agora.Stake
|
Agora.Stake
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,10 @@ import Agora.AuthorityToken (
|
||||||
AuthorityToken (AuthorityToken),
|
AuthorityToken (AuthorityToken),
|
||||||
authorityTokenPolicy,
|
authorityTokenPolicy,
|
||||||
)
|
)
|
||||||
|
import Agora.MultiSig (
|
||||||
|
MultiSig (..),
|
||||||
|
multiSigValidator,
|
||||||
|
)
|
||||||
import Agora.SafeMoney (LQ)
|
import Agora.SafeMoney (LQ)
|
||||||
import Agora.Stake (
|
import Agora.Stake (
|
||||||
Stake (Stake),
|
Stake (Stake),
|
||||||
|
|
@ -34,9 +38,16 @@ benchmarks =
|
||||||
benchGroup
|
benchGroup
|
||||||
"full_scripts"
|
"full_scripts"
|
||||||
[ bench "authorityTokenPolicy" $ authorityTokenPolicy authorityToken
|
[ bench "authorityTokenPolicy" $ authorityTokenPolicy authorityToken
|
||||||
|
, bench "multiSigValidator" $ multiSigValidator multiSig
|
||||||
, bench "stakePolicy" $ stakePolicy (Stake @LQ)
|
, bench "stakePolicy" $ stakePolicy (Stake @LQ)
|
||||||
, bench "stakeValidator" $ stakeValidator (Stake @LQ)
|
, bench "stakeValidator" $ stakeValidator (Stake @LQ)
|
||||||
]
|
]
|
||||||
|
|
||||||
authorityToken :: AuthorityToken
|
authorityToken :: AuthorityToken
|
||||||
authorityToken = AuthorityToken (Value.assetClass "" "")
|
authorityToken = AuthorityToken (Value.assetClass "" "")
|
||||||
|
|
||||||
|
multiSig :: MultiSig (s :: S)
|
||||||
|
multiSig = MultiSig
|
||||||
|
{ keys = PSNil
|
||||||
|
, minSigs = 0
|
||||||
|
}
|
||||||
52
src/Agora/MultiSig.hs
Normal file
52
src/Agora/MultiSig.hs
Normal 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 ())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue