stricter constraints over inputs

It will only allow treasuries given in the datum as input. It prevents
unwanted change in the system.
This commit is contained in:
Seungheon Oh 2022-04-22 19:01:36 -05:00
parent ec46273b5b
commit bf13fd926e
4 changed files with 66 additions and 43 deletions

View file

@ -7,16 +7,18 @@ This module tests the Treasury Withdrawal Effect.
-} -}
module Spec.Effect.TreasuryWithdrawal (tests) where module Spec.Effect.TreasuryWithdrawal (tests) where
import Spec.Sample.Effect.TreasuryWithdrawal import Spec.Sample.Effect.TreasuryWithdrawal (
( currSymbol, buildReceiversOutputFromDatum,
users, buildScriptContext,
treasuries, currSymbol,
inputGAT, inputGAT,
inputTreasury, inputTreasury,
outputTreasury, inputUser,
outputUser, outputTreasury,
buildReceiversOutputFromDatum, outputUser,
buildScriptContext ) treasuries,
users,
)
import Agora.Effect.TreasuryWithdrawal ( import Agora.Effect.TreasuryWithdrawal (
TreasuryWithdrawalDatum (TreasuryWithdrawalDatum), TreasuryWithdrawalDatum (TreasuryWithdrawalDatum),
@ -110,10 +112,23 @@ tests =
[ inputGAT [ inputGAT
, inputTreasury 999 (asset1 20) , inputTreasury 999 (asset1 20)
] ]
$ [ outputTreasury 999 (asset1 17) $ outputTreasury 999 (asset1 17) :
buildReceiversOutputFromDatum datum3
)
, effectFailsWith
"Prevent transactions besides the withdrawal"
(treasuryWithdrawalValidator currSymbol)
datum3
( buildScriptContext
[ inputGAT
, inputTreasury 1 (asset1 20)
, inputUser 99 (asset2 100)
]
$ [ outputTreasury 1 (asset1 17)
, outputUser 100 (asset2 100)
] ]
++ buildReceiversOutputFromDatum datum3 ++ buildReceiversOutputFromDatum datum3
) )
] ]
] ]
where where
@ -124,17 +139,17 @@ tests =
[ (head users, asset1 1) [ (head users, asset1 1)
, (users !! 1, asset1 1) , (users !! 1, asset1 1)
, (users !! 2, asset1 1) , (users !! 2, asset1 1)
] $ ]
[ head treasuries [ treasuries !! 1
, treasuries !! 1
, treasuries !! 2 , treasuries !! 2
, treasuries !! 3
] ]
datum2 = datum2 =
TreasuryWithdrawalDatum TreasuryWithdrawalDatum
[ (head users, asset1 4 <> asset2 5) [ (head users, asset1 4 <> asset2 5)
, (users !! 1, asset1 2 <> asset2 1) , (users !! 1, asset1 2 <> asset2 1)
, (users !! 2, asset1 1) , (users !! 2, asset1 1)
] $ ]
[ head treasuries [ head treasuries
, treasuries !! 1 , treasuries !! 1
, treasuries !! 2 , treasuries !! 2
@ -144,6 +159,5 @@ tests =
[ (head users, asset1 1) [ (head users, asset1 1)
, (users !! 1, asset1 1) , (users !! 1, asset1 1)
, (users !! 2, asset1 1) , (users !! 2, asset1 1)
] $ ]
[ treasuries !! 1 [treasuries !! 1]
]

View file

@ -7,6 +7,7 @@ This module provides smaples for Treasury Withdrawal Effect tests.
-} -}
module Spec.Sample.Effect.TreasuryWithdrawal ( module Spec.Sample.Effect.TreasuryWithdrawal (
inputTreasury, inputTreasury,
inputUser,
inputGAT, inputGAT,
outputTreasury, outputTreasury,
outputUser, outputUser,
@ -77,7 +78,7 @@ treasuries = ScriptCredential . ValidatorHash . toBuiltin . sha2 . C.pack . show
inputGAT :: TxInInfo inputGAT :: TxInInfo
inputGAT = inputGAT =
TxInInfo -- Initiator TxInInfo
(TxOutRef "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" 1) (TxOutRef "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" 1)
TxOut TxOut
{ txOutAddress = Address (ScriptCredential $ validatorHash validator) Nothing { txOutAddress = Address (ScriptCredential $ validatorHash validator) Nothing
@ -87,7 +88,7 @@ inputGAT =
inputTreasury :: Int -> Value -> TxInInfo inputTreasury :: Int -> Value -> TxInInfo
inputTreasury indx val = inputTreasury indx val =
TxInInfo -- Initiator TxInInfo
(TxOutRef "" 1) (TxOutRef "" 1)
TxOut TxOut
{ txOutAddress = Address (treasuries !! indx) Nothing { txOutAddress = Address (treasuries !! indx) Nothing
@ -95,6 +96,16 @@ inputTreasury indx val =
, txOutDatumHash = Just (DatumHash "") , txOutDatumHash = Just (DatumHash "")
} }
inputUser :: Int -> Value -> TxInInfo
inputUser indx val =
TxInInfo
(TxOutRef "" 1)
TxOut
{ txOutAddress = Address (users !! indx) Nothing
, txOutValue = val
, txOutDatumHash = Just (DatumHash "")
}
outputTreasury :: Int -> Value -> TxOut outputTreasury :: Int -> Value -> TxOut
outputTreasury indx val = outputTreasury indx val =
TxOut TxOut

View file

@ -141,8 +141,7 @@ effectSucceedsWith ::
PLifted datum -> PLifted datum ->
ScriptContext -> ScriptContext ->
TestTree TestTree
effectSucceedsWith tag eff datum scriptContext = effectSucceedsWith tag eff datum = validatorSucceedsWith tag eff datum ()
validatorSucceedsWith tag eff datum () scriptContext
-- | Check that a validator script fails, given a name and arguments. -- | Check that a validator script fails, given a name and arguments.
effectFailsWith :: effectFailsWith ::
@ -154,8 +153,7 @@ effectFailsWith ::
PLifted datum -> PLifted datum ->
ScriptContext -> ScriptContext ->
TestTree TestTree
effectFailsWith tag eff datum scriptContext = effectFailsWith tag eff datum = validatorFailsWith tag eff datum ()
validatorFailsWith tag eff datum () scriptContext
-- | Check that an arbitrary script doesn't error when evaluated, given a name. -- | Check that an arbitrary script doesn't error when evaluated, given a name.
scriptSucceeds :: String -> Script -> TestTree scriptSucceeds :: String -> Script -> TestTree

View file

@ -38,11 +38,10 @@ import Plutus.V1.Ledger.Credential (Credential)
import Plutus.V1.Ledger.Value (CurrencySymbol, Value) import Plutus.V1.Ledger.Value (CurrencySymbol, Value)
import PlutusTx qualified import PlutusTx qualified
data TreasuryWithdrawalDatum = data TreasuryWithdrawalDatum = TreasuryWithdrawalDatum
TreasuryWithdrawalDatum { receivers :: [(Credential, Value)]
{ receivers :: [(Credential, Value)] , treasuries :: [Credential]
, treasuries :: [Credential] }
}
deriving stock (Show, GHC.Generic) deriving stock (Show, GHC.Generic)
deriving anyclass (Generic) deriving anyclass (Generic)
@ -119,23 +118,15 @@ treasuryWithdrawalValidator currSymbol = makeEffect currSymbol $
let treasuryOutputValues = let treasuryOutputValues =
pfilter pfilter
# plam # plam
( \((pfield @"_0" #) . pfromData -> cred) -> pelem # cred # datum.treasuries) (\((pfield @"_0" #) . pfromData -> cred) -> pelem # cred # datum.treasuries)
# outputValues # outputValues
treasuryInputValuesSum = sumValues =
pfoldr pfoldr
# plam (\((pfield @"_1" #) . pfromData -> x) y -> paddValue # pfromData x # y) # plam (\((pfield @"_1" #) . pfromData -> x) y -> paddValue # pfromData x # y)
# pconstant (mempty :: Value) # pconstant (mempty :: Value)
# treasuryInputValues treasuryInputValuesSum = sumValues # treasuryInputValues
treasuryOutputValuesSum = treasuryOutputValuesSum = sumValues # treasuryOutputValues
pfoldr receiverValuesSum = sumValues # datum.receivers
# plam (\((pfield @"_1" #) . pfromData -> x) y -> paddValue # pfromData x # y)
# pconstant (mempty :: Value)
# treasuryOutputValues
receiverValuesSum =
pfoldr
# plam (\((pfield @"_1" #) . pfromData -> x) y -> paddValue # pfromData x # y)
# pconstant (mempty :: Value)
# datum.receivers
outputContentMatchesRecivers = outputContentMatchesRecivers =
pall # plam (\out -> pelem # out # outputValues) pall # plam (\out -> pelem # out # outputValues)
#$ datum.receivers #$ datum.receivers
@ -148,8 +139,17 @@ treasuryWithdrawalValidator currSymbol = makeEffect currSymbol $
effInput.address #== pfield @"address" # pfromData x effInput.address #== pfield @"address" # pfromData x
) )
# pfromData txInfo.outputs # pfromData txInfo.outputs
inputsAreOnlyTreasuries =
pall
# plam
( \((pfield @"_0" #) . pfromData -> cred) ->
cred #== pfield @"credential" # effInput.address
#|| pelem # cred # datum.treasuries
)
# inputValues
passert "Transaction output does not match receivers" outputContentMatchesRecivers passert "Transaction output does not match receivers" outputContentMatchesRecivers
passert "Transaction should not pay to effects" shouldNotPayToEffect passert "Transaction should not pay to effects" shouldNotPayToEffect
passert "Transaction should only have treasuries specified in the datum as input" inputsAreOnlyTreasuries
passert "Remainders should be returned to the treasury" excessShouldBePaidToInputs passert "Remainders should be returned to the treasury" excessShouldBePaidToInputs
popaque $ pconstant () popaque $ pconstant ()