Skip to content

Commit e801553

Browse files
committed
add disjoint refInput PredicateFailure
1 parent b05ba36 commit e801553

File tree

2 files changed

+36
-2
lines changed
  • eras/babbage/impl/src/Cardano/Ledger/Babbage/Rules
  • libs/cardano-ledger-test/src/Test/Cardano/Ledger/Generic

2 files changed

+36
-2
lines changed

eras/babbage/impl/src/Cardano/Ledger/Babbage/Rules/Utxo.hs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ import Cardano.Ledger.Alonzo.Tx (AlonzoTx (..))
4747
import Cardano.Ledger.Alonzo.TxWits (nullRedeemers)
4848
import Cardano.Ledger.Babbage.Collateral (collAdaBalance)
4949
import Cardano.Ledger.Babbage.Core
50-
import Cardano.Ledger.Babbage.Era (BabbageUTXO)
50+
import Cardano.Ledger.Babbage.Era (BabbageEra, BabbageUTXO)
5151
import Cardano.Ledger.Babbage.Rules.Utxos (BabbageUTXOS)
5252
import Cardano.Ledger.BaseTypes (
53+
ProtVer (..),
5354
ShelleyBase,
5455
epochInfo,
5556
networkId,
@@ -71,7 +72,7 @@ import Cardano.Ledger.TxIn (TxIn)
7172
import Cardano.Ledger.UTxO (EraUTxO (..), UTxO (..), areAllAdaOnly, balance)
7273
import Cardano.Ledger.Val ((<->))
7374
import qualified Cardano.Ledger.Val as Val (inject, isAdaOnly, pointwise)
74-
import Control.Monad (unless)
75+
import Control.Monad (unless, when)
7576
import Control.Monad.Trans.Reader (asks)
7677
import Control.SetAlgebra (eval, (◁))
7778
import Control.State.Transition.Extended (
@@ -89,6 +90,8 @@ import Data.Foldable (sequenceA_, toList)
8990
import Data.List.NonEmpty (NonEmpty)
9091
import qualified Data.Map.Strict as Map
9192
import Data.Maybe.Strict (StrictMaybe (..))
93+
import Data.Set (Set)
94+
import qualified Data.Set as Set
9295
import Data.Typeable (Typeable)
9396
import GHC.Generics (Generic)
9497
import Lens.Micro
@@ -110,6 +113,9 @@ data BabbageUtxoPredFailure era
110113
-- together with the minimum value for the given output.
111114
BabbageOutputTooSmallUTxO
112115
![(TxOut era, Coin)]
116+
| -- | TxIns that appear in both inputs and reference inputs
117+
BabbageNonDisjointRefInputs
118+
!(Set (TxIn (EraCrypto era)))
113119
deriving (Generic)
114120

115121
deriving instance
@@ -118,6 +124,7 @@ deriving instance
118124
, Show (PredicateFailure (EraRule "UTXO" era))
119125
, Show (TxOut era)
120126
, Show (Script era)
127+
, Show (TxIn (EraCrypto era))
121128
) =>
122129
Show (BabbageUtxoPredFailure era)
123130

@@ -127,6 +134,7 @@ deriving instance
127134
, Eq (PredicateFailure (EraRule "UTXO" era))
128135
, Eq (TxOut era)
129136
, Eq (Script era)
137+
, Eq (TxIn (EraCrypto era))
130138
) =>
131139
Eq (BabbageUtxoPredFailure era)
132140

@@ -194,6 +202,20 @@ feesOK pp tx (UTxO utxo) =
194202
validateTotalCollateral pp txBody utxoCollateral
195203
]
196204

205+
disjointRefInputs ::
206+
forall era.
207+
EraPParams era =>
208+
PParams era ->
209+
Set (TxIn (EraCrypto era)) ->
210+
Set (TxIn (EraCrypto era)) ->
211+
Test (BabbageUtxoPredFailure era)
212+
disjointRefInputs pp inputs refInputs =
213+
when
214+
(pvMajor (pp ^. ppProtocolVersionL) > eraProtVerHigh @(BabbageEra (EraCrypto era)))
215+
(failureIf (null common) (BabbageNonDisjointRefInputs common))
216+
where
217+
common = inputs `Set.intersection` refInputs
218+
197219
validateTotalCollateral ::
198220
forall era.
199221
BabbageEraTxBody era =>
@@ -320,6 +342,13 @@ utxoTransition = do
320342
{- txb := txbody tx -}
321343
let txBody = body tx
322344
allInputs = txBody ^. allInputsTxBodyF
345+
refInputs :: Set (TxIn (EraCrypto era))
346+
refInputs = txBody ^. referenceInputsTxBodyL
347+
inputs :: Set (TxIn (EraCrypto era))
348+
inputs = txBody ^. inputsTxBodyL
349+
350+
{- inputs ∩ refInputs = ∅ -}
351+
runTest $ disjointRefInputs @era pp inputs refInputs
323352

324353
{- ininterval slot (txvld txb) -}
325354
runTest $ Allegra.validateOutsideValidityIntervalUTxO slot txBody
@@ -431,6 +460,7 @@ instance
431460
, EncCBOR (PredicateFailure (EraRule "UTXOS" era))
432461
, EncCBOR (PredicateFailure (EraRule "UTXO" era))
433462
, EncCBOR (Script era)
463+
, EncCBOR (TxIn (EraCrypto era))
434464
, Typeable (TxAuxData era)
435465
) =>
436466
EncCBOR (BabbageUtxoPredFailure era)
@@ -440,6 +470,7 @@ instance
440470
AlonzoInBabbageUtxoPredFailure x -> Sum AlonzoInBabbageUtxoPredFailure 1 !> To x
441471
IncorrectTotalCollateralField c1 c2 -> Sum IncorrectTotalCollateralField 2 !> To c1 !> To c2
442472
BabbageOutputTooSmallUTxO x -> Sum BabbageOutputTooSmallUTxO 3 !> To x
473+
BabbageNonDisjointRefInputs x -> Sum BabbageNonDisjointRefInputs 4 !> To x
443474

444475
instance
445476
( Era era
@@ -456,6 +487,7 @@ instance
456487
1 -> SumD AlonzoInBabbageUtxoPredFailure <! From
457488
2 -> SumD IncorrectTotalCollateralField <! From <! From
458489
3 -> SumD BabbageOutputTooSmallUTxO <! From
490+
4 -> SumD BabbageNonDisjointRefInputs <! From
459491
n -> Invalid n
460492

461493
deriving via

libs/cardano-ledger-test/src/Test/Cardano/Ledger/Generic/PrettyCore.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,8 @@ ppBabbageUtxoPredFailure (IncorrectTotalCollateralField c1 c2) =
12871287
[("collateral provided", pcCoin c1), ("collateral declared", pcCoin c2)]
12881288
ppBabbageUtxoPredFailure (BabbageOutputTooSmallUTxO xs) =
12891289
ppSexp "BabbageOutputTooSmallUTxO" [ppList (ppPair (pcTxOut reify) pcCoin) xs]
1290+
ppBabbageUtxoPredFailure (BabbageNonDisjointRefInputs xs) =
1291+
ppSexp "BabbageNonDisjointRefInputs" [ppSet pcTxIn xs]
12901292

12911293
instance Reflect era => PrettyA (BabbageUtxoPredFailure era) where
12921294
prettyA = ppBabbageUtxoPredFailure

0 commit comments

Comments
 (0)