From 23824d7e3d4f37f98fdc6f94941f5da2de566aee Mon Sep 17 00:00:00 2001 From: Jordan Millar Date: Mon, 15 Jul 2024 18:41:42 +0200 Subject: [PATCH] Introduce UnsignedTx --- .../Cardano/Api/Experimental/UnsignedTx.hs | 71 +++++++++++++++++-- cardano-api/internal/Cardano/Api/Tx/Body.hs | 16 +++++ 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/cardano-api/internal/Cardano/Api/Experimental/UnsignedTx.hs b/cardano-api/internal/Cardano/Api/Experimental/UnsignedTx.hs index e0bd60c16f..d1b9e326b0 100644 --- a/cardano-api/internal/Cardano/Api/Experimental/UnsignedTx.hs +++ b/cardano-api/internal/Cardano/Api/Experimental/UnsignedTx.hs @@ -1,13 +1,76 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE KindSignatures #-} + module Cardano.Api.Experimental.UnsignedTx where +import Cardano.Api.Eras import Cardano.Api.Experimental.Eras +import Cardano.Api.ReexposeLedger (strictMaybeToMaybe) +import Cardano.Api.Tx.Body import qualified Cardano.Ledger.Core as Ledger +import Data.Bifunctor + + -- A transaction that contains everything -- except signing key witnesses -data UnsignedTx era - = UnsignedTx - (Ledger.Tx (ToConstrainedEra era)) - (Ledger.TxWits (ToConstrainedEra era)) +newtype UnsignedTx era + = UnsignedTx (Ledger.Tx (ToConstrainedEra era)) + + +data UnsignedTxError + = UnsignedTxError TxBodyError + +makeUnsignedTx + :: Era era + -> TxBodyContent BuildTx (AvailableErasToSbe era) + -> Either UnsignedTxError (UnsignedTx era) +makeUnsignedTx era bc = do + sbe <- maybe (Left $ error "") Right $ protocolVersionToSbe era + + -- Construct tx body + let apiTxOuts = txOuts bc + apiScriptWitnesses = collectTxBodyScriptWitnesses sbe bc + apiScriptValidity = txScriptValidity bc + apiMintValue = txMintValue bc + apiProtocolParameters = txProtocolParams bc + apiCollateralTxIns = txInsCollateral bc + apiReferenceInputs = txInsReference bc + apiExtraKeyWitnesses = txExtraKeyWits bc + apiReturnCollateral = txReturnCollateral bc + apiTotalCollateral = txTotalCollateral bc + + -- Ledger types + collTxIns = convCollateralTxIns apiCollateralTxIns + refTxIns = convReferenceInputs apiReferenceInputs + returnCollateral = convReturnCollateral sbe apiReturnCollateral + totalCollateral = convTotalCollateral apiTotalCollateral + certs = convCertificates sbe $ txCertificates bc + txAuxData = toAuxiliaryData sbe (txMetadata bc) (txAuxScripts bc) + scripts = convScripts apiScriptWitnesses + languages = convLanguages apiScriptWitnesses + sData = convScriptData sbe apiTxOuts apiScriptWitnesses + + setUpdateProposal <- first UnsignedTxError $ convTxUpdateProposal sbe (txUpdateProposal bc) + + setInvalidBefore <- maybe (Left $ error "TODO") Right $ convValidityLowerBound (txValidityLowerBound bc) + + let setMint = convMintValue apiMintValue + + setScriptIntegrityHash <- maybe (Left $ error "TODO") Right $ strictMaybeToMaybe $ getScriptIntegrityHash apiProtocolParameters languages sData + + let setReqSignerHashes = convExtraKeyWitnesses apiExtraKeyWitnesses + + let ledgerTxBody = + mkCommonTxBody sbe (txIns bc) (txOuts bc) (txFee bc) (txWithdrawals bc) txAuxData + & A.certsTxBodyL sbe .~ certs + & A.invalidHereAfterTxBodyL sbe .~ convValidityUpperBound sbe (txValidityUpperBound bc) + + -- TODO: Left off here + undefined + -- Construct script witnesses + +-- TODO: Left off here. Fill out this function and also +-- create a function for signing. diff --git a/cardano-api/internal/Cardano/Api/Tx/Body.hs b/cardano-api/internal/Cardano/Api/Tx/Body.hs index 46f5dd079c..3e6940df9a 100644 --- a/cardano-api/internal/Cardano/Api/Tx/Body.hs +++ b/cardano-api/internal/Cardano/Api/Tx/Body.hs @@ -130,6 +130,22 @@ module Cardano.Api.Tx.Body , scriptDataToInlineDatum -- * Internal conversion functions & types + , convCertificates + , convCollateralTxIns + , convExtraKeyWitnesses + , convLanguages + , convMintValue + , convReferenceInputs + , convReturnCollateral + , convScripts + , convScriptData + , convTotalCollateral + , convTxUpdateProposal + , convValidityLowerBound + , convValidityUpperBound + , getScriptIntegrityHash + , mkCommonTxBody + , toAuxiliaryData , toByronTxId , toShelleyTxId , toShelleyTxIn