From 03240fe1f5f7cdca9b9a43415dfd4e8b3a3303de Mon Sep 17 00:00:00 2001 From: Jordan Millar Date: Fri, 21 May 2021 11:07:54 +0100 Subject: [PATCH] Fill in network magic in Alonzo tx body construction --- cardano-api/src/Cardano/Api/Address.hs | 8 +++++++- cardano-api/src/Cardano/Api/NetworkId.hs | 9 +++++---- cardano-api/src/Cardano/Api/TxBody.hs | 10 +++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/cardano-api/src/Cardano/Api/Address.hs b/cardano-api/src/Cardano/Api/Address.hs index 45fa9d598e9..422cdee7c4c 100644 --- a/cardano-api/src/Cardano/Api/Address.hs +++ b/cardano-api/src/Cardano/Api/Address.hs @@ -45,6 +45,7 @@ module Cardano.Api.Address ( StakeExtendedKey, -- * Internal conversion functions + getNetworkId, toShelleyAddr, toShelleyStakeAddr, toShelleyStakeCredential, @@ -81,8 +82,8 @@ import qualified Shelley.Spec.Ledger.BaseTypes as Shelley import qualified Shelley.Spec.Ledger.Credential as Shelley import Cardano.Api.Eras -import Cardano.Api.Hash import Cardano.Api.HasTypeProxy +import Cardano.Api.Hash import Cardano.Api.Key import Cardano.Api.KeysByron import Cardano.Api.KeysShelley @@ -490,6 +491,11 @@ makeStakeAddress nw sc = -- Internal conversion functions -- +getNetworkId :: Address addrtype -> Shelley.Network +getNetworkId (ByronAddress addr) = + Shelley.getNetwork . Shelley.AddrBootstrap $ Shelley.BootstrapAddress addr +getNetworkId (ShelleyAddress nid _ _ ) = nid + toShelleyAddr :: AddressInEra era -> Shelley.Addr StandardCrypto toShelleyAddr (AddressInEra ByronAddressInAnyEra (ByronAddress addr)) = Shelley.AddrBootstrap (Shelley.BootstrapAddress addr) diff --git a/cardano-api/src/Cardano/Api/NetworkId.hs b/cardano-api/src/Cardano/Api/NetworkId.hs index 91f28b89f89..84199f5df0d 100644 --- a/cardano-api/src/Cardano/Api/NetworkId.hs +++ b/cardano-api/src/Cardano/Api/NetworkId.hs @@ -19,12 +19,12 @@ import Prelude import Ouroboros.Network.Magic (NetworkMagic (..)) -import qualified Cardano.Crypto.ProtocolMagic as Byron - (ProtocolMagicId(..), RequiresNetworkMagic(..)) -import qualified Cardano.Chain.Common as Byron (NetworkMagic(..)) +import qualified Cardano.Chain.Common as Byron (NetworkMagic (..)) import qualified Cardano.Chain.Genesis as Byron (mainnetProtocolMagicId) +import qualified Cardano.Crypto.ProtocolMagic as Byron (ProtocolMagicId (..), + RequiresNetworkMagic (..)) -import qualified Shelley.Spec.Ledger.BaseTypes as Shelley (Network(..)) +import qualified Shelley.Spec.Ledger.BaseTypes as Shelley (Network (..)) -- ---------------------------------------------------------------------------- @@ -76,3 +76,4 @@ fromShelleyNetwork Shelley.Mainnet nm | nm == mainnetNetworkMagic = Mainnet | otherwise = error "fromShelleyNetwork Mainnet: wrong mainnet network magic" + diff --git a/cardano-api/src/Cardano/Api/TxBody.hs b/cardano-api/src/Cardano/Api/TxBody.hs index 8a1dd06c335..df6dc62b84a 100644 --- a/cardano-api/src/Cardano/Api/TxBody.hs +++ b/cardano-api/src/Cardano/Api/TxBody.hs @@ -165,6 +165,7 @@ import qualified Cardano.Ledger.Alonzo.Tx as Alonzo import qualified Cardano.Ledger.Alonzo.TxWitness as Alonzo import qualified Shelley.Spec.Ledger.Address as Shelley import Shelley.Spec.Ledger.BaseTypes (StrictMaybe (..), maybeToStrictMaybe) +import qualified Shelley.Spec.Ledger.BaseTypes as Shelley import qualified Shelley.Spec.Ledger.Credential as Shelley import qualified Shelley.Spec.Ledger.Genesis as Shelley import qualified Shelley.Spec.Ledger.Keys as Shelley @@ -1922,11 +1923,18 @@ makeShelleyTransactionBody era@ShelleyBasedEraAlonzo redeemerPtrs) (maybeToStrictMaybe (Ledger.hashAuxiliaryData @StandardAlonzo <$> txAuxData)) - (error "TODO alonzo: optional network")) + (maybeToStrictMaybe $ networkId txOuts)) (map toShelleySimpleScript (collectTxBodySimpleScripts txbodycontent)) txAuxData redeemerPtrs where + -- Necessary for hardware wallets constructing tx bodies. + networkId :: [TxOut era] -> Maybe Shelley.Network + networkId txouts = + case map (\(TxOut (AddressInEra _ addr) _ _) -> getNetworkId addr) txouts of + nid : _ -> Just nid + [] -> Nothing + redeemerPtrs :: Map Alonzo.RdmrPtr (Alonzo.Data ledgerera, Alonzo.ExUnits) redeemerPtrs = Map.fromList $ concat [ certifyingRedeemerPtr txCertificates