@@ -432,6 +432,8 @@ import Cardano.Api.Internal.SerialiseJSON
432432import Cardano.Api.Internal.Tx.BuildTxWith
433433import Cardano.Api.Internal.Tx.Output
434434import Cardano.Api.Internal.Tx.Sign
435+ import Cardano.Api.Internal.Tx.UTxO (UTxO )
436+ import Cardano.Api.Internal.Tx.UTxO qualified as UTxO
435437import Cardano.Api.Internal.TxIn
436438import Cardano.Api.Internal.TxMetadata
437439import Cardano.Api.Internal.Utils
@@ -570,16 +572,20 @@ deriving instance Eq (TxTotalCollateral era)
570572
571573deriving instance Show (TxTotalCollateral era )
572574
573- data TxInsReference era where
574- TxInsReferenceNone :: TxInsReference era
575+ data TxInsReference build era where
576+ TxInsReferenceNone :: TxInsReference build era
575577 TxInsReference
576578 :: BabbageEraOnwards era
577579 -> [TxIn ]
578- -> TxInsReference era
580+ -- ^ A list of reference inputs
581+ -> BuildTxWith build (Set HashableScriptData )
582+ -- ^ A set of datums, which hashes are referenced in UTXO of reference inputs. Those datums will be inserted
583+ -- to the datum map available to the scripts.
584+ -> TxInsReference build era
579585
580- deriving instance Eq (TxInsReference era )
586+ deriving instance Eq (TxInsReference build era )
581587
582- deriving instance Show (TxInsReference era )
588+ deriving instance Show (TxInsReference build era )
583589
584590-- ----------------------------------------------------------------------------
585591-- Transaction fees
@@ -984,7 +990,7 @@ data TxBodyContent build era
984990 = TxBodyContent
985991 { txIns :: TxIns build era
986992 , txInsCollateral :: TxInsCollateral era
987- , txInsReference :: TxInsReference era
993+ , txInsReference :: TxInsReference build era
988994 , txOuts :: [TxOut CtxTx era ]
989995 , txTotalCollateral :: TxTotalCollateral era
990996 , txReturnCollateral :: TxReturnCollateral CtxTx era
@@ -1075,25 +1081,36 @@ addTxInCollateral
10751081 :: IsAlonzoBasedEra era => TxIn -> TxBodyContent build era -> TxBodyContent build era
10761082addTxInCollateral txInCollateral = addTxInsCollateral [txInCollateral]
10771083
1078- setTxInsReference :: TxInsReference era -> TxBodyContent build era -> TxBodyContent build era
1084+ setTxInsReference :: TxInsReference build era -> TxBodyContent build era -> TxBodyContent build era
10791085setTxInsReference v txBodyContent = txBodyContent{txInsReference = v}
10801086
10811087modTxInsReference
1082- :: (TxInsReference era -> TxInsReference era ) -> TxBodyContent build era -> TxBodyContent build era
1088+ :: (TxInsReference build era -> TxInsReference build era )
1089+ -> TxBodyContent build era
1090+ -> TxBodyContent build era
10831091modTxInsReference f txBodyContent = txBodyContent{txInsReference = f (txInsReference txBodyContent)}
10841092
10851093addTxInsReference
1086- :: IsBabbageBasedEra era => [TxIn ] -> TxBodyContent build era -> TxBodyContent build era
1087- addTxInsReference txInsReference =
1094+ :: Applicative (BuildTxWith build )
1095+ => IsBabbageBasedEra era
1096+ => [TxIn ]
1097+ -> Set HashableScriptData
1098+ -> TxBodyContent build era
1099+ -> TxBodyContent build era
1100+ addTxInsReference txInsReference scriptData =
10881101 modTxInsReference
10891102 ( \ case
1090- TxInsReferenceNone -> TxInsReference babbageBasedEra txInsReference
1091- TxInsReference era xs -> TxInsReference era (xs <> txInsReference)
1103+ TxInsReferenceNone -> TxInsReference babbageBasedEra txInsReference ( pure scriptData)
1104+ TxInsReference era xs bScriptData' -> TxInsReference era (xs <> txInsReference) (( <> scriptData) <$> bScriptData' )
10921105 )
10931106
10941107addTxInReference
1095- :: IsBabbageBasedEra era => TxIn -> TxBodyContent build era -> TxBodyContent build era
1096- addTxInReference txInReference = addTxInsReference [txInReference]
1108+ :: Applicative (BuildTxWith build )
1109+ => IsBabbageBasedEra era
1110+ => TxIn
1111+ -> TxBodyContent build era
1112+ -> TxBodyContent build era
1113+ addTxInReference txInReference = addTxInsReference [txInReference] mempty
10971114
10981115setTxOuts :: [TxOut CtxTx era ] -> TxBodyContent build era -> TxBodyContent build era
10991116setTxOuts v txBodyContent = txBodyContent{txOuts = v}
@@ -1370,9 +1387,11 @@ createTransactionBody
13701387 :: forall era
13711388 . HasCallStack
13721389 => ShelleyBasedEra era
1390+ -> UTxO era
1391+ -- ^ UTXO for reference inputs
13731392 -> TxBodyContent BuildTx era
13741393 -> Either TxBodyError (TxBody era )
1375- createTransactionBody sbe bc =
1394+ createTransactionBody sbe utxo bc =
13761395 shelleyBasedEraConstraints sbe $ do
13771396 (sData, mScriptIntegrityHash, scripts) <-
13781397 caseShelleyToMaryOrAlonzoEraOnwards
@@ -1387,7 +1406,7 @@ createTransactionBody sbe bc =
13871406 )
13881407 ( \ aeon -> do
13891408 TxScriptWitnessRequirements languages scripts dats redeemers <-
1390- collectTxBodyScriptWitnessRequirements aeon bc
1409+ collectTxBodyScriptWitnessRequirements aeon utxo bc
13911410
13921411 let pparams = txProtocolParams bc
13931412 sData = TxBodyScriptData aeon dats redeemers
@@ -1742,11 +1761,11 @@ fromLedgerTxInsCollateral sbe body =
17421761 sbe
17431762
17441763fromLedgerTxInsReference
1745- :: ShelleyBasedEra era -> Ledger. TxBody (ShelleyLedgerEra era ) -> TxInsReference era
1764+ :: ShelleyBasedEra era -> Ledger. TxBody (ShelleyLedgerEra era ) -> TxInsReference ViewTx era
17461765fromLedgerTxInsReference sbe txBody =
17471766 caseShelleyToAlonzoOrBabbageEraOnwards
17481767 (const TxInsReferenceNone )
1749- (\ w -> TxInsReference w $ map fromShelleyTxIn . toList $ txBody ^. L. referenceInputsTxBodyL)
1768+ (\ w -> TxInsReference w ( map fromShelleyTxIn . toList $ txBody ^. L. referenceInputsTxBodyL) ViewTx )
17501769 sbe
17511770
17521771fromLedgerTxTotalCollateral
@@ -2108,11 +2127,11 @@ convPParamsToScriptIntegrityHash
21082127 -> Alonzo. TxDats (ShelleyLedgerEra era )
21092128 -> Set Plutus. Language
21102129 -> StrictMaybe L. ScriptIntegrityHash
2111- convPParamsToScriptIntegrityHash w txProtocolParams redeemers datums languages =
2130+ convPParamsToScriptIntegrityHash w ( BuildTxWith mTxProtocolParams) redeemers datums languages =
21122131 alonzoEraOnwardsConstraints w $
2113- case txProtocolParams of
2114- BuildTxWith Nothing -> SNothing
2115- BuildTxWith ( Just (LedgerProtocolParameters pp) ) ->
2132+ case mTxProtocolParams of
2133+ Nothing -> SNothing
2134+ Just (LedgerProtocolParameters pp) ->
21162135 Alonzo. hashScriptIntegrity (Set. map (L. getLanguageView pp) languages) redeemers datums
21172136
21182137convLanguages :: [(ScriptWitnessIndex , AnyScriptWitness era )] -> Set Plutus. Language
@@ -2122,11 +2141,11 @@ convLanguages witnesses =
21222141 | (_, AnyScriptWitness (PlutusScriptWitness _ v _ _ _ _)) <- witnesses
21232142 ]
21242143
2125- convReferenceInputs :: TxInsReference era -> Set Ledger. TxIn
2144+ convReferenceInputs :: TxInsReference build era -> Set Ledger. TxIn
21262145convReferenceInputs txInsReference =
21272146 case txInsReference of
21282147 TxInsReferenceNone -> mempty
2129- TxInsReference _ refTxins -> fromList $ map toShelleyTxIn refTxins
2148+ TxInsReference _ refTxins _ -> fromList $ map toShelleyTxIn refTxins
21302149
21312150-- | Returns an OSet of proposals from 'TxProposalProcedures'.
21322151convProposalProcedures
@@ -2986,18 +3005,27 @@ collectTxBodyScriptWitnessRequirements
29863005 :: forall era
29873006 . IsShelleyBasedEra era
29883007 => AlonzoEraOnwards era
3008+ -> UTxO era
3009+ -- ^ UTXO for reference inputs
29893010 -> TxBodyContent BuildTx era
29903011 -> Either
29913012 TxBodyError
29923013 (TxScriptWitnessRequirements (ShelleyLedgerEra era ))
29933014collectTxBodyScriptWitnessRequirements
29943015 aEon
3016+ utxo
29953017 bc@ TxBodyContent
2996- { txOuts
3018+ { txInsReference
3019+ , txOuts
29973020 } =
29983021 obtainAlonzoScriptPurposeConstraints aEon $ do
29993022 let sbe = shelleyBasedEra @ era
3000- supplementaldatums = TxScriptWitnessRequirements mempty mempty (getSupplementalDatums aEon txOuts) mempty
3023+ supplementaldatums =
3024+ TxScriptWitnessRequirements
3025+ mempty
3026+ mempty
3027+ (getSupplementalDatums aEon txInsReference utxo txOuts)
3028+ mempty
30013029 txInWits <-
30023030 first TxBodyPlutusScriptDecodeError $
30033031 legacyWitnessToScriptRequirements aEon $
@@ -3053,17 +3081,30 @@ collectTxBodyScriptWitnessRequirements
30533081
30543082getSupplementalDatums
30553083 :: AlonzoEraOnwards era
3084+ -> TxInsReference BuildTx era
3085+ -- ^ reference inputs
3086+ -> UTxO era
3087+ -- ^ UTxO for reference inputs
30563088 -> [TxOut CtxTx era ]
30573089 -> L. TxDats (ShelleyLedgerEra era )
3058- getSupplementalDatums eon [] = alonzoEraOnwardsConstraints eon mempty
3059- getSupplementalDatums eon txouts =
3060- alonzoEraOnwardsConstraints eon $
3061- L. TxDats $
3062- fromList
3063- [ (L. hashData ledgerData, ledgerData)
3064- | TxOut _ _ (TxOutSupplementalDatum _ d) _ <- txouts
3065- , let ledgerData = toAlonzoData d
3090+ getSupplementalDatums eon txInsRef utxo txOutsFromTx = alonzoEraOnwardsConstraints eon $ do
3091+ let refTxInsDats =
3092+ [ d
3093+ | TxInsReference _ txIns (BuildTxWith datumSet) <- [txInsRef]
3094+ , let datumMap = fromList $ map (\ h -> (hashScriptDataBytes h, h)) $ toList datumSet
3095+ , txIn <- txIns
3096+ , -- resolve only hashes
3097+ TxOut _ _ (TxOutDatumHash _ datumHash) _ <- maybeToList $ UTxO. lookup txIn utxo
3098+ , d <- maybeToList $ Map. lookup datumHash datumMap
30663099 ]
3100+ -- use only supplemental datum
3101+ txOutsDats = [d | TxOut _ _ (TxOutSupplementalDatum _ d) _ <- txOutsFromTx]
3102+ L. TxDats $
3103+ fromList $
3104+ [ (L. hashData ledgerData, ledgerData)
3105+ | d <- refTxInsDats <> txOutsDats
3106+ , let ledgerData = toAlonzoData d
3107+ ]
30673108
30683109extractWitnessableTxIns
30693110 :: AlonzoEraOnwards era
0 commit comments