Modularize & update to recent haskoin.
[?]
Mar 13, 2019, 5:24 PM
B6HWAPDPXIWH7CHK5VLMWLL6EQN6NOFZEFYO47BPUY2ZO4SL7VDACDependencies
- [2]
UOG5H2TWDefault work logging credit to logged-in user. - [3]
IPG33FAWAdd billing daemon - [4]
2MNO5FUYUpgrade LTS version - [5]
JFOEOFGAstylish-haskell formatting. - [6]
GKGVYBZGAdded JSON serialization to TimeLog - [7]
AL37SVTCImplement payments service endpoints. - [8]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [9]
MGOF7IUFUpdate TASKS list to reflect completed projects. - [10]
5OI44E4EAdd authentication to auction search. - [11]
3QVT6MA6Add database support for event amend operations. - [12]
5W5M56VJMove library code to 'lib' - [13]
75N3UJ4JMore progression toward lenses. - [14]
NAS4BFL4Trivial stylish-haskell reformat. - [15]
JUUMYIQEAdd groupBy utility function for use in TimeLog. - [16]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [17]
7XN3I3QJAdd 'loggedIntervals' endpoint. - [18]
F2XLL7XWRemove Ord Bid & sort in favor of sortBy - [19]
7DBNV3GVInitial, stack-based impl of time log event reduction. - [20]
EMVTF2IWWIP moving back to snap. - [21]
V2VDN77HEnable postgres configuration via environment variable for Heroku. - [22]
LHJ2HFXVAdd property test for auction algorithm. - [23]
7VGYLTMUClean up schema version handling. - [24]
Y3LIJ5USAdd handler for CreatePaymentRequest - [25]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [26]
I2KHGVD4Require project permissions for access to most data. - [27]
PBD7LZYQPostgres & auth are beginning to function. - [28]
WZUHEZSBStart of migration back toward snap. - [29]
MB5SHULBAdd route for accepting an invitation with an existing account - [30]
5DRIWGLUImproving TimeLog specs - [31]
POX3UAMTEnabling logging of time to contributor/project accounts - [32]
Q5X5RYQLstylish-haskell reformatting - [33]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [34]
BWN72T44Don't accept work timestamp from an external source. - [35]
4FDQGIXNMake payment request retrieval key an opaque 32-bit hash. - [36]
WZFQDWW4Add retrieval/storage of current exchange rate data to payment recording. - [37]
UILI6PILThe route-based logStart/logStop is nicer. - [38]
M4KM76DGMerge branch 'stackify' - [39]
TLQ72DSJLenses, sqlite-simple - [40]
4IQVQL4TAdded client for payouts endpoint. - [41]
P6NR2CGXBeginning of implementation of depreciation. - [42]
N4NDAZYTInitial implementation of payouts. - [43]
WFZDMVUXRename ADB -> QDB - [44]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [45]
KEP5WUFJConvert project to stack-based build. - [46]
XTBSG4C7Adding serveJSON combinator to eliminate some boilerplate from handlers. - [47]
7HPY3QPFFix linting errors. (yay hlint!) - [48]
2OIPAQCBMerge branch 'master' of github.com:nuttycom/ananke - [49]
A6HKMINBAttempting to improve JSON handling. - [50]
O722AOKEAdd route to allow crediting of events to users/projects. - [51]
EKI57EJRAdd alternative implementation of auction winner determination. - [52]
HBULCDN6Add tests for auction winner determination algorithm. - [53]
Z7KS5XHHVery WIP. Wow. - [54]
HALRDT2FAdded initial auction create route. - [55]
HO2PFRABClient login now handles response correctly. - [56]
SCXG6TJWMake log reduction safer in presence of overlapping events. - [57]
KNSI575VCleanup of EventLog types. - [58]
IZEVQF62Work in progress replacing sqlite with postgres. - [59]
NEDDHXUKReformat via stylish-haskell - [60]
ADMKQQGCInitial empty Snap project. - [61]
2G3GNDDUEvent logging is now functioning in postgres. - [62]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [63]
OV5AKJHARemove unused LogInterval type. - [64]
SEWTRB6SImplement payment request creation functions. - [65]
RN7EI6INUpdate database layer to use CreditTo - [66]
2Y2QZFVFSwitch to more modern cabal2nix-based workflow. - [67]
QADKFHARAdds CreatePayment handler implementation. - [68]
ASF3UPJLAdd auction creation and bid handlers - [69]
FXJQACESEnsure that auction is not ended at the time of bid - [70]
EW2XN7KUUpdate docker build, clean up migration for payments tables. - [71]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [72]
LAROLAYUWIP - [73]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [74]
NTPC7KJETrivial changes, feature scratchpad. - [75]
EQXRXRZDChanged to use tasty instead of test-framework - [76]
TNR3TEHKSwitch to Postgres + snaplet arch compiles. - [77]
EZQG2APBUpdate task list. - [78]
DFOBMSAOInitial work on payments API - [79]
KQQAITFHUpgrade snap dependency. - [80]
Z3MK2PJ5Add GET handler for retrieving auction data. - [81]
WAIX6AGNAdd event serialization for PaymentRequest & Payment - [82]
WO2MINIFAuctions now compile! - [83]
FD7SV5I6Fix handling of event_t columns. - [84]
NVOCQVASInitial failing tests. - [85]
GLFF5ZDKFactor winningBids for easier testing. - [86]
ZITLSTYXFix problems with SQL queries & depreciation function parsing. - [87]
EKY7U7SKFinish conversion to stack. - [88]
HMDM3B55Implement core of payments/billing infrastructure. - [89]
BXGLKYRXAdded primitive user registration handler. - [90]
4QX5E5ACInitial compilation of payouts function succeeds. - [91]
RSEB2NFGReplacing Snap with Scotty. - [92]
SLL7262CMake depreciation functions more flexible. - [93]
OBFPJS2GProject successfully builds and tests under nix. - [94]
BROSTG5KBeginning of modularization of server. - [95]
73NDXDEZBegin implementation of billing event persistence. - [96]
VJPT6HDRFix remaining type errors after addition of login handler. - [97]
W35DDBFYFactor common JSON conversions up into client lib module. - [98]
5XFJNUAZStart of addition of project infrastructure. - [99]
LD4GLVSFMore database stuff. - [100]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [101]
ZP62WC47Begin conversion to build with stack. - [102]
BSIUHCGFAdd payment response handler. - [103]
NLZ3JXLOFix formatting with stylish-haskell. - [104]
O227CEAVAdds storage of original event JSON for some DBOp constructors. - [*]
LEINLS3XUpdate deployment documentation. - [*]
SOIAMXLWBuild versioned docker images. - [*]
UUR6SMCAAdd start of specs for auctions. - [*]
MJ6R42RCUtility methods for reading key & cert data. - [*]
6L5BK5EHUse generic SMTP rather than Sendmail-specific mail client. - [*]
AXKKXBWNInitial attempt at writing down my ideas for a company based on trust.
Change contents
- edit in Makefile at line 3
format:find lib test server daemon -name \*.hs -exec brittany --write-mode=inplace {} \; - replacement in aftok.cabal at line 12
Cabal-version: >= 1.22Cabal-version: >= 2.0 - replacement in aftok.cabal at line 23
exposed-modules: AftokAftok.Auctionexposed-modules: Aftok.Auction - edit in aftok.cabal at line 26
Aftok.CurrencyAftok.Currency.Bitcoin - edit in aftok.cabal at line 30
Aftok.Database.PostgreSQL.Types - edit in aftok.cabal at line 37
Aftok.TimeLog.Serialization - edit in aftok.cabal at line 59
, from-sum - edit in aftok.cabal at line 166
, haskoin-core - edit in aftok.cabal at line 219
, haskoin-core - replacement in daemon/AftokD/AftokM.hs at line 7
import ClassyPreludeimport ClassyPrelude - replacement in daemon/AftokD/AftokM.hs at line 22
import Network.Mail.Mimeimport Network.Mail.SMTP as SMTPimport qualified Network.Mail.Mime as Mimeimport qualified Network.Mail.SMTP as SMTP - replacement in daemon/AftokD/AftokM.hs at line 25
import Text.StringTemplateimport Network.Haskoin.Address (Address)import Text.StringTemplate (directoryGroup, newSTMP, getStringTemplate, setManyAttrib, render) - replacement in daemon/AftokD/AftokM.hs at line 31
import Aftok (User, UserId, userEmail, _Email)import Aftok.Types (satoshi)import Aftok.Types (User, UserId, ProjectId(..), userEmail, _Email)import Aftok.Currency.Bitcoin (NetworkId, satoshi) - replacement in daemon/AftokD/AftokM.hs at line 39
import Aftok.Project (Project, ProjectId(..), projectName)import Aftok.Project (Project, projectName) - replacement in daemon/AftokD/AftokM.hs at line 53
data AftokMEnv = AftokMEnvdata AftokMEnv = AftokMEnv - replacement in daemon/AftokD/AftokM.hs at line 61
network = pcfg . P.networknetworkMode = pcfg . P.networkMode - replacement in daemon/AftokD/AftokM.hs at line 76
liftQDBM (QDBM r) =AftokM . mapReaderT (withExceptT DBErr) . withReaderT _conn $ rliftQDBM (QDBM r) = dolet f a = (a ^. dcfg . D.billingConfig . AC.networkMode, a ^. conn)AftokM . mapReaderT (withExceptT DBErr) . withReaderT f $ r - replacement in daemon/AftokD/AftokM.hs at line 113
let mailer = maybe (sendMailWithLogin _smtpHost) (sendMailWithLogin' _smtpHost) _smtpPortlet mailer = maybe (SMTP.sendMailWithLogin _smtpHost) (SMTP.sendMailWithLogin' _smtpHost) _smtpPort - replacement in daemon/AftokD/AftokM.hs at line 115
- replacement in daemon/AftokD/AftokM.hs at line 118
-> P.PaymentRequest' (Subscription' User (Billable' Project UserId Satoshi))-> P.PaymentRequest' (Subscription' (User (NetworkId, Address)) (Billable' Project UserId Satoshi)) - replacement in daemon/AftokD/AftokM.hs at line 120
-> m Mail-> m Mime.Mail - replacement in daemon/AftokD/AftokM.hs at line 127
Just template ->Just template -> - replacement in daemon/AftokD/AftokM.hs at line 132
setAttrs = setManyAttribsetAttrs = setManyAttrib - replacement in daemon/AftokD/AftokM.hs at line 139
fromAddr = Address Nothing ("billing@aftok.com")toAddr = Address Nothing (toEmail ^. _Email)fromAddr = Mime.Address Nothing ("billing@aftok.com")toAddr = Mime.Address Nothing (toEmail ^. _Email) - replacement in daemon/AftokD/AftokM.hs at line 142
body = plainTextPart . render $ setAttrs templatebody = SMTP.plainTextPart . render $ setAttrs template - replacement in daemon/AftokD/AftokM.hs at line 145
memoGen :: Subscription' UserId Billable-> T.Day-> C.UTCTimememoGen :: Subscription' UserId Billable-> T.Day-> C.UTCTime - replacement in daemon/AftokD/AftokM.hs at line 152
setAttrs = setManyAttribsetAttrs = setManyAttrib - replacement in daemon/AftokD.hs at line 14
import Aftok (Email(..))import Aftok.Types (Email(..)) - replacement in daemon/AftokD.hs at line 33
loadConfig cfgFile =loadConfig cfgFile = - replacement in daemon/AftokD.hs at line 37
readConfig cfg = ConfigreadConfig cfg = Config - replacement in daemon/AftokD.hs at line 39
<*> (AC.readBillingConfig $ C.subconfig "billing" cfg)<*> (AC.readBillingConfig $ C.subconfig "billing" cfg) - file deletion: Quixotic.hs Aftok.hs Ananke.hs Quixotic.hs[5.1]→[5.207:242](∅→∅),[5.242]→[5.2457:2457](∅→∅),[5.1]→[5.1924:1956](∅→∅),[5.1956]→[5.2457:2457](∅→∅),[5.4286]→[5.2849:2882](∅→∅),[5.2882]→[5.2457:2457](∅→∅),[5.4286]→[5.5517:5552](∅→∅),[5.5552]→[5.2457:2457](∅→∅)
{-# LANGUAGE DeriveDataTypeable #-}{-# LANGUAGE NoImplicitPrelude #-}{-# LANGUAGE TemplateHaskell #-}module Aftok whereimport ClassyPreludeimport Control.Lens (makeLenses, makePrisms)import Data.Aesonimport Data.Aeson.Typesimport Data.Dataimport Data.UUIDimport Network.Haskoin.Crypto (Address (..), base58ToAddr)newtype BtcAddr = BtcAddr Address deriving (Show, Eq, Ord)makePrisms ''BtcAddrparseBtcAddr :: Text -> Maybe BtcAddrparseBtcAddr addr = BtcAddr <$> (base58ToAddr . encodeUtf8) addrinstance FromJSON BtcAddr whereparseJSON v = dot <- parseJSON vmaybe (fail $ show t <> " is not a valid BTC address") pure $ parseBtcAddr tnewtype Months = Months Integerderiving (Eq, Show, Data, Typeable)data DepreciationFunction = LinearDepreciation Months Monthsderiving (Eq, Show, Data, Typeable)newtype UserId = UserId UUID deriving (Show, Eq, Ord)makePrisms ''UserIdnewtype UserName = UserName Text deriving (Show, Eq)makePrisms ''UserNamenewtype Email = Email Text deriving (Show, Eq)makePrisms ''Emaildata User = User{ _username :: !UserName, _userAddress :: !(Maybe BtcAddr), _userEmail :: !Email}makeLenses ''User-- | others tbdinstance ToJSON DepreciationFunction wheretoJSON (LinearDepreciation (Months up) (Months dp)) =object [ "type" .= ("LinearDepreciation" :: Text), "arguments" .= object [ "undep" .= up, "dep" .= dp]]instance FromJSON DepreciationFunction whereparseJSON (Object v) = dot <- v .: "type" :: Parser Textargs <- v .: "arguments"case unpack t of"LinearDepreciation" ->let undep = Months <$> (args .: "undep")dep = Months <$> (args .: "dep")in LinearDepreciation <$> undep <*> depx -> fail $ "No depreciation function recognized for type " <> xparseJSON _ = mzero - replacement in lib/Aftok/Auction.hs at line 5
import ClassyPreludeimport ClassyPrelude hiding (rem) - replacement in lib/Aftok/Auction.hs at line 8
import Data.Hourglassimport Data.Hourglass (Seconds(..))import Data.Ratio ((%))import Data.Traversable (for) - replacement in lib/Aftok/Auction.hs at line 15
import Aftok (UserId)import Aftok.Project (ProjectId)import Aftok.Types (Satoshi (..))import Aftok.Types (UserId, ProjectId)import Aftok.Currency.Bitcoin (satoshi, ssub)import Network.Bippy.Types (Satoshi(..)) - replacement in lib/Aftok/Auction.hs at line 40
} deriving (Eq, Show)} deriving (Eq) - replacement in lib/Aftok/Auction.hs at line 52
deriving (Show, Eq)deriving (Eq) - replacement in lib/Aftok/Auction.hs at line 56
foldl' (\s b -> s + (b^.bidAmount)) (Satoshi 0) bidsfoldl' (\s b -> s <> (b^.bidAmount)) (Satoshi 0) bids - replacement in lib/Aftok/Auction.hs at line 63
btc bid = toRational $ bid ^. bidAmountbtc bid = toRational $ bid ^. bidAmount . satoshi - replacement in lib/Aftok/Auction.hs at line 75
| total + (bid ^. bidAmount) < raiseAmount' =bid : takeWinningBids (total + (bid ^. bidAmount)) xs| total <> (bid ^. bidAmount) < raiseAmount' =bid : takeWinningBids (total <> (bid ^. bidAmount)) xs - replacement in lib/Aftok/Auction.hs at line 80[5.228]→[5.228:275](∅→∅),[5.275]→[5.282:459](∅→∅),[5.158]→[5.925:926](∅→∅),[5.459]→[5.925:926](∅→∅),[5.677]→[5.925:926](∅→∅),[5.925]→[5.925:926](∅→∅),[5.926]→[5.460:538](∅→∅),[5.538]→[5.1080:1081](∅→∅),[5.754]→[5.1080:1081](∅→∅),[5.999]→[5.1080:1081](∅→∅),[5.1080]→[5.1080:1081](∅→∅)
let remainder = raiseAmount' - totalwinFraction = toRational remainder / toRational (bid ^. bidAmount)remainderSeconds = Seconds . round $ winFraction * toRational (bid ^. bidSeconds)in [bid & bidSeconds .~ remainderSeconds & bidAmount .~ remainder]let winFraction rem = rem % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi rem) = Seconds . round $ winFraction rem * fromIntegral (bid ^. bidSeconds)adjustBid rem = bid & bidSeconds .~ remainderSeconds rem & bidAmount .~ remin toList $ adjustBid <$> raiseAmount' `ssub` total - replacement in lib/Aftok/Auction.hs at line 89
in if submittedTotal >= raiseAmount'then WinningBids $ takeWinningBids 0 $ sortBy bidOrder bidselse InsufficientBids (raiseAmount' - submittedTotal)in maybe(WinningBids $ takeWinningBids (Satoshi 0) $ sortBy bidOrder bids)InsufficientBids(raiseAmount' `ssub` submittedTotal) - replacement in lib/Aftok/Auction.hs at line 99
x | x + (bid ^. bidAmount) < raiseAmount' ->put (x + bid ^. bidAmount) >>x | x <> (bid ^. bidAmount) < raiseAmount' ->put (x <> bid ^. bidAmount) >> - replacement in lib/Aftok/Auction.hs at line 105
let remainder = raiseAmount' - xwinFraction = toRational remainder / toRational (bid ^. bidAmount)remainderSeconds = Seconds . round $ winFraction * toRational (bid ^. bidSeconds)in put (x + remainder) >>(pure . Just $ Commitment bid (remainderSeconds) remainder)let winFraction rem = rem % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi rem) = Seconds . round $ winFraction rem * fromIntegral (bid ^. bidSeconds)in for (raiseAmount' `ssub` x) $ \remainder ->put (x <> remainder) *>(pure $ Commitment bid (remainderSeconds remainder) remainder) - replacement in lib/Aftok/Billables.hs at line 17
import Aftok (UserId)import Aftok.Project (ProjectId)import Aftok.Types (Satoshi)import Aftok.Types (UserId, ProjectId)import Network.Bippy.Types (Satoshi) - replacement in lib/Aftok/Billables.hs at line 84
}} - replacement in lib/Aftok/Config.hs at line 9
import qualified Data.Configurator.Types as CTimport qualified Data.Configurator.Types as C - replacement in lib/Aftok/Config.hs at line 12
import Database.PostgreSQL.Simple (ConnectInfo(..))import Filesystem.Path.CurrentOS (FilePath, fromText, encodeString)import Database.PostgreSQL.Simple (ConnectInfo(..))import Filesystem.Path.CurrentOS (FilePath, fromText, encodeString) - edit in lib/Aftok/Config.hs at line 19
import Aftok.Currency.Bitcoin (NetworkMode) - replacement in lib/Aftok/Config.hs at line 31
{ _network :: BT.Network{ _networkMode :: NetworkMode - replacement in lib/Aftok/Config.hs at line 35
}} - replacement in lib/Aftok/Config.hs at line 38
readSmtpConfig :: CT.Config -> IO SmtpConfigreadSmtpConfig :: C.Config -> IO SmtpConfig - replacement in lib/Aftok/Config.hs at line 45
readBillingConfig :: CT.Config -> IO BillingConfigreadBillingConfig :: C.Config -> IO BillingConfig - replacement in lib/Aftok/Config.hs at line 47
BillingConfig <$> (parseNetwork <$> C.require cfg "network")BillingConfig <$> C.require cfg "networkMode" - edit in lib/Aftok/Config.hs at line 51
where parseNetwork :: String -> BT.NetworkparseNetwork "main" = BT.MainNetparseNetwork _ = BT.TestNet - replacement in lib/Aftok/Config.hs at line 52
readConnectInfo :: CT.Config -> IO ConnectInforeadConnectInfo :: C.Config -> IO ConnectInfo - replacement in lib/Aftok/Config.hs at line 66
Just (PrivKeyDSA _) -> fail "DSA keys not supported for payment request signing."Nothing -> fail $ "No keys found in private key file " <> encodeString (c ^. signingKeyFile)Just _ -> fail $ "Only RSA keys are currently supported for payment request signing."Nothing -> fail $ "No keys found in private key file " <> encodeString (c ^. signingKeyFile) - replacement in lib/Aftok/Config.hs at line 69
pure $ PaymentsConfig (c ^. network) privKey pkiData[3.13405]pure $ PaymentsConfig (c ^. networkMode) privKey pkiData - file addition: Currency[5.679]
- file addition: Bitcoin.hs[0.4250]
{-# LANGUAGE GeneralizedNewtypeDeriving #-}{-# LANGUAGE LambdaCase #-}{-# LANGUAGE TemplateHaskell #-}module Aftok.Currency.Bitcoin whereimport ClassyPreludeimport qualified Data.Configurator.Types as Cimport Control.Lensimport Network.Bippy.Types (Satoshi (..))import Network.Haskoin.Constantssatoshi :: Lens' Satoshi Word64satoshi inj (Satoshi value) = Satoshi <$> inj valuessub :: Satoshi -> Satoshi -> Maybe Satoshissub (Satoshi a) (Satoshi b) | a > b = Just . Satoshi $ (a - b)ssub _ _ = Nothingdata NetworkId= BTC| BCHderiving (Eq, Show, Ord)renderNetworkId :: NetworkId -> TextrenderNetworkId = \caseBTC -> "btc"BCH -> "bch"parseNetworkId :: Text -> Maybe NetworkIdparseNetworkId = \case"btc" -> Just BTC"bch" -> Just BCH_ -> Nothingdata NetworkMode= LiveMode| TestModeparseNetworkMode :: Text -> Maybe NetworkModeparseNetworkMode = \case"test" -> Just TestMode"live" -> Just LiveMode_ -> Nothinginstance C.Configured NetworkMode whereconvert (C.String t) = parseNetworkMode tconvert _ = NothingtoNetwork :: NetworkMode -> NetworkId -> NetworktoNetwork LiveMode = \caseBTC -> btcBCH -> bchtoNetwork TestMode = \caseBTC -> btcTestBCH -> bchTesttoNetworkId :: Network -> Maybe NetworkIdtoNetworkId n = case getNetworkName n of"btc" -> Just BTC"btcTest" -> Just BTC"bch" -> Just BCH"bchTest" -> Just BCH_ -> Nothing - file addition: Currency.hs[5.679]
module Aftok.Currency whereimport Data.Aeson (Value)import Data.Aeson.Types (Parser)data Network a = Network{ addressFromJSON :: Parser a, addressToJSON :: a -> Value} - file addition: PostgreSQL[5.988]
- file addition: Types.hs[0.6049]
module Aftok.Database.PostgreSQL.Types whereimport ClassyPrelude hiding (null)import Data.Aeson (FromJSON(..), ToJSON(..))import Aftok.TimeLog.Serialization (depfFromJSON, depfToJSON)import Aftok.Types (DepreciationFunction)newtype SerDepFunction = SerDepFunction { unSerDepFunction :: DepreciationFunction }instance FromJSON SerDepFunction whereparseJSON v = SerDepFunction <$> depfFromJSON vinstance ToJSON SerDepFunction wheretoJSON (SerDepFunction depf) = depfToJSON depf - replacement in lib/Aftok/Database/PostgreSQL.hs at line 7
import ClassyPreludeimport ClassyPrelude hiding (null) - edit in lib/Aftok/Database/PostgreSQL.hs at line 27
import Network.Haskoin.Crypto (addrToBase58) - edit in lib/Aftok/Database/PostgreSQL.hs at line 28
import Aftok - edit in lib/Aftok/Database/PostgreSQL.hs at line 30
import Aftok.Currency.Bitcoin - edit in lib/Aftok/Database/PostgreSQL.hs at line 32
import Aftok.Database.PostgreSQL.Types (SerDepFunction(..)) - edit in lib/Aftok/Database/PostgreSQL.hs at line 42
import Network.Bippy.Types (Satoshi(..))import Network.Haskoin.Address (Address, stringToAddr, addrToString)import Network.Haskoin.Constants (Network) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 46
newtype QDBM a = QDBM (ReaderT Connection (ExceptT DBError IO) a)newtype QDBM a = QDBM (ReaderT (NetworkMode, Connection) (ExceptT DBError IO) a) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 58
runQDBM :: Connection -> QDBM a -> ExceptT DBError IO arunQDBM conn (QDBM r) = runReaderT r connrunQDBM :: NetworkMode -> Connection -> QDBM a -> ExceptT DBError IO arunQDBM mode conn (QDBM r) = runReaderT r (mode, conn)null :: RowParser Nullnull = field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 67
btcAddrParser :: FieldParser BtcAddrbtcAddrParser f v = doaddrMay <- parseBtcAddr <$> fromField f vnetworkIdParser :: FieldParser NetworkIdnetworkIdParser f b = donetworkName <- fromField f bcase networkName ofJust "btc" -> pure BTCJust "bch" -> pure BCHJust other -> returnError ConversionFailed f ("Network identifier " <> other <> " is not supported.")Nothing -> pure BTCaddressParser :: NetworkMode -> RowParser (NetworkId, Address)addressParser mode = donetworkId <- fieldWith (networkIdParser)address <- fieldWith $ addrFieldParser (toNetwork mode networkId)pure (networkId, address)addrFieldParser :: Network -> FieldParser AddressaddrFieldParser n f v = doaddrMay <- stringToAddr n <$> fromField f v - replacement in lib/Aftok/Database/PostgreSQL.hs at line 102
else maybe (returnError UnexpectedNull f "event type may not be null") (nameEvent . decodeUtf8) velse maybe (returnError UnexpectedNull f "event type may not be null")(maybe (returnError Incompatible f "unrecognized event type value") pure . nameEvent . decodeUtf8)v - replacement in lib/Aftok/Database/PostgreSQL.hs at line 110
creditToParser :: RowParser CreditTocreditToParser = join $ fieldWith creditToParser'creditToParser :: NetworkMode -> RowParser (CreditTo (NetworkId, Address))creditToParser mode = join $ fieldWith (creditToParser' mode) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 113[5.294]→[5.294:346](∅→∅),[5.346]→[5.1326:1348](∅→∅),[5.371]→[5.2050:2093](∅→∅),[5.1348]→[5.2050:2093](∅→∅),[5.2050]→[5.2050:2093](∅→∅),[5.2093]→[3.13923:14031](∅→∅),[3.14031]→[5.1537:1742](∅→∅),[5.2201]→[5.1537:1742](∅→∅)
creditToParser' :: FieldParser (RowParser CreditTo)creditToParser' f v =let parser :: Text -> RowParser CreditToparser "credit_to_address" = CreditToAddress <$> (fieldWith btcAddrParser <* nullField <* nullField)parser "credit_to_user" = CreditToUser <$> (nullField *> idParser UserId <* nullField)parser "credit_to_project" = CreditToProject <$> (nullField *> nullField *> idParser P.ProjectId)creditToParser' :: NetworkMode -> FieldParser (RowParser (CreditTo (NetworkId, Address)))creditToParser' mode f v =let parser :: Text -> RowParser (CreditTo (NetworkId, Address))parser "credit_to_address" =CreditToCurrency <$> (addressParser mode <* nullField <* nullField)parser "credit_to_user" =CreditToUser <$> (nullField *> nullField *> idParser UserId <* nullField)parser "credit_to_project" =CreditToProject <$> (nullField *> nullField *> nullField *> idParser ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 129[5.1683]→[5.241:278](∅→∅),[5.224]→[5.241:278](∅→∅),[5.278]→[5.1911:1928](∅→∅),[5.1928]→[5.372:402](∅→∅)
logEntryParser :: RowParser LogEntrylogEntryParser =LogEntry <$> creditToParserlogEntryParser :: NetworkMode -> RowParser (LogEntry (NetworkId, Address))logEntryParser mode =LogEntry <$> creditToParser mode - replacement in lib/Aftok/Database/PostgreSQL.hs at line 135
qdbLogEntryParser :: RowParser KeyedLogEntryqdbLogEntryParser =(,,) <$> idParser P.ProjectIdqdbLogEntryParser :: NetworkMode -> RowParser (KeyedLogEntry (NetworkId, Address))qdbLogEntryParser mode =(,,) <$> idParser ProjectId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 139
<*> logEntryParser<*> logEntryParser mode - replacement in lib/Aftok/Database/PostgreSQL.hs at line 143
A.Auction <$> idParser P.ProjectIdA.Auction <$> idParser ProjectId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 157
userParser :: RowParser UseruserParser =userParser :: NetworkMode -> RowParser BTCUseruserParser mode = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 160
<*> fieldWith (optionalField btcAddrParser)<*> ((null *> null *> pure Nothing) <|> fmap Just (addressParser mode)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 168
<*> fieldWith fromJSONField<*> (unSerDepFunction <$> fieldWith fromJSONField) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 172
P.Invitation <$> idParser P.ProjectIdP.Invitation <$> idParser ProjectId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 180
B.Billable <$> idParser P.ProjectIdB.Billable <$> idParser ProjectId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 226
conn <- askconn <- asks snd - replacement in lib/Aftok/Database/PostgreSQL.hs at line 231[5.412]→[5.3172:3186](∅→∅),[5.554]→[5.3172:3186](∅→∅),[5.1232]→[5.3172:3186](∅→∅),[5.1546]→[5.3172:3186](∅→∅),[5.3172]→[5.3172:3186](∅→∅)
conn <- askconn <- asks snd - replacement in lib/Aftok/Database/PostgreSQL.hs at line 237
conn <- askconn <- asks snd - replacement in lib/Aftok/Database/PostgreSQL.hs at line 242[5.580]→[5.1320:1334](∅→∅),[5.1694]→[5.1320:1334](∅→∅),[5.2726]→[5.1320:1334](∅→∅),[5.1320]→[5.1320:1334](∅→∅),[5.1334]→[3.14079:14153](∅→∅)
conn <- asklift . ExceptT $ withTransaction conn (runExceptT $ runReaderT rt conn)env <- asklift . ExceptT $ withTransaction (snd env) (runExceptT $ runReaderT rt env) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 265
pinsert EventId[sql| INSERT INTO aftok_events(event_time, created_by, event_type, event_json)pinsert EventId[sql| INSERT INTO aftok_events(event_time, created_by, event_type, event_json) - edit in lib/Aftok/Database/PostgreSQL.hs at line 270
askNetworkMode :: QDBM NetworkModeaskNetworkMode = QDBM $ asks fst - replacement in lib/Aftok/Database/PostgreSQL.hs at line 275
pgEval (CreateEvent (P.ProjectId pid) (UserId uid) (LogEntry c e m)) =pgEval (CreateEvent (ProjectId pid) (UserId uid) (LogEntry c e m)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 277
CreditToAddress addr ->pinsert EventId[sql| INSERT INTO work_eventsCreditToCurrency (nid, addr) -> domode <- askNetworkModelet network = toNetwork mode nidpinsert EventId[sql| INSERT INTO work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 283
, event_type, event_time, event_metadata )VALUES (?, ?, ?, ?, ?, ?, ?), event_type, event_time, event_metadata )VALUES (?, ?, ?, ?, ?, ?, ?) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 286
( pid, uid, creditToName c, addr ^. _BtcAddr . to addrToBase58, eventName e, fromThyme $ e ^. eventTime, m)( pid, uid, creditToName c, addrToString network addr, eventName e, fromThyme $ e ^. eventTime, m) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 296
pinsert EventId[sql| INSERT INTO work_eventspinsert EventId[sql| INSERT INTO work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 299
, event_type, event_time, event_metadata )VALUES (?, ?, ?, ?, ?, ?, ?), event_type, event_time, event_metadata )VALUES (?, ?, ?, ?, ?, ?, ?) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 302
( pid, uid, creditToName c, pid' ^. P._ProjectId, eventName e, fromThyme $ e ^. eventTime, m)( pid, uid, creditToName c, pid' ^. _ProjectId, eventName e, fromThyme $ e ^. eventTime, m) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 305
pinsert EventId[sql| INSERT INTO work_events(project_id, user_id, credit_to_type, credit_to_user_id, event_type, event_time, event_metadata)VALUES (?, ?, ?, ?, ?, ?, ?)pinsert EventId[sql| INSERT INTO work_events(project_id, user_id, credit_to_type, credit_to_user_id, event_type, event_time, event_metadata)VALUES (?, ?, ?, ?, ?, ?, ?) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 312
pgEval (FindEvent (EventId eid)) =headMay <$> pquery qdbLogEntryParser[sql| SELECT project_id, user_id,credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadata FROM work_eventspgEval (FindEvent (EventId eid)) = domode <- askNetworkModeheadMay <$> pquery (qdbLogEntryParser mode)[sql| SELECT project_id, user_id,credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadata FROM work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 321
pgEval (FindEvents (P.ProjectId pid) (UserId uid) ival) =let q (Before e) = pquery logEntryParser[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time,event_metadataFROM work_eventspgEval (FindEvents (ProjectId pid) (UserId uid) ival) = domode <- askNetworkModelet q (Before e) = pquery (logEntryParser mode)[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time,event_metadataFROM work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 330
q (During s e) = pquery logEntryParser[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_eventsWHERE project_id = ? AND user_id = ?q (During s e) = pquery (logEntryParser mode)[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_eventsWHERE project_id = ? AND user_id = ? - replacement in lib/Aftok/Database/PostgreSQL.hs at line 337
q (After s) = pquery logEntryParser[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_eventsq (After s) = pquery (logEntryParser mode)[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 343
in q ivalq ival - replacement in lib/Aftok/Database/PostgreSQL.hs at line 346
pinsert AmendmentId[sql| INSERT INTO event_time_amendments(event_id, amended_at, event_time)pinsert AmendmentId[sql| INSERT INTO event_time_amendments(event_id, amended_at, event_time) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 352
pgEval (AmendEvent (EventId eid) (CreditToChange mt c)) =pgEval (AmendEvent (EventId eid) (CreditToChange mt c)) = domode <- askNetworkMode - replacement in lib/Aftok/Database/PostgreSQL.hs at line 355
CreditToAddress addr ->pinsert AmendmentId[sql| INSERT INTO event_credit_to_amendments(event_id, amended_at, credit_to_type, credit_to_btc_addr)CreditToCurrency (nid, addr) -> dolet network = toNetwork mode nidpinsert AmendmentId[sql| INSERT INTO event_credit_to_amendments(event_id, amended_at, credit_to_type, credit_to_btc_addr) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 361
( eid, fromThyme $ mt ^. _ModTime, creditToName c, addr ^. _BtcAddr . to addrToBase58 )( eid, fromThyme $ mt ^. _ModTime, creditToName c, addrToString network addr ) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 364
pinsert AmendmentId[sql| INSERT INTO event_credit_to_amendments(event_id, amended_at, credit_to_type, credit_to_project_id)pinsert AmendmentId[sql| INSERT INTO event_credit_to_amendments(event_id, amended_at, credit_to_type, credit_to_project_id) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 368
( eid, fromThyme $ mt ^. _ModTime, creditToName c, pid ^. P._ProjectId )( eid, fromThyme $ mt ^. _ModTime, creditToName c, pid ^. _ProjectId ) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 371
pinsert AmendmentId[sql| INSERT INTO event_credit_to_amendments(event_id, amended_at, credit_to_type, credit_to_user_id)pinsert AmendmentId[sql| INSERT INTO event_credit_to_amendments(event_id, amended_at, credit_to_type, credit_to_user_id) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 378
pinsert AmendmentId[sql| INSERT INTO event_metadata_amendments(event_id, amended_at, event_metadata)pinsert AmendmentId[sql| INSERT INTO event_metadata_amendments(event_id, amended_at, event_metadata) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 384
pgEval (ReadWorkIndex (P.ProjectId pid)) = dologEntries <- pquery logEntryParser[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_eventspgEval (ReadWorkIndex (ProjectId pid)) = domode <- askNetworkModelogEntries <- pquery (logEntryParser mode)[sql| SELECT credit_to_type, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 395
pinsert A.AuctionId[sql| INSERT INTO auctions (project_id, initiator_id, raise_amount, end_time)pinsert A.AuctionId[sql| INSERT INTO auctions (project_id, initiator_id, raise_amount, end_time) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 398
( auc ^. (A.projectId . P._ProjectId)( auc ^. (A.projectId . _ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 405
headMay <$> pquery auctionParser[sql| SELECT project_id, initiator_id, created_at, raise_amount, start_time, end_timeFROM auctionsheadMay <$> pquery auctionParser[sql| SELECT project_id, initiator_id, created_at, raise_amount, start_time, end_timeFROM auctions - replacement in lib/Aftok/Database/PostgreSQL.hs at line 412
pinsert A.BidId[sql| INSERT INTO bids (auction_id, bidder_id, bid_seconds, bid_amount, bid_time)pinsert A.BidId[sql| INSERT INTO bids (auction_id, bidder_id, bid_seconds, bid_amount, bid_time) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 423
pquery ((,) <$> idParser A.BidId <*> bidParser)pquery ((,) <$> idParser A.BidId <*> bidParser) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 427[5.705]→[5.4816:4844](∅→∅),[5.4844]→[5.9214:9327](∅→∅),[5.9214]→[5.9214:9327](∅→∅),[5.9327]→[3.18198:18307](∅→∅)
pgEval (CreateUser user') =let addrMay :: Maybe ByteStringaddrMay = user' ^? (userAddress . traverse . _BtcAddr . to addrToBase58)in pinsert UserId[sql| INSERT INTO users (handle, btc_addr, email) VALUES (?, ?, ?) RETURNING id |]pgEval (CreateUser user') = domode <- askNetworkModelet nidMay = fst <$> _userAddress user'addrMay :: Maybe TextaddrMay = donetwork <- toNetwork mode <$> nidMayaddress <- snd <$> _userAddress user'pure $ addrToString network addresspinsert UserId[sql| INSERT INTO users (handle, network, addr, email)VALUES (?, ?, ?, ?) RETURNING id |] - edit in lib/Aftok/Database/PostgreSQL.hs at line 439
, renderNetworkId <$> nidMay - replacement in lib/Aftok/Database/PostgreSQL.hs at line 444
pgEval (FindUser (UserId uid)) =headMay <$> pquery userParserpgEval (FindUser (UserId uid)) = domode <- askNetworkModeheadMay <$> pquery (userParser mode) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 450
pgEval (FindUserByName (UserName h)) =headMay <$> pquery ((,) <$> idParser UserId <*> userParser)pgEval (FindUserByName (UserName h)) = domode <- askNetworkModeheadMay <$> pquery ((,) <$> idParser UserId <*> userParser mode) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 456
pgEval (CreateInvitation (P.ProjectId pid) (UserId uid) (Email e) t) = dopgEval (CreateInvitation (ProjectId pid) (UserId uid) (Email e) t) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 458
void $ pexec[sql| INSERT INTO invitations (project_id, invitor_id, invitee_email, invitation_key, invitation_time)void $ pexec[sql| INSERT INTO invitations (project_id, invitor_id, invitee_email, invitation_key, invitation_time) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 465
headMay <$> pquery invitationParser[sql| SELECT project_id, invitor_id, invitee_email, invitation_time, acceptance_timeheadMay <$> pquery invitationParser[sql| SELECT project_id, invitor_id, invitee_email, invitation_time, acceptance_time - replacement in lib/Aftok/Database/PostgreSQL.hs at line 471
void $ pexecvoid $ pexec - replacement in lib/Aftok/Database/PostgreSQL.hs at line 475
void $ pexec[sql| INSERT INTO project_companions (project_id, user_id, invited_by, joined_at)SELECT i.project_id, ?, i.invitor_id, ?FROM invitations ivoid $ pexec[sql| INSERT INTO project_companions (project_id, user_id, invited_by, joined_at)SELECT i.project_id, ?, i.invitor_id, ?FROM invitations i - replacement in lib/Aftok/Database/PostgreSQL.hs at line 483
pinsert P.ProjectId[sql| INSERT INTO projects (project_name, inception_date, initiator_id, depreciation_fn)pinsert ProjectId[sql| INSERT INTO projects (project_name, inception_date, initiator_id, depreciation_fn) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 486
(p ^. P.projectName, p ^. (P.inceptionDate . to fromThyme), p ^. (P.initiator . _UserId), toJSON $ p ^. P.depf)( p ^. P.projectName, p ^. (P.inceptionDate . to fromThyme), p ^. (P.initiator . _UserId), toJSON $ p ^. P.depf . to SerDepFunction) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 493
pquery (idParser P.ProjectId)pquery (idParser ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 499
[sql| SELECT s.user_idFROM subscripions sJOIN billables b ON s.billable_id = b.id[sql| SELECT s.user_idFROM subscripions sJOIN billables b ON s.billable_id = b.id - replacement in lib/Aftok/Database/PostgreSQL.hs at line 503
(Only (pid ^. P._ProjectId))(Only (pid ^. _ProjectId)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 505
pgEval (FindProject (P.ProjectId pid)) =headMay <$> pquery projectParserpgEval (FindProject (ProjectId pid)) =headMay <$> pquery projectParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 511
pquery ((,) <$> idParser P.ProjectId <*> projectParser)[sql| SELECT p.id, p.project_name, p.inception_date, p.initiator_id, p.depreciation_fnFROM projects p LEFT OUTER JOIN project_companions pc ON pc.project_id = p.idWHERE pc.user_id = ?pquery ((,) <$> idParser ProjectId <*> projectParser)[sql| SELECT p.id, p.project_name, p.inception_date, p.initiator_id, p.depreciation_fnFROM projects p LEFT OUTER JOIN project_companions pc ON pc.project_id = p.idWHERE pc.user_id = ? - replacement in lib/Aftok/Database/PostgreSQL.hs at line 519
pexecpexec - replacement in lib/Aftok/Database/PostgreSQL.hs at line 521
(pid ^. P._ProjectId, new ^. _UserId, current ^. _UserId)(pid ^. _ProjectId, new ^. _UserId, current ^. _UserId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 523
pgEval dbop @ (CreateBillable _ b) = dopgEval dbop@(CreateBillable _ b) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 525
pinsert B.BillableId[sql| INSERT INTO billables( project_id, event_id, name, description, recurrence_type, recurrence_countpinsert B.BillableId[sql| INSERT INTO billables( project_id, event_id, name, description, recurrence_type, recurrence_count - replacement in lib/Aftok/Database/PostgreSQL.hs at line 531
, payment_request_memo_template), payment_request_memo_template) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 533
( b ^. (B.project . P._ProjectId)( b ^. (B.project . _ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 546
headMay <$> pquery billableParser[sql| SELECT b.project_id, e.created_by, b.name, b.description,b.recurrence_type, b.recurrence_count,headMay <$> pquery billableParser[sql| SELECT b.project_id, e.created_by, b.name, b.description,b.recurrence_type, b.recurrence_count, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 551
FROM billables b JOIN aftok_events e ON e.id = b.event_idFROM billables b JOIN aftok_events e ON e.id = b.event_id - replacement in lib/Aftok/Database/PostgreSQL.hs at line 555
pgEval (FindBillables pid) =pquery ((,) <$> idParser B.BillableId <*> billableParser)[sql| SELECT b.id, b.project_id, e.created_by, b.name, b.description,b.recurrence_type, b.recurrence_count,b.billing_amount, b.grace_period_dayspgEval (FindBillables pid) =pquery ((,) <$> idParser B.BillableId <*> billableParser)[sql| SELECT b.id, b.project_id, e.created_by, b.name, b.description,b.recurrence_type, b.recurrence_count,b.billing_amount, b.grace_period_days - replacement in lib/Aftok/Database/PostgreSQL.hs at line 561
FROM billables b JOIN aftok_events e ON e.id = b.event_idFROM billables b JOIN aftok_events e ON e.id = b.event_id - replacement in lib/Aftok/Database/PostgreSQL.hs at line 563
(Only (pid ^. P._ProjectId))(Only (pid ^. _ProjectId)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 565
pgEval dbop @ (CreateSubscription uid bid start_date) = dopgEval dbop@(CreateSubscription uid bid start_date) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 567
pinsert B.SubscriptionId[sql| INSERT INTO subscriptions(user_id, billable_id, event_id, start_date)pinsert B.SubscriptionId[sql| INSERT INTO subscriptions(user_id, billable_id, event_id, start_date) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 578
headMay <$> pquery subscriptionParser[sql| SELECT id, billable_id, start_date, end_dateFROM subscriptions sheadMay <$> pquery subscriptionParser[sql| SELECT id, billable_id, start_date, end_dateFROM subscriptions s - replacement in lib/Aftok/Database/PostgreSQL.hs at line 585
pquery ((,) <$> idParser B.SubscriptionId <*> subscriptionParser)[sql| SELECT s.id, user_id, billable_id, start_date, end_dateFROM subscriptions sJOIN billables b ON b.id = s.billable_idWHERE s.user_id = ?pquery ((,) <$> idParser B.SubscriptionId <*> subscriptionParser)[sql| SELECT s.id, user_id, billable_id, start_date, end_dateFROM subscriptions sJOIN billables b ON b.id = s.billable_idWHERE s.user_id = ? - replacement in lib/Aftok/Database/PostgreSQL.hs at line 591
(uid ^. _UserId, pid ^. P._ProjectId)(uid ^. _UserId, pid ^. _ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 594
pgEval dbop @ (CreatePaymentRequest req) = dopgEval dbop@(CreatePaymentRequest req) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 596
pinsert PaymentRequestId[sql| INSERT INTO payment_requests(subscription_id, event_id, request_data, url_key, request_time, billing_date)pinsert PaymentRequestId[sql| INSERT INTO payment_requests(subscription_id, event_id, request_data, url_key, request_time, billing_date) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 609
headMay <$> pquery ((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_dateFROM payment_requestsWHERE url_key = ?headMay <$> pquery ((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_dateFROM payment_requestsWHERE url_key = ? - replacement in lib/Aftok/Database/PostgreSQL.hs at line 618
[sql| SELECT subscription_id, request_data, url_key, request_time, billing_dateFROM payment_requests[sql| SELECT subscription_id, request_data, url_key, request_time, billing_dateFROM payment_requests - replacement in lib/Aftok/Database/PostgreSQL.hs at line 624
pquery ((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_dateFROM payment_requestspquery ((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_dateFROM payment_requests - replacement in lib/Aftok/Database/PostgreSQL.hs at line 636
in pquery rowp[sql| SELECT r.url_key,r.subscription_id, r.request_data, r.url_key, r.request_time, r.billing_date,s.user_id, s.billable_id, s.start_date, s.end_date,b.project_id, e.created_by, b.name, b.description, b.recurrence_type,in pquery rowp[sql| SELECT r.url_key,r.subscription_id, r.request_data, r.url_key, r.request_time, r.billing_date,s.user_id, s.billable_id, s.start_date, s.end_date,b.project_id, e.created_by, b.name, b.description, b.recurrence_type, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 643
FROM payment_requests rJOIN subscriptions s on s.id = r.subscription_idJOIN billables b on b.id = s.billable_idFROM payment_requests rJOIN subscriptions s on s.id = r.subscription_idJOIN billables b on b.id = s.billable_id - replacement in lib/Aftok/Database/PostgreSQL.hs at line 647
WHERE subscription_id = ?WHERE subscription_id = ? - replacement in lib/Aftok/Database/PostgreSQL.hs at line 651
pgEval dbop @ (CreatePayment p) = dopgEval dbop@(CreatePayment p) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 653
pinsert PaymentId[sql| INSERT INTO payments(payment_request_id, event_id, payment_data, payment_date, exchange_rates)pinsert PaymentId[sql| INSERT INTO payments(payment_request_id, event_id, payment_data, payment_date, exchange_rates) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 665
pquery ((,) <$> idParser PaymentId <*> paymentParser)[sql| SELECT id, payment_request_id, payment_data, payment_dateFROM paymentspquery ((,) <$> idParser PaymentId <*> paymentParser)[sql| SELECT id, payment_request_id, payment_data, payment_dateFROM payments - replacement in lib/Aftok/Database.hs at line 17
import Aftokimport Aftok.Types - edit in lib/Aftok/Database.hs at line 20
import Aftok.Currency.Bitcoin (NetworkId) - replacement in lib/Aftok/Database.hs at line 27
type KeyedLogEntry = (ProjectId, UserId, LogEntry)type InvitingUID = UserIdtype InvitedUID = UserIdimport Network.Haskoin.Address (Address)type KeyedLogEntry a = (ProjectId, UserId, LogEntry a)type InvitingUID = UserIdtype InvitedUID = UserIdtype BTCNet = (NetworkId, Address)type BTCUser = User BTCNet - replacement in lib/Aftok/Database.hs at line 37
CreateUser :: User -> DBOp UserIdFindUser :: UserId -> DBOp (Maybe User)FindUserByName :: UserName -> DBOp (Maybe (UserId, User))CreateUser :: BTCUser -> DBOp UserIdFindUser :: UserId -> DBOp (Maybe BTCUser)FindUserByName :: UserName -> DBOp (Maybe (UserId, BTCUser)) - replacement in lib/Aftok/Database.hs at line 51
CreateEvent :: ProjectId -> UserId -> LogEntry -> DBOp EventIdAmendEvent :: EventId -> EventAmendment -> DBOp AmendmentIdFindEvent :: EventId -> DBOp (Maybe KeyedLogEntry)FindEvents :: ProjectId -> UserId -> Interval' -> DBOp [LogEntry]ReadWorkIndex :: ProjectId -> DBOp WorkIndexCreateEvent :: ProjectId -> UserId -> LogEntry BTCNet -> DBOp EventIdAmendEvent :: EventId -> EventAmendment BTCNet -> DBOp AmendmentIdFindEvent :: EventId -> DBOp (Maybe (KeyedLogEntry BTCNet))FindEvents :: ProjectId -> UserId -> Interval' -> DBOp [LogEntry BTCNet]ReadWorkIndex :: ProjectId -> DBOp (WorkIndex BTCNet) - replacement in lib/Aftok/Database.hs at line 111
createUser :: (MonadDB m) => User -> m UserIdcreateUser :: (MonadDB m) => BTCUser -> m UserId - replacement in lib/Aftok/Database.hs at line 114
findUser :: (MonadDB m) => UserId -> MaybeT m UserfindUser :: (MonadDB m) => UserId -> MaybeT m BTCUser - replacement in lib/Aftok/Database.hs at line 117
findUserByName :: (MonadDB m) => UserName -> MaybeT m (UserId, User)findUserByName :: (MonadDB m) => UserName -> MaybeT m (UserId, BTCUser) - replacement in lib/Aftok/Database.hs at line 192
createEvent :: (MonadDB m) => ProjectId -> UserId -> LogEntry -> m EventIdcreateEvent :: (MonadDB m) => ProjectId -> UserId -> LogEntry BTCNet -> m EventId - replacement in lib/Aftok/Database.hs at line 195
amendEvent :: (MonadDB m) => UserId -> EventId -> EventAmendment -> m AmendmentIdamendEvent :: (MonadDB m) => UserId -> EventId -> EventAmendment BTCNet -> m AmendmentId - replacement in lib/Aftok/Database.hs at line 203
findEvent :: (MonadDB m) => EventId -> m (Maybe KeyedLogEntry)findEvent :: (MonadDB m) => EventId -> m (Maybe (KeyedLogEntry BTCNet)) - replacement in lib/Aftok/Database.hs at line 206
findEvents :: (MonadDB m) => ProjectId -> UserId -> Interval' -> m [LogEntry]findEvents :: (MonadDB m) => ProjectId -> UserId -> Interval' -> m [LogEntry BTCNet] - replacement in lib/Aftok/Database.hs at line 209
readWorkIndex :: (MonadDB m) => ProjectId -> UserId -> m WorkIndexreadWorkIndex :: (MonadDB m) => ProjectId -> UserId -> m (WorkIndex BTCNet) - replacement in lib/Aftok/Database.hs at line 257
_ <- lift $ checkProjectAuth (auc ^. A.projectId) uid findOp_ <- lift $ checkProjectAuth (auc ^. A.projectId) uid findOp - edit in lib/Aftok/Json.hs at line 3
{-# LANGUAGE LambdaCase #-} - edit in lib/Aftok/Json.hs at line 6
{-# LANGUAGE TupleSections #-} - replacement in lib/Aftok/Json.hs at line 11
import ClassyPrelude hiding (Day)import ClassyPrelude hiding (Day, fail, fromEitherM, UTCTime) - edit in lib/Aftok/Json.hs at line 13
import Control.FromSum (fromMaybeM, fromEitherM) - edit in lib/Aftok/Json.hs at line 15
import Control.Monad.Fail (MonadFail(..)) - replacement in lib/Aftok/Json.hs at line 29
import Data.Thyme.Clock as Cimport Data.Thyme.Clock as Clock - replacement in lib/Aftok/Json.hs at line 33
import Aftokimport Network.Haskoin.Address (Address, addrToJSON, addrFromJSON, stringToAddr)import Aftok.Currency.Bitcoin - replacement in lib/Aftok/Json.hs at line 53
instance Show Version whereshow Version{..} = intercalate "." $ fmap show [majorVersion, minorVersion]failT :: Text -> Parser afailT = fail . T.unpackprintVersion :: Version -> TextprintVersion Version{..} = T.intercalate "." $ fmap (pack . show) [majorVersion, minorVersion] - replacement in lib/Aftok/Json.hs at line 62
version :: QuasiQuoterversion = QuasiQuoter { quoteExp = quoteVersionExp, quotePat = error "Pattern quasiquotation of versions not supported.", quoteType = error "Type quasiquotation of versions not supported.", quoteDec = error "Dec quasiquotation of versions not supported."}version :: MonadFail m => ByteString -> m Versionversion = fromEitherM fail . PC.parseOnly versionParserv :: QuasiQuoterv = QuasiQuoter { quoteExp = quoteVersionExp, quotePat = error "Pattern quasiquotation of versions not supported.", quoteType = error "Type quasiquotation of versions not supported.", quoteDec = error "Dec quasiquotation of versions not supported."} - replacement in lib/Aftok/Json.hs at line 75
v <- either (fail . show) pure $ PC.parseOnly versionParser (C.pack s)dataToExpQ (const Nothing) vver <- version $ C.pack sdataToExpQ (const Nothing) ver - replacement in lib/Aftok/Json.hs at line 79
versioned ver o = Object $ uncurry O.insert ("schemaVersion" .= tshow ver) oversioned ver o = Object $ uncurry O.insert ("schemaVersion" .= printVersion ver) o - replacement in lib/Aftok/Json.hs at line 88
vers <- either fail pure $ PC.parseOnly versionParser (encodeUtf8 verstr)vers <- fromEitherM fail $ PC.parseOnly versionParser (encodeUtf8 verstr) - replacement in lib/Aftok/Json.hs at line 107
badVersion name ver = const . fail $ "Unrecognized " <> name <> " schema version: " <> show verbadVersion name ver =const . fail $ "Unrecognized " <> name <> " schema version: " <> unpack (printVersion ver) - replacement in lib/Aftok/Json.hs at line 119
idValue l a = toJSON . tshow $ view l aidValue l a = toJSON . U.toText $ view l a - edit in lib/Aftok/Json.hs at line 156
---- CreditTo-- - replacement in lib/Aftok/Json.hs at line 161[5.2561]→[5.1090:1124](∅→∅),[5.1124]→[5.1803:1894](∅→∅),[5.1894]→[5.2065:2157](∅→∅),[5.2157]→[5.1989:2079](∅→∅),[5.1989]→[5.1989:2079](∅→∅)
creditToJSON :: CreditTo -> ValuecreditToJSON (CreditToAddress addr) = v2 $ obj [ "creditToAddress" .= (addr ^. _BtcAddr) ]creditToJSON (CreditToUser uid) = v2 $ obj [ "creditToUser" .= idValue _UserId uid ]creditToJSON (CreditToProject pid) = v2 $ obj [ "creditToProject" .= projectIdJSON pid ]creditToJSON :: NetworkMode -> CreditTo (NetworkId, Address) -> ValuecreditToJSON nmode (CreditToCurrency (netId, addr)) =v2 $ obj [ "creditToAddress" .= addrToJSON (toNetwork nmode netId) addr, "creditToNetwork" .= renderNetworkId netId]creditToJSON _ (CreditToUser uid) =v2 $ obj [ "creditToUser" .= idValue _UserId uid ]creditToJSON _ (CreditToProject pid) =v2 $ obj [ "creditToProject" .= projectIdJSON pid ]parseCreditTo :: NetworkMode -> Value -> Parser (CreditTo (NetworkId, Address))parseCreditTo nmode = unversion "CreditTo" $ \case(Version 1 0) -> parseCreditToV1 nmode(Version 2 0) -> parseCreditToV2 nmodever -> badVersion "EventAmendment" verparseBtcAddr:: NetworkMode-> NetworkId-> Text-> Parser (CreditTo (NetworkId, Address))parseBtcAddr nmode net addrText =maybe(fail . unpack $ "Address " <> addrText <> " cannot be parsed as a BTC network address.")(pure . CreditToCurrency . (net,))(stringToAddr (toNetwork nmode net) addrText)parseCreditToV1:: NetworkMode-> Object-> Parser (CreditTo (NetworkId, Address))parseCreditToV1 nmode x = doparseBtcAddr nmode BTC =<< x .: "btcAddr"parseCreditToV2 :: NetworkMode -> Object -> Parser (CreditTo (NetworkId, Address))parseCreditToV2 nmode o =let parseCreditToAddr = donetName <- o .: "creditToNetwork"net <- fromMaybeM(fail . T.unpack $ "Currency network " <> netName <> " not recognized.")(parseNetworkId netName)addrValue <- o .: "creditToAddress"CreditToCurrency . (net,) <$> addrFromJSON (toNetwork nmode net) addrValueparseCreditToUser =fmap CreditToUser . parseId _UserId =<< o .: "creditToUser"parseCreditToProject =fmap CreditToProject . parseId _ProjectId =<< o .: "creditToProject"notFound = fail $ "Value " <> show o <> " does not represent a CreditTo value."in parseCreditToAddr <|> parseCreditToUser <|> parseCreditToProject <|> notFound---- Payouts-- - replacement in lib/Aftok/Json.hs at line 219
payoutsJSON :: Payouts -> ValuepayoutsJSON (Payouts m) = v2 $let payoutsRec :: (CreditTo, Rational) -> ValuepayoutsRec (c, r) = object [ "creditTo" .= creditToJSON cpayoutsJSON :: NetworkMode -> Payouts (NetworkId, Address)-> ValuepayoutsJSON nmode (Payouts m) = v2 $let payoutsRec :: (CreditTo (NetworkId, Address), Rational) -> ValuepayoutsRec (c, r) = object [ "creditTo" .= creditToJSON nmode c - edit in lib/Aftok/Json.hs at line 226
parsePayoutsJSON :: NetworkMode -> Value -> Parser (Payouts (NetworkId, Address))parsePayoutsJSON nmode = unversion "Payouts" $ p wherep :: Version -> Object -> Parser (Payouts (NetworkId, Address))p (Version 1 _) val =Payouts <$> join (traverseKeys (parseBtcAddr nmode BTC) <$> parseJSON (Object val))p (Version 2 0) val =let parsePayoutRecord x = (,) <$> (parseCreditToV2 nmode =<< (x .: "creditTo"))<*> (x .: "payoutRatio")in Payouts . MS.fromList <$> (traverse parsePayoutRecord =<< parseJSON (Object val))p ver x =badVersion "Payouts" ver x - replacement in lib/Aftok/Json.hs at line 241
workIndexJSON :: WorkIndex -> ValueworkIndexJSON (WorkIndex widx) = v2 $let widxRec :: (CreditTo, NonEmpty Interval) -> ValuewidxRec (c, l) = object [ "creditTo" .= creditToJSON c---- WorkIndex--workIndexJSON :: NetworkMode -> WorkIndex (NetworkId, Address) -> ValueworkIndexJSON nmode (WorkIndex widx) = v2 $let widxRec :: (CreditTo (NetworkId, Address), NonEmpty Interval) -> ValuewidxRec (c, l) = object [ "creditTo" .= creditToJSON nmode c - replacement in lib/Aftok/Json.hs at line 259[5.255]→[5.1799:1833](∅→∅),[5.1799]→[5.1799:1833](∅→∅),[5.1833]→[5.1059:1097](∅→∅),[5.1097]→[5.2236:2274](∅→∅),[5.1665]→[5.2236:2274](∅→∅)
logEntryJSON :: LogEntry -> ValuelogEntryJSON (LogEntry c ev m) = v2 $obj [ "creditTo" .= creditToJSON clogEntryJSON :: NetworkMode -> LogEntry (NetworkId, Address) -> ValuelogEntryJSON nmode (LogEntry c ev m) = v2 $obj [ "creditTo" .= creditToJSON nmode c - replacement in lib/Aftok/Json.hs at line 283
, "requestExpiryPeriod" .= (C.toSeconds' <$> (b ^. B.requestExpiryPeriod)), "requestExpiryPeriod" .= (Clock.toSeconds' <$> (b ^. B.requestExpiryPeriod)) - replacement in lib/Aftok/Json.hs at line 328
wherewhere - replacement in lib/Aftok/Json.hs at line 353
wherewhere - replacement in lib/Aftok/Json.hs at line 360
parseUUID v = dostr <- parseJSON vparseUUID val = dostr <- parseJSON val - replacement in lib/Aftok/Json.hs at line 365[3.27264]→[3.27264:27305](∅→∅),[5.2031]→[5.2133:2134](∅→∅),[5.5724]→[5.2133:2134](∅→∅),[3.27305]→[5.2133:2134](∅→∅),[5.2133]→[5.2133:2134](∅→∅),[5.2134]→[5.2381:2423](∅→∅),[5.2423]→[5.1098:1145](∅→∅),[5.1145]→[5.2471:2596](∅→∅),[5.2471]→[5.2471:2596](∅→∅),[5.2596]→[5.1146:1191](∅→∅),[5.1191]→[5.5128:5201](∅→∅),[5.5201]→[5.2722:2768](∅→∅),[5.2722]→[5.2722:2768](∅→∅),[5.2768]→[5.1192:1241](∅→∅),[5.1241]→[5.5202:5277](∅→∅),[5.5277]→[5.2901:2902](∅→∅),[5.2901]→[5.2901:2902](∅→∅),[5.2902]→[5.1242:1271](∅→∅),[5.1271]→[3.27306:27381](∅→∅),[3.27381]→[5.3012:3013](∅→∅),[5.3012]→[5.3012:3013](∅→∅),[5.3013]→[5.1272:1304](∅→∅),[5.1304]→[3.27382:27466](∅→∅),[3.27466]→[5.3135:3350](∅→∅),[5.3135]→[5.3135:3350](∅→∅),[5.3350]→[5.5725:5769](∅→∅),[5.2134]→[5.5725:5769](∅→∅),[5.5769]→[5.3351:3443](∅→∅),[5.3443]→[5.1958:1980](∅→∅),[5.1980]→[5.5301:5347](∅→∅),[5.5301]→[5.5301:5347](∅→∅),[5.5347]→[5.1981:2143](∅→∅),[5.2143]→[5.5512:5633](∅→∅),[5.5512]→[5.5512:5633](∅→∅),[5.5633]→[5.2144:2145](∅→∅),[5.2145]→[5.1305:1327](∅→∅),[5.5638]→[5.1305:1327](∅→∅),[5.3539]→[5.1305:1327](∅→∅),[5.1327]→[5.3563:3752](∅→∅),[5.3563]→[5.3563:3752](∅→∅)
parseId p = fmap (review p) . parseUUIDparseCreditTo :: Value -> Parser CreditToparseCreditTo = unversion "CreditTo" $ p wherep (Version 1 0) = parseCreditToV1p (Version 2 0) = parseCreditToV2p ver = badVersion "EventAmendment" verparseCreditToV1 :: Object -> Parser CreditToparseCreditToV1 x = CreditToAddress <$> (parseJSON =<< (x .: "btcAddr"))parseCreditToV2 :: Object -> Parser CreditToparseCreditToV2 o =let parseCreditToAddr o' =fmap CreditToAddress . parseJSON <$> O.lookup "creditToAddress" o'parseCreditToUser o' =fmap CreditToUser . parseId _UserId <$> O.lookup "creditToUser" o'parseCreditToProject o' =fmap CreditToProject . parseId _ProjectId <$> O.lookup "creditToProject" o'notFound = fail $ "Value " <> show o <> " does not represent a CreditTo value."parseV v = (parseCreditToAddr v <|> parseCreditToUser v <|> parseCreditToProject v)in fromMaybe notFound $ parseV oparsePayoutsJSON :: Value -> Parser PayoutsparsePayoutsJSON = unversion "Payouts" $ p wherep :: Version -> Object -> Parser Payoutsp (Version 1 _) v =let parseKey :: String -> Parser CreditToparseKey k = maybe(fail $ "Key " <> k <> " cannot be parsed as a valid BTC address.")(pure . CreditToAddress)(parseBtcAddr $ T.pack k)in Payouts <$> join (traverseKeys parseKey <$> parseJSON (Object v))p (Version 2 0) v =let parsePayoutRecord x = (,) <$> (parseCreditToV2 =<< (x .: "creditTo")) <*> x .: "payoutRatio"in Payouts . MS.fromList <$> (traverse parsePayoutRecord =<< parseJSON (Object v))parseId p = fmap (review p) . parseUUID - replacement in lib/Aftok/Json.hs at line 367[5.5640]→[5.2146:2158](∅→∅),[5.2158]→[5.5653:5684](∅→∅),[5.5653]→[5.5653:5684](∅→∅),[5.1744]→[5.5859:5925](∅→∅),[5.1774]→[5.5859:5925](∅→∅),[5.3791]→[5.5859:5925](∅→∅),[5.4400]→[5.5859:5925](∅→∅),[5.5684]→[5.5859:5925](∅→∅),[5.5859]→[5.5859:5925](∅→∅),[5.5925]→[5.3792:3941](∅→∅)
p ver x =badVersion "Payouts" ver xparseEventAmendment :: ModTime -> Value -> Parser EventAmendmentparseEventAmendment t = unversion "EventAmendment" $ p wherep (Version 1 _) = parseEventAmendmentV1 tp (Version 2 0) = parseEventAmendmentV2 tparseEventAmendment:: NetworkMode-> ModTime-> Value-> Parser (EventAmendment (NetworkId, Address))parseEventAmendment nmode t = unversion "EventAmendment" $ p wherep (Version 1 _) = parseEventAmendmentV1 nmode tp (Version 2 0) = parseEventAmendmentV2 nmode t - replacement in lib/Aftok/Json.hs at line 377
parseEventAmendmentV1 :: ModTime -> Object -> Parser EventAmendmentparseEventAmendmentV1 t o =let parseA :: Text -> Parser EventAmendmentparseEventAmendmentV1:: NetworkMode-> ModTime-> Object-> Parser (EventAmendment (NetworkId, Address))parseEventAmendmentV1 nmode t o =let parseA :: Text -> Parser (EventAmendment (NetworkId, Address)) - replacement in lib/Aftok/Json.hs at line 385
parseA "addrChange" = CreditToChange t <$> parseCreditToV1 oparseA "addrChange" = CreditToChange t <$> parseCreditToV1 nmode o - replacement in lib/Aftok/Json.hs at line 387
parseA tid = fail . show $ "Amendment type " <> tid <> " not recognized."parseA tid = fail . unpack $ "Amendment type " <> tid <> " not recognized." - replacement in lib/Aftok/Json.hs at line 390
parseEventAmendmentV2 :: ModTime -> Object -> Parser EventAmendmentparseEventAmendmentV2 t o =let parseA :: Text -> Parser EventAmendmentparseEventAmendmentV2:: NetworkMode-> ModTime-> Object-> Parser (EventAmendment (NetworkId, Address))parseEventAmendmentV2 nmode t o =let parseA :: Text -> Parser (EventAmendment (NetworkId, Address)) - replacement in lib/Aftok/Json.hs at line 398
parseA "creditToChange" = CreditToChange t <$> parseCreditToV2 oparseA "creditToChange" = CreditToChange t <$> parseCreditToV2 nmode o - replacement in lib/Aftok/Json.hs at line 400
parseA tid = fail . show $ "Amendment type " <> tid <> " not recognized."parseA tid = fail . unpack $ "Amendment type " <> tid <> " not recognized." - replacement in lib/Aftok/Json.hs at line 403
parseLogEntry :: UserId -> (C.UTCTime -> LogEvent) -> Value -> Parser (C.UTCTime -> LogEntry)parseLogEntry uid f = unversion "LogEntry" p whereparseLogEntry:: NetworkMode-> UserId-> (UTCTime -> LogEvent)-> Value-> Parser (UTCTime -> (LogEntry (NetworkId, Address)))parseLogEntry nmode uid f = unversion "LogEntry" p where - replacement in lib/Aftok/Json.hs at line 411
creditTo' <- o .:? "creditTo" >>= maybe (pure $ CreditToUser uid) parseCreditToV2creditTo' <- o .:? "creditTo" >>= maybe (pure $ CreditToUser uid) (parseCreditToV2 nmode) - replacement in lib/Aftok/Json.hs at line 415
p v o = badVersion "LogEntry" v op ver o = badVersion "LogEntry" ver o - replacement in lib/Aftok/Json.hs at line 418
parseRecurrence o =parseRecurrence o = - replacement in lib/Aftok/Json.hs at line 425
parseV v = parseAnnually v <|> parseMonthly v <|> parseWeekly v <|> parseOneTime vparseV val = parseAnnually val<|> parseMonthly val<|> parseWeekly val<|> parseOneTime val - replacement in lib/Aftok/Json.hs at line 433
parseRecurrence' v = fail $ "Value " <> show v <> " is not a JSON object."[3.28162]parseRecurrence' val = fail $ "Value " <> show val <> " is not a JSON object." - replacement in lib/Aftok/Payments/Types.hs at line 21
import Network.Haskoin.Crypto (decodeBase58Check)import Network.Haskoin.Address.Base58 (decodeBase58Check) - replacement in lib/Aftok/Payments/Types.hs at line 70
parsePaymentKey bs = (PaymentKey . decodeUtf8) <$> decodeBase58Check bsparsePaymentKey bs = (PaymentKey . decodeUtf8) <$> decodeBase58Check (decodeUtf8 bs) - replacement in lib/Aftok/Payments.hs at line 29
import Network.Haskoin.Crypto (encodeBase58Check)import Network.Haskoin.Address (Address(..))import Network.Haskoin.Address.Base58 (encodeBase58Check) - replacement in lib/Aftok/Payments.hs at line 34
import Aftok (BtcAddr (..), UserId, userAddress,_BtcAddr)import Aftok.Types (UserId, ProjectId, userAddress) - edit in lib/Aftok/Payments.hs at line 36
import Aftok.Currency.Bitcoin (NetworkId(..), NetworkMode, satoshi, toNetwork) - replacement in lib/Aftok/Payments.hs at line 39
import Aftok.Project (ProjectId, depf)import Aftok.Project (depf) - edit in lib/Aftok/Payments.hs at line 41
import Aftok.Types (satoshi) - replacement in lib/Aftok/Payments.hs at line 43
{ _network :: !BT.Network, _signingKey :: !RSA.PrivateKey, _pkiData :: !BT.PKIData{ _networkMode :: !NetworkMode, _signingKey :: !RSA.PrivateKey, _pkiData :: !BT.PKIData - replacement in lib/Aftok/Payments.hs at line 56
, uriGen :: PaymentKey -- ^ payment key to be included in the URL, uriGen :: PaymentKey -- ^ payment key to be included in the URL - replacement in lib/Aftok/Payments.hs at line 62
-> m (Maybe ByteString)-> m (Maybe ByteString) - edit in lib/Aftok/Payments.hs at line 73
| IllegalAddress !Address - replacement in lib/Aftok/Payments.hs at line 128
pkey <- PaymentKey . decodeUtf8 . encodeBase58Check <$> getRandomBytes 32pkey <- PaymentKey . encodeBase58Check <$> getRandomBytes 32 - replacement in lib/Aftok/Payments.hs at line 172[5.12639]→[3.30227:30316](∅→∅),[5.4754]→[5.12728:13149](∅→∅),[3.30316]→[5.12728:13149](∅→∅),[5.12728]→[5.12728:13149](∅→∅),[5.13149]→[5.14275:14318](∅→∅),[5.14275]→[5.14275:14318](∅→∅)
createPaymentDetails :: (MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadDB m)=> T.Day -- ^ payout date (billing date)-> C.UTCTime -- ^ timestamp of payment request creation-> Maybe Text -- ^ user memo-> Maybe URI -- ^ payment response URL-> Maybe ByteString -- ^ merchant payload-> Billable -- ^ billing information-> m P.PaymentDetailscreatePaymentDetails:: ( MonadRandom m, MonadReader r m , HasPaymentsConfig r, MonadError e m, AsPaymentError e, MonadDB m)=> T.Day -- ^ payout date (billing date)-> C.UTCTime -- ^ timestamp of payment request creation-> Maybe Text -- ^ user memo-> Maybe URI -- ^ payment response URL-> Maybe ByteString -- ^ merchant payload-> Billable -- ^ billing information-> m P.PaymentDetails - replacement in lib/Aftok/Payments.hs at line 191
(cfg ^. network)(toNetwork (cfg ^. networkMode) BTC) - replacement in lib/Aftok/Payments.hs at line 199
getProjectPayouts :: (MonadDB m) => C.UTCTime -> ProjectId -> m TL.PayoutsgetProjectPayouts:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime-> ProjectId-> m (TL.Payouts (NetworkId, Address)) - replacement in lib/Aftok/Payments.hs at line 213
createPayoutsOutputs :: (MonadDB m) => C.UTCTime -> BT.Satoshi -> TL.Payouts -> m [BT.Output]createPayoutsOutputs:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime-> BT.Satoshi-> TL.Payouts (NetworkId, Address)-> m [BT.Output] - replacement in lib/Aftok/Payments.hs at line 220
let payoutFractions :: [(TL.CreditTo, BT.Satoshi)]let payoutFractions :: [(TL.CreditTo (NetworkId, Address), BT.Satoshi)] - replacement in lib/Aftok/Payments.hs at line 226
createOutputs :: (MonadDB m) => C.UTCTime -> TL.CreditTo -> BT.Satoshi -> m [BT.Output]createOutputs _ (TL.CreditToAddress (BtcAddr addr)) amt =createOutputs:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime-> TL.CreditTo (NetworkId, Address)-> BT.Satoshi-> m [BT.Output]createOutputs _ (TL.CreditToCurrency (BTC, (PubKeyAddress addr))) amt = - edit in lib/Aftok/Payments.hs at line 235
createOutputs _ (TL.CreditToCurrency (_, other)) _ =throwError $ review _IllegalAddress other - replacement in lib/Aftok/Payments.hs at line 240
addr <- MaybeT . pure $ user ^. userAddresspure $ BT.Output amt (PayPKHash (addr ^. _BtcAddr))addr <- MaybeT . pure . fmap snd $ user ^. userAddresscase addr ofPubKeyAddress a -> pure $ BT.Output amt (PayPKHash a)other -> throwError $ review _IllegalAddress other - edit in lib/Aftok/Project.hs at line 12
import Data.UUIDimport Aftok - replacement in lib/Aftok/Project.hs at line 13
newtype ProjectId = ProjectId UUID deriving (Show, Eq, Ord)makePrisms ''ProjectIdimport Aftok.Types - file addition: TimeLog[5.679]
- file addition: Serialization.hs[0.29316]
{-# LANGUAGE LambdaCase #-}{-# LANGUAGE NoImplicitPrelude #-}module Aftok.TimeLog.Serialization( depfFromJSON, depfToJSON) whereimport ClassyPreludeimport Control.Applicative ((<*>))import Data.Aeson (Value(..), (.=), (.:), object)import Data.Aeson.Types (Parser)import Data.Functor ((<$>))import Aftok.TypesdepfToJSON :: DepreciationFunction -> ValuedepfToJSON = \caseLinearDepreciation (Months up) (Months dp) ->object [ "type" .= ("LinearDepreciation" :: Text), "arguments" .= object [ "undep" .= up, "dep" .= dp]]depfFromJSON :: Value -> Parser DepreciationFunctiondepfFromJSON = \caseObject v -> dot <- v .: "type" :: Parser Textargs <- v .: "arguments"case unpack t of"LinearDepreciation" ->let undep = Months <$> (args .: "undep")dep = Months <$> (args .: "dep")in LinearDepreciation <$> undep <*> depx -> fail $ "No depreciation function recognized for type " <> x_ ->fail $ "Cannot interpret non-object value as a depreciation function." - replacement in lib/Aftok/TimeLog.hs at line 1
{-# LANGUAGE DeriveDataTypeable #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE NoImplicitPrelude #-} - replacement in lib/Aftok/TimeLog.hs at line 7
, CreditTo(..), _CreditToAddress, _CreditToUser, _CreditToProject, creditToName, CreditTo(..), _CreditToCurrency, _CreditToUser, _CreditToProject, creditToName - replacement in lib/Aftok/TimeLog.hs at line 20
import ClassyPreludeimport Control.Arrow ((&&&)) - edit in lib/Aftok/TimeLog.hs at line 25
import Data.Eq (Eq, (==))import Data.Either (Either(..), rights) - edit in lib/Aftok/TimeLog.hs at line 28
import Data.Function (($), (.), id)import Data.Functor (fmap) - edit in lib/Aftok/TimeLog.hs at line 32
import Data.Maybe (Maybe(..)) - replacement in lib/Aftok/TimeLog.hs at line 34
import Data.Ratio ()import Data.Ord (Ord(..), Ordering(..))import Data.Ratio (Rational)import Data.Text (Text) - edit in lib/Aftok/TimeLog.hs at line 40
import Prelude ((/), (*))import Text.Show (Show) - edit in lib/Aftok/TimeLog.hs at line 43
import Aftok - replacement in lib/Aftok/TimeLog.hs at line 44
import Aftok.Project (ProjectId)import Aftok.Typestype NDT = C.NominalDiffTime - edit in lib/Aftok/TimeLog.hs at line 48
{-|- The depreciation function should return a value between 0 and 1;- this result is multiplied by the length of an interval of work to determine- the depreciated value of the work.-}type DepF = C.UTCTime -> Interval -> NDT - edit in lib/Aftok/TimeLog.hs at line 69[5.1694]→[5.3806:3807](∅→∅),[5.3806]→[5.3806:3807](∅→∅),[5.3807]→[5.1695:1757](∅→∅),[5.1757]→[5.990:1059](∅→∅),[5.1059]→[5.3928:3954](∅→∅),[5.3928]→[5.3928:3954](∅→∅),[5.3954]→[5.4562:4563](∅→∅),[5.4563]→[5.1531:1545](∅→∅),[5.1545]→[5.4578:4662](∅→∅),[5.4578]→[5.4578:4662](∅→∅),[5.4662]→[3.30633:30662](∅→∅),[5.1574]→[5.4691:4762](∅→∅),[3.30662]→[5.4691:4762](∅→∅),[5.4691]→[5.4691:4762](∅→∅),[5.4762]→[3.30663:30688](∅→∅),[3.30688]→[5.1575:1635](∅→∅),[5.4786]→[5.1575:1635](∅→∅),[5.1635]→[3.30689:30720](∅→∅),[3.30720]→[5.4877:4926](∅→∅),[5.4877]→[5.4877:4926](∅→∅)
nameEvent :: MonadPlus m => Text -> m (C.UTCTime -> LogEvent)nameEvent "start" = pure StartWorknameEvent "stop" = pure StopWorknameEvent _ = mzerodata CreditTo-- payouts are made directly to this address, or to an address replacing this one= CreditToAddress !BtcAddr-- payouts are distributed as requested by the specified contributor| CreditToUser !UserId-- payouts are distributed to this project's contributors| CreditToProject !ProjectIdderiving (Show, Eq, Ord)makePrisms ''CreditTo - replacement in lib/Aftok/TimeLog.hs at line 70[5.432]→[5.5249:5337](∅→∅),[5.5337]→[5.2569:2621](∅→∅),[5.2621]→[5.5386:5441](∅→∅),[5.5386]→[5.5386:5441](∅→∅)
creditToName :: CreditTo -> TextcreditToName (CreditToAddress _) = "credit_to_address"creditToName (CreditToUser _) = "credit_to_user"creditToName (CreditToProject _) = "credit_to_project"nameEvent :: Text -> Maybe (C.UTCTime -> LogEvent)nameEvent "start" = Just StartWorknameEvent "stop" = Just StopWorknameEvent _ = Nothing - replacement in lib/Aftok/TimeLog.hs at line 75
data LogEntry = LogEntry{ _creditTo :: !CreditTodata LogEntry a = LogEntry{ _creditTo :: !(CreditTo a) - replacement in lib/Aftok/TimeLog.hs at line 82
instance Ord LogEntry whereinstance Ord a => Ord (LogEntry a) where - replacement in lib/Aftok/TimeLog.hs at line 93
data EventAmendment = TimeChange !ModTime !C.UTCTime| CreditToChange !ModTime !CreditTo| MetadataChange !ModTime !A.Valuedata EventAmendment a= TimeChange !ModTime !C.UTCTime| CreditToChange !ModTime !(CreditTo a)| MetadataChange !ModTime !A.Value - replacement in lib/Aftok/TimeLog.hs at line 101
newtype Payouts = Payouts (Map CreditTo Rational)newtype Payouts a = Payouts (Map (CreditTo a) Rational) - replacement in lib/Aftok/TimeLog.hs at line 104
newtype WorkIndex = WorkIndex (Map CreditTo (NonEmpty Interval)) deriving (Show, Eq)newtype WorkIndex a = WorkIndex (Map (CreditTo a) (NonEmpty Interval)) deriving (Show, Eq) - edit in lib/Aftok/TimeLog.hs at line 106[5.613]→[5.6693:6694](∅→∅),[5.6693]→[5.6693:6694](∅→∅),[5.6766]→[5.1866:1896](∅→∅),[5.1896]→[5.89:93](∅→∅),[5.6766]→[5.89:93](∅→∅),[5.351]→[5.89:93](∅→∅),[5.93]→[5.1012:1201](∅→∅),[5.1201]→[5.4792:4833](∅→∅)
type NDT = C.NominalDiffTime{-|- The depreciation function should return a value between 0 and 1;- this result is multiplied by the length of an interval of work to determine- the depreciated value of the work.-}type DepF = C.UTCTime -> Interval -> NDT - replacement in lib/Aftok/TimeLog.hs at line 122
payouts :: DepF -> C.UTCTime -> WorkIndex -> Payoutspayouts :: Ord a => DepF -> C.UTCTime -> WorkIndex a -> Payouts a - replacement in lib/Aftok/TimeLog.hs at line 131
workIndex :: Foldable f => f LogEntry -> WorkIndexworkIndex :: (Ord a, Foldable f) => f (LogEntry a) -> (WorkIndex a) - replacement in lib/Aftok/TimeLog.hs at line 147
type RawIndex = Map CreditTo [Either LogEvent Interval]type RawIndex a = Map (CreditTo a) [Either LogEvent Interval] - replacement in lib/Aftok/TimeLog.hs at line 149
appendLogEntry :: RawIndex -> LogEntry -> RawIndexappendLogEntry :: (Ord a) => RawIndex a -> LogEntry a -> RawIndex a - replacement in lib/Aftok/Types.hs at line 1
{-# LANGUAGE GeneralizedNewtypeDeriving #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE NoImplicitPrelude #-}{-# LANGUAGE TemplateHaskell #-} - replacement in lib/Aftok/Types.hs at line 5
module Aftok.Types (Satoshi(..), satoshi) wheremodule Aftok.Types where - replacement in lib/Aftok/Types.hs at line 7
import ClassyPreludeimport Control.Lensimport Network.Bippy.Types (Satoshi (..))import Control.Lens (makeLenses, makePrisms)import Data.Maybe (Maybe)import Data.Eq (Eq)import Data.Functor (Functor)import Data.Ord (Ord)import Data.Text (Text)import Data.UUID (UUID)import Prelude (Integer)import Text.Show (Show)newtype UserId = UserId UUID deriving (Show, Eq, Ord)makePrisms ''UserId - replacement in lib/Aftok/Types.hs at line 21
satoshi :: Lens' Satoshi Word64satoshi inj (Satoshi value) = Satoshi <$> inj valuenewtype UserName = UserName Text deriving (Show, Eq)makePrisms ''UserNamenewtype Email = Email Text deriving (Show, Eq)makePrisms ''Emaildata User a = User{ _username :: !UserName, _userAddress :: !(Maybe a), _userEmail :: !Email}makeLenses ''Usernewtype ProjectId = ProjectId UUID deriving (Show, Eq, Ord)makePrisms ''ProjectIddata CreditTo a-- payouts are made directly via a cryptocurrency network= CreditToCurrency !a-- payouts are distributed as requested by the specified contributor| CreditToUser !UserId-- payouts are distributed to this project's contributors| CreditToProject !ProjectIdderiving (Show, Eq, Ord, Functor)makePrisms ''CreditTo - edit in lib/Aftok/Types.hs at line 47[5.1037]
creditToName :: CreditTo a -> TextcreditToName (CreditToCurrency _) = "credit_via_net"creditToName (CreditToUser _) = "credit_to_user"creditToName (CreditToProject _) = "credit_to_project"data DepreciationFunction = LinearDepreciation Months Monthsderiving (Eq, Show)newtype Months = Months Integerderiving (Eq, Show) - edit in server/Aftok/QConfig.hs at line 17
import Aftok.Currency.Bitcoin (NetworkMode) - edit in server/Aftok/QConfig.hs at line 29
, networkMode :: NetworkMode - edit in server/Aftok/QConfig.hs at line 50
<*> C.require cfg "networkMode" - replacement in server/Aftok/Snaplet/Auctions.hs at line 20
import Aftok (UserId)import Aftok.Types (UserId) - edit in server/Aftok/Snaplet/Auctions.hs at line 24
import Aftok.Types - edit in server/Aftok/Snaplet/Auctions.hs at line 28
import Network.Bippy.Types (Satoshi(..)) - replacement in server/Aftok/Snaplet/Auth.hs at line 10
import Aftokimport Aftok.Types - replacement in server/Aftok/Snaplet/Billing.hs at line 19
import Aftok (UserId)import Aftok.Billablesimport Aftok.Types (UserId)import Aftok.Billablesimport Network.Bippy.Types (Satoshi(..)) - edit in server/Aftok/Snaplet/Billing.hs at line 24
import Aftok.Project - replacement in server/Aftok/Snaplet/Billing.hs at line 31
p (Version 1 0) o =p (Version 1 0) o = - replacement in server/Aftok/Snaplet/Billing.hs at line 43
p v o = badVersion "Billable" v op ver o = badVersion "Billable" ver o - replacement in server/Aftok/Snaplet/Billing.hs at line 65[3.35830]
- replacement in server/Aftok/Snaplet/Projects.hs at line 23
import Aftokimport Aftok.Types - edit in server/Aftok/Snaplet/Projects.hs at line 30
import Aftok.TimeLog.Serialization (depfFromJSON) - replacement in server/Aftok/Snaplet/Projects.hs at line 39
parseJSON (Object v) = CP <$> v .: "projectName" <*> v .: "depf"parseJSON _ = mzeroparseJSON (Object v) =CP <$> v .: "projectName"<*> (depfFromJSON =<< v .: "depf")parseJSON _ = mzero - edit in server/Aftok/Snaplet/Users.hs at line 2
{-# LANGUAGE TupleSections #-} - edit in server/Aftok/Snaplet/Users.hs at line 15
import Network.Haskoin.Address (stringToAddr) - replacement in server/Aftok/Snaplet/Users.hs at line 18
import Aftokimport Aftok.Typesimport Aftok.Currency.Bitcoin (NetworkId(..), toNetwork) - replacement in server/Aftok/Snaplet/Users.hs at line 30
{ _cuser :: User{ _cuser :: User Text - replacement in server/Aftok/Snaplet/Users.hs at line 39
<*> (parseBtcAddr <$> v .: "btcAddr")<*> (v .: "btcAddr") - edit in server/Aftok/Snaplet/Users.hs at line 59
nmode <- getNetworkModelet addr = stringToAddr (toNetwork nmode BTC) =<< (userData ^. cuser . userAddress) - replacement in server/Aftok/Snaplet/Users.hs at line 63
userId <- createUser $ userData ^. cuseruserId <- createUser ((userData ^. cuser) & userAddress .~ ((BTC,) <$> addr)) - edit in server/Aftok/Snaplet/WorkLog.hs at line 12
import Network.Haskoin.Address (Address, stringToAddr) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 14
import Aftok (parseBtcAddr)import Aftok.Currency.Bitcoin (NetworkId(..), toNetwork) - edit in server/Aftok/Snaplet/WorkLog.hs at line 20
import Aftok.Types (CreditTo(..)) - edit in server/Aftok/Snaplet/WorkLog.hs at line 34
nmode <- getNetworkMode - replacement in server/Aftok/Snaplet/WorkLog.hs at line 37
case A.eitherDecode requestBody >>= parseEither (parseLogEntry uid evCtr) ofLeft err -> snapError 400 $ "Unable to parse log entry " <> (tshow requestBody) <> ": " <> tshow errRight entry -> snapEval $ createEvent pid uid (entry timestamp)case A.eitherDecode requestBody >>= parseEither (parseLogEntry nmode uid evCtr) ofLeft err ->snapError 400 $ "Unable to parse log entry " <> (tshow requestBody) <> ": " <> tshow errRight entry ->snapEval $ createEvent pid uid (entry timestamp) - edit in server/Aftok/Snaplet/WorkLog.hs at line 47
nmode <- getNetworkModelet network = toNetwork nmode BTC - replacement in server/Aftok/Snaplet/WorkLog.hs at line 52[5.3394]→[5.6163:6216](∅→∅),[5.3758]→[5.6163:6216](∅→∅),[5.4208]→[5.6163:6216](∅→∅),[5.4818]→[5.6163:6216](∅→∅),[5.6163]→[5.6163:6216](∅→∅)
case fmap decodeUtf8 addrBytes >>= parseBtcAddr ofcase fmap decodeUtf8 addrBytes >>= stringToAddr network of - replacement in server/Aftok/Snaplet/WorkLog.hs at line 57
LogEntry (CreditToAddress addr) (evCtr timestamp) (A.decode requestBody)LogEntry (CreditToCurrency (BTC, addr))(evCtr timestamp)(A.decode requestBody) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 61
loggedIntervalsHandler :: S.Handler App App WorkIndexloggedIntervalsHandler :: S.Handler App App (WorkIndex (NetworkId, Address)) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 67
logEntriesHandler :: S.Handler App App [LogEntry]logEntriesHandler :: S.Handler App App [LogEntry (NetworkId, Address)] - replacement in server/Aftok/Snaplet/WorkLog.hs at line 79
payoutsHandler :: S.Handler App App PayoutspayoutsHandler :: S.Handler App App (Payouts (NetworkId, Address)) - edit in server/Aftok/Snaplet/WorkLog.hs at line 93
nmode <- getNetworkMode - replacement in server/Aftok/Snaplet/WorkLog.hs at line 104
(parseEither (parseEventAmendment modTime) requestJSON)[5.13417](parseEither (parseEventAmendment nmode modTime) requestJSON) - edit in server/Aftok/Snaplet.hs at line 17
import Aftok - edit in server/Aftok/Snaplet.hs at line 18
import Aftok.Currency.Bitcoin (NetworkMode(..)) - replacement in server/Aftok/Snaplet.hs at line 21
import Aftok.Project (ProjectId (..))import Aftok.Types (UserId(..), ProjectId(..)) - replacement in server/Aftok/Snaplet.hs at line 31
{ _sess :: Snaplet SessionManager{ _networkMode :: NetworkMode, _sess :: Snaplet SessionManager - replacement in server/Aftok/Snaplet.hs at line 42
snapEval :: (MonadSnap m, HasPostgres m) => Program DBOp a -> m aclass HasNetworkMode m wheregetNetworkMode :: m NetworkModeinstance HasNetworkMode (S.Handler b App) wheregetNetworkMode = _networkMode <$> getsnapEval:: (MonadSnap m, HasPostgres m, HasNetworkMode m)=> Program DBOp a-> m a - replacement in server/Aftok/Snaplet.hs at line 60
e <- liftPG $ \conn -> liftIO $ runExceptT (runQDBM conn $ interpret liftdb p)nmode <- getNetworkModee <- liftPG $ \conn -> liftIO $ runExceptT (runQDBM nmode conn $ interpret liftdb p) - replacement in server/Main.hs at line 15
import Aftok.QConfigimport Aftok.QConfig as Q - edit in server/Main.hs at line 45
let nmode = Q.networkMode cfg - replacement in server/Main.hs at line 48
let loginRoute = method GET requireLogin >> redirect "/home"xhrLoginRoute = void $ method POST requireLoginloginRoute = method GET requireLogin >> redirect "/home"xhrLoginRoute = void $ method POST requireLogin - replacement in server/Main.hs at line 59
logEntriesRoute = serveJSON (fmap logEntryJSON) $ method GET logEntriesHandlerlogIntervalsRoute = serveJSON workIndexJSON $ method GET loggedIntervalsHandlerlogEntriesRoute = serveJSON (fmap $ logEntryJSON nmode) $ method GET logEntriesHandlerlogIntervalsRoute = serveJSON (workIndexJSON nmode) $ method GET loggedIntervalsHandler - replacement in server/Main.hs at line 62
payoutsRoute = serveJSON payoutsJSON $ method GET payoutsHandlerpayoutsRoute = serveJSON (payoutsJSON nmode) $ method GET payoutsHandler - replacement in server/Main.hs at line 70
auctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandlerauctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandler - replacement in server/Main.hs at line 82
, ("login", loginRoute), ("login", xhrLoginRoute), ("login", loginRoute), ("login", xhrLoginRoute) - replacement in server/Main.hs at line 109
return $ App sesss pgs authsreturn $ App nmode sesss pgs auths - edit in stack.yaml at line 2[5.1085]→[5.1085:1101](∅→∅),[5.1101]→[5.10542:10554](∅→∅),[5.10554]→[5.3580:3624](∅→∅),[5.3624]→[5.13697:13750](∅→∅),[5.10594]→[5.13697:13750](∅→∅),[5.13750]→[5.10647:10665](∅→∅),[5.23340]→[5.10647:10665](∅→∅),[5.10647]→[5.10647:10665](∅→∅)
packages:- '.'- location:git: https://github.com/aftok/bippy.gitcommit: 97fda0368ae660239d1b9398d44530cd5b05eec3extra-dep: true - replacement in stack.yaml at line 4
- snap-1.0.0.2- snaplet-postgresql-simple-1.0.2.0- haskoin-core-0.4.2- heist-1.0.1.0- map-syntax-0.2.0.2- murmur3-1.0.3- pbkdf-1.1.1.1- secp256k1-0.4.8resolver: lts-8.5# - snap-1.0.0.2# - snaplet-postgresql-simple-1.0.2.0# - haskoin-core-0.4.2# - heist-1.0.1.0# - map-syntax-0.2.0.2# - murmur3-1.0.3# - pbkdf-1.1.1.1# - secp256k1-0.4.8- snap-1.1.2.0@sha256:5640450870d06e659b0f31dd47a7b767a053a78b48048ff8c12c014e08d6651e- snaplet-postgresql-simple-1.1.0.0@sha256:93979aebd232cd92e2971faa118eb78cce399191278d4655354ed292fa980999- heist-1.1.0.1@sha256:7c0fe723e766e41a234def6ad3162958512ad78d3aaaa9b36676186a4427dd01- map-syntax-0.3@sha256:84dc86fa1c292af25963bf7212ae7d55ce87239a9f8d4cc85bd0acc35874d2e1- http-client-openssl-0.3.0.0@sha256:cd617e7bef6c3d8ac4587d7c623b80c35a15735d0142e56eca0ae1c8a67a1b5d- pwstore-fast-2.4.4@sha256:9b6a37510d8b9f37f409a8ab3babac9181afcaaa3fce8ba1c131a7ed3de30698- xmlhtml-0.2.5.2@sha256:0e9ada870a5c5c7d522ed8444bef0f9f0e1587e31a5881f15a5f9cdd983af8b4- git: https://github.com/aftok/bippy.gitcommit: 1c60b6fee50fff28f40c5d5412de422f4a501f66resolver: lts-13.9 #lts-8.5 - edit in stack.yaml at line 24[5.3647]
pvp-bounds: both - file addition: stack.yaml.lock[111.2]
# This file was autogenerated by Stack.# You should not edit this file by hand.# For more information, please see the documentation at:# https://docs.haskellstack.org/en/stable/lock_filespackages:- completed:hackage: snap-1.1.2.0@sha256:5640450870d06e659b0f31dd47a7b767a053a78b48048ff8c12c014e08d6651e,9175pantry-tree:size: 5743sha256: ef0dfdb19409ce2aae0d8d9c6312e51931b89f0285bf5798a2349d8130cab89aoriginal:hackage: snap-1.1.2.0@sha256:5640450870d06e659b0f31dd47a7b767a053a78b48048ff8c12c014e08d6651e- completed:hackage: snaplet-postgresql-simple-1.1.0.0@sha256:93979aebd232cd92e2971faa118eb78cce399191278d4655354ed292fa980999,2700pantry-tree:size: 655sha256: 6525a26918dec9179af73a433ac8de4d5a456f5f96a9fcd23f6365e3999b4f5aoriginal:hackage: snaplet-postgresql-simple-1.1.0.0@sha256:93979aebd232cd92e2971faa118eb78cce399191278d4655354ed292fa980999- completed:hackage: heist-1.1.0.1@sha256:7c0fe723e766e41a234def6ad3162958512ad78d3aaaa9b36676186a4427dd01,8973pantry-tree:size: 7354sha256: 1ed83746a3e9470618ef67da249b0b4d78c87cc5c50d9c892e27db057c0d4866original:hackage: heist-1.1.0.1@sha256:7c0fe723e766e41a234def6ad3162958512ad78d3aaaa9b36676186a4427dd01- completed:hackage: map-syntax-0.3@sha256:84dc86fa1c292af25963bf7212ae7d55ce87239a9f8d4cc85bd0acc35874d2e1,2420pantry-tree:size: 558sha256: bb33cb3230b362d94f2367b313f06f9d73d2b2afa4626bd2fab8dc4d45468164original:hackage: map-syntax-0.3@sha256:84dc86fa1c292af25963bf7212ae7d55ce87239a9f8d4cc85bd0acc35874d2e1- completed:hackage: http-client-openssl-0.3.0.0@sha256:cd617e7bef6c3d8ac4587d7c623b80c35a15735d0142e56eca0ae1c8a67a1b5d,1548pantry-tree:size: 387sha256: 5712016dbe69a539ca265b8e1b248d499445a2a414ac3a8bc9c8a62bef0ffc6doriginal:hackage: http-client-openssl-0.3.0.0@sha256:cd617e7bef6c3d8ac4587d7c623b80c35a15735d0142e56eca0ae1c8a67a1b5d- completed:hackage: pwstore-fast-2.4.4@sha256:9b6a37510d8b9f37f409a8ab3babac9181afcaaa3fce8ba1c131a7ed3de30698,1351pantry-tree:size: 270sha256: ff4a44ede62515efe5cd366a5803f7183c811c4a0cf56eea88da94181c4844c0original:hackage: pwstore-fast-2.4.4@sha256:9b6a37510d8b9f37f409a8ab3babac9181afcaaa3fce8ba1c131a7ed3de30698- completed:hackage: xmlhtml-0.2.5.2@sha256:0e9ada870a5c5c7d522ed8444bef0f9f0e1587e31a5881f15a5f9cdd983af8b4,46997pantry-tree:size: 61835sha256: 13fdaf307ac4a3f60999aca0c367792e97f92428f56ffe144092a6360bd1e33foriginal:hackage: xmlhtml-0.2.5.2@sha256:0e9ada870a5c5c7d522ed8444bef0f9f0e1587e31a5881f15a5f9cdd983af8b4- completed:cabal-file:size: 2747sha256: 6ec7c63e2fa691f9b07015e756018f1dbc13d280521801664cee1317be07cf71name: bippyversion: 0.1.0.0git: https://github.com/aftok/bippy.gitpantry-tree:size: 3547sha256: 4ee75c44d9cb4b8a39bbd297d63866a3a738108b438e33dfad068a78edcea5dccommit: 1c60b6fee50fff28f40c5d5412de422f4a501f66original:git: https://github.com/aftok/bippy.gitcommit: 1c60b6fee50fff28f40c5d5412de422f4a501f66snapshots:- completed:size: 496697url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/13/9.yamlsha256: 3846ba7d13dd1b2679426dc3f450332a3b8a181063b0f3fc2d0c7d55db2e9c24original: lts-13.9