@@ -19,11 +19,19 @@ module Pos.Core.Configuration.Core
1919 , defaultCoreConfiguration
2020 ) where
2121
22- import Universum
22+ import Prelude
23+ import Universum hiding (fail , (<>) )
2324
25+ import Data.Aeson (FromJSON , ToJSON , Value (.. ), genericToEncoding , pairs , parseJSON ,
26+ toEncoding , (.:) )
27+ import Data.Aeson.Encoding (pairStr )
28+ import Data.Aeson.Types (typeMismatch )
29+ import qualified Data.HashMap.Strict as HM
30+ import Data.Monoid ((<>) )
2431import Data.Reflection (Given (.. ), give )
32+ import Serokell.Aeson.Options (defaultOptions )
2533
26- import qualified Data.HashMap.Strict as HM
34+ import Pos.Aeson.Genesis ()
2735import Pos.Binary.Class (Raw )
2836import Pos.Core.Common (Coeff (.. ), SharedSeed (.. ), TxFeePolicy (.. ), TxSizeLinear (.. ),
2937 unsafeCoinPortionFromDouble )
@@ -47,7 +55,70 @@ data GenesisConfiguration
4755 , gcsHash :: ! (Hash Raw )
4856 -- ^ Hash of canonically encoded 'GenesisData'.
4957 }
50- deriving (Show )
58+ deriving (Eq , Show , Generic )
59+
60+ instance ToJSON GenesisConfiguration where
61+ toEncoding (GCSrc gcsFile gcsHash) =
62+ pairs . pairStr " src"
63+ . pairs $ pairStr " file"
64+ (toEncoding gcsFile) <> pairStr " hash" (toEncoding gcsHash)
65+
66+ toEncoding (GCSpec value) =
67+ genericToEncoding defaultOptions (GCSpec value)
68+
69+ instance FromJSON GenesisConfiguration where
70+ parseJSON (Object o)
71+ | HM. member " src" o = GCSrc <$> ((o .: " src" ) >>= (.: " file" ))
72+ <*> ((o .: " src" ) >>= (.: " hash" ))
73+ | HM. member " spec" o = do
74+ -- GCSpec Object
75+ specO <- o .: " spec"
76+
77+ -- GenesisAvvmBalances
78+ avvmDistrO <- specO .: " avvmDistr"
79+ avvmDistr <- parseJSON (avvmDistrO)
80+
81+ -- SharedSeed
82+ ftsSeed <- specO .: " ftsSeed"
83+
84+ -- GenesisDelegation
85+ heavyDelegationO <- specO .: " heavyDelegation"
86+ heavyDelegation <- parseJSON (heavyDelegationO)
87+
88+ -- BlockVersionData
89+ blockVersionDataO <- specO .: " blockVersionData"
90+ blockVersionData <- parseJSON blockVersionDataO
91+
92+ -- GenesisProtocolConstants
93+ protocolConstantsO <- specO .: " protocolConstants"
94+ protocolConstants <- parseJSON protocolConstantsO
95+
96+ -- GenesisInitializer
97+ initializerO <- specO .: " initializer"
98+ testBalanceO <- initializerO .: " testBalance"
99+ testBalance <- parseJSON testBalanceO
100+ fakeAvvmBalanceO <- (initializerO .: " fakeAvvmBalance" )
101+ fakeAvvmBalance <- parseJSON fakeAvvmBalanceO
102+ avvmBalanceFactor <- initializerO .: " avvmBalanceFactor"
103+ useHeavyDlg <- initializerO .: " useHeavyDlg"
104+ seed <- initializerO .: " seed"
105+
106+ return . GCSpec $
107+ UnsafeGenesisSpec
108+ (GenesisAvvmBalances avvmDistr)
109+ ftsSeed
110+ heavyDelegation
111+ blockVersionData
112+ protocolConstants
113+ (GenesisInitializer
114+ testBalance
115+ fakeAvvmBalance
116+ avvmBalanceFactor
117+ useHeavyDlg
118+ seed)
119+ | otherwise = fail " Incorrect JSON encoding for GenesisConfiguration"
120+
121+ parseJSON invalid = typeMismatch " GenesisConfiguration" invalid
51122
52123data CoreConfiguration = CoreConfiguration
53124 {
0 commit comments