diff --git a/plutus-ledger-api/plutus-ledger-api.cabal b/plutus-ledger-api/plutus-ledger-api.cabal index 413f6e6517d..d4d1831ca1e 100644 --- a/plutus-ledger-api/plutus-ledger-api.cabal +++ b/plutus-ledger-api/plutus-ledger-api.cabal @@ -57,6 +57,7 @@ library PlutusLedgerApi.Data.V1 PlutusLedgerApi.Data.V2 PlutusLedgerApi.Data.V3 + PlutusLedgerApi.Data.V4 PlutusLedgerApi.Envelope PlutusLedgerApi.MachineParameters PlutusLedgerApi.V1 @@ -97,6 +98,9 @@ library PlutusLedgerApi.V3.MintValue PlutusLedgerApi.V3.ParamName PlutusLedgerApi.V3.Tx + PlutusLedgerApi.V4 + PlutusLedgerApi.V4.Contexts + PlutusLedgerApi.V4.Data.Contexts other-modules: PlutusLedgerApi.Common.Eval diff --git a/plutus-ledger-api/src/PlutusLedgerApi/Data/V4.hs b/plutus-ledger-api/src/PlutusLedgerApi/Data/V4.hs new file mode 100644 index 00000000000..14c62ecc075 --- /dev/null +++ b/plutus-ledger-api/src/PlutusLedgerApi/Data/V4.hs @@ -0,0 +1,298 @@ +{-# LANGUAGE PatternSynonyms #-} + +-- | The data-backed type interface to Plutus V4 for the ledger. +module PlutusLedgerApi.Data.V4 + ( -- * Accounts + Contexts.AccountId (..) + , Contexts.AccountBalanceInterval + , pattern Contexts.AccountBalanceLowerBound + , pattern Contexts.AccountBalanceUpperBound + , pattern Contexts.AccountBalanceBothBounds + , Contexts.AccountBalanceIntervals (..) + + -- * Governance + , Contexts.ColdCommitteeCredential (..) + , Contexts.HotCommitteeCredential (..) + , Contexts.DRepCredential (..) + , Contexts.DRep + , pattern Contexts.DRep + , pattern Contexts.DRepAlwaysAbstain + , pattern Contexts.DRepAlwaysNoConfidence + , Contexts.Delegatee + , pattern Contexts.DelegStake + , pattern Contexts.DelegVote + , pattern Contexts.DelegStakeVote + , Contexts.TxCert + , pattern Contexts.TxCertRegAccount + , pattern Contexts.TxCertUnRegAccount + , pattern Contexts.TxCertDelegAccount + , pattern Contexts.TxCertRegAccountDeleg + , pattern Contexts.TxCertRegDRep + , pattern Contexts.TxCertUpdateDRep + , pattern Contexts.TxCertUnRegDRep + , pattern Contexts.TxCertPoolRegister + , pattern Contexts.TxCertPoolRetire + , pattern Contexts.TxCertAuthHotCommittee + , pattern Contexts.TxCertResignColdCommittee + , Contexts.Voter + , pattern Contexts.CommitteeVoter + , pattern Contexts.DRepVoter + , pattern Contexts.StakePoolVoter + , Contexts.Vote + , pattern Contexts.VoteNo + , pattern Contexts.VoteYes + , pattern Contexts.Abstain + , Contexts.GovernanceActionId + , pattern Contexts.GovernanceActionId + , Contexts.gaidTxId + , Contexts.gaidGovActionIx + , Contexts.Committee + , pattern Contexts.Committee + , Contexts.committeeMembers + , Contexts.committeeQuorum + , Contexts.Constitution (..) + , Contexts.ProtocolVersion + , pattern Contexts.ProtocolVersion + , Contexts.pvMajor + , Contexts.pvMinor + , Contexts.GovernanceAction + , pattern Contexts.ParameterChange + , pattern Contexts.HardForkInitiation + , pattern Contexts.TreasuryWithdrawals + , pattern Contexts.NoConfidence + , pattern Contexts.UpdateCommittee + , pattern Contexts.NewConstitution + , pattern Contexts.InfoAction + , Contexts.ChangedParameters (..) + , Contexts.ProposalProcedure + , pattern Contexts.ProposalProcedure + , Contexts.ppDeposit + , Contexts.ppReturnAddr + , Contexts.ppGovernanceAction + + -- * Context types + , Contexts.ScriptContext + , pattern Contexts.ScriptContext + , Contexts.scriptContextTxInfo + , Contexts.scriptContextRedeemer + , Contexts.scriptContextScriptInfo + , Contexts.scriptContextScriptHash + , Contexts.ScriptPurpose + , pattern Contexts.Minting + , pattern Contexts.Spending + , pattern Contexts.Withdrawing + , pattern Contexts.Certifying + , pattern Contexts.Voting + , pattern Contexts.Proposing + , pattern Contexts.Guarding + , Contexts.ScriptInfo + , pattern Contexts.MintingScript + , pattern Contexts.SpendingScript + , pattern Contexts.WithdrawingScript + , pattern Contexts.CertifyingScript + , pattern Contexts.VotingScript + , pattern Contexts.ProposingScript + , pattern Contexts.GuardingScript + , Contexts.TopTxInfo + , pattern Contexts.TopTxInfo + , Contexts.topTxInfoSubTransactions + , Contexts.topTxInfoDatums + , Contexts.topTxInfoStartingBalanceIntervals + , Contexts.topTxInfoSimplified + , Contexts.TopTxInfoSimplified + , pattern Contexts.TopTxInfoSimplified + , Contexts.ttisIds + , Contexts.ttisInputs + , Contexts.ttisReferenceInputs + , Contexts.ttisOutputs + , Contexts.ttisMints + , Contexts.ttisBurns + , Contexts.ttisTxCerts + , Contexts.ttisWithdrawals + , Contexts.ttisDirectDeposits + , Contexts.ttisValidRange + , Contexts.ttisGuards + , Contexts.ttisRequiredTopLevelGuards + , Contexts.ttisScriptPurposes + , Contexts.ttisData + , Contexts.ttisVotes + , Contexts.ttisProposalProcedures + , Contexts.ttisCurrentTreasuryAmount + , Contexts.ttisTreasuryDonations + + -- ** Supporting types used in the context types + + -- *** Builtins + , Common.BuiltinByteString + , Common.toBuiltin + , Common.fromBuiltin + , Common.toOpaque + , Common.fromOpaque + + -- *** Bytes + , V2.LedgerBytes (..) + , V2.fromBytes + + -- *** Credentials + , V2.StakingCredential + , pattern V2.StakingHash + , pattern V2.StakingPtr + , V2.Credential + , pattern V2.PubKeyCredential + , pattern V2.ScriptCredential + + -- *** Value + , V2.Value (..) + , V2.CurrencySymbol (..) + , V2.TokenName (..) + , V2.singleton + , V2.unionWith + , V2.adaSymbol + , V2.adaToken + , V2.Lovelace (..) + , V2.AssetClass (..) + , V2.assetClass + , V2.assetClassValue + , V2.assetClassValueOf + , V2.currencySymbol + , V2.currencySymbolValueOf + , V2.flattenValue + , V2.geq + , V2.gt + , V2.isZero + , V2.leq + , V2.lovelaceValue + , V2.lovelaceValueOf + , V2.lt + , V2.scale + , V2.split + , V2.symbols + , V2.tokenName + , V2.unsafeLovelaceValueOf + , V2.valueOf + , V2.withCurrencySymbol + + -- *** Mint Value + , MintValue.MintValue + , MintValue.emptyMintValue + , MintValue.mintValueToMap + , MintValue.mintValueMinted + , MintValue.mintValueBurned + + -- *** Time + , V2.POSIXTime (..) + , V2.POSIXTimeRange + + -- *** Types for representing transactions + , V2.Address + , pattern V2.Address + , V2.addressCredential + , V2.addressStakingCredential + , V2.PubKeyHash (..) + , Tx.TxId (..) + , Contexts.TxInfo + , pattern Contexts.TxInfo + , Contexts.txInfoId + , Contexts.txInfoSubTxIx + , Contexts.txInfoInputs + , Contexts.txInfoReferenceInputs + , Contexts.txInfoOutputs + , Contexts.txInfoFee + , Contexts.txInfoMint + , Contexts.txInfoTxCerts + , Contexts.txInfoWithdrawals + , Contexts.txInfoDirectDeposits + , Contexts.txInfoAccountBalanceIntervals + , Contexts.txInfoValidRange + , Contexts.txInfoGuards + , Contexts.txInfoRequiredTopLevelGuards + , Contexts.txInfoRedeemers + , Contexts.txInfoData + , Contexts.txInfoVotes + , Contexts.txInfoProposalProcedures + , Contexts.txInfoCurrentTreasuryAmount + , Contexts.txInfoTreasuryDonation + , V2.TxOut + , pattern V2.TxOut + , V2.txOutAddress + , V2.txOutValue + , V2.txOutDatum + , V2.txOutReferenceScript + , Tx.TxOutRef + , pattern Tx.TxOutRef + , Tx.txOutRefId + , Tx.txOutRefIdx + , Contexts.TxInInfo + , pattern Contexts.TxInInfo + , Contexts.txInInfoOutRef + , Contexts.txInInfoResolved + , V2.OutputDatum + , pattern V2.NoOutputDatum + , pattern V2.OutputDatum + , pattern V2.OutputDatumHash + + -- *** Intervals + , V2.Interval + , pattern V2.Interval + , V2.ivFrom + , V2.ivTo + , V2.Extended + , pattern V2.NegInf + , pattern V2.PosInf + , pattern V2.Finite + , V2.Closure + , V2.UpperBound + , pattern V2.UpperBound + , V2.LowerBound + , pattern V2.LowerBound + , V2.always + , V2.from + , V2.to + , V2.lowerBound + , V2.upperBound + , V2.strictLowerBound + , V2.strictUpperBound + , V2.inclusiveLowerBound + , V2.inclusiveUpperBound + + -- *** Ratio + , Ratio.Rational + , Ratio.ratio + , Ratio.unsafeRatio + , Ratio.numerator + , Ratio.denominator + , Ratio.fromHaskellRatio + , Ratio.toHaskellRatio + , Ratio.fromGHC + , Ratio.toGHC + + -- *** Association maps + , V2.Map + , V2.unsafeFromSOPList + + -- *** Newtypes and hash types + , V2.ScriptHash (..) + , V2.Redeemer (..) + , V2.RedeemerHash (..) + , V2.Datum (..) + , V2.DatumHash (..) + + -- * Data + , V2.Data (..) + , V2.BuiltinData (..) + , V2.ToData (..) + , V2.FromData (..) + , V2.UnsafeFromData (..) + , V2.toData + , V2.fromData + , V2.unsafeFromData + , V2.dataToBuiltinData + , V2.builtinDataToData + ) where + +import PlutusLedgerApi.Common qualified as Common +import PlutusLedgerApi.Data.V2 qualified as V2 +import PlutusLedgerApi.V3.Data.MintValue qualified as MintValue +import PlutusLedgerApi.V3.Data.Tx qualified as Tx +import PlutusLedgerApi.V4.Data.Contexts qualified as Contexts +import PlutusTx.Ratio qualified as Ratio diff --git a/plutus-ledger-api/src/PlutusLedgerApi/V4.hs b/plutus-ledger-api/src/PlutusLedgerApi/V4.hs new file mode 100644 index 00000000000..4b900a0e9f4 --- /dev/null +++ b/plutus-ledger-api/src/PlutusLedgerApi/V4.hs @@ -0,0 +1,157 @@ +-- | The type interface to Plutus V4 for the ledger. +module PlutusLedgerApi.V4 + ( -- * Accounts + Contexts.AccountId (..) + , Contexts.AccountBalanceInterval (..) + , Contexts.AccountBalanceIntervals (..) + + -- * Governance + , Contexts.ColdCommitteeCredential (..) + , Contexts.HotCommitteeCredential (..) + , Contexts.DRepCredential (..) + , Contexts.DRep (..) + , Contexts.Delegatee (..) + , Contexts.TxCert (..) + , Contexts.Voter (..) + , Contexts.Vote (..) + , Contexts.GovernanceActionId (..) + , Contexts.Committee (..) + , Contexts.Constitution (..) + , Contexts.ProtocolVersion (..) + , Contexts.GovernanceAction (..) + , Contexts.ChangedParameters (..) + , Contexts.ProposalProcedure (..) + + -- * Context types + , Contexts.ScriptContext (..) + , Contexts.ScriptPurpose (..) + , Contexts.ScriptInfo (..) + , Contexts.TopTxInfo (..) + , Contexts.TopTxInfoSimplified (..) + + -- ** Supporting types used in the context types + + -- *** Builtins + , Common.BuiltinByteString + , Common.toBuiltin + , Common.fromBuiltin + , Common.toOpaque + , Common.fromOpaque + + -- *** Bytes + , V2.LedgerBytes (..) + , V2.fromBytes + + -- *** Credentials + , V2.StakingCredential (..) + , V2.Credential (..) + + -- *** Value + , V2.Value (..) + , V2.CurrencySymbol (..) + , V2.TokenName (..) + , V2.singleton + , V2.unionWith + , V2.adaSymbol + , V2.adaToken + , V2.Lovelace (..) + , V2.AssetClass (..) + , V2.assetClass + , V2.assetClassValue + , V2.assetClassValueOf + , V2.currencySymbol + , V2.currencySymbolValueOf + , V2.flattenValue + , V2.geq + , V2.gt + , V2.isZero + , V2.leq + , V2.lovelaceValue + , V2.lovelaceValueOf + , V2.lt + , V2.scale + , V2.split + , V2.symbols + , V2.tokenName + , V2.unsafeLovelaceValueOf + , V2.valueOf + , V2.withCurrencySymbol + + -- *** Mint Value + , MintValue.MintValue + , MintValue.emptyMintValue + , MintValue.mintValueToMap + , MintValue.mintValueMinted + , MintValue.mintValueBurned + + -- *** Time + , V2.POSIXTime (..) + , V2.POSIXTimeRange + + -- *** Types for representing transactions + , V2.Address (..) + , V2.PubKeyHash (..) + , Tx.TxId (..) + , Contexts.TxInfo (..) + , V2.TxOut (..) + , Tx.TxOutRef (..) + , Contexts.TxInInfo (..) + , V2.OutputDatum (..) + + -- *** Intervals + , V2.Interval (..) + , V2.Extended (..) + , V2.Closure + , V2.UpperBound (..) + , V2.LowerBound (..) + , V2.always + , V2.from + , V2.to + , V2.lowerBound + , V2.upperBound + , V2.strictLowerBound + , V2.strictUpperBound + , V2.inclusiveLowerBound + , V2.inclusiveUpperBound + + -- *** Ratio + , Ratio.Rational + , Ratio.ratio + , Ratio.unsafeRatio + , Ratio.numerator + , Ratio.denominator + , Ratio.fromHaskellRatio + , Ratio.toHaskellRatio + , Ratio.fromGHC + , Ratio.toGHC + + -- *** Association maps + , V2.Map + , V2.unsafeFromList + + -- *** Newtypes and hash types + , V2.ScriptHash (..) + , V2.Redeemer (..) + , V2.RedeemerHash (..) + , V2.Datum (..) + , V2.DatumHash (..) + + -- * Data + , V2.Data (..) + , V2.BuiltinData (..) + , V2.ToData (..) + , V2.FromData (..) + , V2.UnsafeFromData (..) + , V2.toData + , V2.fromData + , V2.unsafeFromData + , V2.dataToBuiltinData + , V2.builtinDataToData + ) where + +import PlutusLedgerApi.Common qualified as Common +import PlutusLedgerApi.V2 qualified as V2 +import PlutusLedgerApi.V3.MintValue qualified as MintValue +import PlutusLedgerApi.V3.Tx qualified as Tx +import PlutusLedgerApi.V4.Contexts qualified as Contexts +import PlutusTx.Ratio qualified as Ratio diff --git a/plutus-ledger-api/src/PlutusLedgerApi/V4/Contexts.hs b/plutus-ledger-api/src/PlutusLedgerApi/V4/Contexts.hs new file mode 100644 index 00000000000..9dd692ee0d9 --- /dev/null +++ b/plutus-ledger-api/src/PlutusLedgerApi/V4/Contexts.hs @@ -0,0 +1,454 @@ +-- editorconfig-checker-disable-file +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DerivingVia #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE UndecidableInstances #-} +{-# LANGUAGE ViewPatterns #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-} +{-# OPTIONS_GHC -fno-omit-interface-pragmas #-} +{-# OPTIONS_GHC -fno-specialise #-} +{-# OPTIONS_GHC -fno-strictness #-} + +module PlutusLedgerApi.V4.Contexts + ( AccountId (..) + , AccountBalanceInterval (..) + , AccountBalanceIntervals (..) + , ColdCommitteeCredential (..) + , HotCommitteeCredential (..) + , DRepCredential (..) + , DRep (..) + , Delegatee (..) + , TxCert (..) + , Voter (..) + , Vote (..) + , GovernanceActionId (..) + , Committee (..) + , Constitution (..) + , ProtocolVersion (..) + , ChangedParameters (..) + , GovernanceAction (..) + , ProposalProcedure (..) + , ScriptPurpose (..) + , ScriptInfo (..) + , TxInInfo (..) + , TxInfo (..) + , TopTxInfoSimplified (..) + , TopTxInfo (..) + , ScriptContext (..) + , findOwnInput + , findDatum + , findDatumHash + , findTxInByTxOutRef + , findContinuingOutputs + , getContinuingOutputs + , txSignedBy + , pubKeyOutputsAt + , valuePaidTo + , valueSpent + , valueProduced + , ownCurrencySymbol + , spendsOutput + ) where + +import Data.Function ((&)) +import GHC.Generics (Generic) +import PlutusLedgerApi.V2 qualified as V2 +import PlutusLedgerApi.V3.Contexts + ( ChangedParameters (..) + , ColdCommitteeCredential (..) + , Committee (..) + , Constitution (..) + , DRep (..) + , DRepCredential (..) + , Delegatee (..) + , GovernanceAction (..) + , GovernanceActionId (..) + , HotCommitteeCredential (..) + , ProposalProcedure (..) + , ProtocolVersion (..) + , TxInInfo (..) + , Vote (..) + , Voter (..) + ) +import PlutusLedgerApi.V3.MintValue qualified as V3 +import PlutusLedgerApi.V3.Tx qualified as V3 +import PlutusTx (makeIsDataSchemaIndexed) +import PlutusTx qualified +import PlutusTx.AssocMap (Map, lookup, toList) +import PlutusTx.Blueprint + ( HasBlueprintDefinition + , HasBlueprintSchema + , HasSchemaDefinition + , SchemaInfo (..) + ) +import PlutusTx.Blueprint.Class (HasBlueprintSchema (..)) +import PlutusTx.Blueprint.Definition.Derive (definitionRef) +import PlutusTx.Blueprint.Schema (withSchemaInfo) +import PlutusTx.Foldable qualified as F +import PlutusTx.Lift (makeLift) +import PlutusTx.List qualified as List +import PlutusTx.Prelude qualified as PlutusTx +import Prettyprinter (nest, vsep, (<+>)) +import Prettyprinter.Extras (Pretty (pretty), PrettyShow (PrettyShow)) +import Prelude qualified as Haskell + +newtype AccountId = AccountId V2.Credential + deriving stock (Generic) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow AccountId) + deriving newtype + ( Haskell.Eq + , Haskell.Ord + , Haskell.Show + , PlutusTx.Eq + , PlutusTx.ToData + , PlutusTx.FromData + , PlutusTx.UnsafeFromData + ) + +instance + ( HasSchemaDefinition V2.PubKeyHash referencedTypes + , HasSchemaDefinition V2.ScriptHash referencedTypes + ) + => HasBlueprintSchema AccountId referencedTypes + where + schema = + schema @V2.Credential @referencedTypes + & withSchemaInfo \info -> info {title = Haskell.Just "AccountId"} + +data AccountBalanceInterval + = AccountBalanceLowerBound V2.Lovelace + | AccountBalanceUpperBound V2.Lovelace + | AccountBalanceBothBounds V2.Lovelace V2.Lovelace + deriving stock (Generic, Haskell.Show, Haskell.Eq, Haskell.Ord) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow AccountBalanceInterval) + +PlutusTx.deriveEq ''AccountBalanceInterval + +$(makeLift ''AccountBalanceInterval) +$( makeIsDataSchemaIndexed + ''AccountBalanceInterval + [ ('AccountBalanceLowerBound, 0) + , ('AccountBalanceUpperBound, 1) + , ('AccountBalanceBothBounds, 2) + ] + ) + +newtype AccountBalanceIntervals = AccountBalanceIntervals (Map AccountId AccountBalanceInterval) + deriving stock (Generic) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow AccountBalanceIntervals) + deriving newtype + ( Haskell.Eq + , Haskell.Ord + , Haskell.Show + , PlutusTx.ToData + , PlutusTx.FromData + , PlutusTx.UnsafeFromData + ) + +instance + ( HasBlueprintSchema AccountId referencedTypes + , HasBlueprintSchema AccountBalanceInterval referencedTypes + ) + => HasBlueprintSchema AccountBalanceIntervals referencedTypes + where + schema = + schema @(Map AccountId AccountBalanceInterval) @referencedTypes + & withSchemaInfo \info -> info {title = Haskell.Just "AccountBalanceIntervals"} + +data TxCert + = TxCertRegAccount AccountId V2.Lovelace + | TxCertUnRegAccount AccountId V2.Lovelace + | TxCertDelegAccount AccountId Delegatee + | TxCertRegAccountDeleg AccountId Delegatee V2.Lovelace + | TxCertRegDRep DRepCredential V2.Lovelace + | TxCertUpdateDRep DRepCredential + | TxCertUnRegDRep DRepCredential V2.Lovelace + | TxCertPoolRegister V2.PubKeyHash V2.PubKeyHash + | TxCertPoolRetire V2.PubKeyHash Haskell.Integer + | TxCertAuthHotCommittee ColdCommitteeCredential HotCommitteeCredential + | TxCertResignColdCommittee ColdCommitteeCredential + deriving stock (Generic, Haskell.Show, Haskell.Eq, Haskell.Ord) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow TxCert) + +PlutusTx.deriveEq ''TxCert + +data ScriptPurpose + = Minting V2.ScriptHash V2.CurrencySymbol + | Spending V2.ScriptHash V3.TxOutRef + | Withdrawing V2.ScriptHash V2.Credential + | Certifying V2.ScriptHash Haskell.Integer TxCert + | Voting V2.ScriptHash Voter + | Proposing V2.ScriptHash Haskell.Integer ProposalProcedure + | Guarding V2.ScriptHash Haskell.Integer + deriving stock (Generic, Haskell.Show, Haskell.Eq, Haskell.Ord) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow ScriptPurpose) + +data TxInfo = TxInfo + { txInfoId :: V3.TxId + , txInfoSubTxIx :: Haskell.Maybe Haskell.Integer + , txInfoInputs :: [TxInInfo] + , txInfoReferenceInputs :: [TxInInfo] + , txInfoOutputs :: [V2.TxOut] + , txInfoFee :: V2.Lovelace + , txInfoMint :: V3.MintValue + , txInfoTxCerts :: [TxCert] + , txInfoWithdrawals :: Map V2.Credential V2.Lovelace + , txInfoDirectDeposits :: Map V2.Credential V2.Lovelace + , txInfoAccountBalanceIntervals :: AccountBalanceIntervals + , txInfoValidRange :: V2.POSIXTimeRange + , txInfoGuards :: [V2.Credential] + , txInfoRequiredTopLevelGuards :: Map V2.Credential (Haskell.Maybe V2.Datum) + , txInfoRedeemers :: Map ScriptPurpose V2.Redeemer + , txInfoData :: Map V2.DatumHash V2.Datum + , txInfoVotes :: Map Voter (Map GovernanceActionId Vote) + , txInfoProposalProcedures :: [ProposalProcedure] + , txInfoCurrentTreasuryAmount :: Haskell.Maybe V2.Lovelace + , txInfoTreasuryDonation :: V2.Lovelace + } + deriving stock (Generic, Haskell.Show, Haskell.Eq) + deriving anyclass (HasBlueprintDefinition) + +instance Pretty TxInfo where + pretty TxInfo {..} = + vsep + [ "TxId:" <+> pretty txInfoId + , "Sub-transaction index:" <+> pretty txInfoSubTxIx + , "Inputs:" <+> pretty txInfoInputs + , "Reference inputs:" <+> pretty txInfoReferenceInputs + , "Outputs:" <+> pretty txInfoOutputs + , "Fee:" <+> pretty txInfoFee + , "Value minted:" <+> pretty txInfoMint + , "TxCerts:" <+> pretty txInfoTxCerts + , "Withdrawals:" <+> pretty txInfoWithdrawals + , "Direct deposits:" <+> pretty txInfoDirectDeposits + , "Account balance intervals:" <+> pretty txInfoAccountBalanceIntervals + , "Valid range:" <+> pretty txInfoValidRange + , "Guards:" <+> pretty txInfoGuards + , "Required top-level guards:" <+> pretty txInfoRequiredTopLevelGuards + , "Redeemers:" <+> pretty txInfoRedeemers + , "Datums:" <+> pretty txInfoData + , "Votes:" <+> pretty txInfoVotes + , "Proposal procedures:" <+> pretty txInfoProposalProcedures + , "Current treasury amount:" <+> pretty txInfoCurrentTreasuryAmount + , "Treasury donation:" <+> pretty txInfoTreasuryDonation + ] + +data TopTxInfoSimplified = TopTxInfoSimplified + { ttisIds :: [V3.TxId] + , ttisInputs :: [TxInInfo] + , ttisReferenceInputs :: [TxInInfo] + , ttisOutputs :: [V2.TxOut] + , ttisMints :: V3.MintValue + , ttisBurns :: V3.MintValue + , ttisTxCerts :: [TxCert] + , ttisWithdrawals :: Map V2.Credential V2.Lovelace + , ttisDirectDeposits :: Map V2.Credential V2.Lovelace + , ttisValidRange :: V2.POSIXTimeRange + , ttisGuards :: [V2.Credential] + , ttisRequiredTopLevelGuards :: Map V2.Credential () + , ttisScriptPurposes :: Map ScriptPurpose () + , ttisData :: Map V2.DatumHash V2.Datum + , ttisVotes :: Map Voter (Map GovernanceActionId Vote) + , ttisProposalProcedures :: [ProposalProcedure] + , ttisCurrentTreasuryAmount :: Haskell.Maybe V2.Lovelace + , ttisTreasuryDonations :: V2.Lovelace + } + deriving stock (Generic, Haskell.Show, Haskell.Eq) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow TopTxInfoSimplified) + +data TopTxInfo = TopTxInfo + { topTxInfoSubTransactions :: [TxInfo] + , topTxInfoDatums :: Map V3.TxId V2.Datum + , topTxInfoStartingBalanceIntervals :: AccountBalanceIntervals + , topTxInfoSimplified :: TopTxInfoSimplified + } + deriving stock (Generic, Haskell.Show, Haskell.Eq) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow TopTxInfo) + +data ScriptInfo + = MintingScript V2.CurrencySymbol + | SpendingScript V3.TxOutRef (Haskell.Maybe V2.Datum) + | WithdrawingScript AccountId + | CertifyingScript Haskell.Integer TxCert + | VotingScript Voter + | ProposingScript Haskell.Integer ProposalProcedure + | GuardingScript Haskell.Integer (Haskell.Maybe TopTxInfo) + deriving stock (Generic, Haskell.Show, Haskell.Eq) + deriving anyclass (HasBlueprintDefinition) + deriving (Pretty) via (PrettyShow ScriptInfo) + +data ScriptContext = ScriptContext + { scriptContextTxInfo :: TxInfo + , scriptContextRedeemer :: V2.Redeemer + , scriptContextScriptInfo :: ScriptInfo + , scriptContextScriptHash :: V2.ScriptHash + } + deriving stock (Generic, Haskell.Eq, Haskell.Show) + deriving anyclass (HasBlueprintDefinition) + +instance Pretty ScriptContext where + pretty ScriptContext {..} = + vsep + [ "ScriptInfo:" <+> pretty scriptContextScriptInfo + , "ScriptHash:" <+> pretty scriptContextScriptHash + , nest 2 (vsep ["TxInfo:", pretty scriptContextTxInfo]) + , nest 2 (vsep ["Redeemer:", pretty scriptContextRedeemer]) + ] + +findOwnInput :: ScriptContext -> Haskell.Maybe TxInInfo +findOwnInput + ScriptContext + { scriptContextTxInfo = TxInfo {txInfoInputs} + , scriptContextScriptInfo = SpendingScript txOutRef _ + } = + List.find + (\TxInInfo {txInInfoOutRef} -> txInInfoOutRef PlutusTx.== txOutRef) + txInfoInputs +findOwnInput _ = Haskell.Nothing +{-# INLINEABLE findOwnInput #-} + +findDatum :: V2.DatumHash -> TxInfo -> Haskell.Maybe V2.Datum +findDatum dsh TxInfo {txInfoData} = lookup dsh txInfoData +{-# INLINEABLE findDatum #-} + +findDatumHash :: V2.Datum -> TxInfo -> Haskell.Maybe V2.DatumHash +findDatumHash ds TxInfo {txInfoData} = + PlutusTx.fst PlutusTx.<$> List.find (\(_, ds') -> ds' PlutusTx.== ds) (toList txInfoData) +{-# INLINEABLE findDatumHash #-} + +findTxInByTxOutRef :: V3.TxOutRef -> TxInfo -> Haskell.Maybe TxInInfo +findTxInByTxOutRef outRef TxInfo {txInfoInputs} = + List.find + (\TxInInfo {txInInfoOutRef} -> txInInfoOutRef PlutusTx.== outRef) + txInfoInputs +{-# INLINEABLE findTxInByTxOutRef #-} + +findContinuingOutputs :: ScriptContext -> [Haskell.Integer] +findContinuingOutputs ctx + | Haskell.Just TxInInfo {txInInfoResolved = V2.TxOut {txOutAddress}} <- findOwnInput ctx = + List.findIndices + (\V2.TxOut {txOutAddress = otherAddress} -> txOutAddress PlutusTx.== otherAddress) + (txInfoOutputs (scriptContextTxInfo ctx)) +findContinuingOutputs _ = PlutusTx.traceError "Le" +{-# INLINEABLE findContinuingOutputs #-} + +getContinuingOutputs :: ScriptContext -> [V2.TxOut] +getContinuingOutputs ctx + | Haskell.Just TxInInfo {txInInfoResolved = V2.TxOut {txOutAddress}} <- findOwnInput ctx = + List.filter + (\V2.TxOut {txOutAddress = otherAddress} -> txOutAddress PlutusTx.== otherAddress) + (txInfoOutputs (scriptContextTxInfo ctx)) +getContinuingOutputs _ = PlutusTx.traceError "Lf" +{-# INLINEABLE getContinuingOutputs #-} + +txSignedBy :: TxInfo -> V2.PubKeyHash -> Haskell.Bool +txSignedBy TxInfo {txInfoGuards} keyHash = + List.any ((PlutusTx.==) (V2.PubKeyCredential keyHash)) txInfoGuards +{-# INLINEABLE txSignedBy #-} + +pubKeyOutputsAt :: V2.PubKeyHash -> TxInfo -> [V2.Value] +pubKeyOutputsAt pk txInfo = + let atPubKey V2.TxOut {txOutAddress = V2.Address (V2.PubKeyCredential pk') _, txOutValue} + | pk PlutusTx.== pk' = Haskell.Just txOutValue + atPubKey _ = Haskell.Nothing + in PlutusTx.mapMaybe atPubKey (txInfoOutputs txInfo) +{-# INLINEABLE pubKeyOutputsAt #-} + +valuePaidTo :: TxInfo -> V2.PubKeyHash -> V2.Value +valuePaidTo txInfo keyHash = PlutusTx.mconcat (pubKeyOutputsAt keyHash txInfo) +{-# INLINEABLE valuePaidTo #-} + +valueSpent :: TxInfo -> V2.Value +valueSpent = F.foldMap (V2.txOutValue PlutusTx.. txInInfoResolved) PlutusTx.. txInfoInputs +{-# INLINEABLE valueSpent #-} + +valueProduced :: TxInfo -> V2.Value +valueProduced = F.foldMap V2.txOutValue PlutusTx.. txInfoOutputs +{-# INLINEABLE valueProduced #-} + +ownCurrencySymbol :: ScriptContext -> V2.CurrencySymbol +ownCurrencySymbol ScriptContext {scriptContextScriptInfo = MintingScript currencySymbol} = currencySymbol +ownCurrencySymbol _ = PlutusTx.traceError "Lh" +{-# INLINEABLE ownCurrencySymbol #-} + +spendsOutput :: TxInfo -> V3.TxId -> Haskell.Integer -> Haskell.Bool +spendsOutput txInfo txId outputIndex = + List.any + ( \TxInInfo {txInInfoOutRef = V3.TxOutRef refId refIndex} -> + txId PlutusTx.== refId PlutusTx.&& outputIndex PlutusTx.== refIndex + ) + (txInfoInputs txInfo) +{-# INLINEABLE spendsOutput #-} + +$(makeLift ''AccountId) + +$(makeLift ''AccountBalanceIntervals) + +$(makeLift ''TxCert) +$( makeIsDataSchemaIndexed + ''TxCert + [ ('TxCertRegAccount, 0) + , ('TxCertUnRegAccount, 1) + , ('TxCertDelegAccount, 2) + , ('TxCertRegAccountDeleg, 3) + , ('TxCertRegDRep, 4) + , ('TxCertUpdateDRep, 5) + , ('TxCertUnRegDRep, 6) + , ('TxCertPoolRegister, 7) + , ('TxCertPoolRetire, 8) + , ('TxCertAuthHotCommittee, 9) + , ('TxCertResignColdCommittee, 10) + ] + ) + +$(makeLift ''ScriptPurpose) +$( makeIsDataSchemaIndexed + ''ScriptPurpose + [ ('Minting, 0) + , ('Spending, 1) + , ('Withdrawing, 2) + , ('Certifying, 3) + , ('Voting, 4) + , ('Proposing, 5) + , ('Guarding, 6) + ] + ) + +$(makeLift ''TxInfo) +$(makeIsDataSchemaIndexed ''TxInfo [('TxInfo, 0)]) + +$(makeLift ''TopTxInfoSimplified) +$(makeIsDataSchemaIndexed ''TopTxInfoSimplified [('TopTxInfoSimplified, 0)]) + +$(makeLift ''TopTxInfo) +$(makeIsDataSchemaIndexed ''TopTxInfo [('TopTxInfo, 0)]) + +$(makeLift ''ScriptInfo) +$( makeIsDataSchemaIndexed + ''ScriptInfo + [ ('MintingScript, 0) + , ('SpendingScript, 1) + , ('WithdrawingScript, 2) + , ('CertifyingScript, 3) + , ('VotingScript, 4) + , ('ProposingScript, 5) + , ('GuardingScript, 6) + ] + ) + +$(makeLift ''ScriptContext) +$(makeIsDataSchemaIndexed ''ScriptContext [('ScriptContext, 0)]) diff --git a/plutus-ledger-api/src/PlutusLedgerApi/V4/Data/Contexts.hs b/plutus-ledger-api/src/PlutusLedgerApi/V4/Data/Contexts.hs new file mode 100644 index 00000000000..09609b4c2ef --- /dev/null +++ b/plutus-ledger-api/src/PlutusLedgerApi/V4/Data/Contexts.hs @@ -0,0 +1,583 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DerivingVia #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE ViewPatterns #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-} +{-# OPTIONS_GHC -fexpose-all-unfoldings #-} +{-# OPTIONS_GHC -fno-omit-interface-pragmas #-} +{-# OPTIONS_GHC -fno-specialise #-} +{-# OPTIONS_GHC -fno-strictness #-} + +module PlutusLedgerApi.V4.Data.Contexts + ( ColdCommitteeCredential (..) + , HotCommitteeCredential (..) + , DRepCredential (..) + , DRep + , matchDRep + , pattern DRep + , pattern DRepAlwaysAbstain + , pattern DRepAlwaysNoConfidence + , Delegatee + , matchDelegatee + , pattern DelegStake + , pattern DelegVote + , pattern DelegStakeVote + , AccountId (..) + , AccountBalanceInterval + , matchAccountBalanceInterval + , pattern AccountBalanceLowerBound + , pattern AccountBalanceUpperBound + , pattern AccountBalanceBothBounds + , AccountBalanceIntervals (..) + , TxCert + , matchTxCert + , pattern TxCertRegAccount + , pattern TxCertUnRegAccount + , pattern TxCertDelegAccount + , pattern TxCertRegAccountDeleg + , pattern TxCertRegDRep + , pattern TxCertUpdateDRep + , pattern TxCertUnRegDRep + , pattern TxCertPoolRegister + , pattern TxCertPoolRetire + , pattern TxCertAuthHotCommittee + , pattern TxCertResignColdCommittee + , Voter + , matchVoter + , pattern CommitteeVoter + , pattern DRepVoter + , pattern StakePoolVoter + , Vote + , matchVote + , pattern VoteNo + , pattern VoteYes + , pattern Abstain + , GovernanceActionId + , pattern GovernanceActionId + , matchGovernanceActionId + , gaidTxId + , gaidGovActionIx + , Committee + , pattern Committee + , matchCommittee + , committeeMembers + , committeeQuorum + , Constitution (..) + , ProtocolVersion + , pattern ProtocolVersion + , matchProtocolVersion + , pvMajor + , pvMinor + , ChangedParameters (..) + , GovernanceAction + , matchGovernanceAction + , pattern ParameterChange + , pattern HardForkInitiation + , pattern TreasuryWithdrawals + , pattern NoConfidence + , pattern UpdateCommittee + , pattern NewConstitution + , pattern InfoAction + , ProposalProcedure + , pattern ProposalProcedure + , matchProposalProcedure + , ppDeposit + , ppReturnAddr + , ppGovernanceAction + , ScriptPurpose + , matchScriptPurpose + , pattern Minting + , pattern Spending + , pattern Withdrawing + , pattern Certifying + , pattern Voting + , pattern Proposing + , pattern Guarding + , TxInInfo + , pattern TxInInfo + , matchTxInInfo + , txInInfoOutRef + , txInInfoResolved + , TxInfo + , pattern TxInfo + , matchTxInfo + , txInfoId + , txInfoSubTxIx + , txInfoInputs + , txInfoReferenceInputs + , txInfoOutputs + , txInfoFee + , txInfoMint + , txInfoTxCerts + , txInfoWithdrawals + , txInfoDirectDeposits + , txInfoAccountBalanceIntervals + , txInfoValidRange + , txInfoGuards + , txInfoRequiredTopLevelGuards + , txInfoRedeemers + , txInfoData + , txInfoVotes + , txInfoProposalProcedures + , txInfoCurrentTreasuryAmount + , txInfoTreasuryDonation + , TopTxInfoSimplified + , pattern TopTxInfoSimplified + , matchTopTxInfoSimplified + , ttisIds + , ttisInputs + , ttisReferenceInputs + , ttisOutputs + , ttisMints + , ttisBurns + , ttisTxCerts + , ttisWithdrawals + , ttisDirectDeposits + , ttisValidRange + , ttisGuards + , ttisRequiredTopLevelGuards + , ttisScriptPurposes + , ttisData + , ttisVotes + , ttisProposalProcedures + , ttisCurrentTreasuryAmount + , ttisTreasuryDonations + , TopTxInfo + , pattern TopTxInfo + , matchTopTxInfo + , topTxInfoSubTransactions + , topTxInfoDatums + , topTxInfoStartingBalanceIntervals + , topTxInfoSimplified + , ScriptInfo + , matchScriptInfo + , pattern MintingScript + , pattern SpendingScript + , pattern WithdrawingScript + , pattern CertifyingScript + , pattern VotingScript + , pattern ProposingScript + , pattern GuardingScript + , ScriptContext + , pattern ScriptContext + , matchScriptContext + , scriptContextTxInfo + , scriptContextRedeemer + , scriptContextScriptInfo + , scriptContextScriptHash + , findOwnInput + , findDatum + , findDatumHash + , findTxInByTxOutRef + , findContinuingOutputs + , getContinuingOutputs + , txSignedBy + , pubKeyOutputsAt + , valuePaidTo + , valueSpent + , valueProduced + , ownCurrencySymbol + , spendsOutput + ) where + +import GHC.Generics (Generic) +import Prettyprinter (nest, vsep, (<+>)) +import Prettyprinter.Extras + +import PlutusLedgerApi.Data.V2 qualified as V2 +import PlutusLedgerApi.V3.Data.Contexts + ( ChangedParameters (..) + , ColdCommitteeCredential (..) + , Committee + , Constitution (..) + , DRep + , DRepCredential (..) + , Delegatee + , GovernanceAction + , GovernanceActionId + , HotCommitteeCredential (..) + , ProposalProcedure + , ProtocolVersion + , TxInInfo + , Vote + , Voter + , committeeMembers + , committeeQuorum + , gaidGovActionIx + , gaidTxId + , matchCommittee + , matchDRep + , matchDelegatee + , matchGovernanceAction + , matchGovernanceActionId + , matchProposalProcedure + , matchProtocolVersion + , matchTxInInfo + , matchVote + , matchVoter + , ppDeposit + , ppGovernanceAction + , ppReturnAddr + , pvMajor + , pvMinor + , txInInfoOutRef + , txInInfoResolved + , pattern Abstain + , pattern Committee + , pattern CommitteeVoter + , pattern DRep + , pattern DRepAlwaysAbstain + , pattern DRepAlwaysNoConfidence + , pattern DRepVoter + , pattern DelegStake + , pattern DelegStakeVote + , pattern DelegVote + , pattern GovernanceActionId + , pattern HardForkInitiation + , pattern InfoAction + , pattern NewConstitution + , pattern NoConfidence + , pattern ParameterChange + , pattern ProposalProcedure + , pattern ProtocolVersion + , pattern StakePoolVoter + , pattern TreasuryWithdrawals + , pattern TxInInfo + , pattern UpdateCommittee + , pattern VoteNo + , pattern VoteYes + ) +import PlutusLedgerApi.V3.Data.MintValue qualified as V3 +import PlutusLedgerApi.V3.Data.Tx qualified as V3 +import PlutusTx qualified +import PlutusTx.AsData qualified as PlutusTx +import PlutusTx.BuiltinList qualified as BuiltinList +import PlutusTx.Builtins.Internal qualified as Builtins +import PlutusTx.Data.AssocMap +import PlutusTx.Data.List (List) +import PlutusTx.Data.List qualified as Data.List +import PlutusTx.Prelude qualified as PlutusTx + +import Prelude qualified as Haskell + +newtype AccountId = AccountId V2.Credential + deriving stock (Generic) + deriving (Pretty) via (PrettyShow AccountId) + deriving newtype + ( Haskell.Eq + , Haskell.Show + , PlutusTx.Eq + , PlutusTx.ToData + , PlutusTx.FromData + , PlutusTx.UnsafeFromData + ) + +PlutusTx.makeLift ''AccountId + +PlutusTx.asData + [d| + data AccountBalanceInterval + = AccountBalanceLowerBound V2.Lovelace + | AccountBalanceUpperBound V2.Lovelace + | AccountBalanceBothBounds V2.Lovelace V2.Lovelace + deriving stock (Generic, Haskell.Show, Haskell.Eq) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + deriving (Pretty) via (PrettyShow AccountBalanceInterval) + |] + +PlutusTx.deriveEq ''AccountBalanceInterval +PlutusTx.makeLift ''AccountBalanceInterval + +newtype AccountBalanceIntervals + = AccountBalanceIntervals (Map AccountId AccountBalanceInterval) + deriving stock (Generic) + deriving (Pretty) via (PrettyShow AccountBalanceIntervals) + deriving newtype + ( Haskell.Show + , PlutusTx.ToData + , PlutusTx.FromData + , PlutusTx.UnsafeFromData + ) + +PlutusTx.makeLift ''AccountBalanceIntervals + +PlutusTx.asData + [d| + data TxCert + = TxCertRegAccount AccountId V2.Lovelace + | TxCertUnRegAccount AccountId V2.Lovelace + | TxCertDelegAccount AccountId Delegatee + | TxCertRegAccountDeleg AccountId Delegatee V2.Lovelace + | TxCertRegDRep DRepCredential V2.Lovelace + | TxCertUpdateDRep DRepCredential + | TxCertUnRegDRep DRepCredential V2.Lovelace + | TxCertPoolRegister V2.PubKeyHash V2.PubKeyHash + | TxCertPoolRetire V2.PubKeyHash Haskell.Integer + | TxCertAuthHotCommittee ColdCommitteeCredential HotCommitteeCredential + | TxCertResignColdCommittee ColdCommitteeCredential + deriving stock (Generic, Haskell.Show, Haskell.Eq) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + deriving (Pretty) via (PrettyShow TxCert) + |] + +PlutusTx.deriveEq ''TxCert +PlutusTx.makeLift ''TxCert + +PlutusTx.asData + [d| + data ScriptPurpose + = Minting V2.ScriptHash V2.CurrencySymbol + | Spending V2.ScriptHash V3.TxOutRef + | Withdrawing V2.ScriptHash V2.Credential + | Certifying V2.ScriptHash Haskell.Integer TxCert + | Voting V2.ScriptHash Voter + | Proposing V2.ScriptHash Haskell.Integer ProposalProcedure + | Guarding V2.ScriptHash Haskell.Integer + deriving stock (Generic, Haskell.Show) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + deriving (Pretty) via (PrettyShow ScriptPurpose) + |] + +PlutusTx.makeLift ''ScriptPurpose + +PlutusTx.asData + [d| + data TxInfo = TxInfo + { txInfoId :: V3.TxId + , txInfoSubTxIx :: Haskell.Maybe Haskell.Integer + , txInfoInputs :: List TxInInfo + , txInfoReferenceInputs :: List TxInInfo + , txInfoOutputs :: List V2.TxOut + , txInfoFee :: V2.Lovelace + , txInfoMint :: V3.MintValue + , txInfoTxCerts :: List TxCert + , txInfoWithdrawals :: Map V2.Credential V2.Lovelace + , txInfoDirectDeposits :: Map V2.Credential V2.Lovelace + , txInfoAccountBalanceIntervals :: AccountBalanceIntervals + , txInfoValidRange :: V2.POSIXTimeRange + , txInfoGuards :: List V2.Credential + , txInfoRequiredTopLevelGuards :: Map V2.Credential (Haskell.Maybe V2.Datum) + , txInfoRedeemers :: Map ScriptPurpose V2.Redeemer + , txInfoData :: Map V2.DatumHash V2.Datum + , txInfoVotes :: Map Voter (Map GovernanceActionId Vote) + , txInfoProposalProcedures :: List ProposalProcedure + , txInfoCurrentTreasuryAmount :: Haskell.Maybe V2.Lovelace + , txInfoTreasuryDonation :: V2.Lovelace + } + deriving stock (Generic, Haskell.Show) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + |] + +PlutusTx.makeLift ''TxInfo + +PlutusTx.asData + [d| + data TopTxInfoSimplified = TopTxInfoSimplified + { ttisIds :: List V3.TxId + , ttisInputs :: List TxInInfo + , ttisReferenceInputs :: List TxInInfo + , ttisOutputs :: List V2.TxOut + , ttisMints :: V3.MintValue + , ttisBurns :: V3.MintValue + , ttisTxCerts :: List TxCert + , ttisWithdrawals :: Map V2.Credential V2.Lovelace + , ttisDirectDeposits :: Map V2.Credential V2.Lovelace + , ttisValidRange :: V2.POSIXTimeRange + , ttisGuards :: List V2.Credential + , ttisRequiredTopLevelGuards :: Map V2.Credential () + , ttisScriptPurposes :: Map ScriptPurpose () + , ttisData :: Map V2.DatumHash V2.Datum + , ttisVotes :: Map Voter (Map GovernanceActionId Vote) + , ttisProposalProcedures :: List ProposalProcedure + , ttisCurrentTreasuryAmount :: Haskell.Maybe V2.Lovelace + , ttisTreasuryDonations :: V2.Lovelace + } + deriving stock (Generic, Haskell.Show) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + deriving (Pretty) via (PrettyShow TopTxInfoSimplified) + |] + +PlutusTx.makeLift ''TopTxInfoSimplified + +PlutusTx.asData + [d| + data TopTxInfo = TopTxInfo + { topTxInfoSubTransactions :: List TxInfo + , topTxInfoDatums :: Map V3.TxId V2.Datum + , topTxInfoStartingBalanceIntervals :: AccountBalanceIntervals + , topTxInfoSimplified :: TopTxInfoSimplified + } + deriving stock (Generic, Haskell.Show) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + deriving (Pretty) via (PrettyShow TopTxInfo) + |] + +PlutusTx.makeLift ''TopTxInfo + +PlutusTx.asData + [d| + data ScriptInfo + = MintingScript V2.CurrencySymbol + | SpendingScript V3.TxOutRef (Haskell.Maybe V2.Datum) + | WithdrawingScript AccountId + | CertifyingScript Haskell.Integer TxCert + | VotingScript Voter + | ProposingScript Haskell.Integer ProposalProcedure + | GuardingScript Haskell.Integer (Haskell.Maybe TopTxInfo) + deriving stock (Generic, Haskell.Show) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + deriving (Pretty) via (PrettyShow ScriptInfo) + |] + +PlutusTx.makeLift ''ScriptInfo + +PlutusTx.asData + [d| + data ScriptContext = ScriptContext + { scriptContextTxInfo :: TxInfo + , scriptContextRedeemer :: V2.Redeemer + , scriptContextScriptInfo :: ScriptInfo + , scriptContextScriptHash :: V2.ScriptHash + } + deriving stock (Generic, Haskell.Show) + deriving newtype (PlutusTx.FromData, PlutusTx.UnsafeFromData, PlutusTx.ToData) + |] + +PlutusTx.makeLift ''ScriptContext + +{-# INLINEABLE findOwnInput #-} +findOwnInput :: ScriptContext -> Haskell.Maybe TxInInfo +findOwnInput + ScriptContext + { scriptContextTxInfo = TxInfo {txInfoInputs} + , scriptContextScriptInfo = SpendingScript txOutRef _ + } = + Data.List.find + (\TxInInfo {txInInfoOutRef} -> txInInfoOutRef PlutusTx.== txOutRef) + txInfoInputs +findOwnInput _ = Haskell.Nothing + +{-# INLINEABLE findDatum #-} +findDatum :: V2.DatumHash -> TxInfo -> Haskell.Maybe V2.Datum +findDatum dsh TxInfo {txInfoData} = lookup dsh txInfoData + +{-# INLINEABLE findDatumHash #-} +findDatumHash :: V2.Datum -> TxInfo -> Haskell.Maybe V2.DatumHash +findDatumHash ds TxInfo {txInfoData} = + getHash PlutusTx.<$> BuiltinList.find matchDatum (toBuiltinList txInfoData) + where + getHash = PlutusTx.unsafeFromBuiltinData PlutusTx.. Builtins.fst + matchDatum pair = Builtins.snd pair PlutusTx.== V2.getDatum ds + +{-# INLINEABLE findTxInByTxOutRef #-} +findTxInByTxOutRef :: V3.TxOutRef -> TxInfo -> Haskell.Maybe TxInInfo +findTxInByTxOutRef outRef TxInfo {txInfoInputs} = + Data.List.find + (\TxInInfo {txInInfoOutRef} -> txInInfoOutRef PlutusTx.== outRef) + txInfoInputs + +{-# INLINEABLE findContinuingOutputs #-} +findContinuingOutputs :: ScriptContext -> List Haskell.Integer +findContinuingOutputs ctx + | Haskell.Just TxInInfo {txInInfoResolved = V2.TxOut {txOutAddress}} <- findOwnInput ctx = + Data.List.findIndices + (f txOutAddress) + (txInfoOutputs (scriptContextTxInfo ctx)) + where + f addr V2.TxOut {txOutAddress = otherAddress} = addr PlutusTx.== otherAddress +findContinuingOutputs _ = PlutusTx.traceError "Le" + +{-# INLINEABLE getContinuingOutputs #-} +getContinuingOutputs :: ScriptContext -> List V2.TxOut +getContinuingOutputs ctx + | Haskell.Just TxInInfo {txInInfoResolved = V2.TxOut {txOutAddress}} <- findOwnInput ctx = + Data.List.filter (f txOutAddress) (txInfoOutputs (scriptContextTxInfo ctx)) + where + f addr V2.TxOut {txOutAddress = otherAddress} = addr PlutusTx.== otherAddress +getContinuingOutputs _ = PlutusTx.traceError "Lf" + +{-# INLINEABLE txSignedBy #-} +txSignedBy :: TxInfo -> V2.PubKeyHash -> Haskell.Bool +txSignedBy TxInfo {txInfoGuards} keyHash = + case Data.List.find isSigner txInfoGuards of + Haskell.Just _ -> Haskell.True + Haskell.Nothing -> Haskell.False + where + isSigner (V2.PubKeyCredential guardKeyHash) = guardKeyHash PlutusTx.== keyHash + isSigner _ = Haskell.False + +{-# INLINEABLE pubKeyOutputsAt #-} +pubKeyOutputsAt :: V2.PubKeyHash -> TxInfo -> List V2.Value +pubKeyOutputsAt pk p = + let flt V2.TxOut {txOutAddress = V2.Address (V2.PubKeyCredential pk') _, txOutValue} + | pk PlutusTx.== pk' = Haskell.Just txOutValue + flt _ = Haskell.Nothing + in Data.List.mapMaybe flt (txInfoOutputs p) + +{-# INLINEABLE valuePaidTo #-} +valuePaidTo :: TxInfo -> V2.PubKeyHash -> V2.Value +valuePaidTo ptx pkh = Data.List.mconcat (pubKeyOutputsAt pkh ptx) + +{-# INLINEABLE valueSpent #-} +valueSpent :: TxInfo -> V2.Value +valueSpent = Data.List.foldMap (V2.txOutValue PlutusTx.. txInInfoResolved) PlutusTx.. txInfoInputs + +{-# INLINEABLE valueProduced #-} +valueProduced :: TxInfo -> V2.Value +valueProduced = Data.List.foldMap V2.txOutValue PlutusTx.. txInfoOutputs + +{-# INLINEABLE ownCurrencySymbol #-} +ownCurrencySymbol :: ScriptContext -> V2.CurrencySymbol +ownCurrencySymbol ScriptContext {scriptContextScriptInfo = MintingScript cs} = cs +ownCurrencySymbol _ = PlutusTx.traceError "Lh" + +{-# INLINEABLE spendsOutput #-} +spendsOutput :: TxInfo -> V3.TxId -> Haskell.Integer -> Haskell.Bool +spendsOutput txInfo txId i = + let spendsOutRef inp = + let outRef = txInInfoOutRef inp + in txId + PlutusTx.== V3.txOutRefId outRef + PlutusTx.&& i + PlutusTx.== V3.txOutRefIdx outRef + in Data.List.any spendsOutRef (txInfoInputs txInfo) + +instance Pretty TxInfo where + pretty TxInfo {..} = + vsep + [ "TxId:" <+> pretty txInfoId + , "Sub-transaction index:" <+> pretty txInfoSubTxIx + , "Inputs:" <+> pretty txInfoInputs + , "Reference inputs:" <+> pretty txInfoReferenceInputs + , "Outputs:" <+> pretty txInfoOutputs + , "Fee:" <+> pretty txInfoFee + , "Value minted:" <+> pretty txInfoMint + , "TxCerts:" <+> pretty txInfoTxCerts + , "Withdrawals:" <+> pretty txInfoWithdrawals + , "Direct deposits:" <+> pretty txInfoDirectDeposits + , "Account balance intervals:" <+> pretty txInfoAccountBalanceIntervals + , "Valid range:" <+> pretty txInfoValidRange + , "Guards:" <+> pretty txInfoGuards + , "Required top-level guards:" <+> pretty txInfoRequiredTopLevelGuards + , "Redeemers:" <+> pretty txInfoRedeemers + , "Datums:" <+> pretty txInfoData + , "Votes:" <+> pretty txInfoVotes + , "Proposal procedures:" <+> pretty txInfoProposalProcedures + , "Current treasury amount:" <+> pretty txInfoCurrentTreasuryAmount + , "Treasury donation:" <+> pretty txInfoTreasuryDonation + ] + +instance Pretty ScriptContext where + pretty ScriptContext {..} = + vsep + [ "ScriptInfo:" <+> pretty scriptContextScriptInfo + , "ScriptHash:" <+> pretty scriptContextScriptHash + , nest 2 (vsep ["TxInfo:", pretty scriptContextTxInfo]) + , nest 2 (vsep ["Redeemer:", pretty scriptContextRedeemer]) + ]