2
2
{-# LANGUAGE DataKinds #-}
3
3
{-# LANGUAGE FlexibleContexts #-}
4
4
{-# LANGUAGE GADTs #-}
5
+ {-# LANGUAGE LambdaCase #-}
5
6
{-# LANGUAGE RankNTypes #-}
6
7
{-# LANGUAGE ScopedTypeVariables #-}
7
8
{-# LANGUAGE TypeApplications #-}
@@ -36,7 +37,7 @@ import Cardano.DbSync.Era.Shelley.Generic.Util
36
37
import Cardano.DbSync.Era.Shelley.Generic.Witness
37
38
import Cardano.DbSync.Types (DataHash )
38
39
import qualified Cardano.Ledger.Address as Ledger
39
- import Cardano.Ledger.Alonzo.Scripts (ExUnits (.. ), txscriptfee , unBinaryPlutus )
40
+ import Cardano.Ledger.Alonzo.Scripts (AsIndex ( .. ), ExUnits (.. ), PlutusPurpose ( .. ), txscriptfee , unPlutusBinary )
40
41
import qualified Cardano.Ledger.Alonzo.Scripts as Alonzo
41
42
import qualified Cardano.Ledger.Alonzo.Tx as Alonzo
42
43
import Cardano.Ledger.Alonzo.TxAuxData (AlonzoTxAuxData (.. ), getAlonzoTxAuxDataScripts )
@@ -46,21 +47,29 @@ import qualified Cardano.Ledger.Alonzo.TxWits as Alonzo
46
47
import Cardano.Ledger.BaseTypes
47
48
import Cardano.Ledger.Coin (Coin (.. ))
48
49
import qualified Cardano.Ledger.Core as Core
49
- import qualified Cardano.Ledger.Era as Ledger
50
+
51
+ -- import qualified Cardano.Ledger.Era as Ledger
50
52
import qualified Cardano.Ledger.Keys as Ledger
51
53
import Cardano.Ledger.Mary.Value (MaryValue (.. ), MultiAsset (.. ), policyID )
52
- import Cardano.Ledger.Plutus.Language (Plutus (.. ))
53
- import qualified Cardano.Ledger.Plutus.Language as Alonzo
54
+
55
+ -- import Cardano.Ledger.Plutus.Language (Plutus (..))
56
+ -- import qualified Cardano.Ledger.Plutus.Language as Alonzo
54
57
import qualified Cardano.Ledger.SafeHash as Ledger
55
58
import Cardano.Ledger.Shelley.Scripts (ScriptHash )
56
- import qualified Cardano.Ledger.Shelley.Tx as ShelleyTx
59
+
60
+ -- import qualified Cardano.Ledger.Shelley.Tx as ShelleyTx
57
61
import qualified Cardano.Ledger.Shelley.TxBody as Shelley
58
62
import Cardano.Ledger.Shelley.TxCert as Shelley
59
63
import Cardano.Prelude
60
64
import qualified Data.Aeson as Aeson
61
65
import qualified Data.ByteString.Lazy.Char8 as LBS
66
+
62
67
import qualified Data.ByteString.Short as SBS
68
+
69
+ import Cardano.Ledger.Conway.Scripts (ConwayPlutusPurpose (.. ))
70
+ import qualified Cardano.Ledger.TxIn as Ledger
63
71
import qualified Data.Map.Strict as Map
72
+ import qualified Data.Maybe.Strict as Strict
64
73
import qualified Data.Set as Set
65
74
import Lens.Micro
66
75
import Ouroboros.Consensus.Cardano.Block (EraCrypto , StandardAlonzo , StandardCrypto )
@@ -149,6 +158,7 @@ getScripts ::
149
158
, Core. Script era ~ Alonzo. AlonzoScript era
150
159
, Core. TxAuxData era ~ AlonzoTxAuxData era
151
160
, Core. EraTx era
161
+ , DBPlutusScript era
152
162
) =>
153
163
Core. Tx era ->
154
164
[TxScript ]
@@ -174,7 +184,7 @@ resolveRedeemers ::
174
184
( EraCrypto era ~ StandardCrypto
175
185
, Alonzo. AlonzoEraTxWits era
176
186
, Core. EraTx era
177
- , Alonzo. MaryEraTxBody era
187
+ , DBScriptPurpose era
178
188
) =>
179
189
Bool ->
180
190
Maybe Alonzo. Prices ->
@@ -204,15 +214,15 @@ resolveRedeemers ioExtraPlutus mprices tx toCert =
204
214
toList $
205
215
toCert <$> (txBody ^. Core. certsTxBodyL)
206
216
207
- txInsMissingRedeemer :: Map (ShelleyTx . TxIn StandardCrypto ) TxIn
217
+ txInsMissingRedeemer :: Map (Ledger . TxIn StandardCrypto ) TxIn
208
218
txInsMissingRedeemer = Map. fromList $ fmap (\ inp -> (inp, fromTxIn inp)) $ toList $ txBody ^. Core. inputsTxBodyL
209
219
210
220
initRedeemersMaps :: RedeemerMaps
211
221
initRedeemersMaps = RedeemerMaps withdrawalsNoRedeemers txCertsNoRedeemers txInsMissingRedeemer
212
222
213
223
mkRdmrAndUpdateRec ::
214
224
(RedeemerMaps , [(Word64 , TxRedeemer )]) ->
215
- [(Word64 , (Alonzo. RdmrPtr , (Alonzo. Data era , ExUnits )))] ->
225
+ [(Word64 , (Alonzo. PlutusPurpose AsIndex era , (Alonzo. Data era , ExUnits )))] ->
216
226
(RedeemerMaps , [(Word64 , TxRedeemer )])
217
227
mkRdmrAndUpdateRec (rdmrMaps, rdmrsAcc) [] = (rdmrMaps, reverse rdmrsAcc)
218
228
mkRdmrAndUpdateRec (rdmrMaps, rdmrsAcc) ((rdmrIx, rdmr) : rest) =
@@ -221,33 +231,46 @@ resolveRedeemers ioExtraPlutus mprices tx toCert =
221
231
222
232
handleRedeemer ::
223
233
Word64 ->
224
- (Alonzo. RdmrPtr , (Alonzo. Data era , ExUnits )) ->
234
+ (PlutusPurpose AsIndex era , (Alonzo. Data era , ExUnits )) ->
225
235
RedeemerMaps ->
226
236
(TxRedeemer , RedeemerMaps )
227
- handleRedeemer rdmrIx (ptr@ ( Alonzo. RdmrPtr tag index) , (dt, exUnits)) rdmrMps =
237
+ handleRedeemer rdmrIx (ptr, (dt, exUnits)) rdmrMps =
228
238
(txRdmr, rdmrMps')
229
239
where
230
- (rdmrMps', mScript) = case strictMaybeToMaybe (Alonzo. rdptrInv txBody ptr) of
231
- Just (Alonzo. Minting policyId) -> (rdmrMps, Just $ Right $ unScriptHash $ policyID policyId)
232
- Just (Alonzo. Spending txIn) -> handleTxInPtr rdmrIx txIn rdmrMps
233
- Just (Alonzo. Rewarding rwdAcnt) -> handleRewardPtr rdmrIx rwdAcnt rdmrMps
234
- Just prp@ (Alonzo. Certifying dcert) -> case strictMaybeToMaybe (Alonzo. rdptr txBody prp) of
235
- Just ptr' | ptr == ptr' -> handleCertPtr rdmrIx (toCert dcert) rdmrMps
236
- _ -> (rdmrMps, Nothing )
240
+ (rdmrMps', mScript) = case mkPurpose $ Alonzo. redeemerPointerInverse txBody ptr of
241
+ Just (Left (Alonzo. AlonzoMinting policyId, _)) -> (rdmrMps, Just $ Right $ unScriptHash $ policyID (Alonzo. unAsItem policyId))
242
+ Just (Left (Alonzo. AlonzoSpending txIn, _)) -> handleTxInPtr rdmrIx (Alonzo. unAsItem txIn) rdmrMps
243
+ Just (Left (Alonzo. AlonzoRewarding rwdAcnt, _)) -> handleRewardPtr rdmrIx (Alonzo. unAsItem rwdAcnt) rdmrMps
244
+ Just (Left (Alonzo. AlonzoCertifying dcert, Just ptr')) ->
245
+ if ptr == ptr'
246
+ then handleCertPtr rdmrIx (toCert $ Alonzo. unAsItem dcert) rdmrMps
247
+ else (rdmrMps, Nothing )
248
+ Just (Left (Alonzo. AlonzoCertifying _, Nothing )) -> (rdmrMps, Nothing )
249
+ Just (Right (ConwayMinting policyId)) -> (rdmrMps, Just $ Right $ unScriptHash $ policyID (Alonzo. unAsItem policyId))
250
+ Just (Right (ConwaySpending txIn)) -> handleTxInPtr rdmrIx (Alonzo. unAsItem txIn) rdmrMps
251
+ Just (Right (ConwayRewarding rwdAcnt)) -> handleRewardPtr rdmrIx (Alonzo. unAsItem rwdAcnt) rdmrMps
252
+ Just (Right (ConwayCertifying dcert)) -> handleCertPtr rdmrIx (toCert $ Alonzo. unAsItem dcert) rdmrMps
253
+ Just (Right (ConwayVoting _)) -> (rdmrMps, Nothing )
254
+ Just (Right (ConwayProposing _)) -> (rdmrMps, Nothing )
237
255
Nothing -> (rdmrMps, Nothing )
238
256
257
+ (tag, idx) = getPurpose ptr
239
258
txRdmr =
240
259
TxRedeemer
241
260
{ txRedeemerMem = fromIntegral $ exUnitsMem exUnits
242
261
, txRedeemerSteps = fromIntegral $ exUnitsSteps exUnits
243
262
, txRedeemerFee = (`txscriptfee` exUnits) <$> mprices
244
263
, txRedeemerPurpose = tag
245
- , txRedeemerIndex = index
264
+ , txRedeemerIndex = fromIntegral idx
246
265
, txRedeemerScriptHash = mScript
247
266
, txRedeemerData = mkTxData (Alonzo. hashData dt, dt)
248
267
}
249
268
250
- handleTxInPtr :: Word64 -> ShelleyTx. TxIn StandardCrypto -> RedeemerMaps -> (RedeemerMaps , Maybe (Either TxIn ByteString ))
269
+ mkPurpose = \ case
270
+ Strict. SNothing -> Nothing
271
+ Strict. SJust a -> toAlonzoPurpose txBody a
272
+
273
+ handleTxInPtr :: Word64 -> Ledger. TxIn StandardCrypto -> RedeemerMaps -> (RedeemerMaps , Maybe (Either TxIn ByteString ))
251
274
handleTxInPtr rdmrIx txIn mps = case Map. lookup txIn (rmInps mps) of
252
275
Nothing -> (mps, Nothing )
253
276
Just gtxIn ->
@@ -271,11 +294,11 @@ handleCertPtr rdmrIx dcert mps =
271
294
data RedeemerMaps = RedeemerMaps
272
295
{ rmWdrl :: Map (Shelley. RewardAcnt StandardCrypto ) TxWithdrawal
273
296
, rmCerts :: [(Cert , TxCertificate )]
274
- , rmInps :: Map (ShelleyTx . TxIn StandardCrypto ) TxIn
297
+ , rmInps :: Map (Ledger . TxIn StandardCrypto ) TxIn
275
298
}
276
299
277
300
mkTxScript ::
278
- ( Ledger. Era era ) =>
301
+ DBPlutusScript era =>
279
302
(ScriptHash StandardCrypto , Alonzo. AlonzoScript era ) ->
280
303
TxScript
281
304
mkTxScript (hsh, script) =
@@ -291,9 +314,7 @@ mkTxScript (hsh, script) =
291
314
getScriptType =
292
315
case script of
293
316
Alonzo. TimelockScript {} -> Timelock
294
- Alonzo. PlutusScript (Plutus Alonzo. PlutusV1 _s) -> PlutusV1
295
- Alonzo. PlutusScript (Plutus Alonzo. PlutusV2 _s) -> PlutusV2
296
- Alonzo. PlutusScript (Plutus Alonzo. PlutusV3 _s) -> PlutusV3
317
+ Alonzo. PlutusScript ps -> getPlutusScriptType ps
297
318
298
319
timelockJsonScript :: Maybe ByteString
299
320
timelockJsonScript =
@@ -313,6 +334,7 @@ getPlutusSizes ::
313
334
( Core. EraTx era
314
335
, Core. TxWits era ~ Alonzo. AlonzoTxWits era
315
336
, Core. Script era ~ Alonzo. AlonzoScript era
337
+ , AlonzoEraScript era
316
338
) =>
317
339
Core. Tx era ->
318
340
[Word64 ]
@@ -322,11 +344,12 @@ getPlutusSizes tx =
322
344
tx ^. (Core. witsTxL . Alonzo. scriptAlonzoTxWitsL)
323
345
324
346
-- | Returns Nothing for non-plutus scripts.
325
- getPlutusScriptSize :: Alonzo. AlonzoScript era -> Maybe Word64
347
+ getPlutusScriptSize :: AlonzoEraScript era => Alonzo. AlonzoScript era -> Maybe Word64
326
348
getPlutusScriptSize script =
327
349
case script of
328
350
Alonzo. TimelockScript {} -> Nothing
329
- Alonzo. PlutusScript (Plutus _lang sbs) -> Just $ fromIntegral (SBS. length $ unBinaryPlutus sbs)
351
+ Alonzo. PlutusScript ps ->
352
+ Just $ fromIntegral $ SBS. length $ unPlutusBinary $ Alonzo. plutusScriptBinary ps
330
353
331
354
txDataWitness ::
332
355
(Core. TxWits era ~ Alonzo. AlonzoTxWits era , Core. EraTx era , EraCrypto era ~ StandardCrypto ) =>
0 commit comments