Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit 435cd3f

Browse files
authored
Merge pull request #3561 from input-output-hk/intricate+mhuesch/CO-354/implement-networkmagic
[release/1.3.1] [CO-354] Implement `NetworkMagic` logic
2 parents 1b39e25 + a2d569a commit 435cd3f

File tree

65 files changed

+788
-620
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+788
-620
lines changed

auxx/src/Command/BlockGen.hs

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import System.Wlog (logInfo)
1414
import Pos.AllSecrets (mkAllSecretsSimple)
1515
import Pos.Client.KeyStorage (getSecretKeysPlain)
1616
import Pos.Core (gdBootStakeholders, genesisData)
17+
import Pos.Core.NetworkMagic (makeNetworkMagic)
1718
import Pos.Crypto (ProtocolMagic, encToSecret)
1819
import Pos.Generator.Block (BlockGenParams (..), genBlocks, tgpTxCountRange)
1920
import Pos.Infra.StateLock (Priority (..), withStateLock)
@@ -30,7 +31,8 @@ generateBlocks pm GenBlocksParams{..} = withStateLock HighPriority ApplyBlock $
3031
seed <- liftIO $ maybe randomIO pure bgoSeed
3132
logInfo $ "Generating with seed " <> show seed
3233

33-
allSecrets <- mkAllSecretsSimple . map encToSecret <$> getSecretKeysPlain
34+
let nm = makeNetworkMagic pm
35+
allSecrets <- mkAllSecretsSimple nm . map encToSecret <$> getSecretKeysPlain
3436

3537
let bgenParams =
3638
BlockGenParams

auxx/src/Command/Proc.hs

+20-18
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ import qualified Text.JSON.Canonical as CanonicalJSON
1717

1818
import Pos.Client.KeyStorage (addSecretKey, getSecretKeysPlain)
1919
import Pos.Client.Txp.Balances (getBalance)
20-
import Pos.Core (AddrStakeDistribution (..), Address, HeavyDlgIndex (..),
21-
SoftwareVersion (..), StakeholderId, addressHash, mkMultiKeyDistr,
22-
unsafeGetCoin)
20+
import Pos.Core (AddrStakeDistribution (..), HeavyDlgIndex (..), SoftwareVersion (..),
21+
StakeholderId, addressHash, mkMultiKeyDistr, unsafeGetCoin)
2322
import Pos.Core.Common (AddrAttributes (..), AddrSpendingData (..), makeAddress)
2423
import Pos.Core.Configuration (genesisSecretKeys)
25-
import Pos.Core.NetworkMagic (NetworkMagic (..))
24+
import Pos.Core.NetworkMagic (makeNetworkMagic)
2625
import Pos.Core.Txp (TxOut (..))
2726
import Pos.Crypto (ProtocolMagic, PublicKey, emptyPassphrase, encToPublic, fullPublicKeyF,
2827
hashHexF, noPassEncrypt, safeCreatePsk, unsafeCheatingHashCoerce,
@@ -94,6 +93,8 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
9493

9594
let name = "addr" in
9695
needsAuxxMode name >>= \Dict ->
96+
needsProtocolMagic name >>= \pm ->
97+
let nm = makeNetworkMagic pm in
9798
return CommandProc
9899
{ cpName = name
99100
, cpArgumentPrepare = map
@@ -104,9 +105,9 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
104105
, cpExec = \(pk', mDistr) -> do
105106
pk <- toLeft pk'
106107
addr <- case mDistr of
107-
Nothing -> makePubKeyAddressAuxx fixedNM pk
108+
Nothing -> makePubKeyAddressAuxx nm pk
108109
Just distr -> return $
109-
makeAddress (PubKeyASD pk) (AddrAttributes Nothing distr fixedNM)
110+
makeAddress (PubKeyASD pk) (AddrAttributes Nothing distr nm)
110111
return $ ValueAddress addr
111112
, cpHelp = "address for the specified public key. a stake distribution \
112113
\ can be specified manually (by default it uses the current epoch \
@@ -115,6 +116,7 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
115116

116117
let name = "addr-hd" in
117118
needsAuxxMode name >>= \Dict ->
119+
needsProtocolMagic name >>= \pm ->
118120
return CommandProc
119121
{ cpName = name
120122
, cpArgumentPrepare = identity
@@ -124,7 +126,8 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
124126
sk <- evaluateWHNF (sks !! i) -- WHNF is sufficient to force possible errors
125127
-- from using (!!). I'd use NF but there's no
126128
-- NFData instance for secret keys.
127-
addrHD <- deriveHDAddressAuxx fixedNM sk
129+
let nm = makeNetworkMagic pm
130+
addrHD <- deriveHDAddressAuxx nm sk
128131
return $ ValueAddress addrHD
129132
, cpHelp = "address of the HD wallet for the specified public key"
130133
},
@@ -182,12 +185,16 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
182185

183186
let name = "balance" in
184187
needsAuxxMode name >>= \Dict ->
188+
needsProtocolMagic name >>= \pm ->
189+
let nm = makeNetworkMagic pm in
185190
return CommandProc
186191
{ cpName = name
187192
, cpArgumentPrepare = identity
188193
, cpArgumentConsumer = getArg (tyAddress `tyEither` tyPublicKey `tyEither` tyInt) "addr"
189194
, cpExec = \addr' -> do
190-
addr <- toLeft addr'
195+
addr <- case addr' of
196+
Left a -> pure a
197+
Right pki -> makePubKeyAddressAuxx nm =<< toLeft pki
191198
balance <- getBalance addr
192199
return $ ValueNumber (fromIntegral . unsafeGetCoin $ balance)
193200
, cpHelp = "check the amount of coins on the specified address"
@@ -466,6 +473,8 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
466473

467474
let name = "listaddr" in
468475
needsAuxxMode name >>= \Dict ->
476+
needsProtocolMagic name >>= \pm ->
477+
let nm = makeNetworkMagic pm in
469478
return CommandProc
470479
{ cpName = name
471480
, cpArgumentPrepare = identity
@@ -475,8 +484,8 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
475484
printAction "Available addresses:"
476485
for_ (zip [0 :: Int ..] sks) $ \(i, sk) -> do
477486
let pk = encToPublic sk
478-
addr <- makePubKeyAddressAuxx fixedNM pk
479-
addrHD <- deriveHDAddressAuxx fixedNM sk
487+
addr <- makePubKeyAddressAuxx nm pk
488+
addrHD <- deriveHDAddressAuxx nm sk
480489
printAction $
481490
sformat (" #"%int%": addr: "%build%"\n"%
482491
" pk: "%fullPublicKeyF%"\n"%
@@ -485,7 +494,7 @@ createCommandProcs mpm hasAuxxMode printAction mDiffusion = rights . fix $ \comm
485494
i addr pk (addressHash pk) addrHD
486495
walletMB <- (^. usWallet) <$> (view userSecret >>= atomically . readTVar)
487496
whenJust walletMB $ \wallet -> do
488-
addrHD <- deriveHDAddressAuxx fixedNM (_wusRootKey wallet)
497+
addrHD <- deriveHDAddressAuxx nm (_wusRootKey wallet)
489498
printAction $
490499
sformat (" Wallet address:\n"%
491500
" HD addr: "%build)
@@ -536,16 +545,9 @@ instance MonadAuxxMode m => ToLeft m PublicKey Int where
536545
instance MonadAuxxMode m => ToLeft m StakeholderId PublicKey where
537546
toLeft = return . either identity addressHash
538547

539-
instance MonadAuxxMode m => ToLeft m Address PublicKey where
540-
toLeft = either return (makePubKeyAddressAuxx fixedNM)
541-
542548
getPublicKeyFromIndex :: MonadAuxxMode m => Int -> m PublicKey
543549
getPublicKeyFromIndex i = do
544550
sks <- getSecretKeysPlain
545551
let sk = sks !! i
546552
pk = encToPublic sk
547553
evaluateNF pk
548-
549-
550-
fixedNM :: NetworkMagic
551-
fixedNM = NMNothing

auxx/src/Command/Tx.hs

+7-8
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import Pos.Client.Txp.Util (createTx)
4040
import Pos.Core (BlockVersionData (bvdSlotDuration), IsBootstrapEraAddr (..),
4141
Timestamp (..), deriveFirstHDAddress, makePubKeyAddress, mkCoin)
4242
import Pos.Core.Configuration (genesisBlockVersionData, genesisSecretKeys)
43-
import Pos.Core.NetworkMagic (NetworkMagic (..))
43+
import Pos.Core.NetworkMagic (makeNetworkMagic)
4444
import Pos.Core.Txp (TxAux (..), TxIn (TxInUtxo), TxOut (..), TxOutAux (..), txaF)
4545
import Pos.Crypto (EncryptedSecretKey, ProtocolMagic, emptyPassphrase, encToPublic,
4646
fakeSigner, hash, safeToPublic, toPublic, withSafeSigners)
@@ -104,18 +104,19 @@ sendToAllGenesis pm diffusion (SendToAllGenesisParams genesisTxsPerThread txsPer
104104
logInfo $ sformat ("Found "%shown%" keys in the genesis block.") (length keysToSend)
105105
startAtTxt <- liftIO $ lookupEnv "AUXX_START_AT"
106106
let startAt = fromMaybe 0 . readMaybe . fromMaybe "" $ startAtTxt :: Int
107+
let nm = makeNetworkMagic pm
107108
-- construct a transaction, and add it to the queue
108109
let addTx secretKey = do
109110
let signer = fakeSigner secretKey
110111
publicKey = toPublic secretKey
111112
-- construct transaction output
112-
outAddr <- makePubKeyAddressAuxx fixedNM publicKey
113+
outAddr <- makePubKeyAddressAuxx nm publicKey
113114
let txOut1 = TxOut {
114115
txOutAddress = outAddr,
115116
txOutValue = mkCoin 1
116117
}
117118
txOuts = TxOutAux txOut1 :| []
118-
utxo <- getOwnUtxoForPk fixedNM $ safeToPublic signer
119+
utxo <- getOwnUtxoForPk nm $ safeToPublic signer
119120
etx <- createTx pm mempty utxo signer txOuts publicKey
120121
case etx of
121122
Left err -> logError (sformat ("Error: "%build%" while trying to contruct tx") err)
@@ -221,11 +222,12 @@ send
221222
-> m ()
222223
send pm diffusion idx outputs = do
223224
skey <- takeSecret
225+
let nm = makeNetworkMagic pm
224226
let curPk = encToPublic skey
225-
let plainAddresses = map (flip (makePubKeyAddress fixedNM) curPk . IsBootstrapEraAddr) [False, True]
227+
let plainAddresses = map (flip (makePubKeyAddress nm) curPk . IsBootstrapEraAddr) [False, True]
226228
let (hdAddresses, hdSecrets) = unzip $ map
227229
(\ibea -> fromMaybe (error "send: pass mismatch") $
228-
deriveFirstHDAddress fixedNM (IsBootstrapEraAddr ibea) emptyPassphrase skey) [False, True]
230+
deriveFirstHDAddress nm (IsBootstrapEraAddr ibea) emptyPassphrase skey) [False, True]
229231
let allAddresses = hdAddresses ++ plainAddresses
230232
let allSecrets = hdSecrets ++ [skey, skey]
231233
etx <- withSafeSigners allSecrets (pure emptyPassphrase) $ \signers -> runExceptT @AuxxException $ do
@@ -273,6 +275,3 @@ sendTxsFromFile diffusion txsFile = do
273275
(topsortTxAuxes txAuxes)
274276
let submitOne = submitTxRaw diffusion
275277
mapM_ submitOne sortedTxAuxes
276-
277-
fixedNM :: NetworkMagic
278-
fixedNM = NMNothing

block/src/Pos/Block/Logic/Internal.hs

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import Pos.Core (ComponentBlock (..), IsGenesisHeader, epochIndexL, gb
4242
mainBlockUpdatePayload)
4343
import Pos.Core.Block (Block, GenesisBlock, MainBlock)
4444
import Pos.Core.Chrono (NE, NewestFirst (..), OldestFirst (..))
45+
import Pos.Core.NetworkMagic (makeNetworkMagic)
4546
import Pos.Crypto (ProtocolMagic)
4647
import Pos.DB (MonadDB, MonadDBRead, MonadGState, SomeBatchOp (..))
4748
import qualified Pos.DB.GState.Common as GS (writeBatchGState)
@@ -186,7 +187,7 @@ applyBlocksDbUnsafeDo pm scb blunds pModifier = do
186187
let blocks = fmap fst blunds
187188
-- Note: it's important to do 'slogApplyBlocks' first, because it
188189
-- puts blocks in DB.
189-
slogBatch <- slogApplyBlocks scb blunds
190+
slogBatch <- slogApplyBlocks pm scb blunds
190191
TxpGlobalSettings {..} <- view (lensOf @TxpGlobalSettings)
191192
usBatch <- SomeBatchOp <$> usApplyBlocks pm (map toUpdateBlock blocks) pModifier
192193
delegateBatch <- SomeBatchOp <$> dlgApplyBlocks (map toDlgBlund blunds)
@@ -213,7 +214,8 @@ rollbackBlocksUnsafe
213214
-> NewestFirst NE Blund
214215
-> m ()
215216
rollbackBlocksUnsafe pm bsc scb toRollback = do
216-
slogRoll <- slogRollbackBlocks bsc scb toRollback
217+
let nm = makeNetworkMagic pm
218+
slogRoll <- slogRollbackBlocks nm bsc scb toRollback
217219
dlgRoll <- SomeBatchOp <$> dlgRollbackBlocks (map toDlgBlund toRollback)
218220
usRoll <- SomeBatchOp <$> usRollbackBlocks
219221
(toRollback & each._2 %~ undoUS

block/src/Pos/Block/Slog/Logic.hs

+10-11
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import Pos.Core (BlockVersion (..), FlatSlotId, blkSecurityParam, diff
4242
import Pos.Core.Block (Block, genBlockLeaders, mainBlockSlot)
4343
import Pos.Core.Chrono (NE, NewestFirst (getNewestFirst), OldestFirst (..), toOldestFirst,
4444
_OldestFirst)
45-
import Pos.Core.NetworkMagic (NetworkMagic (..))
45+
import Pos.Core.NetworkMagic (NetworkMagic, makeNetworkMagic)
4646
import Pos.Crypto (ProtocolMagic)
4747
import Pos.DB (SomeBatchOp (..))
4848
import Pos.DB.Block (putBlunds)
@@ -214,10 +214,11 @@ newtype ShouldCallBListener = ShouldCallBListener Bool
214214
-- 6. Setting @inMainChain@ flags
215215
slogApplyBlocks
216216
:: MonadSlogApply ctx m
217-
=> ShouldCallBListener
217+
=> ProtocolMagic
218+
-> ShouldCallBListener
218219
-> OldestFirst NE Blund
219220
-> m SomeBatchOp
220-
slogApplyBlocks (ShouldCallBListener callBListener) blunds = do
221+
slogApplyBlocks pm (ShouldCallBListener callBListener) blunds = do
221222
-- Note: it's important to put blunds first. The invariant is that
222223
-- the sequence of blocks corresponding to the tip must exist in
223224
-- BlockDB. If program is interrupted after we put blunds and
@@ -227,7 +228,8 @@ slogApplyBlocks (ShouldCallBListener callBListener) blunds = do
227228
-- If the program is interrupted at this point (after putting blunds
228229
-- in BlockDB), we will have garbage blunds in BlockDB, but it's not a
229230
-- problem.
230-
bListenerBatch <- if callBListener then onApplyBlocks fixedNM blunds
231+
let nm = makeNetworkMagic pm
232+
bListenerBatch <- if callBListener then onApplyBlocks nm blunds
231233
else pure mempty
232234

233235
let newestBlock = NE.last $ getOldestFirst blunds
@@ -282,11 +284,12 @@ newtype BypassSecurityCheck = BypassSecurityCheck Bool
282284
-- 5. Removing @inMainChain@ flags
283285
slogRollbackBlocks ::
284286
MonadSlogApply ctx m
285-
=> BypassSecurityCheck -- ^ is rollback for more than k blocks allowed?
287+
=> NetworkMagic
288+
-> BypassSecurityCheck -- ^ is rollback for more than k blocks allowed?
286289
-> ShouldCallBListener
287290
-> NewestFirst NE Blund
288291
-> m SomeBatchOp
289-
slogRollbackBlocks (BypassSecurityCheck bypassSecurity) (ShouldCallBListener callBListener) blunds = do
292+
slogRollbackBlocks nm (BypassSecurityCheck bypassSecurity) (ShouldCallBListener callBListener) blunds = do
290293
inAssertMode $ when (isGenesis0 (blocks ^. _Wrapped . _neLast)) $
291294
assertionFailed $
292295
colorize Red "FATAL: we are TRYING TO ROLLBACK 0-TH GENESIS block"
@@ -306,7 +309,7 @@ slogRollbackBlocks (BypassSecurityCheck bypassSecurity) (ShouldCallBListener cal
306309
reportFatalError "slogRollbackBlocks: the attempted rollback would \
307310
\lead to a more than 'k' distance between tip and \
308311
\last seen block, which is a security risk. Aborting."
309-
bListenerBatch <- if callBListener then onRollbackBlocks fixedNM blunds
312+
bListenerBatch <- if callBListener then onRollbackBlocks nm blunds
310313
else pure mempty
311314
let putTip =
312315
SomeBatchOp $ GS.PutTip $
@@ -345,7 +348,3 @@ slogRollbackBlocks (BypassSecurityCheck bypassSecurity) (ShouldCallBListener cal
345348
blockExtraBatch lastSlots =
346349
GS.SetLastSlots (newLastSlots lastSlots) :
347350
mconcat [forwardLinksBatch, inMainBatch]
348-
349-
350-
fixedNM :: NetworkMagic
351-
fixedNM = NMNothing

client/src/Pos/Client/Txp/Network.hs

+3-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import Pos.Client.Txp.Util (InputSelectionPolicy, PendingAddresses (..
2525
import Pos.Communication.Message ()
2626
import Pos.Communication.Types (InvOrDataTK)
2727
import Pos.Core (Address, Coin, makeRedeemAddress, mkCoin, unsafeAddCoin)
28-
import Pos.Core.NetworkMagic (NetworkMagic (..))
28+
import Pos.Core.NetworkMagic (makeNetworkMagic)
2929
import Pos.Core.Txp (TxAux (..), TxId, TxOut (..), TxOutAux (..), txaF)
3030
import Pos.Crypto (ProtocolMagic, RedeemSecretKey, SafeSigner, hash, redeemToPublic)
3131
import Pos.Infra.Communication.Protocol (OutSpecs)
@@ -68,7 +68,8 @@ prepareRedemptionTx
6868
-> Address
6969
-> m (TxAux, Address, Coin)
7070
prepareRedemptionTx pm rsk output = do
71-
let redeemAddress = makeRedeemAddress fixedNM $ redeemToPublic rsk
71+
let nm = makeNetworkMagic pm
72+
let redeemAddress = makeRedeemAddress nm $ redeemToPublic rsk
7273
utxo <- getOwnUtxo redeemAddress
7374
let addCoin c = unsafeAddCoin c . txOutValue . toaOut
7475
redeemBalance = foldl' addCoin (mkCoin 0) utxo
@@ -90,7 +91,3 @@ submitTxRaw diffusion txAux@TxAux {..} = do
9091

9192
sendTxOuts :: OutSpecs
9293
sendTxOuts = createOutSpecs (Proxy :: Proxy (InvOrDataTK TxId TxMsgContents))
93-
94-
95-
fixedNM :: NetworkMagic
96-
fixedNM = NMNothing

client/src/Pos/Client/Txp/Util.hs

+3-7
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import Pos.Core (Address, Coin, StakeholderId, TxFeePolicy (..), TxSiz
6666
isRedeemAddress, mkCoin, sumCoins, txSizeLinearMinValue,
6767
unsafeIntegerToCoin, unsafeSubCoin)
6868
import Pos.Core.Configuration (HasConfiguration)
69-
import Pos.Core.NetworkMagic (NetworkMagic (..))
69+
import Pos.Core.NetworkMagic (NetworkMagic, makeNetworkMagic)
7070
import Pos.Crypto (ProtocolMagic, RedeemSecretKey, SafeSigner,
7171
SignTag (SignRedeemTx, SignTx), deterministicKeyGen, fakeSigner, hash,
7272
redeemSign, redeemToPublic, safeSign, safeToPublic)
@@ -516,7 +516,7 @@ prepareInpsOuts
516516
-> TxCreator m (TxOwnedInputs TxOut, TxOutputs)
517517
prepareInpsOuts pm pendingTx utxo outputs addrData = do
518518
txRaw@TxRaw {..} <- prepareTxWithFee pm pendingTx utxo outputs
519-
outputsWithRem <- mkOutputsWithRem fixedNM addrData txRaw
519+
outputsWithRem <- mkOutputsWithRem (makeNetworkMagic pm) addrData txRaw
520520
pure (trInputs, outputsWithRem)
521521

522522
createGenericTx
@@ -729,7 +729,7 @@ stabilizeTxFee pm pendingTx linearPolicy utxo outputs = do
729729
stabilizeTxFeeDo (_, 0) _ = pure Nothing
730730
stabilizeTxFeeDo (isSecondStage, attempt) expectedFee = do
731731
txRaw <- prepareTxRaw pendingTx utxo outputs expectedFee
732-
fakeChangeAddr <- lift . lift $ getFakeChangeAddress fixedNM
732+
fakeChangeAddr <- lift . lift $ getFakeChangeAddress (makeNetworkMagic pm)
733733
txMinFee <- txToLinearFee linearPolicy $
734734
createFakeTxFromRawTx pm fakeChangeAddr txRaw
735735

@@ -774,7 +774,3 @@ createFakeTxFromRawTx pm fakeAddr TxRaw{..} =
774774
(\_ -> Right $ fakeSigner fakeSK)
775775
trInputs
776776
txOutsWithRem
777-
778-
779-
fixedNM :: NetworkMagic
780-
fixedNM = NMNothing

client/test/Test/Pos/Client/Txp/Mode.hs

+5-9
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,16 @@ instance MonadGState TxpTestMode where
5454

5555
instance MonadAddresses TxpTestMode where
5656
type AddrData TxpTestMode = ()
57-
getNewAddress _ _ = pure fakeAddressForMonadAddresses
58-
getFakeChangeAddress _ = pure fakeAddressForMonadAddresses
57+
getNewAddress nm _ = pure (fakeAddressForMonadAddresses nm)
58+
getFakeChangeAddress = pure . fakeAddressForMonadAddresses
5959

60-
fakeAddressForMonadAddresses :: Address
61-
fakeAddressForMonadAddresses = address
60+
fakeAddressForMonadAddresses :: NetworkMagic -> Address
61+
fakeAddressForMonadAddresses nm = address
6262
where
6363
-- seed for address generation is a ByteString with 32 255's
6464
seedSize = 32
6565
seed = BS.replicate seedSize (255 :: Word8)
66-
address = makePubKeyAddressBoot fixedNM $ fst $ deterministicKeyGen seed
66+
address = makePubKeyAddressBoot nm $ fst $ deterministicKeyGen seed
6767

6868
withBVData
6969
:: MonadReader BlockVersionData m
@@ -87,7 +87,3 @@ instance MonadAddresses TxpTestProperty where
8787

8888
instance (HasTxpConfigurations, Testable a) => Testable (TxpTestProperty a) where
8989
property = monadic (ioProperty . flip runReaderT genesisBlockVersionData)
90-
91-
92-
fixedNM :: NetworkMagic
93-
fixedNM = NMNothing

0 commit comments

Comments
 (0)