diff --git a/.changes/20260904_fix_dijkstra_era_commands.yml b/.changes/20260904_fix_dijkstra_era_commands.yml new file mode 100644 index 0000000000..b54c6c4736 --- /dev/null +++ b/.changes/20260904_fix_dijkstra_era_commands.yml @@ -0,0 +1,13 @@ +project: cardano-cli + +pr: 1439 + +kind: + - bugfix + +description: | + Fix Dijkstra era commands (BLS key generation/hashing, proof of possession, transaction + witness/assemble) that were failing with "TODO DijkstraEra" because the era dispatch in + runAnyEraCommand was unconditionally calling obtainCommonConstraints, which is not yet + implemented for DijkstraEra. Commands that do not require EraCommonConstraints now work + correctly for the Dijkstra era. diff --git a/cabal.project b/cabal.project index be539ec7a5..97dd84021c 100644 --- a/cabal.project +++ b/cabal.project @@ -13,7 +13,7 @@ repository cardano-haskell-packages -- See CONTRIBUTING for information about these, including some Nix commands -- you need to run if you change them index-state: - , hackage.haskell.org 2026-07-30T07:30:12Z + , hackage.haskell.org 2026-09-02T14:05:07Z , cardano-haskell-packages 2026-09-04T06:57:08Z packages: @@ -35,10 +35,8 @@ extra-packages: Cabal if impl(ghc < 9.14) constraints: - -- hourglass and time-hourglass both in dependency tree break musl build - , time-hourglass < 0 -- haskell.nix patch does not work for 1.6.8 - , any.crypton-x509-system < 1.6.8 + , any.crypton-x509-system (< 1.6.8 || >= 1.7) if os(windows) constraints: time ^>=1.14 @@ -70,6 +68,23 @@ write-ghc-environment-files: always -- Do NOT add more source-repository-package stanzas here unless they are strictly -- temporary! Please read the section in CONTRIBUTING about updating dependencies. +-- Allow network-mux 0.11 from SRP (cardano-ping 0.10 on CHaP expects ^>=0.10) +-- Allow grapesy deps with updated bounds (matching cardano-node) +allow-newer: + , cardano-ping:network-mux + , grapesy:aeson + , grapesy:crypton-x509 + , grapesy:crypton-x509-store + , grapesy:crypton-x509-system + , grapesy:crypton-x509-validation + , grapesy:http2 + , grapesy:http2-tls + , grapesy:network-run + , grapesy:tls + -- kes-agent bounds cardano-crypto-class ^>=2.5 but we have a newer version + , kes-agent:cardano-crypto-class + , kes-agent-crypto:cardano-crypto-class + -- cabal-allow-newer begin if impl(ghc >= 9.14) allow-newer: @@ -83,6 +98,13 @@ if impl(ghc >= 9.14) , dictionary-sharing:containers , diff-containers:base , fs-sim:QuickCheck + , grapesy:base + , grapesy:containers + , grapesy:tls + , grpc-spec:base + , grpc-spec:containers + , lens-family:containers + , lens-family-core:containers , lsm-tree:data-elevator , ordered-containers:containers , partial-order:containers @@ -95,3 +117,78 @@ if impl(ghc >= 9.14) , time-locale-compat:time , with-utf8:base -- cabal-allow-newer end + +source-repository-package + type: git + location: https://github.com/input-output-hk/kes-agent + tag: 4625f3cf543566517d08882e659c97932d106d86 + --sha256: sha256-CSHWndpeJFqCEFNT6ysfyN6x+O4vZ9TtYOOsZKcLnIA= + subdir: + kes-agent + kes-agent-crypto + +source-repository-package + type: git + location: https://github.com/IntersectMBO/cardano-ledger + tag: fb723848a28256fe372ea9ba692eccded6a12a53 + --sha256: sha256-iL61RTn4OPRNzzPn/2YcVJNMJYolXghaQ9cDG/DOOWM= + subdir: + eras/allegra/impl + eras/alonzo/impl + eras/babbage/impl + eras/byron/chain/executable-spec + eras/byron/crypto + eras/byron/ledger/executable-spec + eras/byron/ledger/impl + eras/conway/impl + eras/dijkstra/impl + eras/mary/impl + eras/shelley/impl + eras/shelley/test-suite + libs/cardano-data + libs/cardano-ledger-api + libs/cardano-ledger-binary + libs/cardano-ledger-core + libs/cardano-protocol + libs/cardano-protocol-tpraos + libs/non-integral + libs/small-steps + libs/vector-map + +source-repository-package + type: git + location: https://github.com/intersectmbo/cardano-base.git + --sha256: sha256-WUBluY6UqvBkS5cNsJnKMOaW+1dTfL3mg8iq/kVPV0o= + tag: d92e2e3841eaad354c5e1ef77b458b347f471271 + subdir: cardano-crypto-leios + +source-repository-package + type: git + location: https://github.com/IntersectMBO/ouroboros-consensus + tag: 835d3747eb2fbd6b7d69e73245ec7c9703faec21 + --sha256: sha256-ZDAPypcfLn7xzUyxcI7ktHxnvUKtPEHcPR522+c04Ao= + subdir: + . + +source-repository-package + type: git + location: https://github.com/well-typed/grapesy + tag: bd6af64f69ff89e3a8fc02e2c81262e648f4715d + --sha256: sha256-4F+bUoytvrgOcQ8aIWbOY9uYsPoTZwQOlmh7ckgyK9M= + subdir: + grapesy + grpc-spec + +source-repository-package + type: git + location: https://github.com/input-output-hk/cardano-crypto + tag: ac2e12a471b735ad80949bcbf0f6f634e5dbef77 + --sha256: sha256-NvbMk41W2PQy2H91nkG0GtPyGDwia0y6DQNNf9RtoAc= + +source-repository-package + type: git + location: https://github.com/input-output-hk/cardano-api + tag: 6095192558ff527fc73eb06a9862da62d7fb0949 + --sha256: sha256-6mBza4a3Plu9f3ZFfJNUufj5ckx7bNefvYW8atUz0j8= + subdir: + cardano-api diff --git a/cardano-cli/CHANGELOG.md b/cardano-cli/CHANGELOG.md index 5609f69885..576e87d624 100644 --- a/cardano-cli/CHANGELOG.md +++ b/cardano-cli/CHANGELOG.md @@ -63,37 +63,37 @@ [PR 1396](https://github.com/intersectmbo/cardano-cli/pull/1396) - new `cardano-cli ping` api - + `cardano-cli ping` allows now to ping multiple servers, does domain name resolution and supports SRV records (as specified in https://cips.cardano.org/cip/CIP-0155) - + Some examples: - + Run a ping against two ip addresses, ipv4 & ipv6 ```bash cardano-cli ping 127.0.0.1:3001 [::1]:3001 ``` - + Run a ping against a domain name: ```bash cardano-cli ping my.domain.com:3001 ``` - + Run a ping against an SRV domain. According to CIP#0155 the SRV record needs to be registered at `_cardano._tcp.srv.domain.com` ```bash cardano-cli ping srv.domain.com ``` - + Run a ping against unix socket ```bash cardano-cli ping /var/run/cardano-node.socket ``` - + `cardano-cli` ping has three modes of operation: - + * ping mode: `--mode ping` (the default) * tip mode `--mode tip` * query handshake parameters: `--mode query` @@ -101,20 +101,20 @@ [PR 1384](https://github.com/intersectmbo/cardano-cli/pull/1384) - The interface for `cardano-cli ping` has been reshuffled: - + Removed: - + * `-h`/`--host`, `-u`/`--unixsock` and `-p`/`--port`. The target is now given as a positional argument instead (see below). * `-Q`/`--query-versions`, replaced by `--mode query`. * `-t`/`--tip`, replaced by `--mode tip`. - + Renamed: - + * `-m`/`--magic` is now `-m`/`--network-magic`. - + Added: - + * A positional `ADDRS` argument, which accepts one or more targets: an IP/DNS address with a port (`127.0.0.1:3001`, `[::1]:3001`, `example.org:3001`), an SRV name, or a UNIX socket path. @@ -124,7 +124,7 @@ (default `_cardano._tcp`). * `--color COLOR`, one of `auto`, `never` or `always`. * `--short-hash`, to show an abbreviated tip hash. - + Note that `-h` is now only a short form of `--help`; it no longer means `--host`. (breaking, feature) [PR 1384](https://github.com/intersectmbo/cardano-cli/pull/1384) diff --git a/cardano-cli/cardano-cli.cabal b/cardano-cli/cardano-cli.cabal index f635112921..0e7627e37e 100644 --- a/cardano-cli/cardano-cli.cabal +++ b/cardano-cli/cardano-cli.cabal @@ -249,8 +249,8 @@ library cardano-api ^>=11.7, cardano-binary, cardano-crypto, - cardano-crypto-class ^>=2.5, - cardano-crypto-wrapper ^>=1.7, + cardano-crypto-class ^>=2.6, + cardano-crypto-wrapper ^>=1.8, cardano-data >=1.1, cardano-diffusion:ping ^>=1.1.1, cardano-git-rev ^>=0.2.2, diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Genesis/CreateTestnetData/Run.hs b/cardano-cli/src/Cardano/CLI/EraBased/Genesis/CreateTestnetData/Run.hs index d43852bf05..01261800e0 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Genesis/CreateTestnetData/Run.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Genesis/CreateTestnetData/Run.hs @@ -61,6 +61,7 @@ import Cardano.CLI.Type.Error.StakePoolCmdError import Cardano.CLI.Type.Key import Cardano.Crypto.Hash qualified as Crypto import Cardano.Ledger.Conway.Genesis (ConwayExtraConfig (..)) +import Cardano.Ledger.Shelley qualified as L import Cardano.Ledger.Shelley.Genesis (InjectionData (..), ShelleyExtraConfig (..)) import Cardano.Prelude (canonicalEncodePretty) import Cardano.Protocol.Crypto qualified as C @@ -453,7 +454,7 @@ runGenesisCreateTestNetDataCmd mkPoolDir idx = poolsDir ("pool" <> show idx) mkDelegationMapEntry - :: Delegation -> (L.KeyHash L.Staking, L.StakePoolParams) + :: Delegation -> (L.KeyHash L.Staking, L.StakePoolParams L.ShelleyEra) mkDelegationMapEntry d = (dDelegStaking d, dPoolParams d) addCommitteeToConwayGenesis @@ -765,7 +766,7 @@ createPoolCredentials fmt dir = do data Delegation = Delegation { dInitialUtxoAddr :: !(AddressInEra ShelleyEra) , dDelegStaking :: !(L.KeyHash L.Staking) - , dPoolParams :: !L.StakePoolParams + , dPoolParams :: !(L.StakePoolParams L.ShelleyEra) } deriving (Generic, NFData) @@ -777,7 +778,7 @@ buildPoolParams -- ^ The index of the pool being built. Starts at 0. -> Map Word [L.StakePoolRelay] -- ^ User submitted stake pool relay map. Starts at 0 - -> ExceptT GenesisCmdError IO L.StakePoolParams + -> ExceptT GenesisCmdError IO (L.StakePoolParams era) buildPoolParams nw dir index specifiedRelays = do StakePoolVerificationKey poolColdVK <- firstExceptT (GenesisCmdStakePoolCmdError . StakePoolCmdReadFileError) @@ -802,6 +803,7 @@ buildPoolParams nw dir index specifiedRelays = do , L.sppMargin = minBound , L.sppAccountAddress = toShelleyStakeAddr $ makeStakeAddress nw $ StakeCredentialByKey (verificationKeyHash rewardsSVK) + , L.sppBlsKey = L.SNothing , L.sppOwners = mempty , L.sppRelays = lookupPoolRelay specifiedRelays , L.sppMetadata = L.SNothing @@ -826,7 +828,7 @@ computeInsecureStakeKeyAddr g0 = do computeDelegation :: NetworkId -> (VerificationKey PaymentKey, VerificationKey StakeKey) - -> L.StakePoolParams + -> L.StakePoolParams L.ShelleyEra -> Delegation computeDelegation nw (paymentVK, stakeVK) dPoolParams = do let paymentCredential = PaymentCredentialByKey (verificationKeyHash paymentVK) @@ -849,7 +851,7 @@ updateOutputTemplate -- ^ Total amount of lovelace -> [AddressInEra ShelleyEra] -- ^ UTxO addresses that are not delegating - -> [(L.KeyHash L.StakePool, L.StakePoolParams)] + -> [(L.KeyHash L.StakePool, L.StakePoolParams L.ShelleyEra)] -- ^ Pool map -> [(L.KeyHash L.Staking, L.KeyHash L.StakePool)] -- ^ Delegaton map diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Genesis/Run.hs b/cardano-cli/src/Cardano/CLI/EraBased/Genesis/Run.hs index 093c768e38..da3654751a 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Genesis/Run.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Genesis/Run.hs @@ -69,6 +69,7 @@ import Cardano.Crypto qualified as CC import Cardano.Crypto.Hash qualified as Crypto import Cardano.Crypto.Signing qualified as Byron import Cardano.Ledger.BaseTypes (unNonZero) +import Cardano.Ledger.Shelley qualified as L import Cardano.Ledger.Shelley.Genesis (InjectionData (..), ShelleyExtraConfig (..)) import Cardano.Protocol.Crypto qualified as C @@ -747,7 +748,7 @@ runGenesisCreateStakedCmd where adjustTemplate t = t{sgNetworkMagic = unNetworkMagic (toNetworkMagic networkId)} mkDelegationMapEntry - :: Delegation -> (L.KeyHash L.Staking, L.StakePoolParams) + :: Delegation -> (L.KeyHash L.Staking, L.StakePoolParams L.ShelleyEra) mkDelegationMapEntry d = (dDelegStaking d, dPoolParams d) -- ------------------------------------------------------------------------------------------------- @@ -763,7 +764,7 @@ updateOutputTemplate -- ^ Number of UTxO addresses that are delegating -> [AddressInEra ShelleyEra] -- ^ UTxO addresses that are not delegating - -> [(L.KeyHash L.StakePool, L.StakePoolParams)] + -> [(L.KeyHash L.StakePool, L.StakePoolParams L.ShelleyEra)] -- ^ Pool map -> [(L.KeyHash L.Staking, L.KeyHash L.StakePool)] -- ^ Delegaton map @@ -950,7 +951,7 @@ createPoolCredentials fmt dir index = do data Delegation = Delegation { dInitialUtxoAddr :: !(AddressInEra ShelleyEra) , dDelegStaking :: !(L.KeyHash L.Staking) - , dPoolParams :: !L.StakePoolParams + , dPoolParams :: !(L.StakePoolParams L.ShelleyEra) } deriving (Generic, NFData) @@ -961,7 +962,7 @@ buildPoolParams -> Maybe Word -> Map Word [L.StakePoolRelay] -- ^ User submitted stake pool relay map - -> ExceptT GenesisCmdError IO L.StakePoolParams + -> ExceptT GenesisCmdError IO (L.StakePoolParams L.ShelleyEra) buildPoolParams nw dir index specifiedRelays = do StakePoolVerificationKey poolColdVK <- firstExceptT (GenesisCmdStakePoolCmdError . StakePoolCmdReadFileError) @@ -986,6 +987,7 @@ buildPoolParams nw dir index specifiedRelays = do , L.sppMargin = minBound , L.sppAccountAddress = toShelleyStakeAddr $ makeStakeAddress nw $ StakeCredentialByKey (verificationKeyHash rewardsSVK) + , L.sppBlsKey = L.SNothing , L.sppOwners = mempty , L.sppRelays = lookupPoolRelay specifiedRelays , L.sppMetadata = L.SNothing @@ -1041,7 +1043,7 @@ writeBulkPoolCredentials dir bulkIx poolIxs = do computeInsecureDelegation :: StdGen -> NetworkId - -> L.StakePoolParams + -> L.StakePoolParams L.ShelleyEra -> IO (StdGen, Delegation) computeInsecureDelegation g0 nw pool = do (paymentVK, g1) <- first getVerificationKey <$> generateInsecureSigningKey g0 AsPaymentKey @@ -1091,7 +1093,7 @@ updateTemplate -- ^ Amount of lovelace not delegated -> [AddressInEra ShelleyEra] -- ^ UTxO addresses that are not delegating - -> Map (L.KeyHash L.Staking) L.StakePoolParams + -> Map (L.KeyHash L.Staking) (L.StakePoolParams L.ShelleyEra) -- ^ Genesis staking: pools/delegation map & delegated initial UTxO spec -> Lovelace -- ^ Number of UTxO Addresses for delegation diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Query/Run.hs b/cardano-cli/src/Cardano/CLI/EraBased/Query/Run.hs index ee87e7af34..1eb8ab3ede 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Query/Run.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Query/Run.hs @@ -1173,7 +1173,7 @@ writePoolState :: Exp.Era era -> Vary [FormatJson, FormatYaml] -> Maybe (File () Out) - -> SerialisedPoolState + -> SerialisedPoolState era -> ExceptT QueryCmdError IO () writePoolState era outputFormat mOutFile serialisedCurrentEpochState = do poolState <- diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Run.hs b/cardano-cli/src/Cardano/CLI/EraBased/Run.hs index 471f22a056..8b61c8285f 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Run.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Run.hs @@ -9,7 +9,7 @@ module Cardano.CLI.EraBased.Run ) where -import Cardano.Api.Experimental (IsEra, obtainCommonConstraints) +import Cardano.Api.Experimental (Era (..), IsEra) import Cardano.CLI.Compatible.Exception import Cardano.CLI.EraBased.Command @@ -32,7 +32,9 @@ runAnyEraCommand runAnyEraCommand = \case AnyEraCommandOf era cmd -> do printEraDeprecationWarning era - obtainCommonConstraints era $ runCmds cmd + case era of + ConwayEra -> runCmds cmd + DijkstraEra -> runCmds cmd runCmds :: IsEra era diff --git a/cardano-cli/src/Cardano/CLI/EraIndependent/Key/Run.hs b/cardano-cli/src/Cardano/CLI/EraIndependent/Key/Run.hs index 6f581620eb..0847c666e1 100644 --- a/cardano-cli/src/Cardano/CLI/EraIndependent/Key/Run.hs +++ b/cardano-cli/src/Cardano/CLI/EraIndependent/Key/Run.hs @@ -43,7 +43,7 @@ import Cardano.Api.Byron qualified as ByronApi import Cardano.Api.Crypto.Ed25519Bip32 (xPrvFromBytes) import Cardano.Api.Ledger qualified as L -import Cardano.Binary.FixedSizeCodec (rawDecodeFixedSized) +import Cardano.Binary.FixedSizeCodec qualified as FixedSized import Cardano.CLI.Byron.Key qualified as Byron import Cardano.CLI.Compatible.Exception import Cardano.CLI.EraIndependent.Key.Command qualified as Cmd @@ -498,7 +498,7 @@ runConvertITNBip32KeyCmd convertITNVerificationKey :: Text -> Either ItnKeyConversionError (VerificationKey StakeKey) convertITNVerificationKey pubKey = do (_, _, keyBS) <- first ItnKeyBech32DecodeError (decodeBech32 pubKey) - case rawDecodeFixedSized keyBS of + case FixedSized.rawDecodeFixedSized keyBS of Just verKey -> Right . StakeVerificationKey $ L.VKey verKey Nothing -> Left $ ItnVerificationKeyDeserialisationError keyBS @@ -506,7 +506,7 @@ convertITNVerificationKey pubKey = do convertITNSigningKey :: Text -> Either ItnKeyConversionError (SigningKey StakeKey) convertITNSigningKey privKey = do (_, _, keyBS) <- first ItnKeyBech32DecodeError (decodeBech32 privKey) - case rawDecodeFixedSized keyBS of + case FixedSized.rawDecodeFixedSized keyBS of Just signKey -> Right $ StakeSigningKey signKey Nothing -> Left $ ItnSigningKeyDeserialisationError keyBS diff --git a/cardano-cli/test/cardano-cli-golden/Test/Golden/Dijkstra/Transaction/Assemble.hs b/cardano-cli/test/cardano-cli-golden/Test/Golden/Dijkstra/Transaction/Assemble.hs index 15567d3783..aa0b92fd7d 100644 --- a/cardano-cli/test/cardano-cli-golden/Test/Golden/Dijkstra/Transaction/Assemble.hs +++ b/cardano-cli/test/cardano-cli-golden/Test/Golden/Dijkstra/Transaction/Assemble.hs @@ -19,23 +19,10 @@ import Hedgehog.Extras.Test qualified as H hprop_golden_dijkstra_transaction_assemble_witness_signing_key :: Property hprop_golden_dijkstra_transaction_assemble_witness_signing_key = watchdogProp . propertyOnce $ H.moduleWorkspace "tmp" $ \tempDir -> do - txBodyFile <- noteTempFile tempDir "tx-body" - - -- Create tx body file - void $ - execCardanoCLI - [ "dijkstra" - , "transaction" - , "build-raw" - , "--tx-in" - , "63e6a9a8e58e48cc025cae04daaed9d36fc7b70bc292721d9f5057ae37b24981#0" - , "--tx-out" - , "addr_test1vp0t4dfa9ktc2uvv7sg9leafuhtwyu0xcj4q4kf5pqkpjwqhklklg+15000002800000" - , "--fee" - , "200000" - , "--tx-body-file" - , txBodyFile - ] + -- Use a pre-built tx body golden file (build-raw requires EraCommonConstraints + -- which are not yet implemented for DijkstraEra in cardano-api) + txBodyFile <- + noteInputFile "test/cardano-cli-golden/files/input/dijkstra/transaction/tx_body" -- Sign it with a single signing key, as a detached witness file witnessFile <- noteTempFile tempDir "single-signing-key-witness" diff --git a/cardano-cli/test/cardano-cli-golden/files/input/dijkstra/transaction/tx_body b/cardano-cli/test/cardano-cli-golden/files/input/dijkstra/transaction/tx_body new file mode 100644 index 0000000000..c02d8e90d1 --- /dev/null +++ b/cardano-cli/test/cardano-cli-golden/files/input/dijkstra/transaction/tx_body @@ -0,0 +1,5 @@ +{ + "type": "Tx DijkstraEra", + "description": "Ledger Cddl Format", + "cborHex": "83a300d901028182582063e6a9a8e58e48cc025cae04daaed9d36fc7b70bc292721d9f5057ae37b2498100018182581d605ebab53d2d9785718cf4105fe7a9e5d6e271e6c4aa0ad934082c19381b00000da475d6a980021a00030d40a0f6" +} diff --git a/flake.lock b/flake.lock index ee332f1aae..ede71effc4 100644 --- a/flake.lock +++ b/flake.lock @@ -384,11 +384,11 @@ "hackageNix": { "flake": false, "locked": { - "lastModified": 1785398528, - "narHash": "sha256-dl5vmLjnVynFaniJ60YNZfDT7m/psLU1P/bj+gwlZt8=", + "lastModified": 1788358854, + "narHash": "sha256-NIF+y/9ctwQILbHsCZCOFN7dxuwWXKnFn5T0+ya49+Y=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "cee34cd6eac747364751d1971080bc72c461506d", + "rev": "04149d44d879f7115282c442f8904b5eb5a78c4e", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d13d3c2554..c1fb9b6cba 100644 --- a/flake.nix +++ b/flake.nix @@ -210,13 +210,18 @@ ... }: let cliExe = "${config.hsPkgs.cardano-cli.components.exes.cardano-cli}/bin/cardano-cli${pkgs.stdenv.hostPlatform.extensions.executable}"; - needsQemu = pkgs.stdenv.hostPlatform.isLinux + needsQemu = + pkgs.stdenv.hostPlatform.isLinux && pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform && pkgs.stdenv.hostPlatform.parsed.cpu.name != pkgs.stdenv.buildPlatform.parsed.cpu.name; qemuWrapped = pkgs.buildPackages.writeShellScript "cardano-cli-qemu" '' exec ${pkgs.buildPackages.qemu}/bin/qemu-${pkgs.stdenv.hostPlatform.qemuArch} ${cliExe} "$@" ''; - exportCliPath = "export CARDANO_CLI=${if needsQemu then qemuWrapped else cliExe}"; + exportCliPath = "export CARDANO_CLI=${ + if needsQemu + then qemuWrapped + else cliExe + }"; mainnetConfigFiles = [ "configuration/cardano/mainnet-config.yaml" "configuration/cardano/mainnet-config.json"