Upgrade stack to lts-7.16
HMDM3B557TO5RYP2IGFFC2C2VN6HYZTDQ47CJY2O37BW55DSMFZAC
Q5X5RYQLP5K7REYD6VLHOKC4W36ZELJYA45V6YFKTD5S6MPN3NDQC
DFOBMSAODB3NKW37B272ZXA2ML5HMIH3N3C4GT2DPEQS7ZFK4SNAC
HALRDT2F22DAQ54M334YSKD2XJCAXDXEZPDKGMOWKH7XELBAS6MAC
64C6AWH66FDKU6UE6Z6JPX2J2GBM2JOPTH2GL6LHKAIUBGNGDZ5AC
WO2MINIF4TXOHWSE7JWXRZYN64XRVLYIRFMF4SMPSOXKA2V77KMQC
2XQD6KKKD6QVHFHAEMVE3XXY7X2T7BLTLL7XIILZAXNJJH2YONUQC
KEP5WUFJXTMKRRNZLYTGYYWA4VLFCMHTKTJYF5EA5IWBYFMU6WYQC
M4KM76DGO77VC4O6N5FFA5MTZH5GI5AJ3OUJU7INLAOY2M3LRLLAC
ZP62WC472OTQETO2HTHIQIPO57XZIWVKPA4KL62GYU4OZDMB6NSAC
OBFPJS2GHO2PEHBHGEHKIUOUAFIQHPIZXEVD2YIE3ZIE2PVMH5VAC
Y3LIJ5USPMYBG7HKCIQBE7MWVGLQJPJSQD3KPZCTKXP22GOB535QC
PBD7LZYQHXAA3KLH2ZUX5GW4UFML6BQ32KXZF4KZ6OYFASUYFJ5QC
RPAJLHMTUJU4AYNBOHVGHGGB4NY2NLY3BVPYN5FMWB3ZIMAUQHCQC
QMRKFEPGFBCEWAIXPEIG5ILKAJ2JH5L3TOITHR4HNJXK5FN3KXBQC
EKI57EJR65DA5FPILAHGHHAIU5ITVGHA6V3775OX7GV5XD67OWRQC
5DRIWGLUKMQZU2ZPBXSTLAWJKAMOD5YXAHM5LEDQHDFGYYLHWCDQC
POX3UAMTGCNS3SU5I6IKDNCCSHEAUSFBZ3WCMQ3EXKPNXETOI6BAC
7KZP4RHZ3QSYTPPQ257A65Z5UPX44TF2LAI2U5EMULQCLDCEUK2AC
LHJ2HFXVUQ4VG25I7DADWU73G5K5WNZBDQ3SVNKFYLZ5BEYM4XCQC
UUR6SMCAJMA7O3ZFUCQMPZFDDIPUVQ5IHUAC5F252YVD6H3JIKPQC
ASF3UPJLCX7KIUCNJD5KAXSPDXCUEJHLL4HBRTRUBPCW73IXOCWQC
WZUHEZSBRKHQMNWDKVG4X6DDIQEAXTGI6IGAJ5ERPRQ3W2KUMX4QC
TCOAKCGGHOIRJCTZYEZQ3K6KCGL2LGAYGYFRGSPCHBTJJY2V6AXAC
6L5BK5EHPAOQX3JCKUJ273UDNAC23LPQL4HIJGM4AV3P3QK5OKIQC
IZEVQF627FA7VV25KJAWYWGGC35LZUUBBQRPN5ZAINTQLPEDRTEAC
GCVQD44VRPQVKPZEPIC4AOIXLJIG2ZMV3QI2Y7KALUT6NVUBSGSAC
73NDXDEZRMK672GHSTC3CI6YHXFZ2GGJI5IKQGHKFDZKTNSQXLLQC
O227CEAV7BTKSE3SSC7XHC5IWEBXZL2AOOKJMBMOOFNTLINBLQMAC
NEDDHXUK3GNFMOFO3KLU7NRIHCTYNWBT3D6HTKZAOXFDE6HMDZ6AC
LD4GLVSF6YTA7OZWIGJ45H6TUXGM4WKUIYXKWQFNUP36WDMYSMXAC
EKY7U7SKPF45OOUAHJBEQKXSUXWOHFBQFFVJWPBN5ARFJUFM2BPAC
RN7EI6INGUUHGMNY5RU3NH56WPLRZY5ZMYDNFMNE3TGV4ESFLQIAC
Z7KS5XHHC6PAMTVBHXY7KUSS3BWAOU6FSYIITUCFOOJZU4OUJHBAC
O5FVTOM6YFBLEPF3S576K6IMT6ZZ5VQCSB3YVXNS4CKBITKCRZ7AC
3QVT6MA6I2CILQH3LUZABS4YQ7MN6CNRYTDRVS376OOHTPLYTFJAC
A6HKMINBNGQLLX4QJMYWKQ4JAEHVJ4HIRVDKPPDI3FJUO2AAB7OQC
TNR3TEHKVADAEZSTOD2XLSUTSW5AWST2YUW4CWK5KE7DSC6XHZNAC
QADKFHAR3KWQCNYU25Z7PJUGMD5WL26IU3DOAHBTRN2A7NKPUPKAC
NLZ3JXLOOIL37O3RRQWXHNPNSNEOOLPD6MCB754BEBECQB3KGR2AC
NAS4BFL43SIUAAC663R6VFBHQ2DKI45K6Y6ZKVQI7S5547HBAN7QC
FXJQACESPGTLPG5ELXBU3M3OQXUZQQIR7HPIEHQ3FNUTMWVH4WBAC
5OI44E4EEVYOMHDWNK2WA7K4L4JWRWCUJUNN2UAUGE5VY4W7GTNAC
MB5SHULBN3WP7TGUWZDP6BRGP423FTYKF67T5IF5YHHLNXKQ5REAC
W35DDBFYF6Z4ZPCFEO5RPAONZLYCSNTXUSTS6FIUUVZHCI6Q7GHAC
Z3MK2PJ5U222DXRS22WCDHVPZ7HVAR3HOCUNXIGX6VMEPBQDF6PQC
WAIX6AGNDVJOKTWZ7OP7QOYSJHAJSX5EOWXZHOAO2IG6ALWUCJ6QC
4U7F3CPIDTK6JSEDMNMHVKSR7HOQDLZQD2PPVMDLHO5SFSIMUXZAC
NVOCQVASZWTKQJG7GPH7KHKZZR7NUG4WLV5YY4KAIRPCJRWCZPIAC
Y35QCWYW2OTZ27ZVTH2BA3XJTUCJ2WMLKU32ZCOCDY3AW7TIZXRAC
V2VDN77HCSRYYWXDJJ2XOVHV4P6PVWNJZLXZ7JUYPQEZQIH5BZ3QC
LCBJULKEU4I5FRUGYNRQSHXYLY5X3LRTSNWDCTZLS7YE4BBBDE6AC
I2KHGVD44KT4MQJXGCTVSQKMBO6TVCY72F26TLXGWRL6PHGF6RNQC
XTBSG4C7SCZUFOU2BTNFR6B6TCGYI35BWUV4PVTS3N7KNH5VEARQC
BROSTG5KP3NUNLSYPVQID254TE47E5RKQAKLPIY7PGWETE6JNMTAC
BXGLKYRXO2O4NRM3BLNWQ7AWVPQXAMFS57MFYHJNOZZEZZW5BH6AC
KNSI575VAW6HRCZYXOEPQ4DTSML4EORML5MV4DJBRKE7TXCPS4EAC
UILI6PILCRDPZ3XYA54LGIGPSU7ERWNHCE7R3CE64ZEC7ONOEMOQC
ADMKQQGCGVSHHIMVQ4XFRDCG544SBJCYALSKZV45CQQBZ4ACUH2AC
AXKKXBWN4EMUOLV43WN52JSKJPBV7TLSGLNJW5EZXHSJNKCYUWOQC
base >= 4.8.0
, bippy == 0.1.0.0
, classy-prelude == 0.12.*
, aeson >= 0.11.2
, attoparsec == 0.13.*
, base64-bytestring == 1.0.*
base
, bippy
, classy-prelude
, aeson
, attoparsec
, base64-bytestring
, groups >= 0.4 && < 0.5
, haskoin-core >= 0.4
, heaps >= 0.3.1 && < 0.4
, hourglass >= 0.2.6 && < 0.3
, HsOpenSSL >= 0.11 && < 0.12
, groups
, haskoin-core
, heaps
, hourglass
, resource-pool-catchio
, smtp-mail >= 0.1.4.5
, snap >= 0.14
, snap-core >= 0.9 && < 0.11
, snap-server >= 0.9 && < 0.11
, snaplet-postgresql-simple >= 0.6 && < 0.11
--, resource-pool-catchio
, smtp-mail
, snap
, snap-core
, snap-server
, snaplet-postgresql-simple
data Billable' (p :: *) (u :: *) (c :: *) = Billable
{ _project :: p
, _creator :: u
, _name :: Text
, _description :: Text
, _recurrence :: Recurrence
, _amount :: c
, _gracePeriod :: Days
}
makeLenses ''Billable'
type Billable = Billable' ProjectId UserId Satoshi
type Subscription = Subscription' BillableId
uidParser :: FieldParser UserId
uidParser f v = UserId <$> fromField f v
pidParser :: FieldParser P.ProjectId
pidParser f v = P.ProjectId <$> fromField f v
secondsParser :: FieldParser Seconds
secondsParser f v = Seconds <$> fromField f v
uidParser :: RowParser UserId
uidParser = UserId <$> field
let err = ConversionFailed { errSQLType = "text"
, errSQLTableOid = tableOid f
, errSQLField = maybe "" B.unpack (name f)
, errHaskellType = "BtcAddr"
, errMessage = "could not deserialize value to a valid BTC address"
}
maybe (conversionError err) pure addrMay
let err = returnError ConversionFailed f "could not deserialize value to a valid BTC address"
maybe err pure addrMay
recurrenceParser :: RowParser BI.Recurrence
recurrenceParser =
let prec :: Text -> RowParser BI.Recurrence
prec "annually" = nullField *> pure BI.Annually
prec "monthly" = BI.Monthly <$> field
prec "semimonthly" = nullField *> pure BI.SemiMonthly
prec "weekly" = BI.Weekly <$> field
prec "onetime" = nullField *> pure BI.OneTime
prec _ = empty
in field >>= prec
parser "credit_to_user" = CreditToUser <$> (nullField *> fieldWith uidParser <* nullField)
parser "credit_to_project" = CreditToProject <$> (nullField *> nullField *> fieldWith pidParser)
parser "credit_to_user" = CreditToUser <$> (nullField *> uidParser <* nullField)
parser "credit_to_project" = CreditToProject <$> (nullField *> nullField *> pidParser)
BI.Billable <$> fieldWith pidParser
<*> fieldWith uidParser
<*> field
<*> field
<*> recurrenceParser
<*> fieldWith btcParser
<*> (Days <$> field)
B.Billable <$> pidParser
<*> uidParser
<*> field
<*> field
<*> recurrenceParser
<*> btcParser
<*> (Days <$> field)
<*> fieldWith (optionalField nominalDiffTimeParser)
recurrenceParser :: RowParser B.Recurrence
recurrenceParser =
let prec :: Text -> RowParser B.Recurrence
prec "annually" = nullField *> pure B.Annually
prec "monthly" = B.Monthly <$> field
prec "semimonthly" = nullField *> pure B.SemiMonthly
prec "weekly" = B.Weekly <$> field
prec "onetime" = nullField *> pure B.OneTime
prec _ = empty
in field >>= prec
subscriptionParser :: RowParser B.Subscription
subscriptionParser =
B.Subscription <$> (B.BillableId <$> field)
<*> (toThyme <$> field)
<*> ((fmap toThyme) <$> field)
storeEvent (CreateSubscription uid bid) =
Just $ storeEventJSON uid "create_subscription" (subscriptionJSON uid bid)
storeEvent (CreateSubscription uid s) =
Just $ storeEventJSON uid "create_subscription" (createSubscriptionJSON uid s)
, b ^. BI.name
, b ^. BI.description
, b ^. (BI.recurrence . to BI.recurrenceName)
, b ^. (BI.recurrence . to BI.recurrenceCount)
, b ^. (BI.amount . satoshi)
, b ^. (BI.gracePeriod . _Days)
, b ^. B.name
, b ^. B.description
, b ^. (B.recurrence . to B.recurrenceName)
, b ^. (B.recurrence . to B.recurrenceCount)
, b ^. (B.amount . satoshi)
, b ^. (B.gracePeriod . _Days)
(uid ^. _UserId, bid ^. BI._BillableId, eventId ^. _EventId)
(uid ^. _UserId, s ^. (B.billable . B._BillableId), eventId ^. _EventId)
pgEval (FindSubscriptions uid pid) =
pquery ((,) <$> subscriptionIdParser <*> subscriptionParser)
"SELECT id, billable_id, start_date, end_date \
\FROM subscriptions s \
\JOIN billables b ON b.id = s.billable_id \
\WHERE s.user_id = ? \
\AND b.project_id = ?"
(uid ^. _UserId, pid ^. P._ProjectId)
raiseOpForbidden :: UserId -> OpForbiddenReason -> DBOp x -> DBOp x
raiseOpForbidden uid r = RaiseDBError (OpForbidden uid r)
class (Monad m) => MonadDB (m :: * -> *) where
liftdb :: DBOp x -> m x
instance MonadDB (Program DBOp) where
liftdb = fc
raiseSubjectNotFound :: DBOp y -> DBOp x
raiseSubjectNotFound = RaiseDBError SubjectNotFound
raiseOpForbidden :: (MonadDB m) => UserId -> OpForbiddenReason -> DBOp x -> m x
raiseOpForbidden uid r op = liftdb $ RaiseDBError (OpForbidden uid r) op
missing = raiseSubjectNotFound act
fc $ maybe missing (\(_, uid', _) -> if uid' == uid then act else forbidden) ev
missing = raiseSubjectNotFound act
maybe missing (\(_, uid', _) -> if uid' == uid then liftdb act else forbidden) ev
--createPaymentRequest :: BillableId -> DBProg PaymentRequestId
--createPaymentRequest bid = do
-- billable <- readBillable bid
findSubscriptions :: (MonadDB m)
=> UserId
-> ProjectId
-> m [(SubscriptionId, Subscription' Billable)]
findSubscriptions uid pid = do
subscriptions <- liftdb $ FindSubscriptions uid pid
let sub'' s = sequenceA <$> traverse readBillable s
sub' (sid, s) = fmap (fmap (sid,)) (sub'' s)
catMaybes <$> traverse sub' subscriptions
subscriptionJSON :: UserId -> B.BillableId -> Value
subscriptionJSON uid bid = v1 $
obj [ "userId" .= tshow (uid ^. _UserId)
, "billableId" .= tshow (bid ^. B._BillableId)
createSubscriptionJSON :: UserId -> B.Subscription -> Value
createSubscriptionJSON uid sub = v1 $
obj [ "user_id" .= tshow (uid ^. _UserId)
, "billable_id" .= tshow (sub ^. (B.billable . B._BillableId))
{-# LANGUAGE TemplateHaskell #-}
module Aftok.Payments.Types where
import ClassyPrelude
import Control.Lens (makeLenses, makePrisms)
import Data.Thyme.Clock as C
import Data.UUID
import qualified Network.Bippy.Proto as P
import Aftok.Billables (SubscriptionId)
newtype PaymentRequestId = PaymentRequestId UUID deriving (Show, Eq)
makePrisms ''PaymentRequestId
newtype PaymentId = PaymentId UUID deriving (Show, Eq)
makePrisms ''PaymentId
data PaymentRequest' s = PaymentRequest
{ _subscription :: s
, _paymentRequest :: P.PaymentRequest
, _paymentRequestDate :: C.UTCTime
}
makeLenses ''PaymentRequest'
type PaymentRequest = PaymentRequest' SubscriptionId
data Payment' r = Payment
{ _request :: r
, _payment :: P.Payment
, _paymentDate :: C.UTCTime
}
makeLenses ''Payment'
type Payment = Payment' PaymentRequestId
import Aftok.Payments.Types
import Aftok.Project (ProjectId, depf)
import qualified Aftok.TimeLog as TL
import Aftok.Types (satoshi)
data BillingConfig = BillingConfig
{ _network :: BT.Network
, _signingKey :: PrivateKey
, _pkiData :: BT.PKIData
}
makeLenses ''BillingConfig
createPaymentRequests :: (MonadRandom m, MonadReader BillingConfig m, MonadError Error m, MonadDB m) =>
C.UTCTime -- timestamp for payment request creation
-> (Subscription' Billable -> m (Maybe Text)) -- generator user memo
-> (Subscription' Billable -> m (Maybe URI)) -- generator for payment response URL
-> (Subscription' Billable -> m (Maybe ByteString)) -- generator for merchant payload
-> UserId -- user responsible for payment
-> ProjectId -- project whose worklog is to be paid out to
-> m [PaymentRequestId]
createPaymentRequests t memogen urigen plgen custId pid = do
subscriptions <- findSubscriptions custId pid
cfg <- ask
let createPaymentDetails' s = do
memo <- memogen s
uri <- urigen s
payload <- plgen s
createPaymentDetails t memo uri payload (s ^. billable)
newtype PaymentRequestId = PaymentRequestId UUID deriving (Show, Eq)
makePrisms ''PaymentRequestId
createPaymentRequest (sid, s) = do
details <- createPaymentDetails' s
req <- B.createPaymentRequest (cfg ^. signingKey) (cfg ^. pkiData) details
liftdb $ CreatePaymentRequest custId (PaymentRequest sid req t)
traverse createPaymentRequest subscriptions
createPaymentDetails :: (MonadRandom m, MonadReader BillingConfig m, MonadDB m) =>
C.UTCTime -- timestamp for payment request creation
-> Maybe Text -- user memo
-> Maybe URI -- payment response URL
-> Maybe ByteString -- merchant payload
-> Billable
-> m P.PaymentDetails
createPaymentDetails t memo uri payload b = do
payouts <- getProjectPayouts t (b ^. project)
outputs <- createPayoutsOutputs t (b ^. amount) payouts
let expiry = (BT.Expiry . fromThyme . (t .+^)) <$> (b ^. requestExpiryPeriod)
cfg <- ask
pure $ B.createPaymentDetails (cfg ^. network) outputs (fromThyme t) expiry memo uri payload
getProjectPayouts :: (MonadDB m) => C.UTCTime -> ProjectId -> m TL.Payouts
getProjectPayouts ptime pid = do
project' <-
let projectOp = FindProject pid
in maybe (raiseSubjectNotFound projectOp) pure =<< liftdb projectOp
widx <- liftdb $ ReadWorkIndex pid
pure $ TL.payouts (TL.toDepF $ project' ^. depf) ptime widx
createPayoutsOutputs :: (MonadDB m) => C.UTCTime -> BT.Satoshi -> TL.Payouts -> m [BT.Output]
createPayoutsOutputs t amt p =
let payoutFractions :: [(TL.CreditTo, BT.Satoshi)]
payoutFractions = (_2 %~ outputAmount amt) <$> assocs (p ^. TL._Payouts)
in join <$> traverse (uncurry (createOutputs t)) payoutFractions
newtype PaymentId = PaymentId UUID deriving (Show, Eq)
makePrisms ''PaymentId
createOutputs :: (MonadDB m) => C.UTCTime -> TL.CreditTo -> BT.Satoshi -> m [BT.Output]
createOutputs _ (TL.CreditToAddress (BtcAddr addr)) amt =
pure $ [BT.Output amt (PayPKHash addr)]
data PaymentRequest' s = PaymentRequest
{ _subscription :: s
, _paymentRequest :: P.PaymentRequest
, _paymentRequestDate :: C.UTCTime
}
makeLenses ''PaymentRequest'
createOutputs _ (TL.CreditToUser uid) amt = do
addrMay <- (>>= view userAddress) <$> findUser uid
let createOutput addr = BT.Output amt (PayPKHash (addr ^. _BtcAddr))
pure . maybeToList $ createOutput <$> addrMay
baseSnapConfig :: MonadSnap m => QConfig -> SC.Config m a -> SC.Config m a
readBtcConfig :: CT.Config -> IO BtcConfig
readBtcConfig cfg =
let parseNetwork :: String -> B.Network
parseNetwork "main" = B.MainNet
parseNetwork _ = B.TestNet
in (BtcConfig . parseNetwork) <$> C.require cfg "network"
baseSnapConfig :: QConfig -> SC.Config m a -> SC.Config m a
payouts <- snapEval $ fc (ReadWorkIndex pid)
pure $ payouts (toDepF $ project ^. depf) ptime widx
-- look up the outstanding
widx <- snapEval $ fc (ReadWorkIndex pid)
-- look up outstanding subscriptions the user has for this project
-- determine which subscriptions need to be paid
-- create a payment request for each subscription
---
- Boolean-0.2.3
- HUnit-1.3.1.2
- MemoTrie-0.6.4
- MonadRandom-0.4.2.3
- NumInstances-1.4
- QuickCheck-2.8.2
- RSA-2.2.0
- ReadArgs-1.2.3
- SHA-1.6.4.2
- StateVar-1.1.0.4
- adjunctions-4.3
- aeson-0.11.2.1
- aftok-0.1
- ansi-terminal-0.6.2.3
- ansi-wl-pprint-0.6.7.3
- array-0.5.1.1
- asn1-encoding-0.9.4
- asn1-parse-0.9.4
- asn1-types-0.3.2
- async-2.1.1
- attoparsec-0.13.1.0
- authenticate-oauth-1.5.1.2
- base-4.9.0.0
- base-orphans-0.5.4
- base16-bytestring-0.1.1.6
- base64-bytestring-1.0.0.1
- basic-prelude-0.6.1
- bifunctors-5.4.1
- binary-0.8.3.0
- bippy-0.1.0.0
- blaze-builder-0.4.0.2
- blaze-html-0.8.1.3
- blaze-markup-0.7.1.1
- byteable-0.1.1
- bytedump-1.0
- bytestring-0.10.8.1
- bytestring-builder-0.10.8.1.0
- case-insensitive-1.2.0.7
- cereal-0.5.4.0
- chunked-data-0.3.0
- cipher-aes-0.2.11
- classy-prelude-1.0.2
- clientsession-0.9.1.2
- clock-0.7.2
- comonad-5
- conduit-1.2.8
- configurator-0.3.0.0
- connection-0.2.6
- constraints-0.8
- containers-0.5.7.1
- contravariant-1.4
- cookie-0.4.2.1
- cprng-aes-0.6.1
- crypto-api-0.13.2
- crypto-cipher-types-0.0.9
- crypto-pubkey-types-0.4.3
- crypto-random-0.0.9
- cryptohash-0.11.9
- cryptohash-md5-0.11.100.1
- cryptohash-sha1-0.11.100.1
- cryptonite-0.21
- data-binary-ieee754-0.4.4
- data-default-0.7.1.1
- data-default-class-0.1.2.0
- data-default-instances-containers-0.0.1
- data-default-instances-dlist-0.0.1
- data-default-instances-old-locale-0.0.1
- deepseq-1.4.2.0
- directory-1.2.6.2
- directory-tree-0.12.1
- distributive-0.5.1
- dlist-0.8.0.2
- dlist-instances-0.1.1.1
- either-4.4.1.1
- entropy-0.3.7
- errors-2.1.3
- exceptions-0.8.3
- fail-4.9.0.0
- filepath-1.4.1.0
- free-4.12.4
- ghc-prim-0.5.0.0
- groups-0.4.0.0
- hashable-1.2.4.0
- haskoin-core-0.4.0
- heaps-0.3.3
- heist-1.0.1.0
- hourglass-0.2.10
- http-client-0.4.31.2
- http-client-tls-0.2.4.1
- http-types-0.9.1
- integer-gmp-1.0.0.1
- io-streams-1.3.6.0
- io-streams-haproxy-1.0.0.1
- iso8601-time-0.1.4
- kan-extensions-5.0.1
- keys-3.11
- largeword-1.2.5
- lens-4.14
- lens-aeson-1.0.0.5
- lifted-async-0.9.1
- lifted-base-0.2.3.8
- map-syntax-0.2.0.1
- memory-0.13
- mime-mail-0.4.12
- mime-types-0.1.0.7
- mmorph-1.0.9
- monad-control-1.0.1.0
- monad-unlift-0.2.0
- mono-traversable-1.0.1
- mono-traversable-instances-0.1.0.0
- mtl-2.2.1
- murmur3-1.0.3
- mutable-containers-0.3.3
- mwc-random-0.13.5.0
- network-2.6.3.1
- network-info-0.2.0.8
- network-uri-2.6.1.0
- old-locale-1.0.0.7
- optparse-applicative-0.12.1.0
- parallel-3.2.1.0
- parsec-3.1.11
- pbkdf-1.1.1.1
- pem-0.2.2
- pointed-5
- postgresql-libpq-0.9.3.0
- postgresql-simple-0.5.2.1
- prelude-extras-0.4.0.3
- primitive-0.6.1.0
- process-1.4.2.0
- profunctors-5.2
- protobuf-0.2.1.1
- psqueues-0.2.2.3
- pureMD5-2.1.3
- pwstore-fast-2.4.4
- random-1.1
- readable-0.3.1
- reflection-2.1.2
- regex-base-0.93.2
- regex-posix-0.95.2
- resource-pool-0.2.3.2
- resourcet-1.1.9
- safe-0.3.10
- safe-exceptions-0.1.4.0
- say-0.1.0.0
- scientific-0.3.4.9
- secp256k1-0.4.6
- securemem-0.1.9
- semigroupoids-5.1
- semigroups-0.18.2
- setenv-0.1.1.3
- skein-1.0.9.4
- smtp-mail-0.1.4.6
- snap-1.0.0.1
- snap-core-1.0.1.0
- snap-server-1.0.1.1
- snaplet-postgresql-simple-1.0.1.0
- socks-0.5.5
- split-0.2.3.1
- stm-2.4.4.1
- stm-chans-3.0.0.4
- streaming-commons-0.1.16
- string-conversions-0.4.0.1
- syb-0.6
- system-filepath-0.4.13.4
- tagged-0.8.5
- template-haskell-2.11.0.0
- text-1.2.2.1
- tf-random-0.5
- thyme-0.3.5.5
- time-1.6.0.1
- time-locale-compat-0.1.1.3
- tls-1.3.9
- transformers-0.5.2.0
- transformers-base-0.4.4
- transformers-compat-0.5.1.4
- unexceptionalio-0.3.0
- unix-2.7.2.0
- unix-compat-0.4.3.1
- unordered-containers-0.2.7.2
- utf8-string-1.0.1.1
- uuid-1.3.13
- uuid-types-1.0.3
- vector-0.11.0.0
- vector-algorithms-0.7.0.1
- vector-instances-3.3.1
- vector-space-0.10.4
- vector-th-unbox-0.2.1.6
- void-0.7.1
- wreq-0.4.1.0
- x509-1.6.5
- x509-store-1.6.2
- x509-system-1.6.4
- x509-validation-1.6.5
- xmlhtml-0.2.3.5
- zlib-0.6.1.2
- zlib-bindings-0.1.1.5
- aeson-0.11.2.1
- base-orphans-0.5.4
- bytestring-builder-0.10.8.1.0
- call-stack-0.1.0
- haskoin-core-0.4.0
- hspec-2.3.2
- hspec-core-2.3.2
- hspec-discover-2.3.2
- hspec-expectations-0.8.2
- mmorph-1.0.9
- mono-traversable-0.10.2
- murmur3-1.0.1
- pbkdf-1.1.1.1
- postgresql-libpq-0.9.2.0
- postgresql-simple-0.5.2.1
- resource-pool-catchio-0.2.1.0
- secp256k1-0.4.5
- snaplet-postgresql-simple-0.6.0.4
- unix-compat-0.4.3.1
- vector-th-unbox-0.2.1.6
resolver: lts-5.3
- heist-1.0.1.0
- map-syntax-0.2.0.1
- snap-1.0.0.1
- snaplet-postgresql-simple-1.0.1.0
resolver: lts-7.16