Expanded logicalmodel of treasury tests
This commit is contained in:
parent
1a1b978b28
commit
8633ff15b5
1 changed files with 77 additions and 32 deletions
|
|
@ -22,14 +22,20 @@ import Apropos (
|
|||
(:+),
|
||||
)
|
||||
import Apropos.Script (HasScriptRunner (expect, runScriptTestsWhere, script))
|
||||
import Data.Maybe (fromMaybe)
|
||||
import Data.Set (Set)
|
||||
import Plutus.V1.Ledger.Api (
|
||||
CurrencySymbol,
|
||||
import Plutus.V1.Ledger.Address (Address (addressCredential))
|
||||
import Plutus.V1.Ledger.Contexts (
|
||||
ScriptContext (scriptContextPurpose, scriptContextTxInfo),
|
||||
ScriptPurpose (Minting),
|
||||
TxInfo (txInfoMint),
|
||||
Value,
|
||||
TxInfo (txInfoMint, txInfoOutputs),
|
||||
TxOut (txOutAddress, txOutValue),
|
||||
)
|
||||
import Plutus.V1.Ledger.Credential (Credential (PubKeyCredential, ScriptCredential))
|
||||
import Plutus.V1.Ledger.Scripts (ValidatorHash (ValidatorHash))
|
||||
import Plutus.V1.Ledger.Value (CurrencySymbol, TokenName (unTokenName), Value (getValue))
|
||||
import PlutusTx.AssocMap (Map, elems, keys)
|
||||
import PlutusTx.AssocMap qualified as AssocMap (all, lookup)
|
||||
import Test.Tasty (TestTree, testGroup)
|
||||
import Test.Tasty.Hedgehog (fromGroup)
|
||||
|
||||
|
|
@ -57,6 +63,7 @@ data TreasuryTxModel = TreasuryTxModel
|
|||
{ gatCs :: CurrencySymbol
|
||||
, ctx :: ScriptContext
|
||||
}
|
||||
deriving stock (Show)
|
||||
|
||||
instance Enumerable TreasuryTxProp where
|
||||
enumerated :: [TreasuryTxProp]
|
||||
|
|
@ -68,42 +75,80 @@ instance LogicalModel TreasuryTxProp where
|
|||
ExactlyOne [Var GATIsBurned, Var GATIsNotBurned]
|
||||
:&&: Var SomeGATsInvalid :->: Not (Var AllGATsValid)
|
||||
|
||||
isMinting :: ScriptPurpose -> Bool
|
||||
isMinting (Minting _) = True
|
||||
isMinting _ = False
|
||||
|
||||
authorityTokensValidIn :: CurrencySymbol -> TxOut -> Bool
|
||||
authorityTokensValidIn cs out =
|
||||
let add = out.txOutAddress :: Address
|
||||
outValue = out.txOutValue :: Value
|
||||
|
||||
tokenMap :: Maybe (Map TokenName Integer)
|
||||
tokenMap = AssocMap.lookup cs $ getValue outValue
|
||||
|
||||
cred = add.addressCredential :: Credential
|
||||
|
||||
validCred :: Map TokenName Integer -> Bool
|
||||
validCred m = case cred of
|
||||
PubKeyCredential _ -> False
|
||||
ScriptCredential (ValidatorHash vh) ->
|
||||
all (\tn -> vh == unTokenName tn) $ keys m
|
||||
in case tokenMap of
|
||||
Nothing -> True
|
||||
Just m -> validCred m
|
||||
|
||||
instance HasLogicalModel TreasuryTxProp TreasuryTxModel where
|
||||
satisfiesProperty :: TreasuryTxProp -> TreasuryTxModel -> Bool
|
||||
satisfiesProperty prop model =
|
||||
let purpose = model.ctx.scriptContextPurpose :: ScriptPurpose
|
||||
txInfo = model.ctx.scriptContextTxInfo :: TxInfo
|
||||
amountMinted = txInfo.txInfoMint :: Value
|
||||
|
||||
csValue :: Maybe (Map TokenName Integer)
|
||||
csValue = AssocMap.lookup model.gatCs (getValue amountMinted)
|
||||
|
||||
csValueSum :: Integer
|
||||
csValueSum = case csValue of
|
||||
Nothing -> 0
|
||||
Just m -> sum $ elems m
|
||||
in case prop of
|
||||
ScriptPurposeIsNotMinting -> case purpose of
|
||||
Minting _ -> False
|
||||
_ -> True
|
||||
_ -> undefined
|
||||
GATIsBurned -> csValueSum <= -1
|
||||
GATIsNotBurned -> csValueSum >= 0
|
||||
AllGATsValid ->
|
||||
all
|
||||
(authorityTokensValidIn model.gatCs)
|
||||
txInfo.txInfoOutputs
|
||||
SomeGATsInvalid ->
|
||||
any
|
||||
(not . authorityTokensValidIn model.gatCs)
|
||||
txInfo.txInfoOutputs
|
||||
ScriptPurposeIsNotMinting -> not $ isMinting purpose
|
||||
|
||||
-- instance HasParameterisedGenerator TreasuryTxProp Int where
|
||||
-- parameterisedGenerator :: Set TreasuryTxProp -> Gen Int
|
||||
-- parameterisedGenerator = undefined
|
||||
instance HasParameterisedGenerator TreasuryTxProp TreasuryTxModel where
|
||||
parameterisedGenerator :: Set TreasuryTxProp -> Gen TreasuryTxModel
|
||||
parameterisedGenerator = undefined
|
||||
|
||||
-- instance HasScriptRunner TreasuryTxProp Int where
|
||||
-- expect = undefined
|
||||
-- script = undefined
|
||||
instance HasScriptRunner TreasuryTxProp TreasuryTxModel where
|
||||
expect = undefined
|
||||
script = undefined
|
||||
|
||||
-- genTests :: TestTree
|
||||
-- genTests =
|
||||
-- testGroup "genTests" $
|
||||
-- fromGroup
|
||||
-- <$> [ runGeneratorTestsWhere
|
||||
-- (Apropos :: Int :+ TreasuryTxProp)
|
||||
-- "Generator"
|
||||
-- Yes
|
||||
-- ]
|
||||
genTests :: TestTree
|
||||
genTests =
|
||||
testGroup "genTests" $
|
||||
fromGroup
|
||||
<$> [ runGeneratorTestsWhere
|
||||
(Apropos :: TreasuryTxModel :+ TreasuryTxProp)
|
||||
"Generator"
|
||||
Yes
|
||||
]
|
||||
|
||||
-- plutarchTests :: TestTree
|
||||
-- plutarchTests =
|
||||
-- testGroup "plutarchTests" $
|
||||
-- fromGroup
|
||||
-- <$> [ runScriptTestsWhere
|
||||
-- (Apropos :: Int :+ TreasuryTxProp)
|
||||
-- "ScriptValid"
|
||||
-- Yes
|
||||
-- ]
|
||||
plutarchTests :: TestTree
|
||||
plutarchTests =
|
||||
testGroup "plutarchTests" $
|
||||
fromGroup
|
||||
<$> [ runScriptTestsWhere
|
||||
(Apropos :: TreasuryTxModel :+ TreasuryTxProp)
|
||||
"ScriptValid"
|
||||
Yes
|
||||
]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue