diff --git a/cabal.project b/cabal.project index d2ab2e1..b111689 100644 --- a/cabal.project +++ b/cabal.project @@ -1,288 +1,128 @@ -index-state: 2022-01-17T00:00:00Z -packages: - ./metadata-lib - ./metadata-server - ./metadata-webhook - ./metadata-store-postgres - ./metadata-validator-github - ./token-metadata-creator - ./metadata-sync - -package metadata-lib - tests: True - -package metadata-server - tests: True - -package metadata-webhook - tests: True - -package metadata-store-postgres - tests: True - -package metadata-validator-github - tests: True - -package token-metadata-creator - tests: True - -package metadata-sync - tests: True - --- --------------------------------------------------------- --- Disable all tests belonging to dependencies - -tests: False - -package cardano-api - tests: False - -package cardano-cli - tests: False - -package cardano-node - tests: False - -package cardano-node-chairman - tests: False - -package cardano-config - tests: False - -package hedgehog-extras - tests: False - -package byron-spec-ledger - tests: False - -package ouroboros-consensus-test - tests: False - -package ouroboros-consensus-cardano-test - tests: False - -package ouroboros-network - tests: False - -package ouroboros-network-framework - tests: False +-- Custom repository for cardano haskell packages, see CONTRIBUTING for more +repository cardano-haskell-packages + url: https://input-output-hk.github.io/cardano-haskell-packages + secure: True + root-keys: + 3e0cce471cf09815f930210f7827266fd09045445d65923e6d0238a6cd15126f + 443abb7fb497a134c343faf52f0b659bd7999bc06b7f63fa76dc99d631f9bea1 + a86a1f6ce86c449c46666bda44268677abf29b5b2d2eb5ec7af903ec2f117a82 + bcec67e8e99cabfa7764d75ad9b158d72bfacf70ca1d0ec8bc6b4406d1bf8413 + c00aae8461a256275598500ea0e187588c35a5d5d7454fb57eac18d9edb86a56 + d4a35cd3121aa00d18544bb0ac01c3e1691d618f462c46129271bccf39f7e8ee + +index-state: 2022-09-27T00:00:00Z +index-state: cardano-haskell-packages 2022-11-17T00:00:00Z -package small-steps - tests: False - -package small-steps-test - tests: False - -package goblins - tests: False - -package io-sim-classes - tests: False - -package cardano-db - tests: False - -package * - tests: False - -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-prelude - tag: bb4ed71ba8e587f672d06edf9d2e376f4b055555 - --sha256: 00h10l5mmiza9819p9v5q5749nb9pzgi20vpzpy1d34zmh6gf1cj - subdir: - cardano-prelude - cardano-prelude-test - -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-crypto - tag: f73079303f663e028288f9f4a9e08bcca39a923e - --sha256: 1n87i15x54s0cjkh3nsxs4r1x016cdw1fypwmr68936n3xxsjn6q - -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-node - tag: 1a7453427d6ec8e4128a0951dfaa25e69fb4711e - --sha256: 0w6f27iza6brpszlsb639v1x10hdirm2dp57h8zm2dk2p1a3n82g - subdir: - cardano-api - cardano-cli - cardano-node - -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-config - tag: e9de7a2cf70796f6ff26eac9f9540184ded0e4e6 - --sha256: 1wm1c99r5zvz22pdl8nhkp13falvqmj8dgkm8fxskwa9ydqz01ld - --- Using a fork until our patches can be merged upstream -source-repository-package - type: git - location: https://github.com/input-output-hk/optparse-applicative - tag: 7497a29cb998721a9068d5725d49461f2bba0e7a - --sha256: 1gvsrg925vynwgqwplgjmp53vj953qyh3wbdf34pw21c8r47w35r +packages: + metadata-lib + metadata-server + metadata-webhook + metadata-store-postgres + metadata-validator-github + token-metadata-creator + metadata-sync -source-repository-package - type: git - location: https://github.com/input-output-hk/hedgehog-extras - tag: edf6945007177a638fbeb8802397f3a6f4e47c14 - --sha256: 0wc7qzkc7j4ns2rz562h6qrx2f8xyq7yjcb7zidnj7f6j0pcd0i9 +package cryptonite + -- Using RDRAND instead of /dev/urandom as an entropy source for key + -- generation is dubious. Set the flag so we use /dev/urandom by default. + flags: -support_rdrand -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-base - tag: 41545ba3ac6b3095966316a99883d678b5ab8da8 - --sha256: 0icq9y3nnl42fz536da84414av36g37894qnyw4rk3qkalksqwir - subdir: - base-deriving-via - binary - binary/test - cardano-crypto-class - cardano-crypto-praos - cardano-crypto-tests - measures - orphans-deriving-via - slotting - strict-containers +tests: True -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-crypto - tag: f73079303f663e028288f9f4a9e08bcca39a923e - --sha256: 1n87i15x54s0cjkh3nsxs4r1x016cdw1fypwmr68936n3xxsjn6q +test-show-details: direct -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-ledger - tag: b765575f51d6eaf3af296bede89a6bafd4d8e93c - --sha256: 0i56xxcbpw55yasjgjqiyjqm67az42ffdm13ld6py8hzdfpqp0n4 - subdir: - eras/alonzo/impl - eras/alonzo/test-suite - eras/byron/chain/executable-spec - eras/byron/crypto - eras/byron/crypto/test - eras/byron/ledger/executable-spec - eras/byron/ledger/impl - eras/byron/ledger/impl/test - eras/shelley/impl - eras/shelley/test-suite - eras/shelley-ma/impl - eras/shelley-ma/test-suite - libs/cardano-ledger-core - libs/cardano-ledger-pretty - libs/cardano-protocol-tpraos - libs/cardano-data - libs/compact-map - libs/set-algebra - libs/small-steps - libs/small-steps-test - libs/non-integral +constraints: + hedgehog >= 1.0 + , bimap >= 0.4.0 + , libsystemd-journal >= 1.4.4 + , systemd >= 2.3.0 + -- systemd-2.3.0 requires at least network 3.1.1.0 but it doesn't declare + -- that dependency + , network >= 3.1.1.0 + , HSOpenSSL >= 0.11.7.2 + , algebraic-graphs < 0.7 + , protolude < 0.3.1 + -- TODO: these should be set in cabal files, but avoiding setting them in lower dependencies for initial CHaP release + , cardano-ledger-core < 0.1.1.0 + , cardano-ledger-byron < 0.1.1.0 + , cardano-ledger-shelley < 0.1.1.0 + , cardano-ledger-shelley-ma < 0.1.1.0 + , cardano-ledger-alonzo < 0.1.1.0 + , cardano-ledger-babbage < 0.1.1.0 + , cardano-ledger-pretty < 0.1.1.0 + , cardano-protocol-tpraos < 0.1.1.0 + , cardano-ledger-conway < 0.1.1.0 + , cardano-data < 0.1.1.0 + , cardano-strict-containers < 0.1.1.0 + , cardano-node == 1.35.4 + , cardano-api == 1.35.4 + , cardano-cli == 1.35.4 + , cardano-crypto-wrapper == 1.3.0 + , cardano-prelude == 0.1.0.0 + , base-deriving-via == 0.1.0.0 + , cardano-binary == 1.5.0 + , cardano-binary-test == 1.3.0 + , cardano-crypto-class == 2.0.0.0.1 + , cardano-crypto-praos == 2.0.0.0.1 + , cardano-crypto-tests == 2.0.0.0.1 + , cardano-slotting == 0.1.0.0 + , measures == 0.1.0.0 + , orphans-deriving-via == 0.1.0.0 + , strict-containers == 0.1.0.0 + , plutus-core == 1.0.0.1 + , plutus-ledger-api == 1.0.0.1 + , plutus-tx == 1.0.0.0 + , plutus-tx-plugin == 1.0.0.0 + , prettyprinter-configurable == 0.1.0.0 + , plutus-ghc-stub == 8.6.5 + , word-array == 0.1.0.0 + , algebraic-graphs < 0.7 + +extra-packages: + ouroboros-consensus-cardano-tools == 0.1.0.0 + +package snap-server + flags: +openssl -source-repository-package - type: git - location: https://github.com/input-output-hk/cardano-prelude - tag: bb4ed71ba8e587f672d06edf9d2e376f4b055555 - --sha256: 00h10l5mmiza9819p9v5q5749nb9pzgi20vpzpy1d34zmh6gf1cj - subdir: - cardano-prelude - cardano-prelude-test +package comonad + flags: -test-doctests -source-repository-package - type: git - location: https://github.com/input-output-hk/goblins - tag: cde90a2b27f79187ca8310b6549331e59595e7ba - --sha256: 17c88rbva3iw82yg9srlxjv2ia5wjb9cyqw44hik565f5v9svnyg +allow-newer: + ekg:aeson, + ekg-json:aeson, + threepenny-gui:aeson, + monoidal-containers:aeson, + size-based:template-haskell, + snap-server:attoparsec, -source-repository-package - type: git - location: https://github.com/input-output-hk/iohk-monitoring-framework - tag: 808724ff8a19a33d0ed06f9ef59fbd900b08553c - --sha256: 0298dpl29gxzs9as9ha6y0w18hqwc00ipa3hzkxv7nlfrjjz8hmz - subdir: - contra-tracer - iohk-monitoring - plugins/backend-aggregation - plugins/backend-ekg - plugins/backend-monitoring - plugins/backend-trace-forwarder - plugins/scribe-systemd - tracer-transformers +-- IMPORTANT +-- Do NOT add more source-repository-package stanzas here unless they are strictly +-- temporary! Please read the section in CONTRIBUTING about updating dependencies. source-repository-package type: git - location: https://github.com/input-output-hk/plutus - tag: 1efbb276ef1a10ca6961d0fd32e6141e9798bd11 - --sha256: 1jicyk4hr8p0xksj4048gdxndrb42jz4wsnkhc3ymxbm5v6snalf - subdir: - freer-extras - plutus-core - plutus-ledger - plutus-ledger-api - plutus-tx - plutus-tx-plugin - prettyprinter-configurable - stubs/plutus-ghc-stub - word-array + location: https://github.com/input-output-hk/moo + tag: 8c487714fbfdea66188fcb85053e7e292e0cc348 + --sha256: 1mdj218hgh7s5a6b9k14vg9i06zxah0wa42ycdgh245izs8nfv0x +-- Open PR upstream, maintainer unresponsive, hopefully short-lived fork. +-- TODO (mpj): release into CHaP as a patched version and delete source-repository-package type: git - location: https://github.com/input-output-hk/ouroboros-network - tag: d2d219a86cda42787325bb8c20539a75c2667132 - --sha256: 18xk7r0h2pxrbx76d6flsxifh0a9rz1cj1rjqs1pbs5kdmy8b7kx - subdir: - io-sim - io-classes - monoidal-synchronisation - network-mux - ouroboros-consensus - ouroboros-consensus-byron - ouroboros-consensus-cardano - ouroboros-consensus-protocol - ouroboros-consensus-shelley - ouroboros-network - ouroboros-network-framework - ouroboros-network-testing - strict-stm - typed-protocols - typed-protocols-cborg - typed-protocols-examples + location: https://github.com/vshabanov/ekg-json + tag: 00ebe7211c981686e65730b7144fbf5350462608 + --sha256: 1zvjm3pb38w0ijig5wk5mdkzcszpmlp5d4zxvks2jk1rkypi8gsm source-repository-package type: git - location: https://github.com/input-output-hk/Win32-network - tag: 3825d3abf75f83f406c1f7161883c438dac7277d - --sha256: 19wahfv726fa3mqajpqdqhnl9ica3xmf68i254q45iyjcpj1psqx + location: https://github.com/denisshevchenko/threepenny-gui + tag: 4ec92ded05ccf59ba4a874be4b404ac1b6d666b6 + --sha256: 00fvvaf4ir4hskq4a6gggbh2wmdvy8j8kn6s4m1p1vlh8m8mq514 --- Drops an instance breaking our code. Should be released to Hackage eventually. +-- Aeson v2 support: source-repository-package type: git - location: https://github.com/input-output-hk/flat - tag: ee59880f47ab835dbd73bea0847dab7869fc20d8 - --sha256: 1lrzknw765pz2j97nvv9ip3l1mcpf2zr4n56hwlz0rk7wq7ls4cm - -allow-newer: - github:base16-bytestring, - monoidal-containers:aeson, - size-based:template-haskell - --- Needed for the Windows cabal constraint solver. -max-backjumps: 10000 -reorder-goals: True - -constraints: - hedgehog >= 1.0 - , bimap >= 0.4.0 - , libsystemd-journal >= 1.4.4 - , systemd >= 2.3.0 - -- systemd-2.3.0 requires at least network 3.1.1.0 but it doesn't declare - -- that dependency - , network >= 3.1.1.0 - -package comonad - flags: -test-doctests - -package cardano-crypto-praos - flags: -external-libsodium-vrf + location: https://github.com/evanrelf/servant-github-webhook + tag: 9418ceed4b962368d90079143987e1fc67d27b31 + --sha256: sha256-EPOgXvszheJVsR+/JNzjqL7za/2GzBj6lKb/qcEWnFs= diff --git a/metadata-lib/src/Cardano/Metadata/Server/Types.hs b/metadata-lib/src/Cardano/Metadata/Server/Types.hs index 24f5ded..f4696a7 100644 --- a/metadata-lib/src/Cardano/Metadata/Server/Types.hs +++ b/metadata-lib/src/Cardano/Metadata/Server/Types.hs @@ -28,7 +28,7 @@ module Cardano.Metadata.Server.Types where import Data.Aeson ( FromJSON, ToJSON, (.:), (.:?) ) import qualified Data.Aeson as Aeson import Data.Aeson.TH -import qualified Data.HashMap.Strict as HM +import qualified Data.Aeson.KeyMap as KM import Text.Casing import Cardano.Metadata.Types.Common ( PropertyName, Subject ) @@ -46,7 +46,7 @@ data BatchRequest deriving (Eq, Show) instance ToJSON BatchRequest where - toJSON (BatchRequest subjs propNames) = Aeson.Object . HM.fromList $ + toJSON (BatchRequest subjs propNames) = Aeson.Object . KM.fromList $ [ ("subjects", Aeson.toJSON subjs) , ("properties", Aeson.toJSON propNames) ] diff --git a/metadata-lib/src/Cardano/Metadata/Types/Common.hs b/metadata-lib/src/Cardano/Metadata/Types/Common.hs index cfaff60..cb915e4 100644 --- a/metadata-lib/src/Cardano/Metadata/Types/Common.hs +++ b/metadata-lib/src/Cardano/Metadata/Types/Common.hs @@ -18,15 +18,16 @@ module Cardano.Metadata.Types.Common where import Cardano.Crypto.DSIGN import Cardano.Crypto.Hash import Control.DeepSeq ( NFData ) -import Data.Aeson ( FromJSON, FromJSONKey, ToJSON, ToJSONKey, (.:), (.:?) ) +import Data.Aeson ( FromJSON, FromJSONKey, ToJSON, ToJSONKey, (.:), (.:?), (.=) ) import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Key as AK import Data.Aeson.TH ( deriveJSON ) import qualified Data.Aeson.Types as Aeson import Data.ByteArray.Encoding ( Base (Base16, Base64), convertFromBase, convertToBase ) import qualified Data.ByteString.Char8 as BC import qualified Data.ByteString.Lazy as BSL -import qualified Data.HashMap.Strict as HM +import qualified Data.Aeson.KeyMap as KM import Data.Hashable ( Hashable ) import Data.Int ( Int64 ) import Data.Maybe ( fromMaybe ) @@ -93,11 +94,17 @@ type family Property (propertyType :: PropertyType) a where Property 'Verifiable a = a Property 'Attested a = AttestedProperty a -toPropertyNameList :: [(Text, a)] -> [(PropertyName, a)] -toPropertyNameList = fmap (\(k, v) -> (PropertyName k, v)) +toKey :: PropertyName -> Aeson.Key +toKey = AK.fromText . unPropertyName -fromPropertyNameList :: [(PropertyName, a)] -> [(Text, a)] -fromPropertyNameList = fmap (\(k, v) -> (unPropertyName k, v)) +fromKey :: Aeson.Key -> PropertyName +fromKey = PropertyName . AK.toText + +toPropertyNameList :: [(Aeson.Key, a)] -> [(PropertyName, a)] +toPropertyNameList = fmap (\(k, v) -> (fromKey k, v)) + +fromPropertyNameList :: (ToJSON a) => [(PropertyName, a)] -> [Aeson.Pair] +fromPropertyNameList = fmap (\(k, v) -> (toKey k) .= v) -- | A human-readable name for the metadata subject, suitable for use in an interface @@ -238,7 +245,7 @@ instance Read HashFn where instance Aeson.ToJSON v => Aeson.ToJSON (AttestedProperty v) where toJSON (AttestedProperty v sigs sequenceNumber) = - Aeson.Object . HM.fromList $ + Aeson.Object . KM.fromList $ [ ("value", Aeson.toJSON v) , ("signatures", Aeson.toJSON sigs) , ("sequenceNumber", Aeson.toJSON sequenceNumber) @@ -252,7 +259,7 @@ instance Aeson.FromJSON v => Aeson.FromJSON (AttestedProperty v) where <*> obj .: "sequenceNumber" instance ToJSON AnnotatedSignature where - toJSON (AnnotatedSignature sig pubKey) = Aeson.Object . HM.fromList $ + toJSON (AnnotatedSignature sig pubKey) = Aeson.Object . KM.fromList $ [ ("signature", Aeson.String $ T.decodeUtf8 $ convertToBase Base16 $ rawSerialiseSigDSIGN sig) , ("publicKey", Aeson.String $ T.decodeUtf8 $ convertToBase Base16 $ rawSerialiseVerKeyDSIGN pubKey) ] diff --git a/metadata-lib/src/Cardano/Metadata/Types/Weakly.hs b/metadata-lib/src/Cardano/Metadata/Types/Weakly.hs index 6af2dbb..cdb4605 100644 --- a/metadata-lib/src/Cardano/Metadata/Types/Weakly.hs +++ b/metadata-lib/src/Cardano/Metadata/Types/Weakly.hs @@ -4,6 +4,7 @@ module Cardano.Metadata.Types.Weakly where import Data.Aeson ( FromJSON, ToJSON, (.:) ) import qualified Data.Aeson as Aeson +import qualified Data.Aeson.KeyMap as KM import qualified Data.HashMap.Strict as HM import Cardano.Metadata.Types.Common @@ -22,7 +23,7 @@ getMetadataProperty propertyName (Metadata _ props) = HM.lookup propertyName pro -- JSON instances instance ToJSON Metadata where - toJSON (Metadata subject properties) = Aeson.Object $ HM.fromList $ + toJSON (Metadata subject properties) = Aeson.object $ [ ("subject", Aeson.toJSON subject) ] <> (fmap (Aeson.toJSON) <$> (fromPropertyNameList $ HM.toList properties)) @@ -31,4 +32,4 @@ instance FromJSON Metadata where parseJSON = Aeson.withObject "Weakly-typed Metadata" $ \obj -> Metadata <$> obj .: "subject" - <*> (traverse Aeson.parseJSON $ HM.fromList $ toPropertyNameList $ HM.toList $ foldr HM.delete obj ["subject"]) + <*> (traverse Aeson.parseJSON $ HM.fromList $ toPropertyNameList $ KM.toList $ foldr KM.delete obj ["subject"]) diff --git a/metadata-lib/src/Cardano/Metadata/Validation/Types.hs b/metadata-lib/src/Cardano/Metadata/Validation/Types.hs index c788e35..a68205b 100644 --- a/metadata-lib/src/Cardano/Metadata/Validation/Types.hs +++ b/metadata-lib/src/Cardano/Metadata/Validation/Types.hs @@ -17,7 +17,7 @@ module Cardano.Metadata.Validation.Types import Data.Aeson ( FromJSON, ToJSON, (.:) ) import qualified Data.Aeson as Aeson import qualified Data.Bifunctor as Bifunctor -import qualified Data.HashMap.Strict as HM +import qualified Data.Aeson.KeyMap as KM import Data.List.NonEmpty ( NonEmpty ) import qualified Data.Map.Merge.Strict as M import Data.Map.Strict ( Map ) @@ -73,7 +73,7 @@ parseProperties parseProperties obj = let properties :: [(PropertyName, Aeson.Value)] - properties = toPropertyNameList $ HM.toList $ foldr HM.delete obj ["subject"] + properties = toPropertyNameList $ KM.toList $ foldr KM.delete obj ["subject"] partitioned = foldr (\(name, val) (atts,vers) -> @@ -104,7 +104,7 @@ valid = pure () -- Instances instance ToJSON Metadata where - toJSON meta@(Metadata subject _ _) = Aeson.Object $ HM.fromList $ + toJSON meta@(Metadata subject _ _) = Aeson.Object $ KM.fromList $ [ ("subject", Aeson.toJSON subject) ] <> (fmap (Aeson.toJSON) <$> (fromPropertyNameList $ M.toList $ metaProperties meta)) diff --git a/metadata-lib/src/Cardano/Metadata/Webhook/Types.hs b/metadata-lib/src/Cardano/Metadata/Webhook/Types.hs index 616ef77..2fa545e 100644 --- a/metadata-lib/src/Cardano/Metadata/Webhook/Types.hs +++ b/metadata-lib/src/Cardano/Metadata/Webhook/Types.hs @@ -11,7 +11,7 @@ module Cardano.Metadata.Webhook.Types where import Data.Aeson ( FromJSON, ToJSON, parseJSON, toJSON, (.:), (.:?) ) import qualified Data.Aeson as Aeson import qualified Data.ByteString as BS -import qualified Data.HashMap.Strict as HM +import qualified Data.Aeson.KeyMap as KM import Data.List.NonEmpty ( NonEmpty ) import qualified Data.List.NonEmpty as NE import Data.Text ( Text ) @@ -44,7 +44,7 @@ instance FromJSON PushEvent' where <*> obj .: "repository" instance ToJSON PushEvent' where - toJSON (PushEvent' headCommit repoInfo) = Aeson.Object $ HM.fromList $ + toJSON (PushEvent' headCommit repoInfo) = Aeson.Object $ KM.fromList $ [ ("head_commit", toJSON headCommit) , ("repository", toJSON repoInfo) ] @@ -65,7 +65,7 @@ instance FromJSON Commit where instance ToJSON Commit where toJSON (Commit added modified removed) = - Aeson.Object $ HM.fromList + Aeson.Object $ KM.fromList [ ("added" , toJSON $ maybe [] NE.toList added) , ("modified" , toJSON $ maybe [] NE.toList modified) , ("removed" , toJSON $ maybe [] NE.toList removed) @@ -82,7 +82,7 @@ instance FromJSON RepositoryInfo where <$> obj .: "contents_url" instance ToJSON RepositoryInfo where - toJSON (RepositoryInfo contentsUrl) = Aeson.Object $ HM.fromList $ + toJSON (RepositoryInfo contentsUrl) = Aeson.Object $ KM.fromList $ [("contents_url", toJSON contentsUrl)] type GetEntryFromFile = RepositoryInfo -> Text -> IO (Maybe Weakly.Metadata) diff --git a/metadata-lib/src/Test/Cardano/Helpers.hs b/metadata-lib/src/Test/Cardano/Helpers.hs index 4e1ae13..63f422d 100644 --- a/metadata-lib/src/Test/Cardano/Helpers.hs +++ b/metadata-lib/src/Test/Cardano/Helpers.hs @@ -2,7 +2,8 @@ module Test.Cardano.Helpers where import Data.Aeson ( FromJSON, ToJSON ) import qualified Data.Aeson as Aeson -import qualified Data.HashMap.Strict as HM +import qualified Data.Aeson.KeyMap as KM +import qualified Data.Aeson.Key as AK import Data.List ( sort ) import Data.Text ( Text ) import Data.Word ( Word8 ) @@ -57,7 +58,7 @@ onlyHasKeys :: (MonadTest m, ToJSON a) => a -> [Text] -> m () onlyHasKeys a ks = case Aeson.toJSON a of Aeson.Object obj -> do - sort (HM.keys obj) === sort ks + sort (fmap AK.toText (KM.keys obj)) === sort ks x -> do footnote $ "Expected Aeson Object but got: " <> show x failure diff --git a/metadata-lib/src/Test/Cardano/Metadata/Generators.hs b/metadata-lib/src/Test/Cardano/Metadata/Generators.hs index 74c21e2..1df6917 100644 --- a/metadata-lib/src/Test/Cardano/Metadata/Generators.hs +++ b/metadata-lib/src/Test/Cardano/Metadata/Generators.hs @@ -11,6 +11,7 @@ import qualified Cardano.Crypto.Seed as Crypto import Control.Monad.Except import Control.Monad.Morph ( hoist ) import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Key as AK import Data.Aeson.TH import Data.Functor.Identity ( runIdentity ) import qualified Data.HashMap.Strict as HM @@ -249,7 +250,7 @@ propertyValue = , pure $ Aeson.Null ] [ Aeson.Array . V.fromList <$> Gen.list (Range.linear 0 5) propertyValue - , Aeson.Object . HM.fromList <$> Gen.list (Range.linear 0 5) ((,) <$> Gen.text (Range.linear 1 64) Gen.unicodeAll <*> propertyValue) + , Aeson.object <$> Gen.list (Range.linear 0 5) ((\k -> \v-> (AK.fromText k,v)) <$> Gen.text (Range.linear 1 64) Gen.unicodeAll <*> propertyValue) ] eitherWord8 :: MonadGen m => m (Either Word8 Word8) diff --git a/metadata-lib/test/Test/Cardano/Metadata/Server/Types.hs b/metadata-lib/test/Test/Cardano/Metadata/Server/Types.hs index feff211..8c8fa8f 100644 --- a/metadata-lib/test/Test/Cardano/Metadata/Server/Types.hs +++ b/metadata-lib/test/Test/Cardano/Metadata/Server/Types.hs @@ -8,6 +8,7 @@ module Test.Cardano.Metadata.Server.Types ) where import qualified Data.Aeson as Aeson +import Data.Aeson ( (.=) ) import qualified Data.HashMap.Strict as HM import qualified Data.Vector as V import Test.Tasty ( TestTree, testGroup ) @@ -118,18 +119,18 @@ unit_batch_response_json_spec = do "44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f" $ HM.fromList [ ( "preImage" - , (Aeson.Object $ HM.fromList - [ ("value", Aeson.String "6d792d676f6775656e2d736372697074") - , ("hashFn", Aeson.String "sha256") + , (Aeson.object + [ "value" .= Aeson.String "6d792d676f6775656e2d736372697074" + , "hashFn" .= Aeson.String "sha256" ]) ) , ( "name" - , Aeson.Object $ HM.fromList - [ ("value", Aeson.String "Wallet #6") - , ("signatures", Aeson.Array $ V.fromList $ [ - Aeson.Object $ HM.fromList $ [ ("signature", Aeson.String "2e27065e365d38bef19b7bec139206f99b00effc8a2ad05bd22259aa939dd5083f25da91c4cb764eb1bfbce243ec32cce112be9762e1da7a38e975ebb0cc0b08") - , ("publicKey", Aeson.String "44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f") - ] + , Aeson.object + [ "value" .= Aeson.String "Wallet #6" + , "signatures" .= (Aeson.Array $ V.fromList $ [ + Aeson.object [ "signature" .= Aeson.String "2e27065e365d38bef19b7bec139206f99b00effc8a2ad05bd22259aa939dd5083f25da91c4cb764eb1bfbce243ec32cce112be9762e1da7a38e975ebb0cc0b08" + , "publicKey" .= Aeson.String "44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f" + ] ]) ] ) @@ -139,12 +140,12 @@ unit_batch_response_json_spec = do "7f71940915ea5fe85e840f843c929eba467e6f050475bad1f10b9c274d1888c0" $ HM.fromList [ ( "description" - , Aeson.Object $ HM.fromList - [ ("value", Aeson.String "rex") - , ("signatures", Aeson.Array $ V.fromList - [ Aeson.Object $ HM.fromList - [ ("signature", Aeson.String "7ef6ed44ba9456737ef8d2e31596fdafb66d5775ac1a254086a553b666516e5895bb0c6b7ba8bef1f6b4d9bd9253b4449d1354de2f9e043ea4eb43fd42f87108") - , ("publicKey", Aeson.String "0ee262f062528667964782777917cd7139e19e8eb2c591767629e4200070c661") + , Aeson.object + [ "value" .= Aeson.String "rex" + , "signatures" .= (Aeson.Array $ V.fromList + [ Aeson.object + [ "signature" .= Aeson.String "7ef6ed44ba9456737ef8d2e31596fdafb66d5775ac1a254086a553b666516e5895bb0c6b7ba8bef1f6b4d9bd9253b4449d1354de2f9e043ea4eb43fd42f87108" + , "publicKey" .= Aeson.String "0ee262f062528667964782777917cd7139e19e8eb2c591767629e4200070c661" ] ] ) diff --git a/metadata-lib/test/Test/Cardano/Metadata/Types.hs b/metadata-lib/test/Test/Cardano/Metadata/Types.hs index 6643502..d30d792 100644 --- a/metadata-lib/test/Test/Cardano/Metadata/Types.hs +++ b/metadata-lib/test/Test/Cardano/Metadata/Types.hs @@ -9,6 +9,7 @@ module Test.Cardano.Metadata.Types import Data.Aeson ( FromJSON, ToJSON ) import qualified Data.Aeson as Aeson +import Data.Aeson ( (.=) ) import qualified Data.Bifunctor as Bifunctor import Data.ByteArray.Encoding ( Base (Base16), convertToBase ) import qualified Data.ByteString.Lazy.Char8 as BLC @@ -36,6 +37,7 @@ import Cardano.Metadata.Types.Common , asPublicKey , seqZero , unPropertyName + , toKey , unSubject ) import qualified Cardano.Metadata.Types.Weakly as Weakly @@ -121,17 +123,14 @@ prop_json_annotatedSignature_spec :: H.Property prop_json_annotatedSignature_spec = property $ do as <- forAllT Gen.annotatedSignature' - Aeson.toJSON as === Aeson.Object (HM.fromList - [ ("signature", Aeson.String $ T.decodeUtf8 $ convertToBase Base16 $ rawSerialiseSigDSIGN $ asAttestationSignature as) - , ("publicKey", Aeson.String $ T.decodeUtf8 $ convertToBase Base16 $ rawSerialiseVerKeyDSIGN $ asPublicKey as) - ] - ) + Aeson.toJSON as === Aeson.object [ "signature" .= (Aeson.String $ T.decodeUtf8 $ convertToBase Base16 $ rawSerialiseSigDSIGN $ asAttestationSignature as) + , "publicKey" .= (Aeson.String $ T.decodeUtf8 $ convertToBase Base16 $ rawSerialiseVerKeyDSIGN $ asPublicKey as) + ] prop_json_metadata_spec :: H.Property prop_json_metadata_spec = property $ do m <- forAllT Gen.weaklyMetadata - Aeson.toJSON m === Aeson.Object (HM.fromList $ - [ ("subject", Aeson.String $ unSubject $ Weakly.metaSubject m) ] - <> (fmap (Bifunctor.first unPropertyName) $ HM.toList $ fmap Aeson.toJSON $ Weakly.metaProperties m) + Aeson.toJSON m === Aeson.object ([ "subject" .= (Aeson.String $ unSubject $ Weakly.metaSubject m) ] + <> (fmap (Bifunctor.first toKey) $ HM.toList $ fmap Aeson.toJSON $ Weakly.metaProperties m) ) diff --git a/metadata-store-postgres/src/Cardano/Metadata/Store/Postgres.hs b/metadata-store-postgres/src/Cardano/Metadata/Store/Postgres.hs index e8a8d36..17e7cfb 100644 --- a/metadata-store-postgres/src/Cardano/Metadata/Store/Postgres.hs +++ b/metadata-store-postgres/src/Cardano/Metadata/Store/Postgres.hs @@ -29,6 +29,7 @@ import Control.Exception.Safe import Control.Monad.Reader import Data.Aeson ( FromJSON, FromJSONKey, ToJSON, ToJSONKey ) import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Key as AK import qualified Data.Aeson.Encoding.Internal as Aeson import qualified Data.Aeson.Types as Aeson import Data.Coerce ( coerce ) @@ -188,5 +189,5 @@ toPersistValueJSONKey = toPersistValue . toJSONKeyText toJSONKeyText :: ToJSONKey k => k -> Text toJSONKeyText k = case Aeson.toJSONKey of - Aeson.ToJSONKeyText f _ -> f k + Aeson.ToJSONKeyText f _ -> AK.toText $ f k Aeson.ToJSONKeyValue _ f -> TL.toStrict $ TLE.decodeUtf8 $ Aeson.encodingToLazyByteString $ f k diff --git a/metadata-sync/test/Main.hs b/metadata-sync/test/Main.hs index 5ba5d2f..ab2867d 100644 --- a/metadata-sync/test/Main.hs +++ b/metadata-sync/test/Main.hs @@ -8,7 +8,8 @@ import Control.Monad ( join, void ) import Control.Monad.IO.Class ( liftIO ) import Control.Monad.Logger ( runNoLoggingT ) import qualified Data.Aeson as Aeson -import qualified Data.HashMap.Strict as HM +import qualified Data.Aeson.Key as AK +import qualified Data.Aeson.KeyMap as KM import Data.Pool ( Pool, destroyAllResources ) import Data.Proxy ( Proxy (Proxy) ) import Data.Tagged ( Tagged, unTagged ) @@ -147,11 +148,11 @@ toList :: Connection -> Text -> IO [(Subject, Aeson.Value)] toList conn table = do results <- query conn "SELECT key, value FROM ?" (Only $ Identifier table) - pure $ fmap (\(k, v) -> (Subject k, v)) results + pure $ fmap (\(k, v) -> (Subject k, v)) results genKvs :: MonadGen m => m [(Subject, Aeson.Value)] genKvs = let - kv = (,) <$> Gen.subject <*> (fmap (Aeson.Object . HM.fromList) $ Gen.list (Range.linear 0 20) ((,) <$> (unPropertyName <$> Gen.propertyName) <*> Gen.propertyValue)) + kv = (,) <$> Gen.subject <*> (fmap Aeson.object $ Gen.list (Range.linear 0 20) ((\k -> \v -> (AK.fromText k, v)) <$> (unPropertyName <$> Gen.propertyName) <*> Gen.propertyValue)) in Gen.list (Range.linear 0 15) kv diff --git a/nix/default.nix b/nix/default.nix index ece5dfc..d698d08 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -13,7 +13,7 @@ let nixpkgs = if (sources ? nixpkgs) then (builtins.trace "Not using IOHK default nixpkgs (use 'niv drop nixpkgs' to use default for better sharing)" sources.nixpkgs) - else haskellNix.sources.nixpkgs-2105; + else haskellNix.sources.nixpkgs-2205; # for inclusion in pkgs: overlays = @@ -23,6 +23,7 @@ let ++ iohkNix.overlays.haskell-nix-extra # iohkNix: nix utilities and niv: ++ iohkNix.overlays.iohkNix + ++ iohkNix.overlays.crypto ++ iohkNix.overlays.utils # our own overlays: ++ [ diff --git a/nix/haskell.nix b/nix/haskell.nix index 7e22eae..ddbddda 100644 --- a/nix/haskell.nix +++ b/nix/haskell.nix @@ -22,26 +22,11 @@ let haskell = pkgs.haskell-nix; - # Chop out a subdirectory of the source, so that the package is only - # rebuilt when something in the subdirectory changes. - filterSubDir = subDir: { - src = haskell.haskellLib.cleanSourceWith { inherit src subDir; }; - package.isProject = true; # fixme: Haskell.nix - }; - pkg-set = haskell-nix.cabalProject ({ inherit src; compiler-nix-name = "ghc8107"; + inputMap = { "https://input-output-hk.github.io/cardano-haskell-packages" = pkgs.commonLib.sources.CHaP; }; modules = [ - # Add source filtering to local packages - { - packages.metadata-lib = filterSubDir "metadata-lib"; - packages.metadata-server = filterSubDir "metadata-server"; - packages.metadata-webhook = filterSubDir "metadata-webhook"; - packages.metadata-sync = filterSubDir "metadata-sync"; - packages.metadata-store-postgres = filterSubDir "metadata-store-postgres"; - packages.metadata-validator-github = filterSubDir "metadata-validator-github"; - } # Enable release flag (optimization and -Werror) on all local packages { packages.metadata-lib.flags.release = true; @@ -92,6 +77,12 @@ let doHaddock = false; })) + ({ pkgs, ... }: { + # Use the VRF fork of libsodium + packages.cardano-crypto-praos.components.library.pkgconfig = lib.mkForce [ [ pkgs.libsodium-vrf ] ]; + packages.cardano-crypto-class.components.library.pkgconfig = lib.mkForce [ [ pkgs.libsodium-vrf pkgs.secp256k1 ] ]; + }) + # Allow installation of a newer version of Win32 than what is # included with GHC. The packages in this list are all those # installed with GHC, except for Win32. diff --git a/nix/sources.json b/nix/sources.json index b5e410d..2066220 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -1,14 +1,26 @@ { + "CHaP": { + "branch": "repo", + "description": "Metadata for Cardano's Haskell package repository", + "homepage": "https://input-output-hk.github.io/cardano-haskell-packages/", + "owner": "input-output-hk", + "repo": "cardano-haskell-packages", + "rev": "695c91a740abfeef0860056227c605abf6375edd", + "sha256": "05dffxjxap6ncfs7x4lpp85cm7pvls0b10idpyshm4lqlrz5v92p", + "type": "tarball", + "url": "https://github.com/input-output-hk/cardano-haskell-packages/archive/695c91a740abfeef0860056227c605abf6375edd.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, "haskell.nix": { "branch": "master", "description": "Alternative Haskell Infrastructure for Nixpkgs", "homepage": "https://input-output-hk.github.io/haskell.nix", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "e3ff467e13d3803edec242c8368be2d7e134991b", - "sha256": "11m69ljrvvc26fk0s4zg5arhphxpvgvhdn0zw6qwyr30i5i0lpvp", + "rev": "a88458a496c5e2d3ae889bb22c24f1b4d8e7fa5a", + "sha256": "0lqhhyhz2ha1dnx8kk2drbj6v0mk5cnibm45v1nk44wlkxq058gc", "type": "tarball", - "url": "https://github.com/input-output-hk/haskell.nix/archive/e3ff467e13d3803edec242c8368be2d7e134991b.tar.gz", + "url": "https://github.com/input-output-hk/haskell.nix/archive/a88458a496c5e2d3ae889bb22c24f1b4d8e7fa5a.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "iohk-nix": { @@ -17,10 +29,10 @@ "homepage": null, "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "a878d7fe8607c762f2a961bc87f8882e0485d37a", - "sha256": "0bhjr7rwvxib0jmq31hxmisgmb3di2ml9p8s6lfg2j7x57c3c7fw", + "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", + "sha256": "0s11k38scjaazq5p0ff79nc5jh6dyhl5pc7z6g8az33scz6bn532", "type": "tarball", - "url": "https://github.com/input-output-hk/iohk-nix/archive/a878d7fe8607c762f2a961bc87f8882e0485d37a.tar.gz", + "url": "https://github.com/input-output-hk/iohk-nix/archive/7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b.tar.gz", "url_template": "https://github.com///archive/.tar.gz" } } diff --git a/shell.nix b/shell.nix index 4363c77..d7fdc0b 100644 --- a/shell.nix +++ b/shell.nix @@ -7,7 +7,7 @@ , pkgs ? metadataPackages.pkgs , profiling ? false # enable profiling in haskell dependencies , sourcesOverride ? {} # see sourcesOverride in nix/default.nix -, withHoogle ? true +, withHoogle ? false }: let diff --git a/token-metadata-creator/src/AesonHelpers.hs b/token-metadata-creator/src/AesonHelpers.hs index c05b8ca..bc88d77 100644 --- a/token-metadata-creator/src/AesonHelpers.hs +++ b/token-metadata-creator/src/AesonHelpers.hs @@ -6,6 +6,7 @@ import Control.Category () import qualified Data.Aeson as Aeson +import qualified Data.Aeson.KeyMap as KM import qualified Data.Aeson.Types as Aeson import qualified Data.HashMap.Strict as HMap import qualified Data.HashSet as HSet @@ -19,4 +20,4 @@ noOtherFields -- ^ Fields we expect -> Aeson.Parser () noOtherFields tp o fs = Aeson.modifyFailure (\_ -> T.unpack tp <> " contained extraneous fields") $ - guard $ HSet.null $ HMap.keysSet o `HSet.difference` HSet.fromList fs + guard $ HSet.null $ HMap.keysSet (KM.toHashMapText o) `HSet.difference` HSet.fromList fs diff --git a/token-metadata-creator/src/Cardano/Metadata/GoguenRegistry.hs b/token-metadata-creator/src/Cardano/Metadata/GoguenRegistry.hs index cb31378..64bc95c 100644 --- a/token-metadata-creator/src/Cardano/Metadata/GoguenRegistry.hs +++ b/token-metadata-creator/src/Cardano/Metadata/GoguenRegistry.hs @@ -30,9 +30,10 @@ import Cardano.Metadata.Types , verifyPolicy ) import Control.Arrow ( left ) -import Data.Aeson ( ToJSON (..), (.:?), (.=) ) +import Data.Aeson ( ToJSON, (.:?), (.=) ) import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Key as AK import qualified Data.Aeson.Types as Aeson -- | The goguen-metadata-registry as maintained by Cardano Foundation @@ -79,22 +80,22 @@ deriving instance instance ToJSON (GoguenRegistryEntry Maybe) where toJSON r = Aeson.object $ mconcat [ [ "subject" .= _goguenRegistryEntry_subject r - , unProperty (wellKnownPropertyName (Proxy @Name)) .= + , AK.fromText (unProperty (wellKnownPropertyName (Proxy @Name))) .= (fmap wellKnownToJSON <$> (_goguenRegistryEntry_name r)) - , unProperty (wellKnownPropertyName (Proxy @Description)) .= + , AK.fromText (unProperty (wellKnownPropertyName (Proxy @Description))) .= (fmap wellKnownToJSON <$> (_goguenRegistryEntry_description r)) ] , catMaybes [ do policy <- _goguenRegistryEntry_policy r - Just (unProperty (wellKnownPropertyName (Proxy @Policy)) .= wellKnownToJSON policy) + Just (AK.fromText (unProperty (wellKnownPropertyName (Proxy @Policy))) .= wellKnownToJSON policy) , do logo <- _goguenRegistryEntry_logo r - Just (unProperty (wellKnownPropertyName (Proxy @Logo)) .= fmap wellKnownToJSON logo) + Just (AK.fromText (unProperty (wellKnownPropertyName (Proxy @Logo))) .= fmap wellKnownToJSON logo) , do url <- _goguenRegistryEntry_url r - Just (unProperty (wellKnownPropertyName (Proxy @Url)) .= fmap wellKnownToJSON url) + Just (AK.fromText (unProperty (wellKnownPropertyName (Proxy @Url))) .= fmap wellKnownToJSON url) , do ticker <- (_goguenRegistryEntry_ticker r) - Just (unProperty (wellKnownPropertyName (Proxy @Ticker)) .= fmap wellKnownToJSON ticker) + Just (AK.fromText (unProperty (wellKnownPropertyName (Proxy @Ticker))) .= fmap wellKnownToJSON ticker) , do decimals <- _goguenRegistryEntry_decimals r - Just (unProperty (wellKnownPropertyName (Proxy @Decimals)) .= fmap wellKnownToJSON decimals) + Just (AK.fromText (unProperty (wellKnownPropertyName (Proxy @Decimals))) .= fmap wellKnownToJSON decimals) ] ] @@ -106,15 +107,15 @@ parseRegistryEntry parseRegistryEntry = Aeson.withObject "GoguenRegistryEntry" $ \o -> do subject <- o .:? "subject" - policyRaw <- o .:? unProperty (wellKnownPropertyName $ Proxy @Policy) + policyRaw <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Policy)) policy <- mapM parseWellKnown policyRaw - nameField <- o .:? unProperty (wellKnownPropertyName $ Proxy @Name) - descField <- o .:? unProperty (wellKnownPropertyName $ Proxy @Description) - logoField <- o .:? unProperty (wellKnownPropertyName $ Proxy @Logo) - urlField <- o .:? unProperty (wellKnownPropertyName $ Proxy @Url) - tickerField <- o .:? unProperty (wellKnownPropertyName $ Proxy @Ticker) - decimalsField <- o .:? unProperty (wellKnownPropertyName $ Proxy @Decimals) + nameField <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Name)) + descField <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Description)) + logoField <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Logo)) + urlField <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Url)) + tickerField <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Ticker)) + decimalsField <- o .:? AK.fromText (unProperty (wellKnownPropertyName $ Proxy @Decimals)) nameAnn <- mapM parseWithAttestation nameField descAnn <- mapM parseWithAttestation descField