feat: profile information and runs history
- DAC-358 , DAC-359, DAC-362, DAC-382
- DAC-358 , DAC-359, DAC-362, DAC-382
.vim/
gentags.sh
tags
Makefile
*.sqlite
index-state: 2022-10-13T00:00:00Z
packages: . dapps-certification-interface dapps-certification-helpers
packages: . dapps-certification-interface dapps-certification-helpers dapps-certification-persistence
package plutus-certification
ghc-options: -Wall
package dapps-certification-helpers
ghc-options: -Wall
package dapps-certification-persistence
ghc-options: -Wall
write-ghc-environment-files: never
tests: true
test-show-details: streaming
import Data.Aeson
import System.IO (stdout)
import Data.Time.LocalTime
import Data.Time
import Data.Text as Text
type PublicKey = ByteString
flakeRefReader :: ReadM FlakeRefV1
flakeRefReader = do
urlStr <- str
<> help "the ID of the run"
)
publicKeyParser :: Parser ByteString
publicKeyParser :: Parser PublicKey
publicKeyParser = option str
( long "public-key"
<> metavar "PUB_KEY"
getLogsParser :: Parser GetLogsArgs
getLogsParser = GetLogsArgs
<$> getRunParser
<*> optional (option zonedTimeReader
<*> optional (option generalReader
( long "after"
<> metavar "AFTER"
<> help "getting all the logs following a certain timestamp"
<> help "filter logs by action-type (Generate/Build/Certify)"
))
getRunsParser :: Parser GetRunsArgs
getRunsParser = GetRunsArgs
<$> publicKeyParser
<*> optional (option generalReader
( long "after"
<> metavar "AFTER"
<> help "getting all the runs following a certain timestamp"
))
<*> optional (option auto
( long "max-count"
<> metavar "COUNT"
<> help "maximum number or runs to fetch"
))
abortRunParser :: Parser AbortRunArgs
abortRunParser = AbortRunArgs
<$> getRunParser
<*> publicKeyParser
zonedTimeReader :: ReadM ZonedTime
zonedTimeReader = do
generalReader :: FromHttpApiData a => ReadM a
generalReader = do
urlStr <- str
case parseUrlPiece urlStr of
Right u -> pure u
<> header "plutus-certification-client run get-logs — Get the logs for a run"
)
getRunsInfo :: ParserInfo GetRunsArgs
getRunsInfo = info getRunsParser
( fullDesc
<> header "plutus-certification-client run get-many — Get many runs"
)
data RunCommand
= Create !CreateRunArgs
| Get !RunIDV1
| Abort !AbortRunArgs
| GetLogs !GetLogsArgs
| GetRuns !GetRunsArgs
runCommandParser :: Parser RunCommand
runCommandParser = hsubparser
( command "create" (Create <$> createRunInfo)
<> command "get" (Get <$> getRunInfo)
<> command "abort" (Abort <$> abortRunInfo)
<> command "get-logs" (GetLogs <$> getLogsInfo)
<> command "get-many" (GetRuns <$> getRunsInfo)
)
data CreateRunArgs = CreateRunArgs !FlakeRefV1 !ByteString
data CreateRunArgs = CreateRunArgs !FlakeRefV1 !PublicKey
data GetRunsArgs = GetRunsArgs !PublicKey !(Maybe UTCTime) !(Maybe Int)
data AbortRunArgs = AbortRunArgs !RunIDV1 !ByteString
data AbortRunArgs = AbortRunArgs !RunIDV1 !PublicKey
data GetLogsArgs = GetLogsArgs
{ runId :: !RunIDV1
<> header "plutus-certification-client run — Manage certification runs"
)
currentProfileInfo :: ParserInfo ProfileCommand
currentProfileInfo = info currentProfileParser
( fullDesc
<> header "plutus-certification-client profile Current profile Management"
)
currentProfileParser :: Parser ProfileCommand
currentProfileParser = hsubparser
( command "get" (GetCurrentProfile <$> getCurrentProfileInfo)
<> command "update" (UpdateCurrentProfile <$> updateCurrentProfileInfo)
)
updateCurrentProfileInfo :: ParserInfo UpdateCurrentProfileArgs
updateCurrentProfileInfo = info updateCurrentProfileInfoParser
( fullDesc
<> header "plutus-certification-client profile update — Update the current profile information"
)
updateCurrentProfileInfoParser :: Parser UpdateCurrentProfileArgs
updateCurrentProfileInfoParser = UpdateCurrentProfileArgs
<$> publicKeyParser
<*> profileBodyParser
profileBodyParser :: Parser ProfileBody
profileBodyParser = ProfileBody
<$> optional (option str
( long "dapp"
<> metavar "DAPP-NAME"
<> help "dapp identification"
))
<*> optional (option str
( long "website"
<> metavar "WEBSITE"
<> help "dapp website url"
))
<*> optional (option str
( long "vendor"
<> metavar "VENDOR"
<> help "vendor identification"
))
<*> optional (option str
( long "twitter"
<> metavar "TWITTER"
<> help "twitter account"
))
<*> optional (option str
( long "linkedin"
<> metavar "LINKEDIN"
<> help "linkedin account"
))
getCurrentProfileInfo :: ParserInfo PublicKey
getCurrentProfileInfo = info publicKeyParser
( fullDesc
<> header "plutus-certification-client profile get — Get the current profile information"
)
versionCommandInfo :: ParserInfo ()
versionCommandInfo = info (pure ())
( fullDesc
data Command
= CmdRun !RunCommand
| CmdVersion
| CmdCurrentProfile !ProfileCommand
data ProfileCommand
= GetCurrentProfile !PublicKey
| UpdateCurrentProfile !UpdateCurrentProfileArgs
data UpdateCurrentProfileArgs = UpdateCurrentProfileArgs PublicKey ProfileBody
commandParser :: Parser Command
commandParser = hsubparser
( command "run" (CmdRun <$> runCommandInfo)
<> command "version" (const CmdVersion <$> versionCommandInfo)
<> command "profile" (CmdCurrentProfile <$> currentProfileInfo)
)
data Args = Args
{ certificationURL :: !BaseUrl
, certificationUser :: !(Maybe ByteString)
, certificationUser :: !(Maybe PublicKey)
, cmd :: !Command
}
( fullDesc
<> header "plutus-certification-cli — A tool for interacting with the Plutus Certification service"
)
addAuth :: ByteString -> AuthenticatedRequest (AuthProtect "public-key")
addAuth :: PublicKey -> AuthenticatedRequest (AuthProtect "public-key")
addAuth = flip mkAuthenticatedRequest (\v -> addHeader hAuthorization (BS.unpack v))
type instance AuthClientData (AuthProtect "public-key") = ByteString
type instance AuthClientData (AuthProtect "public-key") = PublicKey
main :: IO ()
main = do
cabal-version: 2.4
name: dapps-certification-persistence
version: 0.1.0.0
author: Bogdan Manole
maintainer: [email protected]
library
exposed-modules: IOHK.Certification.Persistence
other-modules: IOHK.Certification.Persistence.Structure
, IOHK.Certification.Persistence.API
build-depends: base
, selda
, selda-sqlite
, selda-postgresql
, uuid
, text
, time
, aeson
hs-source-dirs: src
default-language: Haskell2010
module IOHK.Certification.Persistence (module X) where
import IOHK.Certification.Persistence.Structure as X
( Run(..)
, Status(..)
, Contact(..)
, Author(..)
, Profile(..)
, profiles
, runs
, authors
, contacts
, createTables
, ProfileId
)
import IOHK.Certification.Persistence.API as X
( upsertProfile
, getProfile
, createRun
, updateFinishedRun
, updateCertificateCreation
, getRuns
, withDb
, getProfileId
, getProfileAddress
, syncRun
, getRunOwner
)
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE RecordWildCards #-}
module IOHK.Certification.Persistence.API where
import Database.Selda
import Database.Selda.SQLite
import IOHK.Certification.Persistence.Structure
import Data.Maybe
import Control.Monad
upsertProfile :: (MonadSelda m, MonadMask m) => Profile -> m (Maybe (ID Profile))
upsertProfile [email protected]{..} = do
upsert profiles
(\profile -> profile ! #ownerAddress .== text ownerAddress)
(`with`
[ #dapp := fromTextMaybe dapp -- TODO: don't know if we should update the dapp
, #website := fromTextMaybe website
, #vendor := fromTextMaybe vendor
, #twitter := fromTextMaybe twitter
, #linkedin := fromTextMaybe linkedin
--TODO: authors and contacts
])
[#profileId (def :: ID Profile) arg]
where
fromTextMaybe = maybe null_ (just . text)
getProfileByAddress :: MonadSelda m => Text -> m (Maybe Profile)
getProfileByAddress address = listToMaybe <$> (query $ do
p <- select profiles
restrict (p ! #ownerAddress .== text address)
pure p
)
getProfileQ :: ID Profile -> Query t (Row t Profile)
getProfileQ pid = do
p <- select profiles
restrict (p ! #profileId .== literal pid )
pure p
getProfile :: MonadSelda m => ID Profile -> m (Maybe Profile)
getProfile = fmap listToMaybe . query . getProfileQ
getProfileIdQ:: Text -> Query t (Col t (ID Profile))
getProfileIdQ address = do
p <- select profiles
restrict (p ! #ownerAddress .== text address)
pure (p ! #profileId)
getProfileId :: MonadSelda m => Text -> m (Maybe ProfileId)
getProfileId = fmap listToMaybe . query . getProfileIdQ
getProfileAddressQ :: ID Profile -> Query t (Col t Text)
getProfileAddressQ pid = do
p <- select profiles
restrict (p ! #profileId .== literal pid)
pure (p ! #ownerAddress)
getProfileAddress :: MonadSelda m => ID Profile -> m (Maybe Text)
getProfileAddress = fmap listToMaybe . query . getProfileAddressQ
createRun :: MonadSelda m => UUID -> UTCTime -> Text -> UTCTime -> ID Profile -> m ()
createRun runId time repo commitDate pid = do
void $ insert runs [Run runId time (Just time) time repo commitDate Queued pid Nothing]
getRunOwnerQ :: UUID -> Query t (Col t (ID Profile))
getRunOwnerQ runId = do
p <- select runs
restrict (p ! #runId .== literal runId )
pure (p ! #profileId)
getRunOwner :: MonadSelda m => UUID -> m (Maybe (ID Profile))
getRunOwner = fmap listToMaybe . query . getRunOwnerQ
updateFinishedRun :: MonadSelda m => UUID -> Bool -> UTCTime -> m Int
updateFinishedRun runId succeeded time= do
update runs
(\run -> (run ! #runId .== literal runId) .&& (run ! #runStatus .== literal Queued))
(`with`
[ #runStatus := literal (if succeeded then Succeeded else Failed)
, #syncedAt := literal time
, #finishedAt := literal (Just time)
]
)
syncRun :: MonadSelda m => UUID -> UTCTime -> m Int
syncRun runId time= update runs
(\run -> (run ! #runId .== literal runId))
(`with` [ #syncedAt := literal time ])
updateCertificateCreation :: MonadSelda m => ID Profile -> UTCTime -> m Int
updateCertificateCreation pid time= update runs
(\run -> (run ! #profileId .== literal pid) .&& (run ! #runStatus .== literal Succeeded))
(`with` [ #certificateCreatedAt := literal (Just time) ] )
getRuns :: MonadSelda m => ID Profile -> Maybe UTCTime -> Maybe Int -> m [Run]
getRuns pid afterM topM = query $
case topM of
Just top -> limit 0 top select'
Nothing -> select runs
where
select' = do
run <- select runs
restrict (run ! #profileId .== literal pid)
case afterM of
Just after -> restrict (run ! #created .< literal after)
Nothing -> pure ()
order (run ! #created) descending
pure run
--TODO: replace this with a proper configuration
withDb :: (MonadIO m, MonadMask m) => SeldaT SQLite m a -> m a
withDb = withSQLite "people.sqlite"
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE RecordWildCards #-}
module IOHK.Certification.Persistence.Structure where
import Database.Selda
import GHC.OverloadedLabels
import Data.Aeson
data Profile = Profile
{ profileId :: ID Profile -- TODO: do we need an internal id?
, ownerAddress :: Text -- TODO: type level restrictions might apply in the future
-- regarding the format
, dapp :: Maybe Text
, website :: Maybe Text
, vendor :: Maybe Text
, twitter :: Maybe Text
, linkedin :: Maybe Text
} deriving (Generic, Show)
type ProfileId = ID Profile
instance FromJSON Profile where
parseJSON = withObject "Profile" $ \v -> Profile
<$> (pure def)
<*> v .: "address"
<*> v .:? "dapp" .!= Nothing
<*> v .:? "website" .!= Nothing
<*> v .:? "vendor" .!= Nothing
<*> v .:? "twitter" .!= Nothing
<*> v .:? "linkedin" .!= Nothing
instance ToJSON Profile where
toJSON (Profile{..}) = object
[ "address" .= ownerAddress
, "dapp" .= dapp
, "website" .= website
, "vendor" .= vendor
, "twitter" .= twitter
, "linkedin" .= linkedin
]
instance SqlRow Profile
data Author = Author
{ authorId :: ID Author
, name :: Text
, profileId :: ID Profile
} deriving (Generic,Show)
instance SqlRow Author
instance IsLabel "profileId" (ID Profile -> Author -> Author) where
fromLabel = \v p -> p { profileId = v}
data Contact = Contact
{ contactId :: ID Contact
, name :: Text
, details :: Maybe Text
, profileId :: ID Profile
} deriving (Generic,Show)
instance IsLabel "profileId" (ID Profile -> Contact -> Contact) where
fromLabel = \v p -> p { profileId = v}
instance SqlRow Contact
data Status = Queued | Failed | Succeeded
deriving (Show, Read, Bounded, Enum, Eq)
instance ToJSON Status where
toJSON :: Status -> Value
toJSON Queued = toJSON ("queued" :: Text)
toJSON Failed = toJSON ("failed" :: Text)
toJSON Succeeded = toJSON ("succeeded" :: Text)
instance FromJSON Status where
parseJSON =
withText "Status" handle
where
handle "queued" = pure Queued
handle "failed" = pure Failed
handle "succeeded" = pure Succeeded
handle t = fail $ "provided text (" ++ show t ++ ") is not a Status"
instance SqlType Status
data Run = Run
{ runId :: UUID
, created :: UTCTime
, finishedAt :: Maybe UTCTime
, syncedAt :: UTCTime
, repoUrl :: Text
, commitDate :: UTCTime
, runStatus :: Status
, profileId :: ID Profile
, certificateCreatedAt :: Maybe UTCTime
} deriving (Generic,Show)
instance ToJSON Run where
toJSON (Run{..}) = object
[ "runId" .= runId
, "created" .= created
, "finishedAt" .= finishedAt
, "syncedAt" .= syncedAt
, "repoUrl" .= repoUrl
, "commitDate" .= commitDate
, "runStatus" .= runStatus
, "certificateCreatedAt" .= certificateCreatedAt
]
instance FromJSON Run where
parseJSON = withObject "Run" $ \v -> Run
<$> v .: "runId"
<*> v .: "created"
<*> v .:? "finishedAt" .!= Nothing
<*> v .: "syncedAt"
<*> v .: "repoUrl"
<*> v .: "commitDate"
<*> v .: "runStatus"
<*> (pure def)
<*> v .:? "certificateCreatedAt" .!= Nothing
instance SqlRow Run
instance IsLabel "profileId" (ID Profile -> Profile -> Profile) where
fromLabel = \v p -> p { profileId = v}
profiles :: Table Profile
profiles = table "profile"
[ #profileId :- autoPrimary
, #ownerAddress :- unique
, #ownerAddress :- index
]
runs :: Table Run
runs = table "run"
[ #runId :- primary
, #profileId :- foreignKey profiles #profileId
, #created :- index
]
authors :: Table Author
authors = table "author"
[ #authorId :- primary
, #profileId :- foreignKey profiles #profileId
]
contacts :: Table Contact
contacts = table "contact"
[ #contactId :- primary
, #profileId :- foreignKey profiles #profileId
]
createTables :: MonadSelda m => m ()
createTables = do
createTable profiles
createTable authors
createTable contacts
createTable runs
{ system
, compiler
, flags
, pkgs
, hsPkgs
, pkgconfPkgs
, errorHandler
, config
, ... }:
{
flags = {};
package = {
specVersion = "2.4";
identifier = {
name = "dapps-certification-persistence";
version = "0.1.0.0";
};
license = "NONE";
copyright = "";
maintainer = "[email protected]";
author = "Bogdan Manole";
homepage = "";
url = "";
synopsis = "";
description = "";
buildType = "Simple";
isLocal = true;
detailLevel = "FullDetails";
licenseFiles = [];
dataDir = ".";
dataFiles = [];
extraSrcFiles = [];
extraTmpFiles = [];
extraDocFiles = [];
};
components = {
"library" = {
depends = [
(hsPkgs."base" or (errorHandler.buildDepError "base"))
(hsPkgs."selda" or (errorHandler.buildDepError "selda"))
(hsPkgs."selda-sqlite" or (errorHandler.buildDepError "selda-sqlite"))
(hsPkgs."selda-postgresql" or (errorHandler.buildDepError "selda-postgresql"))
(hsPkgs."uuid" or (errorHandler.buildDepError "uuid"))
(hsPkgs."text" or (errorHandler.buildDepError "text"))
(hsPkgs."time" or (errorHandler.buildDepError "time"))
(hsPkgs."aeson" or (errorHandler.buildDepError "aeson"))
];
buildable = true;
modules = [
"IOHK/Certification/Persistence/Structure"
"IOHK/Certification/Persistence/API"
"IOHK/Certification/Persistence"
];
hsSourceDirs = [ "src" ];
};
};
} // rec { src = (pkgs.lib).mkDefault ../dapps-certification-persistence; }
\ No newline at end of file
(hsPkgs."time" or (errorHandler.buildDepError "time"))
(hsPkgs."filepath" or (errorHandler.buildDepError "filepath"))
(hsPkgs."temporary" or (errorHandler.buildDepError "temporary"))
(hsPkgs."dapps-certification-persistence" or (errorHandler.buildDepError "dapps-certification-persistence"))
(hsPkgs."dapps-certification-interface" or (errorHandler.buildDepError "dapps-certification-interface"))
(hsPkgs."dapps-certification-helpers" or (errorHandler.buildDepError "dapps-certification-helpers"))
];
"Plutus/Certification/Client"
"Plutus/Certification/Server"
"Plutus/Certification/Local"
"Plutus/Certification/GithubClient"
];
hsSourceDirs = [ "src" ];
};
(hsPkgs."singletons" or (errorHandler.buildDepError "singletons"))
(hsPkgs."text" or (errorHandler.buildDepError "text"))
(hsPkgs."bytestring" or (errorHandler.buildDepError "bytestring"))
(hsPkgs."servant-swagger" or (errorHandler.buildDepError "servant-swagger"))
(hsPkgs."plutus-certification" or (errorHandler.buildDepError "plutus-certification"))
(hsPkgs."dapps-certification-persistence" or (errorHandler.buildDepError "dapps-certification-persistence"))
];
buildable = true;
modules = [ "Paths_plutus_certification" ];
};
};
};
} // rec { src = (pkgs.lib).mkDefault ../.; }
} // rec { src = (pkgs.lib).mkDefault ../.; }
\ No newline at end of file
pkgs = hackage:
{
packages = {
"charset".revision = (((hackage."charset")."0.3.9").revisions).default;
"old-time".revision = (((hackage."old-time")."1.1.0.3").revisions).default;
"ghc-boot".revision = (((hackage."ghc-boot")."9.2.4").revisions).default;
"tf-random".revision = (((hackage."tf-random")."0.5").revisions).default;
"servant-client".revision = (((hackage."servant-client")."0.19").revisions).default;
"mmorph".revision = (((hackage."mmorph")."1.2.0").revisions).default;
"postgresql-binary".revision = (((hackage."postgresql-binary")."0.12.5").revisions).default;
"happy".revision = (((hackage."happy")."1.20.0").revisions).default;
"streaming-commons".revision = (((hackage."streaming-commons")."0.2.2.4").revisions).default;
"streaming-commons".flags.use-bytestring-builder = false;
"pretty".revision = (((hackage."pretty")."1.1.3.6").revisions).default;
"haskell-src-exts".revision = (((hackage."haskell-src-exts")."1.23.1").revisions).default;
"data-textual".revision = (((hackage."data-textual")."0.3.0.3").revisions).default;
"network-uri".revision = (((hackage."network-uri")."2.6.4.1").revisions).default;
"parsers".revision = (((hackage."parsers")."0.12.11").revisions).default;
"parsers".flags.parsec = true;
"parsers".flags.binary = true;
"parsers".flags.attoparsec = true;
"unordered-containers".revision = (((hackage."unordered-containers")."0.2.19.1").revisions).default;
"unordered-containers".flags.debug = false;
"integer-logarithms".revision = (((hackage."integer-logarithms")."1.0.3.1").revisions).default;
"network".revision = (((hackage."network")."3.1.2.7").revisions).default;
"network".flags.devel = false;
"invariant".revision = (((hackage."invariant")."0.6").revisions).default;
"parallel".revision = (((hackage."parallel")."3.2.2.0").revisions).default;
"asn1-parse".revision = (((hackage."asn1-parse")."0.9.5").revisions).default;
"cryptonite".revision = (((hackage."cryptonite")."0.30").revisions).default;
"cryptonite".flags.check_alignment = false;
"cryptonite".flags.support_pclmuldq = false;
"cryptonite".flags.support_aesni = true;
"servant-server".revision = (((hackage."servant-server")."0.19.1").revisions).default;
"vector".revision = (((hackage."vector")."0.13.0.0").revisions).default;
"vector".revision = (((hackage."vector")."0.12.3.1").revisions).default;
"vector".flags.internalchecks = false;
"vector".flags.wall = false;
"vector".flags.boundschecks = true;
"vector".flags.unsafechecks = false;
"socks".revision = (((hackage."socks")."0.6.1").revisions).default;
"lens".revision = (((hackage."lens")."5.1.1").revisions).default;
"lens".flags.test-templates = true;
"lens".flags.benchmark-uniplate = false;
"lens".flags.test-properties = true;
"lens".flags.j = false;
"lens".flags.trustworthy = true;
"lens".flags.test-hunit = true;
"lens".flags.dump-splices = false;
"lens".flags.inlining = true;
"http-types".revision = (((hackage."http-types")."0.12.3").revisions).default;
"some".revision = (((hackage."some")."1.0.4.1").revisions).default;
"some".flags.newtype-unsafe = true;
"temporary".revision = (((hackage."temporary")."1.3").revisions).default;
"selda".revision = (((hackage."selda")."0.5.2.0").revisions).default;
"comonad".revision = (((hackage."comonad")."5.0.8").revisions).default;
"comonad".flags.containers = true;
"comonad".flags.distributive = true;
"comonad".flags.indexed-traversable = true;
"x509".revision = (((hackage."x509")."1.7.7").revisions).default;
"optics-th".revision = (((hackage."optics-th")."0.4.1").revisions).default;
"profunctors".revision = (((hackage."profunctors")."5.6.2").revisions).default;
"x509-system".revision = (((hackage."x509-system")."1.6.7").revisions).default;
"appar".revision = (((hackage."appar")."0.1.8").revisions).default;
"asn1-types".revision = (((hackage."asn1-types")."0.3.4").revisions).default;
"base-compat".revision = (((hackage."base-compat")."0.12.2").revisions).default;
"string-conversions".revision = (((hackage."string-conversions")."0.4.0.1").revisions).default;
"data-endian".revision = (((hackage."data-endian")."0.1.1").revisions).default;
"bitvec".revision = (((hackage."bitvec")."1.1.3.0").revisions).default;
"bitvec".flags.libgmp = false;
"contravariant".revision = (((hackage."contravariant")."1.5.5").revisions).default;
"contravariant".flags.tagged = true;
"contravariant".flags.semigroups = true;
"contravariant".flags.statevar = true;
"type-hint".revision = (((hackage."type-hint")."0.1").revisions).default;
"ghc".revision = (((hackage."ghc")."9.2.4").revisions).default;
"base-compat-batteries".revision = (((hackage."base-compat-batteries")."0.12.2").revisions).default;
"safe".revision = (((hackage."safe")."0.3.19").revisions).default;
"Cabal".revision = (((hackage."Cabal")."3.6.3.0").revisions).default;
"sop-core".revision = (((hackage."sop-core")."0.5.0.2").revisions).default;
"assoc".revision = (((hackage."assoc")."1.0.2").revisions).default;
"cicero-api".revision = (((hackage."cicero-api")."0.1.2.0").revisions).default;
"binary-parser".revision = (((hackage."binary-parser")."0.5.7.2").revisions).default;
"unliftio".revision = (((hackage."unliftio")."0.2.22.0").revisions).default;
"data-fix".revision = (((hackage."data-fix")."0.3.2").revisions).default;
"tls".revision = (((hackage."tls")."1.6.0").revisions).default;
"tls".flags.network = true;
"tls".flags.hans = false;
"tls".flags.compat = true;
"text-printer".revision = (((hackage."text-printer")."0.5.0.2").revisions).default;
"quickcheck-io".revision = (((hackage."quickcheck-io")."0.2.0").revisions).default;
"http-client-tls".revision = (((hackage."http-client-tls")."0.3.6.1").revisions).default;
"data-bword".revision = (((hackage."data-bword")."0.1.0.2").revisions).default;
"basement".revision = (((hackage."basement")."0.0.15").revisions).default;
"network-ip".revision = (((hackage."network-ip")."0.3.0.3").revisions).default;
"old-locale".revision = (((hackage."old-locale")."1.0.0.7").revisions).default;
"mtl".revision = (((hackage."mtl")."2.2.2").revisions).default;
"selda-json".revision = (((hackage."selda-json")."0.1.1.1").revisions).default;
"OneTuple".revision = (((hackage."OneTuple")."0.3.1").revisions).default;
"mime-types".revision = (((hackage."mime-types")."0.1.1.0").revisions).default;
"parsec".revision = (((hackage."parsec")."3.1.15.0").revisions).default;
"bytestring".revision = (((hackage."bytestring")."0.11.3.1").revisions).default;
"attoparsec-iso8601".revision = (((hackage."attoparsec-iso8601")."1.0.2.1").revisions).default;
"attoparsec-iso8601".flags.fast = false;
"attoparsec-iso8601".flags.developer = false;
"data-dword".revision = (((hackage."data-dword")."0.3.2.1").revisions).default;
"reflection".revision = (((hackage."reflection")."2.1.6").revisions).default;
"reflection".flags.slow = false;
"reflection".flags.template-haskell = true;
"hspec-discover".revision = (((hackage."hspec-discover")."2.10.6").revisions).default;
"pem".revision = (((hackage."pem")."0.2.4").revisions).default;
"strict".revision = (((hackage."strict")."0.4.0.1").revisions).default;
"strict".flags.assoc = true;
"splitmix".flags.optimised-mixer = false;
"recv".revision = (((hackage."recv")."0.0.0").revisions).default;
"file-embed".revision = (((hackage."file-embed")."0.0.15.0").revisions).default;
"text-latin1".revision = (((hackage."text-latin1")."0.3.1").revisions).default;
"attoparsec".revision = (((hackage."attoparsec")."0.14.4").revisions).default;
"attoparsec".flags.developer = false;
"bytestring-strict-builder".revision = (((hackage."bytestring-strict-builder")."0.4.5.6").revisions).default;
"singleton-bool".revision = (((hackage."singleton-bool")."0.1.6").revisions).default;
"th-compat".revision = (((hackage."th-compat")."0.1.4").revisions).default;
"data-checked".revision = (((hackage."data-checked")."0.3").revisions).default;
"memory".revision = (((hackage."memory")."0.18.0").revisions).default;
"memory".flags.support_deepseq = true;
"memory".flags.support_bytestring = true;
"filepath".revision = (((hackage."filepath")."1.4.2.2").revisions).default;
"th-lift".revision = (((hackage."th-lift")."0.8.2").revisions).default;
"dec".revision = (((hackage."dec")."0.0.5").revisions).default;
"unliftio-core".revision = (((hackage."unliftio-core")."0.2.0.1").revisions).default;
"servant-swagger".revision = (((hackage."servant-swagger")."1.1.11").revisions).default;
"stm".revision = (((hackage."stm")."2.5.0.2").revisions).default;
"void".revision = (((hackage."void")."0.7.3").revisions).default;
"void".flags.safe = false;
"free".revision = (((hackage."free")."5.1.9").revisions).default;
"terminfo".revision = (((hackage."terminfo")."0.4.1.5").revisions).default;
"connection".revision = (((hackage."connection")."0.3.1").revisions).default;
"ghc-heap".revision = (((hackage."ghc-heap")."9.2.4").revisions).default;
"postgresql-libpq".revision = (((hackage."postgresql-libpq")."0.9.4.3").revisions).default;
"postgresql-libpq".flags.use-pkg-config = false;
"resourcet".revision = (((hackage."resourcet")."1.2.6").revisions).default;
"vault".revision = (((hackage."vault")."0.3.1.5").revisions).default;
"vault".flags.useghc = true;
"optics-core".revision = (((hackage."optics-core")."0.4.1").revisions).default;
"optics-core".flags.explicit-generic-labels = false;
"eventuo11y-batteries".revision = (((hackage."eventuo11y-batteries")."0.2.1.0").revisions).default;
"unix-compat".revision = (((hackage."unix-compat")."0.6").revisions).default;
"unix-compat".flags.old-time = false;
"type-equality".revision = (((hackage."type-equality")."1").revisions).default;
"cryptohash-sha1".revision = (((hackage."cryptohash-sha1")."0.11.101.0").revisions).default;
"cryptohash-md5".revision = (((hackage."cryptohash-md5")."0.11.101.0").revisions).default;
"indexed-profunctors".revision = (((hackage."indexed-profunctors")."0.1.1").revisions).default;
"http-media".revision = (((hackage."http-media")."0.8.0.0").revisions).default;
"call-stack".revision = (((hackage."call-stack")."0.4.0").revisions).default;
"time-manager".revision = (((hackage."time-manager")."0.0.0").revisions).default;
"generics-sop".revision = (((hackage."generics-sop")."0.5.1.2").revisions).default;
"byteorder".revision = (((hackage."byteorder")."1.0.4").revisions).default;
"insert-ordered-containers".revision = (((hackage."insert-ordered-containers")."0.2.5.1").revisions).default;
"http-api-data".revision = (((hackage."http-api-data")."0.4.3").revisions).default;
"http-api-data".flags.use-text-show = false;
"ghc-prim".revision = (((hackage."ghc-prim")."0.8.0").revisions).default;
"x509-validation".revision = (((hackage."x509-validation")."1.6.12").revisions).default;
"vector-stream".revision = (((hackage."vector-stream")."0.1.0.0").revisions).default;
"ghc-boot-th".revision = (((hackage."ghc-boot-th")."9.2.4").revisions).default;
"asn1-encoding".revision = (((hackage."asn1-encoding")."0.9.6").revisions).default;
"selda-postgresql".revision = (((hackage."selda-postgresql")."0.1.8.2").revisions).default;
"selda-postgresql".flags.haste = false;
"indexed-traversable".revision = (((hackage."indexed-traversable")."0.1.2").revisions).default;
"distributive".revision = (((hackage."distributive")."0.6.2.1").revisions).default;
"distributive".flags.tagged = true;
"distributive".flags.semigroups = true;
"text-short".revision = (((hackage."text-short")."0.1.5").revisions).default;
"text-short".flags.asserts = false;
"servant".revision = (((hackage."servant")."0.19").revisions).default;
"data-serializer".revision = (((hackage."data-serializer")."0.3.5").revisions).default;
"bsb-http-chunked".revision = (((hackage."bsb-http-chunked")."0.0.0.4").revisions).default;
"bifunctors".revision = (((hackage."bifunctors")."5.5.13").revisions).default;
"bifunctors".flags.tagged = true;
"base-unicode-symbols".flags.base-4-8 = true;
"base-unicode-symbols".flags.old-base = false;
"wai-logger".revision = (((hackage."wai-logger")."2.4.0").revisions).default;
"selda-sqlite".revision = (((hackage."selda-sqlite")."0.1.7.2").revisions).default;
"selda-sqlite".flags.haste = false;
"these".revision = (((hackage."these")."1.1.1.1").revisions).default;
"these".flags.assoc = true;
"split".revision = (((hackage."split")."0.2.3.5").revisions).default;
"base-orphans".revision = (((hackage."base-orphans")."0.8.7").revisions).default;
"ghc-bignum".revision = (((hackage."ghc-bignum")."1.2").revisions).default;
"hspec-core".revision = (((hackage."hspec-core")."2.10.6").revisions).default;
"time-compat".revision = (((hackage."time-compat")."1.9.6.1").revisions).default;
"time-compat".flags.old-locale = false;
"setenv".revision = (((hackage."setenv")."0.1.1.3").revisions).default;
"typed-process".revision = (((hackage."typed-process")."0.2.10.1").revisions).default;
{ system
, compiler
, flags
, pkgs
, hsPkgs
, pkgconfPkgs
, errorHandler
, config
, ... }:
{
flags = {};
package = {
specVersion = "2.4";
identifier = {
name = "dapps-certification-persistence";
version = "0.1.0.0";
};
license = "NONE";
copyright = "";
maintainer = "[email protected]";
author = "Bogdan Manole";
homepage = "";
url = "";
synopsis = "";
description = "";
buildType = "Simple";
isLocal = true;
detailLevel = "FullDetails";
licenseFiles = [];
dataDir = ".";
dataFiles = [];
extraSrcFiles = [];
extraTmpFiles = [];
extraDocFiles = [];
};
components = {
"library" = {
depends = [
(hsPkgs."base" or (errorHandler.buildDepError "base"))
(hsPkgs."selda" or (errorHandler.buildDepError "selda"))
(hsPkgs."selda-sqlite" or (errorHandler.buildDepError "selda-sqlite"))
(hsPkgs."selda-postgresql" or (errorHandler.buildDepError "selda-postgresql"))
(hsPkgs."uuid" or (errorHandler.buildDepError "uuid"))
(hsPkgs."text" or (errorHandler.buildDepError "text"))
(hsPkgs."time" or (errorHandler.buildDepError "time"))
(hsPkgs."aeson" or (errorHandler.buildDepError "aeson"))
];
buildable = true;
modules = [
"IOHK/Certification/Persistence/Structure"
"IOHK/Certification/Persistence/API"
"IOHK/Certification/Persistence"
];
hsSourceDirs = [ "src" ];
};
};
} // rec { src = (pkgs.lib).mkDefault ../dapps-certification-persistence; }
\ No newline at end of file
depends = [
(hsPkgs."base" or (errorHandler.buildDepError "base"))
(hsPkgs."containers" or (errorHandler.buildDepError "containers"))
(hsPkgs."cicero-api" or (errorHandler.buildDepError "cicero-api"))
(hsPkgs."servant" or (errorHandler.buildDepError "servant"))
(hsPkgs."servant-client" or (errorHandler.buildDepError "servant-client"))
(hsPkgs."servant-client-core" or (errorHandler.buildDepError "servant-client-core"))
(hsPkgs."servant-server" or (errorHandler.buildDepError "servant-server"))
(hsPkgs."conduit" or (errorHandler.buildDepError "conduit"))
(hsPkgs."cicero-api" or (errorHandler.buildDepError "cicero-api"))
(hsPkgs."network-uri" or (errorHandler.buildDepError "network-uri"))
(hsPkgs."bytestring" or (errorHandler.buildDepError "bytestring"))
(hsPkgs."uuid" or (errorHandler.buildDepError "uuid"))
(hsPkgs."time" or (errorHandler.buildDepError "time"))
(hsPkgs."filepath" or (errorHandler.buildDepError "filepath"))
(hsPkgs."temporary" or (errorHandler.buildDepError "temporary"))
(hsPkgs."dapps-certification-persistence" or (errorHandler.buildDepError "dapps-certification-persistence"))
(hsPkgs."dapps-certification-interface" or (errorHandler.buildDepError "dapps-certification-interface"))
(hsPkgs."dapps-certification-helpers" or (errorHandler.buildDepError "dapps-certification-helpers"))
];
"Plutus/Certification/Client"
"Plutus/Certification/Server"
"Plutus/Certification/Local"
"Plutus/Certification/GithubClient"
];
hsSourceDirs = [ "src" ];
};
(hsPkgs."text" or (errorHandler.buildDepError "text"))
(hsPkgs."bytestring" or (errorHandler.buildDepError "bytestring"))
(hsPkgs."plutus-certification" or (errorHandler.buildDepError "plutus-certification"))
(hsPkgs."dapps-certification-persistence" or (errorHandler.buildDepError "dapps-certification-persistence"))
];
buildable = true;
modules = [ "Paths_plutus_certification" ];
pkgs = hackage:
{
packages = {
"charset".revision = (((hackage."charset")."0.3.9").revisions).default;
"old-time".revision = (((hackage."old-time")."1.1.0.3").revisions).default;
"servant-client".revision = (((hackage."servant-client")."0.19").revisions).default;
"mmorph".revision = (((hackage."mmorph")."1.2.0").revisions).default;
"postgresql-binary".revision = (((hackage."postgresql-binary")."0.12.5").revisions).default;
"happy".revision = (((hackage."happy")."1.20.0").revisions).default;
"streaming-commons".revision = (((hackage."streaming-commons")."0.2.2.4").revisions).default;
"streaming-commons".flags.use-bytestring-builder = false;
"pretty".revision = (((hackage."pretty")."1.1.3.6").revisions).default;
"haskell-src-exts".revision = (((hackage."haskell-src-exts")."1.23.1").revisions).default;
"data-textual".revision = (((hackage."data-textual")."0.3.0.3").revisions).default;
"network-uri".revision = (((hackage."network-uri")."2.6.4.1").revisions).default;
"parsers".revision = (((hackage."parsers")."0.12.11").revisions).default;
"parsers".flags.parsec = true;
"parsers".flags.binary = true;
"parsers".flags.attoparsec = true;
"unordered-containers".revision = (((hackage."unordered-containers")."0.2.19.1").revisions).default;
"unordered-containers".flags.debug = false;
"integer-logarithms".revision = (((hackage."integer-logarithms")."1.0.3.1").revisions).default;
"some".revision = (((hackage."some")."1.0.4.1").revisions).default;
"some".flags.newtype-unsafe = true;
"temporary".revision = (((hackage."temporary")."1.3").revisions).default;
"selda".revision = (((hackage."selda")."0.5.2.0").revisions).default;
"comonad".revision = (((hackage."comonad")."5.0.8").revisions).default;
"comonad".flags.containers = true;
"comonad".flags.distributive = true;
"asn1-types".revision = (((hackage."asn1-types")."0.3.4").revisions).default;
"base-compat".revision = (((hackage."base-compat")."0.12.2").revisions).default;
"string-conversions".revision = (((hackage."string-conversions")."0.4.0.1").revisions).default;
"data-endian".revision = (((hackage."data-endian")."0.1.1").revisions).default;
"bitvec".revision = (((hackage."bitvec")."1.1.3.0").revisions).default;
"bitvec".flags.libgmp = false;
"contravariant".revision = (((hackage."contravariant")."1.5.5").revisions).default;
"contravariant".flags.tagged = true;
"contravariant".flags.semigroups = true;
"contravariant".flags.statevar = true;
"type-hint".revision = (((hackage."type-hint")."0.1").revisions).default;
"base-compat-batteries".revision = (((hackage."base-compat-batteries")."0.12.2").revisions).default;
"safe".revision = (((hackage."safe")."0.3.19").revisions).default;
"Cabal".revision = (((hackage."Cabal")."3.6.3.0").revisions).default;
"sop-core".revision = (((hackage."sop-core")."0.5.0.2").revisions).default;
"assoc".revision = (((hackage."assoc")."1.0.2").revisions).default;
"cicero-api".revision = (((hackage."cicero-api")."0.1.1.3").revisions).default;
"cicero-api".revision = (((hackage."cicero-api")."0.1.2.0").revisions).default;
"binary-parser".revision = (((hackage."binary-parser")."0.5.7.2").revisions).default;
"unliftio".revision = (((hackage."unliftio")."0.2.22.0").revisions).default;
"data-fix".revision = (((hackage."data-fix")."0.3.2").revisions).default;
"tls".revision = (((hackage."tls")."1.6.0").revisions).default;
"tls".flags.network = true;
"tls".flags.hans = false;
"tls".flags.compat = true;
"text-printer".revision = (((hackage."text-printer")."0.5.0.2").revisions).default;
"http-client-tls".revision = (((hackage."http-client-tls")."0.3.6.1").revisions).default;
"data-bword".revision = (((hackage."data-bword")."0.1.0.2").revisions).default;
"basement".revision = (((hackage."basement")."0.0.15").revisions).default;
"network-ip".revision = (((hackage."network-ip")."0.3.0.3").revisions).default;
"old-locale".revision = (((hackage."old-locale")."1.0.0.7").revisions).default;
"mtl".revision = (((hackage."mtl")."2.2.2").revisions).default;
"selda-json".revision = (((hackage."selda-json")."0.1.1.1").revisions).default;
"OneTuple".revision = (((hackage."OneTuple")."0.3.1").revisions).default;
"mime-types".revision = (((hackage."mime-types")."0.1.1.0").revisions).default;
"parsec".revision = (((hackage."parsec")."3.1.15.0").revisions).default;
"bytestring".revision = (((hackage."bytestring")."0.11.3.1").revisions).default;
"attoparsec-iso8601".revision = (((hackage."attoparsec-iso8601")."1.0.2.1").revisions).default;
"attoparsec-iso8601".flags.fast = false;
"attoparsec-iso8601".flags.developer = false;
"data-dword".revision = (((hackage."data-dword")."0.3.2.1").revisions).default;
"pem".revision = (((hackage."pem")."0.2.4").revisions).default;
"strict".revision = (((hackage."strict")."0.4.0.1").revisions).default;
"strict".flags.assoc = true;
"splitmix".flags.optimised-mixer = false;
"recv".revision = (((hackage."recv")."0.0.0").revisions).default;
"file-embed".revision = (((hackage."file-embed")."0.0.15.0").revisions).default;
"text-latin1".revision = (((hackage."text-latin1")."0.3.1").revisions).default;
"attoparsec".revision = (((hackage."attoparsec")."0.14.4").revisions).default;
"attoparsec".flags.developer = false;
"bytestring-strict-builder".revision = (((hackage."bytestring-strict-builder")."0.4.5.6").revisions).default;
"singleton-bool".revision = (((hackage."singleton-bool")."0.1.6").revisions).default;
"th-compat".revision = (((hackage."th-compat")."0.1.4").revisions).default;
"data-checked".revision = (((hackage."data-checked")."0.3").revisions).default;
"memory".revision = (((hackage."memory")."0.18.0").revisions).default;
"memory".flags.support_deepseq = true;
"memory".flags.support_bytestring = true;
"free".revision = (((hackage."free")."5.1.9").revisions).default;
"terminfo".revision = (((hackage."terminfo")."0.4.1.5").revisions).default;
"connection".revision = (((hackage."connection")."0.3.1").revisions).default;
"postgresql-libpq".revision = (((hackage."postgresql-libpq")."0.9.4.3").revisions).default;
"postgresql-libpq".flags.use-pkg-config = false;
"resourcet".revision = (((hackage."resourcet")."1.2.6").revisions).default;
"vault".revision = (((hackage."vault")."0.3.1.5").revisions).default;
"vault".flags.useghc = true;
"vector-stream".revision = (((hackage."vector-stream")."0.1.0.0").revisions).default;
"ghc-boot-th".revision = (((hackage."ghc-boot-th")."9.2.4").revisions).default;
"asn1-encoding".revision = (((hackage."asn1-encoding")."0.9.6").revisions).default;
"selda-postgresql".revision = (((hackage."selda-postgresql")."0.1.8.2").revisions).default;
"selda-postgresql".flags.haste = false;
"indexed-traversable".revision = (((hackage."indexed-traversable")."0.1.2").revisions).default;
"distributive".revision = (((hackage."distributive")."0.6.2.1").revisions).default;
"distributive".flags.tagged = true;
"distributive".flags.semigroups = true;
"text-short".revision = (((hackage."text-short")."0.1.5").revisions).default;
"text-short".flags.asserts = false;
"servant".revision = (((hackage."servant")."0.19").revisions).default;
"data-serializer".revision = (((hackage."data-serializer")."0.3.5").revisions).default;
"bsb-http-chunked".revision = (((hackage."bsb-http-chunked")."0.0.0.4").revisions).default;
"bifunctors".revision = (((hackage."bifunctors")."5.5.13").revisions).default;
"bifunctors".flags.tagged = true;
"cereal".revision = (((hackage."cereal")."0.5.8.3").revisions).default;
"cereal".flags.bytestring-builder = false;
"utf8-string".revision = (((hackage."utf8-string")."1.0.2").revisions).default;
"conduit".revision = (((hackage."conduit")."1.3.4.2").revisions).default;
"conduit".revision = (((hackage."conduit")."1.3.4.3").revisions).default;
"transformers-base".revision = (((hackage."transformers-base")."0.4.6").revisions).default;
"transformers-base".flags.orphaninstances = true;
"aeson-qq".revision = (((hackage."aeson-qq")."0.8.4").revisions).default;
"base-unicode-symbols".flags.base-4-8 = true;
"base-unicode-symbols".flags.old-base = false;
"wai-logger".revision = (((hackage."wai-logger")."2.4.0").revisions).default;
"selda-sqlite".revision = (((hackage."selda-sqlite")."0.1.7.2").revisions).default;
"selda-sqlite".flags.haste = false;
"these".revision = (((hackage."these")."1.1.1.1").revisions).default;
"these".flags.assoc = true;
"split".revision = (((hackage."split")."0.2.3.5").revisions).default;
"wai-app-static".flags.print = false;
"transformers".revision = (((hackage."transformers")."0.5.6.2").revisions).default;
"template-haskell".revision = (((hackage."template-haskell")."2.18.0.0").revisions).default;
"direct-sqlite".revision = (((hackage."direct-sqlite")."2.3.27").revisions).default;
"direct-sqlite".flags.haveusleep = true;
"direct-sqlite".flags.systemlib = false;
"direct-sqlite".flags.fulltextsearch = true;
"direct-sqlite".flags.urifilenames = true;
"direct-sqlite".flags.json1 = true;
"blaze-markup".revision = (((hackage."blaze-markup")."0.8.2.8").revisions).default;
"mono-traversable".revision = (((hackage."mono-traversable")."1.0.15.3").revisions).default;
"witherable".revision = (((hackage."witherable")."0.4.2").revisions).default;
packages = {
dapps-certification-interface = ./.plan.nix/dapps-certification-interface.nix;
dapps-certification-helpers = ./.plan.nix/dapps-certification-helpers.nix;
dapps-certification-persistence = ./.plan.nix/dapps-certification-persistence.nix;
plutus-certification = ./.plan.nix/plutus-certification.nix;
};
};
packages = {
"dapps-certification-interface" = { flags = {}; };
"dapps-certification-helpers" = { flags = {}; };
"dapps-certification-persistence" = { flags = {}; };
"plutus-certification" = { flags = {}; };
};
})
"cookie".components.library.planned = lib.mkOverride 900 true;
"these".components.library.planned = lib.mkOverride 900 true;
"cereal".components.library.planned = lib.mkOverride 900 true;
"selda".components.library.planned = lib.mkOverride 900 true;
"resourcet".components.library.planned = lib.mkOverride 900 true;
"haskell-src-meta".components.library.planned = lib.mkOverride 900 true;
"http2".components.library.planned = lib.mkOverride 900 true;
"filepath".components.library.planned = lib.mkOverride 900 true;
"wai".components.library.planned = lib.mkOverride 900 true;
"data-textual".components.library.planned = lib.mkOverride 900 true;
"distributive".components.library.planned = lib.mkOverride 900 true;
"pretty".components.library.planned = lib.mkOverride 900 true;
"utf8-string".components.library.planned = lib.mkOverride 900 true;
"mono-traversable".components.library.planned = lib.mkOverride 900 true;
"zlib".components.library.planned = lib.mkOverride 900 true;
"servant-server".components.exes."greet".planned = lib.mkOverride 900 true;
"data-dword".components.library.planned = lib.mkOverride 900 true;
"strict".components.library.planned = lib.mkOverride 900 true;
"text-printer".components.library.planned = lib.mkOverride 900 true;
"entropy".components.setup.planned = lib.mkOverride 900 true;
"comonad".components.library.planned = lib.mkOverride 900 true;
"data-fix".components.library.planned = lib.mkOverride 900 true;
"dlist".components.library.planned = lib.mkOverride 900 true;
"time-manager".components.library.planned = lib.mkOverride 900 true;
"ghc-prim".components.library.planned = lib.mkOverride 900 true;
"postgresql-libpq".components.setup.planned = lib.mkOverride 900 true;
"HUnit".components.library.planned = lib.mkOverride 900 true;
"some".components.library.planned = lib.mkOverride 900 true;
"array".components.library.planned = lib.mkOverride 900 true;
"cicero-api".components.exes."cicero-cli".planned = lib.mkOverride 900 true;
"dapps-certification-helpers".components.library.planned = lib.mkOverride 900 true;
"binary".components.library.planned = lib.mkOverride 900 true;
"charset".components.library.planned = lib.mkOverride 900 true;
{ system
, compiler
, flags
, pkgs
, hsPkgs
, pkgconfPkgs
, errorHandler
, config
, ... }:
{
flags = {};
package = {
specVersion = "2.4";
identifier = {
name = "dapps-certification-persistence";
version = "0.1.0.0";
};
license = "NONE";
copyright = "";
maintainer = "[email protected]";
author = "Bogdan Manole";
homepage = "";
url = "";
synopsis = "";
description = "";
buildType = "Simple";
isLocal = true;
detailLevel = "FullDetails";
licenseFiles = [];
dataDir = ".";
dataFiles = [];
extraSrcFiles = [];
extraTmpFiles = [];
extraDocFiles = [];
};
components = {
"library" = {
depends = [
(hsPkgs."base" or (errorHandler.buildDepError "base"))
(hsPkgs."selda" or (errorHandler.buildDepError "selda"))
(hsPkgs."selda-sqlite" or (errorHandler.buildDepError "selda-sqlite"))
(hsPkgs."selda-postgresql" or (errorHandler.buildDepError "selda-postgresql"))
(hsPkgs."uuid" or (errorHandler.buildDepError "uuid"))
(hsPkgs."text" or (errorHandler.buildDepError "text"))
(hsPkgs."time" or (errorHandler.buildDepError "time"))
(hsPkgs."aeson" or (errorHandler.buildDepError "aeson"))
];
buildable = true;
modules = [
"IOHK/Certification/Persistence/Structure"
"IOHK/Certification/Persistence/API"
"IOHK/Certification/Persistence"
];
hsSourceDirs = [ "src" ];
};
};
} // rec { src = (pkgs.lib).mkDefault ../dapps-certification-persistence; }
\ No newline at end of file
(hsPkgs."time" or (errorHandler.buildDepError "time"))
(hsPkgs."filepath" or (errorHandler.buildDepError "filepath"))
(hsPkgs."temporary" or (errorHandler.buildDepError "temporary"))
(hsPkgs."dapps-certification-persistence" or (errorHandler.buildDepError "dapps-certification-persistence"))
(hsPkgs."dapps-certification-interface" or (errorHandler.buildDepError "dapps-certification-interface"))
(hsPkgs."dapps-certification-helpers" or (errorHandler.buildDepError "dapps-certification-helpers"))
];
"Plutus/Certification/Client"
"Plutus/Certification/Server"
"Plutus/Certification/Local"
"Plutus/Certification/GithubClient"
];
hsSourceDirs = [ "src" ];
};
(hsPkgs."text" or (errorHandler.buildDepError "text"))
(hsPkgs."bytestring" or (errorHandler.buildDepError "bytestring"))
(hsPkgs."plutus-certification" or (errorHandler.buildDepError "plutus-certification"))
(hsPkgs."dapps-certification-persistence" or (errorHandler.buildDepError "dapps-certification-persistence"))
];
buildable = true;
modules = [ "Paths_plutus_certification" ];
};
};
};
} // rec { src = (pkgs.lib).mkDefault ../.; }
} // rec { src = (pkgs.lib).mkDefault ../.; }
\ No newline at end of file
pkgs = hackage:
{
packages = {
"charset".revision = (((hackage."charset")."0.3.9").revisions).default;
"old-time".revision = (((hackage."old-time")."1.1.0.3").revisions).default;
"servant-client".revision = (((hackage."servant-client")."0.19").revisions).default;
"mmorph".revision = (((hackage."mmorph")."1.2.0").revisions).default;
"postgresql-binary".revision = (((hackage."postgresql-binary")."0.12.5").revisions).default;
"happy".revision = (((hackage."happy")."1.20.0").revisions).default;
"streaming-commons".revision = (((hackage."streaming-commons")."0.2.2.4").revisions).default;
"streaming-commons".flags.use-bytestring-builder = false;
"pretty".revision = (((hackage."pretty")."1.1.3.6").revisions).default;
"haskell-src-exts".revision = (((hackage."haskell-src-exts")."1.23.1").revisions).default;
"data-textual".revision = (((hackage."data-textual")."0.3.0.3").revisions).default;
"network-uri".revision = (((hackage."network-uri")."2.6.4.1").revisions).default;
"parsers".revision = (((hackage."parsers")."0.12.11").revisions).default;
"parsers".flags.parsec = true;
"parsers".flags.binary = true;
"parsers".flags.attoparsec = true;
"unordered-containers".revision = (((hackage."unordered-containers")."0.2.19.1").revisions).default;
"unordered-containers".flags.debug = false;
"integer-logarithms".revision = (((hackage."integer-logarithms")."1.0.3.1").revisions).default;
"some".revision = (((hackage."some")."1.0.4.1").revisions).default;
"some".flags.newtype-unsafe = true;
"temporary".revision = (((hackage."temporary")."1.3").revisions).default;
"selda".revision = (((hackage."selda")."0.5.2.0").revisions).default;
"comonad".revision = (((hackage."comonad")."5.0.8").revisions).default;
"comonad".flags.containers = true;
"comonad".flags.distributive = true;
"asn1-types".revision = (((hackage."asn1-types")."0.3.4").revisions).default;
"base-compat".revision = (((hackage."base-compat")."0.12.2").revisions).default;
"string-conversions".revision = (((hackage."string-conversions")."0.4.0.1").revisions).default;
"data-endian".revision = (((hackage."data-endian")."0.1.1").revisions).default;
"bitvec".revision = (((hackage."bitvec")."1.1.3.0").revisions).default;
"bitvec".flags.libgmp = false;
"contravariant".revision = (((hackage."contravariant")."1.5.5").revisions).default;
"contravariant".flags.tagged = true;
"contravariant".flags.semigroups = true;
"contravariant".flags.statevar = true;
"type-hint".revision = (((hackage."type-hint")."0.1").revisions).default;
"base-compat-batteries".revision = (((hackage."base-compat-batteries")."0.12.2").revisions).default;
"safe".revision = (((hackage."safe")."0.3.19").revisions).default;
"Cabal".revision = (((hackage."Cabal")."3.6.3.0").revisions).default;
"sop-core".revision = (((hackage."sop-core")."0.5.0.2").revisions).default;
"assoc".revision = (((hackage."assoc")."1.0.2").revisions).default;
"cicero-api".revision = (((hackage."cicero-api")."0.1.2.0").revisions).default;
"binary-parser".revision = (((hackage."binary-parser")."0.5.7.2").revisions).default;
"unliftio".revision = (((hackage."unliftio")."0.2.22.0").revisions).default;
"data-fix".revision = (((hackage."data-fix")."0.3.2").revisions).default;
"tls".revision = (((hackage."tls")."1.6.0").revisions).default;
"tls".flags.network = true;
"tls".flags.hans = false;
"tls".flags.compat = true;
"text-printer".revision = (((hackage."text-printer")."0.5.0.2").revisions).default;
"http-client-tls".revision = (((hackage."http-client-tls")."0.3.6.1").revisions).default;
"data-bword".revision = (((hackage."data-bword")."0.1.0.2").revisions).default;
"basement".revision = (((hackage."basement")."0.0.15").revisions).default;
"network-ip".revision = (((hackage."network-ip")."0.3.0.3").revisions).default;
"old-locale".revision = (((hackage."old-locale")."1.0.0.7").revisions).default;
"mtl".revision = (((hackage."mtl")."2.2.2").revisions).default;
"selda-json".revision = (((hackage."selda-json")."0.1.1.1").revisions).default;
"OneTuple".revision = (((hackage."OneTuple")."0.3.1").revisions).default;
"mime-types".revision = (((hackage."mime-types")."0.1.1.0").revisions).default;
"parsec".revision = (((hackage."parsec")."3.1.15.0").revisions).default;
"bytestring".revision = (((hackage."bytestring")."0.11.3.1").revisions).default;
"attoparsec-iso8601".revision = (((hackage."attoparsec-iso8601")."1.0.2.1").revisions).default;
"attoparsec-iso8601".flags.fast = false;
"attoparsec-iso8601".flags.developer = false;
"data-dword".revision = (((hackage."data-dword")."0.3.2.1").revisions).default;
"pem".revision = (((hackage."pem")."0.2.4").revisions).default;
"strict".revision = (((hackage."strict")."0.4.0.1").revisions).default;
"strict".flags.assoc = true;
"splitmix".flags.optimised-mixer = false;
"recv".revision = (((hackage."recv")."0.0.0").revisions).default;
"file-embed".revision = (((hackage."file-embed")."0.0.15.0").revisions).default;
"text-latin1".revision = (((hackage."text-latin1")."0.3.1").revisions).default;
"attoparsec".revision = (((hackage."attoparsec")."0.14.4").revisions).default;
"attoparsec".flags.developer = false;
"bytestring-strict-builder".revision = (((hackage."bytestring-strict-builder")."0.4.5.6").revisions).default;
"singleton-bool".revision = (((hackage."singleton-bool")."0.1.6").revisions).default;
"th-compat".revision = (((hackage."th-compat")."0.1.4").revisions).default;
"data-checked".revision = (((hackage."data-checked")."0.3").revisions).default;
"memory".revision = (((hackage."memory")."0.18.0").revisions).default;
"memory".flags.support_deepseq = true;
"memory".flags.support_bytestring = true;
"free".revision = (((hackage."free")."5.1.9").revisions).default;
"terminfo".revision = (((hackage."terminfo")."0.4.1.5").revisions).default;
"connection".revision = (((hackage."connection")."0.3.1").revisions).default;
"postgresql-libpq".revision = (((hackage."postgresql-libpq")."0.9.4.3").revisions).default;
"postgresql-libpq".flags.use-pkg-config = false;
"resourcet".revision = (((hackage."resourcet")."1.2.6").revisions).default;
"vault".revision = (((hackage."vault")."0.3.1.5").revisions).default;
"vault".flags.useghc = true;
"vector-stream".revision = (((hackage."vector-stream")."0.1.0.0").revisions).default;
"ghc-boot-th".revision = (((hackage."ghc-boot-th")."9.2.4").revisions).default;
"asn1-encoding".revision = (((hackage."asn1-encoding")."0.9.6").revisions).default;
"selda-postgresql".revision = (((hackage."selda-postgresql")."0.1.8.2").revisions).default;
"selda-postgresql".flags.haste = false;
"indexed-traversable".revision = (((hackage."indexed-traversable")."0.1.2").revisions).default;
"distributive".revision = (((hackage."distributive")."0.6.2.1").revisions).default;
"distributive".flags.tagged = true;
"distributive".flags.semigroups = true;
"text-short".revision = (((hackage."text-short")."0.1.5").revisions).default;
"text-short".flags.asserts = false;
"servant".revision = (((hackage."servant")."0.19").revisions).default;
"data-serializer".revision = (((hackage."data-serializer")."0.3.5").revisions).default;
"bsb-http-chunked".revision = (((hackage."bsb-http-chunked")."0.0.0.4").revisions).default;
"bifunctors".revision = (((hackage."bifunctors")."5.5.13").revisions).default;
"bifunctors".flags.tagged = true;
"base-unicode-symbols".flags.base-4-8 = true;
"base-unicode-symbols".flags.old-base = false;
"wai-logger".revision = (((hackage."wai-logger")."2.4.0").revisions).default;
"selda-sqlite".revision = (((hackage."selda-sqlite")."0.1.7.2").revisions).default;
"selda-sqlite".flags.haste = false;
"these".revision = (((hackage."these")."1.1.1.1").revisions).default;
"these".flags.assoc = true;
"split".revision = (((hackage."split")."0.2.3.5").revisions).default;
"wai-app-static".flags.print = false;
"transformers".revision = (((hackage."transformers")."0.5.6.2").revisions).default;
"template-haskell".revision = (((hackage."template-haskell")."2.18.0.0").revisions).default;
"direct-sqlite".revision = (((hackage."direct-sqlite")."2.3.27").revisions).default;
"direct-sqlite".flags.haveusleep = true;
"direct-sqlite".flags.systemlib = false;
"direct-sqlite".flags.fulltextsearch = true;
"direct-sqlite".flags.urifilenames = true;
"direct-sqlite".flags.json1 = true;
"blaze-markup".revision = (((hackage."blaze-markup")."0.8.2.8").revisions).default;
"mono-traversable".revision = (((hackage."mono-traversable")."1.0.15.3").revisions).default;
"witherable".revision = (((hackage."witherable")."0.4.2").revisions).default;
packages = {
dapps-certification-interface = ./.plan.nix/dapps-certification-interface.nix;
dapps-certification-helpers = ./.plan.nix/dapps-certification-helpers.nix;
dapps-certification-persistence = ./.plan.nix/dapps-certification-persistence.nix;
plutus-certification = ./.plan.nix/plutus-certification.nix;
};
};
packages = {
"dapps-certification-interface" = { flags = {}; };
"dapps-certification-helpers" = { flags = {}; };
"dapps-certification-persistence" = { flags = {}; };
"plutus-certification" = { flags = {}; };
};
})
"cookie".components.library.planned = lib.mkOverride 900 true;
"these".components.library.planned = lib.mkOverride 900 true;
"cereal".components.library.planned = lib.mkOverride 900 true;
"selda".components.library.planned = lib.mkOverride 900 true;
"resourcet".components.library.planned = lib.mkOverride 900 true;
"haskell-src-meta".components.library.planned = lib.mkOverride 900 true;
"http2".components.library.planned = lib.mkOverride 900 true;
"filepath".components.library.planned = lib.mkOverride 900 true;
"wai".components.library.planned = lib.mkOverride 900 true;
"data-textual".components.library.planned = lib.mkOverride 900 true;
"distributive".components.library.planned = lib.mkOverride 900 true;
"pretty".components.library.planned = lib.mkOverride 900 true;
"utf8-string".components.library.planned = lib.mkOverride 900 true;
"mono-traversable".components.library.planned = lib.mkOverride 900 true;
"zlib".components.library.planned = lib.mkOverride 900 true;
"servant-server".components.exes."greet".planned = lib.mkOverride 900 true;
"data-dword".components.library.planned = lib.mkOverride 900 true;
"strict".components.library.planned = lib.mkOverride 900 true;
"text-printer".components.library.planned = lib.mkOverride 900 true;
"entropy".components.setup.planned = lib.mkOverride 900 true;
"comonad".components.library.planned = lib.mkOverride 900 true;
"data-fix".components.library.planned = lib.mkOverride 900 true;
"dlist".components.library.planned = lib.mkOverride 900 true;
"time-manager".components.library.planned = lib.mkOverride 900 true;
"ghc-prim".components.library.planned = lib.mkOverride 900 true;
"postgresql-libpq".components.setup.planned = lib.mkOverride 900 true;
"HUnit".components.library.planned = lib.mkOverride 900 true;
"some".components.library.planned = lib.mkOverride 900 true;
"array".components.library.planned = lib.mkOverride 900 true;
"cicero-api".components.exes."cicero-cli".planned = lib.mkOverride 900 true;
"dapps-certification-helpers".components.library.planned = lib.mkOverride 900 true;
"binary".components.library.planned = lib.mkOverride 900 true;
"charset".components.library.planned = lib.mkOverride 900 true;
"wai-extra".components.library.planned = lib.mkOverride 900 true;
"ghc-boot-th".components.library.planned = lib.mkOverride 900 true;
"scientific".components.library.planned = lib.mkOverride 900 true;
"indexed-traversable-instances".components.library.planned = lib.mkOverride 900 true;
"servant-server".components.library.planned = lib.mkOverride 900 true;
"data-default-class".components.library.planned = lib.mkOverride 900 true;
"type-hint".components.library.planned = lib.mkOverride 900 true;
"adjunctions".components.library.planned = lib.mkOverride 900 true;
"cryptonite".components.library.planned = lib.mkOverride 900 true;
time ^>= 1.11.1.1,
filepath,
temporary,
dapps-certification-persistence,
dapps-certification-interface,
dapps-certification-helpers
hs-source-dirs: src
Plutus.Certification.Client
Plutus.Certification.Server
Plutus.Certification.Local
Plutus.Certification.GithubClient
other-modules: Paths_plutus_certification
autogen-modules: Paths_plutus_certification
default-language: Haskell2010
singletons ^>= 3.0.1,
text ^>= 1.2.5.0,
bytestring ^>= 0.11.1.0,
plutus-certification
servant-swagger,
plutus-certification,
dapps-certification-persistence,
main-is: Main.hs
hs-source-dirs: server
other-modules: Paths_plutus_certification
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import Plutus.Certification.Server
import Plutus.Certification.Local
import Paths_plutus_certification qualified as Package
import IOHK.Certification.Persistence qualified as DB
import Data.Text.Encoding
data Backend
= Local
dummyHash :: ByteString -> Int
dummyHash = foldl' (\h c -> 33*h `xor` fromEnum c) 5381 . unpack
authHandler :: AuthHandler Request UserId
authHandler :: AuthHandler Request (DB.ProfileId,UserAddress)
authHandler = mkAuthHandler handler
where
maybeToEither e = maybe (Left e) Right
throw401 msg = throwError $ err401 { errBody = msg }
handler req = either throw401 (pure . UserId . dummyHash) $ do
--TODO: this is a subject of change after MVP 2.0
handler req = either throw401 ensureProfile $ do
maybeToEither "Missing Authorization header" $ lookup "Authorization" $ requestHeaders req
genAuthServerContext :: Context (AuthHandler Request UserId ': '[])
maybeToEither e = maybe (Left e) Right
throw401 msg = throwError $ err401 { errBody = msg }
getProfileFromDb = DB.withDb . DB.getProfileId . decodeUtf8
--NOTE: this will create a new profile if there isn't any with the given address
ensureProfile :: ByteString -> Handler (DB.ProfileId,UserAddress)
ensureProfile bs = do
let address = decodeUtf8 bs
profileIdM <- (getProfileFromDb bs)
case profileIdM of
Just pid -> pure (pid, UserAddress address)
Nothing -> do
pidM <- DB.withDb $ DB.upsertProfile $ DB.Profile undefined address Nothing Nothing Nothing Nothing Nothing
case pidM of
Nothing -> throw $ err500 { errBody = "Profile couldn't be created" }
Just pid -> pure (pid,UserAddress address)
genAuthServerContext :: Context (AuthHandler Request (DB.ProfileId,UserAddress) ': '[])
genAuthServerContext = authHandler :. EmptyContext
initDb :: IO ()
initDb = void $ try' $ DB.withDb $
DB.createTables
where
try' :: IO a -> IO (Either SomeException a)
try' = try
main :: IO ()
main = do
args <- execParser opts
& setBeforeMainLoop (finalize initEv)
corsPolicy = simpleCorsResourcePolicy { corsRequestHeaders = ["Content-Type"] }
_ <- initDb
runSettings settings . application (narrowEventBackend InjectServeRequest eb) $
cors (const $ Just corsPolicy) .
serveWithContext (Proxy @API) genAuthServerContext .
, IncompleteRunStatus(..)
, Cicero.Run.RunLog(..)
, KnownActionType(..)
, ProfileBody(..)
) where
import Control.Applicative
import Data.Time.LocalTime
import Data.Text hiding (unpack, pack)
import IOHK.Certification.Interface
import qualified IOHK.Certification.Persistence as DB
import qualified IOHK.Cicero.API.Run as Cicero.Run (RunLog(..))
import Data.Time
type API = NamedRoutes NamedAPI
data NamedAPI mode = NamedAPI
{ version :: mode :- "version" :> Get '[JSON] VersionV1
, versionHead :: mode :- "version" :> HeadNoContent
, createRun :: mode :- "run"
, createRun :: mode
:- "run"
:> AuthProtect "public-key"
:> ReqBody '[PlainText] FlakeRefV1
:> PostCreated '[OctetStream, PlainText, JSON] RunIDV1
, getRun :: mode :- "run" :> Capture "id" RunIDV1 :> Get '[JSON] RunStatusV1
, abortRun :: mode :- "run"
, abortRun :: mode
:- "run"
:> AuthProtect "public-key"
:> Capture "id" RunIDV1
:> DeleteNoContent
, getLogs :: mode :- "run"
, getLogs :: mode
:- "run"
:> Capture "id" RunIDV1
:> "logs"
:> QueryParam "after" ZonedTime
:> QueryParam "action-type" KnownActionType
:> Get '[JSON] [Cicero.Run.RunLog]
, getRuns :: mode
:- "run"
:> AuthProtect "public-key"
:> QueryParam "after" UTCTime
:> QueryParam "count" Int
:> Get '[JSON] [DB.Run]
, getCurrentProfile :: mode
:- "profile"
:> "current"
:> AuthProtect "public-key"
:> Get '[JSON] DB.Profile
, updateCurrentProfile :: mode
:- "profile"
:> "current"
:> AuthProtect "public-key"
:> ReqBody '[JSON] ProfileBody
:> Put '[JSON] DB.Profile
} deriving stock Generic
data ProfileBody = ProfileBody
{ dapp :: !(Maybe Text)
, website :: !(Maybe Text)
, vendor :: !(Maybe Text)
, twitter :: !(Maybe Text)
, linkedin :: !(Maybe Text)
} deriving stock Generic
instance FromJSON ProfileBody where
parseJSON = withObject "Profile" $ \v -> ProfileBody
<$> v .:? "dapp" .!= Nothing
<*> v .:? "website" .!= Nothing
<*> v .:? "vendor" .!= Nothing
<*> v .:? "twitter" .!= Nothing
<*> v .:? "linkedin" .!= Nothing
instance ToJSON ProfileBody where
newtype VersionV1 = VersionV1 { version :: Version }
versionV1Branch :: VersionV1 -> [Int]
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}
module Plutus.Certification.GithubClient (
getCommitInfo,
CommonResponse(..),
Author(..),
Commit(..),
CommitDetails(..)
) where
import Data.Aeson
import Data.Proxy
import GHC.Generics
import Network.HTTP.Client hiding (Proxy)
import Network.HTTP.Client.TLS
import Servant.API
import Servant.Client
import Data.Text
import Data.Time
data CommonResponse = CommonResponse {
commonRespCommit :: Commit
} deriving (Show, Generic)
data Author = Author
{ name :: Text
, email :: Text
, date :: UTCTime
} deriving (Show, Generic)
data CommitDetails = CommitDetails
{ author :: Author
, message :: Text
, committer :: Author
} deriving (Show, Generic)
data Commit = Commit
{ sha :: Text
, commit :: CommitDetails
} deriving (Show, Generic)
instance FromJSON CommonResponse where
parseJSON = withObject "CommonResponse" $ \v -> CommonResponse <$> v .: "commit"
instance FromJSON Commit
instance FromJSON CommitDetails
instance FromJSON Author
type API = "repos"
:> Header "User-Agent" Text
:> Capture "owner" Text
:> Capture "repo" Text
:> ( "branches" :> Capture "branch" Text :> Get '[JSON] CommonResponse
:<|> "commits" :> Capture "commit" Text :> Get '[JSON] CommonResponse
)
api :: Proxy API
api = Proxy
mkClient :: Text -> Text -> (Text -> ClientM CommonResponse) :<|> (Text -> ClientM CommonResponse)
mkClient = (client api) (Just "")
getCommitInfo :: Text
-> Text
-> Text
-> IO (Either ClientError Commit)
getCommitInfo owner repo path' = do
manager' <- newManager tlsManagerSettings
let settings = (mkClientEnv manager' (BaseUrl Https "api.github.com" 443 ""))
let getBranch :<|> getCommit = mkClient owner repo
-- first try branch
fmap commonRespCommit <$> do
respE <- runClientM (getBranch path' ) settings
case respE of
Left _ -> runClientM (getCommit path' ) settings
_ -> pure respE
This is using optparse-applicative and includes distinct newtypes for the two ports. To make the newtype wrappers more friendly, it's also using newtype-generics which provides a generic getter function (called 'op') for instances among other things. Also included is some reordering of import lists.
Use flake-parts
check return collateral amount on test_duplicated_collareral
Co-authored-by: Juliano Lazzarotto <[email protected]>
Changed a couple cases where the inner Rc object was cloned to use the Rc object instead