@@ -30,6 +30,12 @@ import Ledger.Ada qualified as Ada
3030import Ledger.Address (Address (.. ))
3131import Ledger.Constraints.OffChain (UnbalancedTx (.. ), fromScriptOutput )
3232import Ledger.Crypto (PrivateKey , PubKeyHash )
33+ import Ledger.Interval (
34+ Extended (Finite , NegInf , PosInf ),
35+ Interval (Interval ),
36+ LowerBound (LowerBound ),
37+ UpperBound (UpperBound ),
38+ )
3339import Ledger.Scripts (Datum , DatumHash )
3440import Ledger.Time (POSIXTimeRange )
3541import Ledger.TimeSlot (posixTimeRangeToContainedSlotRange )
@@ -67,8 +73,12 @@ preBalanceTxIO pabConf ownPkh unbalancedTx =
6773 utxos <- lift $ CardanoCLI. utxosAt @ w pabConf $ Ledger. pubKeyHashAddress (Ledger. PaymentPubKeyHash ownPkh) Nothing
6874 privKeys <- newEitherT $ Files. readPrivateKeys @ w pabConf
6975 let utxoIndex = fmap Tx. toTxOut utxos <> fmap (Ledger. toTxOut . fromScriptOutput) (unBalancedTxUtxoIndex unbalancedTx)
70- tx = addValidRange (unBalancedTxValidityTimeRange unbalancedTx) (unBalancedTxTx unbalancedTx)
7176 requiredSigs = map Ledger. unPaymentPubKeyHash $ Map. keys (unBalancedTxRequiredSignatories unbalancedTx)
77+ tx <-
78+ hoistEither $
79+ addValidRange
80+ (unBalancedTxValidityTimeRange unbalancedTx)
81+ (unBalancedTxTx unbalancedTx)
7282
7383 lift $ printLog @ w Debug $ show utxoIndex
7484
@@ -262,9 +272,19 @@ addSignatories ownPkh privKeys pkhs tx =
262272 tx
263273 (ownPkh : pkhs)
264274
265- addValidRange :: POSIXTimeRange -> Tx -> Tx
275+ addValidRange :: POSIXTimeRange -> Tx -> Either Text Tx
266276addValidRange timeRange tx =
267- tx {txValidRange = posixTimeRangeToContainedSlotRange def timeRange}
277+ if validateRange timeRange
278+ then Right $ tx {txValidRange = posixTimeRangeToContainedSlotRange def timeRange}
279+ else Left " Invalid validity interval."
280+
281+ validateRange :: forall (a :: Type ). Ord a => Interval a -> Bool
282+ validateRange (Interval (LowerBound PosInf _) _) = False
283+ validateRange (Interval _ (UpperBound NegInf _)) = False
284+ validateRange (Interval (LowerBound (Finite lowerBound) _) (UpperBound (Finite upperBound) _))
285+ | lowerBound >= upperBound = False
286+ | otherwise = True
287+ validateRange _ = True
268288
269289showText :: forall (a :: Type ). Show a => a -> Text
270290showText = Text. pack . show
0 commit comments