Fine. I'll use ormolu. At least it doesn't break the code.
[?]
Dec 8, 2020, 5:10 AM
X3ES7NUA42D2BF7CQDDKXM5CLMVCYA3H5YU5KXLPTGDBFPE2LNVACDependencies
- [2]
SQ7UMLN5Get z-addr checks working. - [3]
F4ONFXF4Fix signup database issues. - [4]
RSEB2NFGReplacing Snap with Scotty. - [5]
EKI57EJRAdd alternative implementation of auction winner determination. - [6]
GKLIPHR5Fix error in parsing of event metadata - [7]
EW2XN7KUUpdate docker build, clean up migration for payments tables. - [8]
DXIGERDTChange order of Docker build to avoid rebuilding the universe. - [9]
ZIG57EE6Fix project selection, end log end on project switch. - [10]
2J37EVJMCheck for an open interval on project switch. - [11]
A2J7B4SCInitial impl of depreciation function. - [12]
7XN3I3QJAdd 'loggedIntervals' endpoint. - [13]
WZUHEZSBStart of migration back toward snap. - [14]
2KZPOGRBOnce you get Haskell to compile, the tests pass! - [15]
N4NDAZYTInitial implementation of payouts. - [16]
TZQJVHBAAdd auction functions to ADB. - [17]
2G3GNDDUEvent logging is now functioning in postgres. - [18]
TLQ72DSJLenses, sqlite-simple - [19]
4R7XIYK3Switch from ClassyPrelude to Relude - [20]
4QX5E5ACInitial compilation of payouts function succeeds. - [21]
A6HKMINBAttempting to improve JSON handling. - [22]
J6S23MDGUse server timestamps for interval start and end. - [23]
BROSTG5KBeginning of modularization of server. - [24]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [25]
ENNZIQJGUse live signup API for client. - [26]
GLFF5ZDKFactor winningBids for easier testing. - [27]
UILI6PILThe route-based logStart/logStop is nicer. - [28]
WZFQDWW4Add retrieval/storage of current exchange rate data to payment recording. - [29]
NEDDHXUKReformat via stylish-haskell - [30]
Z24SZOGZReturn richer information from event logging calls. - [31]
TNR3TEHKSwitch to Postgres + snaplet arch compiles. - [32]
UUR6SMCAAdd start of specs for auctions. - [33]
MJ6R42RCUtility methods for reading key & cert data. - [34]
5OI44E4EAdd authentication to auction search. - [35]
4SCFOJGNSpecs for recovering intervals from the log now pass. - [36]
P6NR2CGXBeginning of implementation of depreciation. - [37]
HO2PFRABClient login now handles response correctly. - [38]
SLL7262CMake depreciation functions more flexible. - [39]
TJEUE7TYAdded OverloadedStrings to eliminate Text fiddling. - [40]
B6HWAPDPModularize & update to recent haskoin. - [41]
7DBNV3GVInitial, stack-based impl of time log event reduction. - [42]
O227CEAVAdds storage of original event JSON for some DBOp constructors. - [43]
HMDM3B55Implement core of payments/billing infrastructure. - [44]
GMYPBCWEMake docker-compose work. - [45]
UWMGUJOWAutoformat sources. - [46]
Z3M53KTLAdrift. - [47]
5ZSKPQ3KAdd created_at and auction_start timestamps to auction - [48]
BWN72T44Don't accept work timestamp from an external source. - [49]
DFOBMSAOInitial work on payments API - [50]
UOG5H2TWDefault work logging credit to logged-in user. - [51]
NVOCQVASInitial failing tests. - [52]
YWNTVA7PFix broken auction test. - [53]
RN7EI6INUpdate database layer to use CreditTo - [54]
IPG33FAWAdd billing daemon - [55]
5DRIWGLUImproving TimeLog specs - [56]
KEP5WUFJConvert project to stack-based build. - [57]
O722AOKEAdd route to allow crediting of events to users/projects. - [58]
IZEVQF62Work in progress replacing sqlite with postgres. - [59]
HBULCDN6Add tests for auction winner determination algorithm. - [60]
4IQVQL4TAdded client for payouts endpoint. - [61]
EQXRXRZDChanged to use tasty instead of test-framework - [62]
FD7SV5I6Fix handling of event_t columns. - [63]
SCXG6TJWMake log reduction safer in presence of overlapping events. - [64]
WJO37T74Restored the single test to functionality. - [65]
Z7KS5XHHVery WIP. Wow. - [66]
NJNMO72SAdd zcash.com submodule and update client to modern halogen. - [67]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [68]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [69]
GKGVYBZGAdded JSON serialization to TimeLog - [70]
BSIUHCGFAdd payment response handler. - [71]
POX3UAMTEnabling logging of time to contributor/project accounts - [72]
64VI73NPServer now compiles using abstracted SQLite - [73]
Y3LIJ5USAdd handler for CreatePaymentRequest - [74]
OBFPJS2GProject successfully builds and tests under nix. - [75]
M3KUPGZKAdd invitation email template. - [76]
AWWC6P5ZAdd migration to include payment network with addresses. - [77]
73NDXDEZBegin implementation of billing event persistence. - [78]
LAROLAYUWIP - [79]
EKY7U7SKFinish conversion to stack. - [80]
LHJ2HFXVAdd property test for auction algorithm. - [81]
F2XLL7XWRemove Ord Bid & sort in favor of sortBy - [82]
XTBSG4C7Adding serveJSON combinator to eliminate some boilerplate from handlers. - [83]
FXJQACESEnsure that auction is not ended at the time of bid - [84]
WAIX6AGNAdd event serialization for PaymentRequest & Payment - [85]
EYGIUUQZRestore remainder of endpoints to compiling status. - [86]
NMWWP4ZNTrying out Hspec - [87]
5W5M56VJMove library code to 'lib' - [88]
MGOF7IUFUpdate TASKS list to reflect completed projects. - [89]
WO2MINIFAuctions now compile! - [90]
Q5X5RYQLstylish-haskell reformatting - [91]
2OIPAQCBMerge branch 'master' of github.com:nuttycom/ananke - [92]
JFOEOFGAstylish-haskell formatting. - [93]
ADMKQQGCInitial empty Snap project. - [94]
DJATFGICSupport client builds in nix-shell --pure. - [95]
4ZLEDBK7Initial attempts at dockerizing, cabal isn't cooperating. - [96]
NAS4BFL4Trivial stylish-haskell reformat. - [97]
RFYEVKZQAdd nix-shell based build environment. - [98]
LD4GLVSFMore database stuff. - [99]
TCOAKCGGCompleted conversion to snap. - [100]
NLZ3JXLOFix formatting with stylish-haskell. - [101]
2Y2QZFVFSwitch to more modern cabal2nix-based workflow. - [102]
5XFJNUAZStart of addition of project infrastructure. - [103]
M4KM76DGMerge branch 'stackify' - [104]
HALRDT2FAdded initial auction create route. - [105]
U256ZALIAdd captcha check to register route. - [106]
MB5SHULBAdd route for accepting an invitation with an existing account - [107]
MWUPXTBFA few steps down a road to be abandoned. - [108]
7VGYLTMUClean up schema version handling. - [109]
LTSVBVA2Update to a recent haskoin-core. Fix Stack build. - [110]
ASF3UPJLAdd auction creation and bid handlers - [111]
I2KHGVD4Require project permissions for access to most data. - [112]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [113]
QMEYU4MWAdd display for prior intervals. - [114]
MMRVIM3FRemoves copy/paste error from email invitation subject. - [115]
KNSI575VCleanup of EventLog types. - [116]
VJPT6HDRFix remaining type errors after addition of login handler. - [117]
7HPY3QPFFix linting errors. (yay hlint!) - [118]
SEWTRB6SImplement payment request creation functions. - [119]
BXGLKYRXAdded primitive user registration handler. - [120]
ZTPDQKLAAdd changes to event_credit_to_amendments - [121]
PT4276XCAdd logout functionality. - [122]
O2BZOX7MAdd signup form, captcha check. - [123]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [124]
6L5BK5EHUse generic SMTP rather than Sendmail-specific mail client. - [125]
3GBSDS5PFix out-of-date test code, add skeleton for payments spec. - [126]
PBD7LZYQPostgres & auth are beginning to function. - [127]
QADKFHARAdds CreatePayment handler implementation. - [128]
OV5AKJHARemove unused LogInterval type. - [129]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [130]
EMVTF2IWWIP moving back to snap. - [131]
RSF6UAJKBreak out api module for timeline. - [132]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [133]
2MNO5FUYUpgrade LTS version - [134]
3QVT6MA6Add database support for event amend operations. - [135]
EFSXYZPOAutoformat everything with brittany. - [136]
Z3MK2PJ5Add GET handler for retrieving auction data. - [137]
75N3UJ4JMore progression toward lenses. - [138]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [139]
V2VDN77HEnable postgres configuration via environment variable for Heroku. - [140]
AL37SVTCImplement payments service endpoints. - [141]
JV3UEPNCFix Aeson constructors. - [142]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [143]
4FDQGIXNMake payment request retrieval key an opaque 32-bit hash. - [144]
W35DDBFYFactor common JSON conversions up into client lib module. - [145]
EZQG2APBUpdate task list. - [146]
ZITLSTYXFix problems with SQL queries & depreciation function parsing. - [147]
5IDB3IWSIntegrate zcashd-based zaddr validation. - [148]
ZP62WC47Begin conversion to build with stack. - [*]
AXKKXBWNInitial attempt at writing down my ideas for a company based on trust.
Change contents
- file addition: .nvimrc[150.2]
nnoremap <leader>h :!~/.nix-profile/bin/hasktags -o tags -c $(find lib server daemon test -name \*.hs) && ~/.nix-profile/bin/ctags --options-maybe=.ctags --options=$HOME/.ctags --append=yes .<CR><CR>nnoremap <leader>o :!~/.nix-profile/bin/ormolu --mode inplace $(find lib server daemon test -name '*.hs')<CR><CR> - replacement in daemon/AftokD/AftokM.hs at line 1
{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE GeneralizedNewtypeDeriving #-}{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE GeneralizedNewtypeDeriving #-} - replacement in daemon/AftokD/AftokM.hs at line 4
{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE TemplateHaskell #-} - replacement in daemon/AftokD/AftokM.hs at line 8[4.426]→[4.1665:1666](∅→∅),[4.1665]→[4.1665:1666](∅→∅),[4.1666]→[4.442:443](∅→∅),[4.443]→[4.3:409](∅→∅),[4.473]→[4.473:645](∅→∅),[4.645]→[4.3:130](∅→∅),[4.130]→[4.2042:2043](∅→∅),[4.1113]→[4.2042:2043](∅→∅),[4.2042]→[4.2042:2043](∅→∅),[4.2043]→[4.1114:1182](∅→∅),[4.1182]→[4.2102:2103](∅→∅),[4.2102]→[4.2102:2103](∅→∅),[4.2103]→[4.1183:1781](∅→∅),[4.191]→[4.1841:2268](∅→∅),[4.57592]→[4.1841:2268](∅→∅),[4.1841]→[4.1841:2268](∅→∅),[4.2268]→[4.2445:2446](∅→∅),[4.2445]→[4.2445:2446](∅→∅),[4.2446]→[4.192:252](∅→∅)
import Control.Error.Util ( maybeT )import Control.Lens ( (^.), makeLenses, makeClassyPrisms, traverseOf, to)import Control.Monad.Except ( MonadError, throwError)import Control.Monad.Trans.Except ( withExceptT )import Control.Monad.Trans.Reader ( mapReaderT )import Crypto.Random.Types ( MonadRandom(..) )import Database.PostgreSQL.Simple ( Connection, connect)import Data.Thyme.Clock as Cimport Data.Thyme.Time as Cimport qualified Data.Text as Timport qualified Network.Mail.Mime as Mimeimport qualified Network.Mail.SMTP as SMTPimport Network.URI ( URI, parseURI)import Text.StringTemplate ( directoryGroup, newSTMP, getStringTemplate, setManyAttrib, render)import Filesystem.Path.CurrentOS ( encodeString )import Bippy.Types ( Satoshi )import Aftok.Billing( Billable,Billable',ContactChannel (..),Subscription',billable,contactChannel,customer,name,paymentRequestEmailTemplate,paymentRequestMemoTemplate,project,)import qualified Aftok.Config as ACimport Aftok.Currency.Bitcoin (satoshi)import qualified Aftok.Database as DBimport Aftok.Database.PostgreSQL (QDBM (..))import qualified Aftok.Payments as Pimport Aftok.Payments.Types( PaymentKey (..),paymentKey,paymentRequestTotal,subscription,)import Aftok.Project( Project,projectName,)import Aftok.Types( ProjectId (..),User,UserId,_Email,)import qualified AftokD as Dimport Bippy.Types (Satoshi)import Control.Error.Util (maybeT)import Control.Lens( (^.),makeClassyPrisms,makeLenses,to,traverseOf,)import Control.Monad.Except( MonadError,throwError,)import Control.Monad.Trans.Except (withExceptT)import Control.Monad.Trans.Reader (mapReaderT)import Crypto.Random.Types (MonadRandom (..))import qualified Data.Text as Timport Data.Thyme.Clock as Cimport Data.Thyme.Time as Cimport Database.PostgreSQL.Simple( Connection,connect,)import Filesystem.Path.CurrentOS (encodeString)import qualified Network.Mail.Mime as Mimeimport qualified Network.Mail.SMTP as SMTPimport Network.URI( URI,parseURI,)import Text.StringTemplate( directoryGroup,getStringTemplate,newSTMP,render,setManyAttrib,) - edit in daemon/AftokD/AftokM.hs at line 81[4.2484]→[4.2330:2506](∅→∅),[4.2566]→[4.2566:2623](∅→∅),[4.2791]→[4.2791:2841](∅→∅),[4.2841]→[4.3046:3106](∅→∅),[4.3106]→[4.2841:2894](∅→∅),[4.2841]→[4.2841:2894](∅→∅),[4.2894]→[2.251:310](∅→∅),[2.310]→[4.2953:3077](∅→∅),[4.2953]→[4.2953:3077](∅→∅),[4.3077]→[4.3107:3241](∅→∅),[4.3241]→[4.3077:4210](∅→∅),[4.3077]→[4.3077:4210](∅→∅),[4.4210]→[4.3089:3090](∅→∅),[4.3089]→[4.3089:3090](∅→∅)
import Aftok.Types ( User, UserId, ProjectId(..), _Email)import Aftok.Currency.Bitcoin ( satoshi )import qualified Aftok.Config as ACimport Aftok.Billing ( Billable, Billable', Subscription', ContactChannel(..), contactChannel, customer, name, billable, project, paymentRequestEmailTemplate, paymentRequestMemoTemplate)import qualified Aftok.Database as DBimport Aftok.Database.PostgreSQL ( QDBM(..) )import qualified Aftok.Payments as Pimport Aftok.Payments.Types ( PaymentKey(..), subscription, paymentRequestTotal, paymentKey)import Aftok.Project ( Project, projectName)import qualified AftokD as D - edit in daemon/AftokD/AftokM.hs at line 85
- replacement in daemon/AftokD/AftokM.hs at line 90
_Overdue = _PaymentErr . P._Overdue_Overdue = _PaymentErr . P._Overdue - replacement in daemon/AftokD/AftokM.hs at line 93
data AftokMEnv = AftokMEnv{ _dcfg :: !D.Config, _conn :: !Connection, _pcfg :: !P.PaymentsConfig}data AftokMEnv= AftokMEnv{ _dcfg :: !D.Config,_conn :: !Connection,_pcfg :: !P.PaymentsConfig} - replacement in daemon/AftokD/AftokM.hs at line 103
networkMode = pcfg . P.networkModesigningKey = pcfg . P.signingKeypkiData = pcfg . P.pkiDatanetworkMode = pcfg . P.networkModesigningKey = pcfg . P.signingKeypkiData = pcfg . P.pkiData - replacement in daemon/AftokD/AftokM.hs at line 108
newtype AftokM a = AftokM { runAftokM :: ReaderT AftokMEnv (ExceptT AftokDErr IO) a }newtype AftokM a = AftokM {runAftokM :: ReaderT AftokMEnv (ExceptT AftokDErr IO) a} - replacement in daemon/AftokD/AftokM.hs at line 142
requests <-requests <- - replacement in daemon/AftokD/AftokM.hs at line 150
preqCfg = cfg ^. (dcfg . D.paymentRequestConfig)reqMay = dopreq <- DB.findPaymentRequestId reqIdpreq' <- traverseOf P.subscription DB.findSubscriptionBillable preqpreqCfg = cfg ^. (dcfg . D.paymentRequestConfig)reqMay = dopreq <- DB.findPaymentRequestId reqIdpreq' <- traverseOf P.subscription DB.findSubscriptionBillable preq - replacement in daemon/AftokD/AftokM.hs at line 156
req <- maybeT (throwError $ DBErr DB.SubjectNotFound) pure reqMayreq <- maybeT (throwError $ DBErr DB.SubjectNotFound) pure reqMay - replacement in daemon/AftokD/AftokM.hs at line 158
mail <- buildPaymentRequestEmail preqCfg req bip70URLlet mailer = maybe (SMTP.sendMailWithLogin _smtpHost)(SMTP.sendMailWithLogin' _smtpHost)_smtpPortmail <- buildPaymentRequestEmail preqCfg req bip70URLlet mailer =maybe(SMTP.sendMailWithLogin _smtpHost)(SMTP.sendMailWithLogin' _smtpHost)_smtpPort - replacement in daemon/AftokD/AftokM.hs at line 166[4.1181]→[4.5324:5418](∅→∅),[4.5418]→[4.3242:3321](∅→∅),[4.3321]→[4.5558:5584](∅→∅),[4.5558]→[4.5558:5584](∅→∅)
buildPaymentRequestEmail:: (MonadIO m, MonadError AftokDErr m)=> D.PaymentRequestConfig-> P.PaymentRequest' (Subscription' User (Billable' Project UserId Satoshi))-> URI-> m Mime.MailbuildPaymentRequestEmail ::(MonadIO m, MonadError AftokDErr m) =>D.PaymentRequestConfig ->P.PaymentRequest' (Subscription' User (Billable' Project UserId Satoshi)) ->URI ->m Mime.Mail - replacement in daemon/AftokD/AftokM.hs at line 177
^. (subscription . billable . paymentRequestEmailTemplate)^. (subscription . billable . paymentRequestEmailTemplate) - replacement in daemon/AftokD/AftokM.hs at line 185
-- TODO: other channels-- TODO: other channels - replacement in daemon/AftokD/AftokM.hs at line 187[4.5885]→[4.5885:6125](∅→∅),[4.6125]→[4.6891:6929](∅→∅),[4.6891]→[4.6891:6929](∅→∅),[4.6929]→[4.6126:6280](∅→∅),[4.717]→[4.7078:7092](∅→∅),[4.6280]→[4.7078:7092](∅→∅),[4.7078]→[4.7078:7092](∅→∅)
pname = req ^. (subscription . billable . project . projectName)total = req ^. (P.paymentRequest . to paymentRequestTotal)setAttrs = setManyAttrib[ ("from_email" , fromEmail ^. _Email), ("project_name", pname), ("to_email" , toEmail ^. _Email), ("amount_due" , show $ total ^. satoshi), ("payment_url" , show paymentUrl)]pname = req ^. (subscription . billable . project . projectName)total = req ^. (P.paymentRequest . to paymentRequestTotal)setAttrs =setManyAttrib[ ("from_email", fromEmail ^. _Email),("project_name", pname),("to_email", toEmail ^. _Email),("amount_due", show $ total ^. satoshi),("payment_url", show paymentUrl)] - replacement in daemon/AftokD/AftokM.hs at line 198
toAddr = Mime.Address Nothing (toEmail ^. _Email)subject = "Payment is due for your " <> pname <> " subscription!"body = Mime.plainPart . render $ setAttrs templatetoAddr = Mime.Address Nothing (toEmail ^. _Email)subject = "Payment is due for your " <> pname <> " subscription!"body = Mime.plainPart . render $ setAttrs template - replacement in daemon/AftokD/AftokM.hs at line 203
memoGen:: Subscription' UserId Billable -> C.Day -> C.UTCTime -> AftokM (Maybe Text)memoGen ::Subscription' UserId Billable -> C.Day -> C.UTCTime -> AftokM (Maybe Text) - replacement in daemon/AftokD/AftokM.hs at line 210[4.827]→[4.1684:1715](∅→∅),[4.6557]→[4.1684:1715](∅→∅),[4.7728]→[4.1684:1715](∅→∅),[4.1715]→[4.7760:7883](∅→∅),[4.7760]→[4.7760:7883](∅→∅),[4.7883]→[4.828:873](∅→∅),[4.873]→[4.6558:6603](∅→∅),[4.916]→[4.7973:7983](∅→∅),[4.6603]→[4.7973:7983](∅→∅),[4.7973]→[4.7973:7983](∅→∅)
setAttrs = setManyAttrib[ ("project_name", req ^. (billable . project . projectName)), ("subscription", req ^. (billable . name)), ("billing_date", show billingDate), ("issue_time" , show requestTime)]setAttrs =setManyAttrib[ ("project_name", req ^. (billable . project . projectName)),("subscription", req ^. (billable . name)),("billing_date", show billingDate),("issue_time", show requestTime)] - replacement in daemon/AftokD/AftokM.hs at line 224
let hostname = env ^. (dcfg . D.paymentRequestConfig . D.aftokHost)let hostname = env ^. (dcfg . D.paymentRequestConfig . D.aftokHost) - replacement in daemon/AftokD/AftokM.hs at line 227
( throwError. ConfigError$ "Could not parse path "<> paymentRequestPath<> " to a valid URI"( throwError. ConfigError$ "Could not parse path "<> paymentRequestPath<> " to a valid URI" - replacement in daemon/AftokD/AftokM.hs at line 236
payloadGen:: Monad m=> Subscription' UserId Billable-> C.Day-> C.UTCTime-> m (Maybe ByteString)payloadGen ::Monad m =>Subscription' UserId Billable ->C.Day ->C.UTCTime ->m (Maybe ByteString) - replacement in daemon/AftokD.hs at line 5
import Control.Lensimport qualified Aftok.Config as ACimport Aftok.Types (Email (..))import Control.Lensimport qualified Data.Configurator as Cimport qualified Data.Configurator.Types as CTimport Database.PostgreSQL.Simple (ConnectInfo)import Filesystem.Path.CurrentOS( encodeString,fromText,)import qualified Filesystem.Path.CurrentOS as P - replacement in daemon/AftokD.hs at line 17
import qualified Data.Configurator as Cimport qualified Data.Configurator.Types as CTimport Database.PostgreSQL.Simple ( ConnectInfo )import Filesystem.Path.CurrentOS ( fromText, encodeString)import qualified Filesystem.Path.CurrentOS as Pdata PaymentRequestConfig= PaymentRequestConfig{ _aftokHost :: Text,_templatePath :: P.FilePath,_billingFromEmail :: Email} - replacement in daemon/AftokD.hs at line 24
import Aftok.Types ( Email(..) )import qualified Aftok.Config as ACmakeLenses ''PaymentRequestConfig - replacement in daemon/AftokD.hs at line 26[4.9078]→[4.9078:9150](∅→∅),[4.9150]→[4.1127:1159](∅→∅),[4.1159]→[4.9180:9249](∅→∅),[4.9180]→[4.9180:9249](∅→∅)
data PaymentRequestConfig = PaymentRequestConfig{ _aftokHost :: Text, _templatePath :: P.FilePath, _billingFromEmail :: Email}makeLenses ''PaymentRequestConfigdata Config= Config{ _smtpConfig :: AC.SmtpConfig,_billingConfig :: AC.BillingConfig,_dbConfig :: ConnectInfo,_paymentRequestConfig :: PaymentRequestConfig} - edit in daemon/AftokD.hs at line 34
data Config = Config{ _smtpConfig :: AC.SmtpConfig, _billingConfig :: AC.BillingConfig, _dbConfig :: ConnectInfo, _paymentRequestConfig :: PaymentRequestConfig} - replacement in daemon/Main.hs at line 1
{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE TypeApplications #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE TypeApplications #-} - replacement in daemon/Main.hs at line 5
( main( main, - edit in daemon/Main.hs at line 8
- edit in daemon/Main.hs at line 9
import qualified AftokD as Dimport AftokD.AftokM (createAllPaymentRequests)import Control.Exception (try)import Filesystem.Path.CurrentOS (decodeString)import System.Environment (getEnv)import System.IO.Error (IOError) - edit in daemon/Main.hs at line 16[4.10247]→[4.7934:8174](∅→∅),[4.8174]→[4.10341:10342](∅→∅),[4.10341]→[4.10341:10342](∅→∅),[4.10342]→[4.8175:8304](∅→∅),[4.8304]→[4.10419:10420](∅→∅),[4.10419]→[4.10419:10420](∅→∅)
import Control.Exception ( try )import System.Environment ( getEnv )import System.IO.Error ( IOError )import Filesystem.Path.CurrentOS ( decodeString )import qualified AftokD as Dimport AftokD.AftokM ( createAllPaymentRequests ) - replacement in daemon/Main.hs at line 19
cfg <- D.loadConfig . decodeString $ either (const "conf/aftok.cfg")idcfgPathcfg <-D.loadConfig . decodeString $either(const "conf/aftok.cfg")idcfgPath - replacement in lib/Aftok/Auction.hs at line 5[4.1901]→[4.34:64](∅→∅),[4.34]→[4.34:64](∅→∅),[4.64]→[4.8495:8775](∅→∅),[4.41]→[4.135:162](∅→∅),[4.85]→[4.135:162](∅→∅),[4.8775]→[4.135:162](∅→∅),[4.135]→[4.135:162](∅→∅)
import Control.Lensimport Data.Hourglass ( Seconds(..) )import Data.Ratio ( (%) )import Data.Traversable ( for )import Data.Thyme.Clock as Cimport Data.Thyme.Format ( )import Data.UUIDimport Aftok.Currency.Bitcoin( satoshi,ssub,)import Aftok.Types( ProjectId,UserId,)import Bippy.Types (Satoshi (..))import Control.Lensimport Data.Hourglass (Seconds (..))import Data.Ratio ((%))import Data.Thyme.Clock as Cimport Data.Thyme.Format ()import Data.Traversable (for)import Data.UUID - replacement in lib/Aftok/Auction.hs at line 22
import Aftok.Types ( UserId, ProjectId)import Aftok.Currency.Bitcoin ( satoshi, ssub)import Bippy.Types ( Satoshi(..) )newtype AuctionId = AuctionId UUID deriving (Show, Eq) - edit in lib/Aftok/Auction.hs at line 24
newtype AuctionId = AuctionId UUID deriving (Show, Eq) - replacement in lib/Aftok/Auction.hs at line 26[4.5249]→[4.216:239](∅→∅),[4.239]→[4.3:184](∅→∅),[4.88]→[4.5319:5323](∅→∅),[4.165]→[4.5319:5323](∅→∅),[4.184]→[4.5319:5323](∅→∅),[4.189]→[4.5319:5323](∅→∅),[4.270]→[4.5319:5323](∅→∅),[4.351]→[4.5319:5323](∅→∅),[4.1676]→[4.5319:5323](∅→∅),[4.5319]→[4.5319:5323](∅→∅)
data Auction = Auction{ _projectId :: ProjectId, _initiator :: UserId, _createdAt :: C.UTCTime, _raiseAmount :: Satoshi, _auctionStart :: C.UTCTime, _auctionEnd :: C.UTCTime}data Auction= Auction{ _projectId :: ProjectId,_initiator :: UserId,_createdAt :: C.UTCTime,_raiseAmount :: Satoshi,_auctionStart :: C.UTCTime,_auctionEnd :: C.UTCTime} - edit in lib/Aftok/Auction.hs at line 39
- replacement in lib/Aftok/Auction.hs at line 42[4.70]→[4.5324:5339](∅→∅),[4.188]→[4.5324:5339](∅→∅),[4.5324]→[4.5324:5339](∅→∅),[4.5339]→[4.89:142](∅→∅),[4.142]→[4.295:322](∅→∅),[4.322]→[4.1677:1706](∅→∅),[4.322]→[4.1677:1706](∅→∅),[4.165]→[4.1677:1706](∅→∅),[4.1706]→[4.57772:57796](∅→∅)
data Bid = Bid{ _bidUser :: UserId, _bidSeconds :: Seconds, _bidAmount :: Satoshi, _bidTime :: C.UTCTime} deriving (Eq, Show)data Bid= Bid{ _bidUser :: UserId,_bidSeconds :: Seconds,_bidAmount :: Satoshi,_bidTime :: C.UTCTime}deriving (Eq, Show) - replacement in lib/Aftok/Auction.hs at line 53[4.276]→[4.190:219](∅→∅),[4.219]→[4.352:382](∅→∅),[4.382]→[4.239:273](∅→∅),[4.239]→[4.239:273](∅→∅),[4.273]→[4.383:417](∅→∅),[4.417]→[4.306:310](∅→∅),[4.306]→[4.306:310](∅→∅)
data Commitment = Commitment{ _baseBid :: Bid, _commitmentSeconds :: Seconds, _commitmentAmount :: Satoshi}data Commitment= Commitment{ _baseBid :: Bid,_commitmentSeconds :: Seconds,_commitmentAmount :: Satoshi} - replacement in lib/Aftok/Auction.hs at line 70
wheresecs bid = toRational $ bid ^. bidSecondsbtc bid = toRational $ bid ^. bidAmount . satoshicostRatio bid = secs bid / btc bidwheresecs bid = toRational $ bid ^. bidSecondsbtc bid = toRational $ bid ^. bidAmount . satoshicostRatio bid = secs bid / btc bid - replacement in lib/Aftok/Auction.hs at line 81[4.443]→[4.9450:9727](∅→∅),[4.63]→[4.652:653](∅→∅),[4.227]→[4.652:653](∅→∅),[4.281]→[4.652:653](∅→∅),[4.470]→[4.652:653](∅→∅),[4.582]→[4.652:653](∅→∅),[4.2463]→[4.652:653](∅→∅),[4.9727]→[4.652:653](∅→∅),[4.652]→[4.652:653](∅→∅),[4.653]→[4.9728:10199](∅→∅),[4.10199]→[4.437:438](∅→∅),[4.1106]→[4.437:438](∅→∅),[4.438]→[4.10200:10230](∅→∅),[4.10230]→[4.444:445](∅→∅),[4.1147]→[4.444:445](∅→∅),[4.445]→[4.10231:10423](∅→∅)
lettakeWinningBids :: Satoshi -> [Bid] -> [Bid]takeWinningBids total (bid : xs)|-- if the total is fully within the raise amounttotal <> (bid ^. bidAmount) < raiseAmount'= bid : takeWinningBids (total <> (bid ^. bidAmount)) xs|-- if the last bid will exceed the raise amount, reduce it to fittotal < raiseAmount'= letwinFraction r = r % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi r) =Seconds . round $ winFraction r * fromIntegral (bid ^. bidSeconds)adjustBid r = bid & bidSeconds .~ remainderSeconds r & bidAmount .~ rintoList $ adjustBid <$> raiseAmount' `ssub` total| otherwise= []takeWinningBids _ [] = []submittedTotal = bidsTotal bidsinmaybe (WinningBids $ takeWinningBids (Satoshi 0) $ sortBy bidOrder bids)InsufficientBids(raiseAmount' `ssub` submittedTotal)let takeWinningBids :: Satoshi -> [Bid] -> [Bid]takeWinningBids total (bid : xs)| -- if the total is fully within the raise amounttotal <> (bid ^. bidAmount) < raiseAmount' =bid : takeWinningBids (total <> (bid ^. bidAmount)) xs| -- if the last bid will exceed the raise amount, reduce it to fittotal < raiseAmount' =let winFraction r = r % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi r) =Seconds . round $ winFraction r * fromIntegral (bid ^. bidSeconds)adjustBid r = bid & bidSeconds .~ remainderSeconds r & bidAmount .~ rin toList $ adjustBid <$> raiseAmount' `ssub` total| otherwise =[]takeWinningBids _ [] = []submittedTotal = bidsTotal bidsin maybe(WinningBids $ takeWinningBids (Satoshi 0) $ sortBy bidOrder bids)InsufficientBids(raiseAmount' `ssub` submittedTotal) - replacement in lib/Aftok/Auction.hs at line 107[4.502]→[4.2959:3009](∅→∅),[4.3009]→[4.10424:10539](∅→∅),[4.10539]→[4.664:665](∅→∅),[4.664]→[4.664:665](∅→∅)
x | x <> (bid ^. bidAmount) < raiseAmount' ->put (x <> bid ^. bidAmount)>> (pure . Just $ Commitment bid (bid ^. bidSeconds) (bid ^. bidAmount))x| x <> (bid ^. bidAmount) < raiseAmount' ->put (x <> bid ^. bidAmount)>> (pure . Just $ Commitment bid (bid ^. bidSeconds) (bid ^. bidAmount)) - replacement in lib/Aftok/Auction.hs at line 112
x | x < raiseAmount' ->let winFraction r = r % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi r) =x| x < raiseAmount' ->let winFraction r = r % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi r) = - replacement in lib/Aftok/Auction.hs at line 117[4.1812]→[4.3222:3276](∅→∅),[4.10662]→[4.3222:3276](∅→∅),[4.3222]→[4.3222:3276](∅→∅),[4.3276]→[4.10663:10776](∅→∅),[4.3387]→[4.1074:1075](∅→∅),[4.10776]→[4.1074:1075](∅→∅),[4.1074]→[4.1074:1075](∅→∅)
in for (raiseAmount' `ssub` x) $ \remainder ->put (x <> remainder)*> (pure $ Commitment bid (remainderSeconds remainder) remainder)in for (raiseAmount' `ssub` x) $ \remainder ->put (x <> remainder)*> (pure $ Commitment bid (remainderSeconds remainder) remainder) - edit in lib/Aftok/Auction.hs at line 122
- replacement in lib/Aftok/Billing.hs at line 1
{-# LANGUAGE DeriveFoldable #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE DeriveFoldable #-}{-# LANGUAGE DeriveFunctor #-} - replacement in lib/Aftok/Billing.hs at line 4
{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE TemplateHaskell #-} - edit in lib/Aftok/Billing.hs at line 8[2.429]→[4.824:825](∅→∅),[4.824]→[4.824:825](∅→∅),[4.856]→[4.856:857](∅→∅),[4.857]→[4.1814:1815](∅→∅),[4.1815]→[4.110:191](∅→∅),[4.857]→[4.110:191](∅→∅),[4.177]→[4.1017:1056](∅→∅),[4.235]→[4.1017:1056](∅→∅),[4.59]→[4.1017:1056](∅→∅),[4.1056]→[4.236:275](∅→∅),[4.275]→[4.1056:1083](∅→∅),[4.1056]→[4.1056:1083](∅→∅)
import Control.Lens (makeLenses, makePrisms, preview, view, _Just)import Data.Thyme.Clock as Cimport Data.Thyme.Time as Timport Data.UUID - replacement in lib/Aftok/Billing.hs at line 9
import Aftok.Types (UserId, ProjectId, Email)import Bippy.Types (Satoshi)import Aftok.Types (Email, ProjectId, UserId)import Bippy.Types (Satoshi)import Control.Lens (_Just, makeLenses, makePrisms, preview, view)import Data.Thyme.Clock as Cimport Data.Thyme.Time as Timport Data.UUID - edit in lib/Aftok/Billing.hs at line 17
- replacement in lib/Aftok/Billing.hs at line 23
-- | SemiMonthly| Weekly Int| -- | SemiMonthlyWeekly Int - edit in lib/Aftok/Billing.hs at line 26
- replacement in lib/Aftok/Billing.hs at line 30
recurrenceName Annually = "annually"recurrenceName Annually = "annually" - replacement in lib/Aftok/Billing.hs at line 33
recurrenceName (Weekly _) = "weekly"recurrenceName OneTime = "onetime"recurrenceName (Weekly _) = "weekly"recurrenceName OneTime = "onetime" - replacement in lib/Aftok/Billing.hs at line 37
recurrenceCount Annually = NothingrecurrenceCount Annually = Nothing - replacement in lib/Aftok/Billing.hs at line 40
recurrenceCount (Weekly i) = Just irecurrenceCount OneTime = NothingrecurrenceCount (Weekly i) = Just irecurrenceCount OneTime = Nothing - replacement in lib/Aftok/Billing.hs at line 58[4.1085]→[4.1085:1117](∅→∅),[4.1117]→[4.410:638](∅→∅),[4.638]→[4.305:357](∅→∅),[4.1289]→[4.305:357](∅→∅),[4.357]→[4.10662:10755](∅→∅),[4.357]→[4.1342:1346](∅→∅),[4.10755]→[4.1342:1346](∅→∅),[4.1342]→[4.1342:1346](∅→∅)
data Billable' p u c = Billable{ _project :: p, _creator :: u, _name :: Text, _description :: Text, _recurrence :: Recurrence, _amount :: c, _gracePeriod :: Days, _requestExpiryPeriod :: Maybe C.NominalDiffTime, _paymentRequestEmailTemplate :: Maybe Text, _paymentRequestMemoTemplate :: Maybe Text}data Billable' p u c= Billable{ _project :: p,_creator :: u,_name :: Text,_description :: Text,_recurrence :: Recurrence,_amount :: c,_gracePeriod :: Days,_requestExpiryPeriod :: Maybe C.NominalDiffTime,_paymentRequestEmailTemplate :: Maybe Text,_paymentRequestMemoTemplate :: Maybe Text} - edit in lib/Aftok/Billing.hs at line 77
- replacement in lib/Aftok/Billing.hs at line 83[4.1424]→[4.111:149](∅→∅),[4.149]→[4.3707:3867](∅→∅),[4.3867]→[4.3491:3495](∅→∅),[4.694]→[4.3491:3495](∅→∅)
data Subscription' u b = Subscription{ _customer :: u, _billable :: b, _contactChannel :: ContactChannel, _startTime :: C.UTCTime, _endTime :: Maybe C.UTCTime}data Subscription' u b= Subscription{ _customer :: u,_billable :: b,_contactChannel :: ContactChannel,_startTime :: C.UTCTime,_endTime :: Maybe C.UTCTime} - replacement in lib/Aftok/Billing.hs at line 98
Annually -> Just . T.addGregorianYearsClip 1Annually -> Just . T.addGregorianYearsClip 1 - replacement in lib/Aftok/Billing.hs at line 100
Weekly w -> Just . T.addDays (w * 7)OneTime -> const NothingWeekly w -> Just . T.addDays (w * 7)OneTime -> const Nothing - edit in lib/Aftok/Billing.hs at line 112
- edit in lib/Aftok/Billing.hs at line 116
- replacement in lib/Aftok/Config.hs at line 5[4.10875]→[4.10778:10944](∅→∅),[4.10944]→[4.10914:10966](∅→∅),[4.10914]→[4.10914:10966](∅→∅),[4.10966]→[4.3497:3549](∅→∅),[4.3549]→[4.11019:11046](∅→∅),[4.11019]→[4.11019:11046](∅→∅),[4.11046]→[4.10945:11476](∅→∅)
import Control.Lens ( makeClassy, (^.))import qualified Data.Configurator as Cimport qualified Data.Configurator.Types as Cimport Data.X509import Data.X509.File ( readKeyFile, readSignedObject)import Database.PostgreSQL.Simple ( ConnectInfo(..) )import Filesystem.Path.CurrentOS ( fromText, encodeString)import qualified Filesystem.Path.CurrentOS as Pimport Safe ( headMay )import Aftok.Currency.Bitcoin (NetworkMode)import Aftok.Payments (PaymentsConfig (..))import qualified Bippy.Types as BTimport Control.Lens( (^.),makeClassy,)import qualified Data.Configurator as Cimport qualified Data.Configurator.Types as Cimport Data.X509import Data.X509.File( readKeyFile,readSignedObject,)import Database.PostgreSQL.Simple (ConnectInfo (..))import Filesystem.Path.CurrentOS( encodeString,fromText,)import qualified Filesystem.Path.CurrentOS as Pimport qualified Network.Mail.SMTP as SMTPimport qualified Network.Socket as NSimport Safe (headMay) - replacement in lib/Aftok/Config.hs at line 29[4.11259]→[4.790:843](∅→∅),[4.843]→[4.11312:11421](∅→∅),[4.57884]→[4.11312:11421](∅→∅),[4.11312]→[4.11312:11421](∅→∅),[4.11421]→[4.11477:11612](∅→∅)
import qualified Bippy.Types as BTimport qualified Network.Mail.SMTP as SMTPimport qualified Network.Socket as NSimport Aftok.Currency.Bitcoin ( NetworkMode )import Aftok.Payments ( PaymentsConfig(..) )data SmtpConfig= SmtpConfig{ _smtpHost :: NS.HostName,_smtpPort :: Maybe NS.PortNumber,_smtpUser :: SMTP.UserName,_smtpPass :: SMTP.Password} - edit in lib/Aftok/Config.hs at line 37
data SmtpConfig = SmtpConfig{ _smtpHost :: NS.HostName, _smtpPort :: Maybe NS.PortNumber, _smtpUser :: SMTP.UserName, _smtpPass :: SMTP.Password} - replacement in lib/Aftok/Config.hs at line 39[4.11651]→[4.11651:11686](∅→∅),[4.11686]→[4.3749:3792](∅→∅),[4.3792]→[4.1966:2050](∅→∅),[4.2050]→[4.11808:11846](∅→∅),[4.11808]→[4.11808:11846](∅→∅),[4.11846]→[4.3793:3797](∅→∅)
data BillingConfig = BillingConfig{ _networkMode :: NetworkMode, _signingKeyFile :: P.FilePath, _certsFile :: P.FilePath, _exchangeRateServiceURI :: String}data BillingConfig= BillingConfig{ _networkMode :: NetworkMode,_signingKeyFile :: P.FilePath,_certsFile :: P.FilePath,_exchangeRateServiceURI :: String} - replacement in lib/Aftok/Config.hs at line 76
privKeys <- readKeyFile . encodeString $ c ^. signingKeyFileprivKeys <- readKeyFile . encodeString $ c ^. signingKeyFile - replacement in lib/Aftok/Config.hs at line 78
privKey <- case headMay privKeys ofprivKey <- case headMay privKeys of - replacement in lib/Aftok/Config.hs at line 81
fail$ "Only RSA keys are currently supported for payment request signing."Nothing -> fail $ "No keys found in private key file " <> encodeString(c ^. signingKeyFile)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/Currency/Bitcoin.hs at line 2
{-# LANGUAGE LambdaCase #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE LambdaCase #-}{-# LANGUAGE TemplateHaskell #-} - replacement in lib/Aftok/Currency/Bitcoin.hs at line 7[4.4443]→[4.2053:2054](∅→∅),[4.2054]→[4.12410:12462](∅→∅),[4.12462]→[4.4520:4550](∅→∅),[4.4520]→[4.4520:4550](∅→∅),[4.4550]→[4.846:910](∅→∅),[4.910]→[4.57943:57978](∅→∅),[4.57943]→[4.57943:57978](∅→∅)
import qualified Data.Configurator.Types as Cimport Control.Lensimport Bippy.Types ( Satoshi(..) )import Haskoin.Constantsimport Bippy.Types (Satoshi (..))import Control.Lensimport qualified Data.Configurator.Types as Cimport Haskoin.Constants - replacement in lib/Aftok/Currency/Bitcoin.hs at line 17
ssub _ _ = Nothingssub _ _ = Nothing - replacement in lib/Aftok/Currency/Bitcoin.hs at line 33
_ -> Nothing_ -> Nothing - replacement in lib/Aftok/Currency/Bitcoin.hs at line 43
_ -> Nothing_ -> Nothing - replacement in lib/Aftok/Currency/Bitcoin.hs at line 47
convert _ = Nothingconvert _ = Nothing - replacement in lib/Aftok/Currency/Bitcoin.hs at line 59
"btc" -> Just BTC"btc" -> Just BTC - replacement in lib/Aftok/Currency/Bitcoin.hs at line 61
"bch" -> Just BCH"bch" -> Just BCH - replacement in lib/Aftok/Currency/Bitcoin.hs at line 63
_ -> Nothing[4.5756]_ -> Nothing - replacement in lib/Aftok/Currency/Zcash.hs at line 1
{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE TemplateHaskell #-} - replacement in lib/Aftok/Currency/Zcash.hs at line 4[4.494]→[4.494:519](∅→∅),[4.519]→[2.432:477](∅→∅),[2.477]→[4.538:559](∅→∅),[4.538]→[4.538:559](∅→∅),[4.559]→[2.478:529](∅→∅),[2.529]→[4.559:590](∅→∅),[4.559]→[4.559:590](∅→∅)
( ZAddr(..), _ZAddr, RPCError(..), ZValidateAddressErr(..), ZcashdConfig(..), Zatoshi, ToZatoshi(..), rpcAddViewingKey, rpcValidateZAddr) where( ZAddr (..),_ZAddr,RPCError (..),ZValidateAddressErr (..),ZcashdConfig (..),Zatoshi,ToZatoshi (..),rpcAddViewingKey,rpcValidateZAddr,)where - replacement in lib/Aftok/Currency/Zcash.hs at line 16[4.591]→[2.530:588](∅→∅),[2.588]→[4.591:654](∅→∅),[4.591]→[4.591:654](∅→∅),[4.654]→[2.589:648](∅→∅),[2.648]→[4.654:912](∅→∅),[4.654]→[4.654:912](∅→∅)
import Control.Exception ( catch )import Control.Lens ( makePrisms )import Control.Monad.Trans.Except ( except )import qualified Data.Aeson as Aimport Data.Aeson ( Value, (.=), (.:), (.:?), object, encode )import Data.Aeson.Types ( Parser )import qualified Data.Text.Encoding as Timport Control.Exception (catch)import Control.Lens (makePrisms)import Control.Monad.Trans.Except (except)import Data.Aeson ((.:), (.:?), (.=), Value, encode, object)import qualified Data.Aeson as Aimport Data.Aeson.Types (Parser)import qualified Data.Text.Encoding as Timport Network.HTTP.Client( HttpException,Manager,RequestBody (..),applyBasicAuth,defaultRequest,host,httpLbs,method,port,requestBody,responseBody,responseStatus,)import Network.HTTP.Types (Status, statusCode) - edit in lib/Aftok/Currency/Zcash.hs at line 39[4.913]→[4.913:1037](∅→∅),[4.1037]→[2.649:713](∅→∅),[2.713]→[4.1037:1370](∅→∅),[4.1037]→[4.1037:1370](∅→∅),[4.1370]→[2.714:779](∅→∅),[2.779]→[4.1370:1491](∅→∅),[4.1370]→[4.1370:1491](∅→∅),[4.1491]→[2.780:781](∅→∅)
import Network.HTTP.Client ( Manager, RequestBody(..), HttpException, defaultRequest, responseBody, responseStatus, httpLbs, host, port, method, requestBody, applyBasicAuth)import Network.HTTP.Types ( Status, statusCode ) - replacement in lib/Aftok/Currency/Zcash.hs at line 45
newtype ZAddr = ZAddr { zaddrText :: Text }newtype ZAddr = ZAddr {zaddrText :: Text} - edit in lib/Aftok/Currency/Zcash.hs at line 47
- edit in lib/Aftok/Currency/Zcash.hs at line 52
- replacement in lib/Aftok/Currency/Zcash.hs at line 66[4.1622]→[4.1622:1700](∅→∅),[4.1700]→[2.1114:1158](∅→∅),[2.1158]→[4.1700:1704](∅→∅),[4.1700]→[4.1700:1704](∅→∅)
data ZcashdConfig = ZcashdConfig{ zcashdHost :: Text, zcashdPort :: Int, rpcUser :: Text, rpcPassword :: Text}data ZcashdConfig= ZcashdConfig{ zcashdHost :: Text,zcashdPort :: Int,rpcUser :: Text,rpcPassword :: Text} - replacement in lib/Aftok/Currency/Zcash.hs at line 75
ZValidateAddress :: Text -> RPCCall ZValidateAddressRespZValidateAddress :: Text -> RPCCall ZValidateAddressResp - replacement in lib/Aftok/Currency/Zcash.hs at line 92
let req = applyBasicAuth (T.encodeUtf8 $ rpcUser cfg) (T.encodeUtf8 $ rpcPassword cfg) $defaultRequest { host = T.encodeUtf8 $ zcashdHost cfg, port = zcashdPort cfg, method = "POST", requestBody = RequestBodyLBS . encode $ toRequestBody call}response <- ExceptT $ catch(Right <$> httpLbs req mgr)(pure . Left . HttpError)let req =applyBasicAuth (T.encodeUtf8 $ rpcUser cfg) (T.encodeUtf8 $ rpcPassword cfg) $defaultRequest{ host = T.encodeUtf8 $ zcashdHost cfg,port = zcashdPort cfg,method = "POST",requestBody = RequestBodyLBS . encode $ toRequestBody call}response <-ExceptT $catch(Right <$> httpLbs req mgr)(pure . Left . HttpError) - replacement in lib/Aftok/Currency/Zcash.hs at line 108
_ -> Left (ServiceError status)_ -> Left (ServiceError status) - replacement in lib/Aftok/Currency/Zcash.hs at line 118
data ZValidateAddressResp = ZValidateAddressResp{ vzrIsValid :: Bool--, vzrAddress :: Maybe Text, vzrAddrType :: Maybe ZAddrType}data ZValidateAddressResp= ZValidateAddressResp{ vzrIsValid :: Bool,--, vzrAddress :: Maybe TextvzrAddrType :: Maybe ZAddrType} - replacement in lib/Aftok/Currency/Zcash.hs at line 129
validateZAddrRequest addr = object[ "jsonrpc" .= ("1.0" :: Text), "id" .= ("aftok-z_validateaddress" :: Text), "method" .= ("z_validateaddress" :: Text), "params" .= [addr]]validateZAddrRequest addr =object[ "jsonrpc" .= ("1.0" :: Text),"id" .= ("aftok-z_validateaddress" :: Text),"method" .= ("z_validateaddress" :: Text),"params" .= [addr]] - replacement in lib/Aftok/Currency/Zcash.hs at line 154
-- <*> res .:? "address"<*> parseAddrType res-- <*> res .:? "address"<*> parseAddrType res - replacement in lib/Aftok/Currency/Zcash.hs at line 162
except $ if vzrIsValid respthencase vzrAddrType resp ofNothing -> Left (RPCError DataMissing)Just Sprout -> Left (RPCError SproutAddress)except $if vzrIsValid respthen case vzrAddrType resp ofNothing -> Left (RPCError DataMissing)Just Sprout -> Left (RPCError SproutAddress) - replacement in lib/Aftok/Currency/Zcash.hs at line 168
elseLeft $ RPCError ZAddrInvalidelse Left $ RPCError ZAddrInvalid - replacement in lib/Aftok/Currency/Zcash.hs at line 172
data ZImportViewingKeyResp = ZImportViewingKeyResp{ addressType :: ZAddrType-- , address :: ZAddr}data ZImportViewingKeyResp= ZImportViewingKeyResp{ addressType :: ZAddrType-- , address :: ZAddr} - replacement in lib/Aftok/Currency/Zcash.hs at line 183
-- <*> (ZAddr <$> v .: "address")-- <*> (ZAddr <$> v .: "address") - edit in lib/Aftok/Currency/Zcash.hs at line 186
- replacement in lib/Aftok/Currency/Zcash.hs at line 194
importViewingKeyRequest vk = object[ "jsonrpc" .= ("1.0" :: Text), "id" .= ("aftok-z_importviewingkey" :: Text), "method" .= ("z_importviewingkey" :: Text), "params" .= [vk, "no"] -- no need to rescan, for our purposes]importViewingKeyRequest vk =object[ "jsonrpc" .= ("1.0" :: Text),"id" .= ("aftok-z_importviewingkey" :: Text),"method" .= ("z_importviewingkey" :: Text),"params" .= [vk, "no"] -- no need to rescan, for our purposes] - edit in lib/Aftok/Currency/Zcash.hs at line 208
- replacement in lib/Aftok/Currency.hs at line 3
import Data.Aeson ( Value )import Data.Aeson.Types ( Parser )import Data.Aeson (Value)import Data.Aeson.Types (Parser) - replacement in lib/Aftok/Currency.hs at line 6
data Network a = Network{ addressFromJSON :: Parser a, addressToJSON :: a -> Value}[4.5918]data Network a= Network{ addressFromJSON :: Parser a,addressToJSON :: a -> Value} - replacement in lib/Aftok/Database/PostgreSQL/Types.hs at line 3
import Data.Aeson ( FromJSON(..), ToJSON(..))import Aftok.TimeLog.Serialization ( depfFromJSON, depfToJSON)import Aftok.Types ( DepreciationFunction )import Aftok.TimeLog.Serialization( depfFromJSON,depfToJSON,)import Aftok.Types (DepreciationFunction)import Data.Aeson( FromJSON (..),ToJSON (..),) - replacement in lib/Aftok/Database/PostgreSQL/Types.hs at line 13
newtype SerDepFunction = SerDepFunction { unSerDepFunction :: DepreciationFunction }newtype SerDepFunction = SerDepFunction {unSerDepFunction :: DepreciationFunction} - replacement in lib/Aftok/Database/PostgreSQL.hs at line 1
{-# LANGUAGE GADTs #-}{-# LANGUAGE GADTs #-} - replacement in lib/Aftok/Database/PostgreSQL.hs at line 3
{-# LANGUAGE LambdaCase #-}{-# LANGUAGE QuasiQuotes #-}{-# LANGUAGE LambdaCase #-}{-# LANGUAGE QuasiQuotes #-} - replacement in lib/Aftok/Database/PostgreSQL.hs at line 7
( QDBM(..), runQDBM( QDBM (..),runQDBM, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 12[4.623]→[4.13339:13396](∅→∅),[4.2172]→[4.969:999](∅→∅),[4.6734]→[4.969:999](∅→∅),[4.13396]→[4.969:999](∅→∅),[4.969]→[4.969:999](∅→∅),[4.999]→[4.57981:58040](∅→∅),[4.58040]→[4.13627:13967](∅→∅),[4.13627]→[4.13627:13967](∅→∅),[4.13967]→[4.1165:1197](∅→∅),[4.1165]→[4.1165:1197](∅→∅),[4.1197]→[4.13968:14316](∅→∅),[4.14316]→[4.329:381](∅→∅),[4.381]→[4.14316:14368](∅→∅),[4.14316]→[4.14316:14368](∅→∅),[4.14368]→[4.1315:1348](∅→∅),[4.1315]→[4.1315:1348](∅→∅),[4.1348]→[4.14369:14426](∅→∅),[4.14426]→[4.1409:1453](∅→∅),[4.1409]→[4.1409:1453](∅→∅),[4.1453]→[4.1033:1087](∅→∅),[4.1087]→[4.1507:1559](∅→∅),[4.1827]→[4.1507:1559](∅→∅),[4.1507]→[4.1507:1559](∅→∅),[4.1559]→[4.14427:14700](∅→∅)
import Prelude hiding ( null )import Control.Lensimport Control.Monad.Trans.Except ( throwE )import Crypto.Random.Types ( MonadRandom, getRandomBytes)import Data.Aeson ( Value, toJSON)import Data.Hourglassimport qualified Data.List as Limport Data.ProtocolBuffers ( decodeMessage, encodeMessage)import Data.Serialize.Get ( runGet )import Data.Serialize.Put ( runPut )import qualified Data.Text as Timport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.UUID ( UUID )import Database.PostgreSQL.Simpleimport Database.PostgreSQL.Simple.FromFieldimport Database.PostgreSQL.Simple.FromRowimport Database.PostgreSQL.Simple.SqlQQ( sql )import Database.PostgreSQL.Simple.Types( Null )import Safe ( headMay )import qualified Aftok.Auction as Aimport qualified Aftok.Billing as Bimport Aftok.Currency.Bitcoinimport Aftok.Currency.Zcash (ZAddr (..), _ZAddr)import Aftok.Databaseimport Aftok.Database.PostgreSQL.Types( SerDepFunction (..),)import Aftok.Intervalimport Aftok.Json( billableJSON,createSubscriptionJSON,paymentJSON,paymentRequestJSON,)import Aftok.Payments.Typesimport qualified Aftok.Project as Pimport Aftok.TimeLogimport Aftok.Typesimport Bippy.Types (Satoshi (..))import Control.Lensimport Control.Monad.Trans.Except (throwE)import Crypto.Random.Types( MonadRandom,getRandomBytes,)import Data.Aeson( Value,toJSON,)import Data.Hourglassimport qualified Data.List as Limport Data.ProtocolBuffers( decodeMessage,encodeMessage,)import Data.Serialize.Get (runGet)import Data.Serialize.Put (runPut)import qualified Data.Text as Timport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.UUID (UUID)import Database.PostgreSQL.Simpleimport Database.PostgreSQL.Simple.FromFieldimport Database.PostgreSQL.Simple.FromRowimport Database.PostgreSQL.Simple.SqlQQ( sql,)import Database.PostgreSQL.Simple.Types( Null,)import Haskoin.Address( Address,addrToText,textToAddr,)import Haskoin.Constants (Network)import Safe (headMay)import Prelude hiding (null) - edit in lib/Aftok/Database/PostgreSQL.hs at line 72[4.1012]→[4.14701:14753](∅→∅),[4.14753]→[2.4909:4961](∅→∅),[2.4961]→[4.6735:6775](∅→∅),[4.14805]→[4.6735:6775](∅→∅),[4.1722]→[4.6735:6775](∅→∅),[4.6775]→[4.3818:3886](∅→∅),[4.203]→[4.1614:1646](∅→∅),[4.535]→[4.1614:1646](∅→∅),[4.1207]→[4.1614:1646](∅→∅),[4.1369]→[4.1614:1646](∅→∅),[4.1722]→[4.1614:1646](∅→∅),[4.3886]→[4.1614:1646](∅→∅),[4.6775]→[4.1614:1646](∅→∅),[4.1614]→[4.1614:1646](∅→∅),[4.1646]→[4.14806:14926](∅→∅),[4.6851]→[4.1646:1678](∅→∅),[4.14926]→[4.1646:1678](∅→∅),[4.1646]→[4.1646:1678](∅→∅),[4.1678]→[4.14927:15244](∅→∅),[4.15244]→[4.1085:1123](∅→∅),[4.1085]→[4.1085:1123](∅→∅),[4.1123]→[4.15245:15297](∅→∅),[4.240]→[4.1678:1738](∅→∅),[4.595]→[4.1678:1738](∅→∅),[4.1082]→[4.1678:1738](∅→∅),[4.1339]→[4.1678:1738](∅→∅),[4.15297]→[4.1678:1738](∅→∅),[4.1678]→[4.1678:1738](∅→∅),[4.1738]→[4.913:1035](∅→∅),[4.1035]→[4.58147:58269](∅→∅),[4.58147]→[4.58147:58269](∅→∅),[4.58269]→[4.15546:15596](∅→∅),[4.15546]→[4.15546:15596](∅→∅),[4.15596]→[4.1036:1096](∅→∅),[4.476]→[4.1123:1124](∅→∅),[4.476]→[4.1123:1124](∅→∅),[4.1096]→[4.1123:1124](∅→∅),[4.1201]→[4.1123:1124](∅→∅),[4.1738]→[4.1123:1124](∅→∅),[4.7076]→[4.1123:1124](∅→∅),[4.15656]→[4.1123:1124](∅→∅),[4.58322]→[4.1123:1124](∅→∅),[4.1101]→[4.1123:1124](∅→∅)
import qualified Aftok.Auction as Aimport qualified Aftok.Billing as Bimport Aftok.Currency.Bitcoinimport Aftok.Currency.Zcash (ZAddr(..), _ZAddr)import Aftok.Databaseimport Aftok.Database.PostgreSQL.Types( SerDepFunction(..) )import Aftok.Intervalimport Aftok.Json ( billableJSON, createSubscriptionJSON, paymentJSON, paymentRequestJSON)import Aftok.Payments.Typesimport qualified Aftok.Project as Pimport Aftok.TimeLogimport Aftok.Typesimport Bippy.Types ( Satoshi(..) )import Haskoin.Address ( Address, textToAddr, addrToText)import Haskoin.Constants ( Network ) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 96
Just other -> returnErrorConversionFailedf("Network identifier " <> other <> " is not supported.")Just other ->returnErrorConversionFailedf("Network identifier " <> other <> " is not supported.") - replacement in lib/Aftok/Database/PostgreSQL.hs at line 106
address <- fieldWith $ addrFieldParser (toNetwork mode networkId)address <- fieldWith $ addrFieldParser (toNetwork mode networkId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 113
let err = returnErrorConversionFailedf( "could not deserialize value "<> T.unpack fieldValue<> " to a valid BTC address for network "<> show n)let err =returnErrorConversionFailedf( "could not deserialize value "<> T.unpack fieldValue<> " to a valid BTC address for network "<> show n) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 138
else maybe(returnError UnexpectedNull f "event type may not be null")( maybe (returnError Incompatible f "unrecognized event type value") pure. nameEvent. decodeUtf8)velsemaybe(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 153
creditToParser':: NetworkMode -> FieldParser (RowParser (CreditTo (NetworkId, Address)))creditToParser' ::NetworkMode -> FieldParser (RowParser (CreditTo (NetworkId, Address))) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 160[4.4400]→[4.1308:1421](∅→∅),[4.1421]→[4.1464:1541](∅→∅),[4.1541]→[4.1495:1735](∅→∅),[4.1495]→[4.1495:1735](∅→∅)
whereparser :: Text -> RowParser (CreditTo (NetworkId, Address))parser = \case"credit_to_address" ->CreditToCurrency <$> (btcAddressParser mode <* nullField <* nullField)"credit_to_user" ->CreditToUser <$> (nullField *> nullField *> idParser UserId <* nullField)"credit_to_project" ->CreditToProject<$> (nullField *> nullField *> nullField *> idParser ProjectId)_ -> emptywhereparser :: Text -> RowParser (CreditTo (NetworkId, Address))parser = \case"credit_to_address" ->CreditToCurrency <$> (btcAddressParser mode <* nullField <* nullField)"credit_to_user" ->CreditToUser <$> (nullField *> nullField *> idParser UserId <* nullField)"credit_to_project" ->CreditToProject<$> (nullField *> nullField *> nullField *> idParser ProjectId)_ -> empty - replacement in lib/Aftok/Database/PostgreSQL.hs at line 179
qdbLogEntryParser:: NetworkMode -> RowParser (KeyedLogEntry (NetworkId, Address))qdbLogEntryParser ::NetworkMode -> RowParser (KeyedLogEntry (NetworkId, Address)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 202
<*> ((maybe empty pure =<< fmap (RecoverByEmail . Email) <$> field)<|>(maybe empty pure =<< fmap (RecoverByZAddr . ZAddr) <$> field))<*> ( (maybe empty pure =<< fmap (RecoverByEmail . Email) <$> field)<|> (maybe empty pure =<< fmap (RecoverByZAddr . ZAddr) <$> field)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 242
"monthly" -> B.Monthly <$> field"monthly" -> B.Monthly <$> field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 244[4.2408]→[4.2408:2527](∅→∅),[4.1420]→[4.3920:3941](∅→∅),[4.2246]→[4.3920:3941](∅→∅),[4.2527]→[4.3920:3941](∅→∅),[4.3920]→[4.3920:3941](∅→∅)
"weekly" -> B.Weekly <$> field"onetime" -> nullField *> pure B.OneTime_ -> emptyin field >>= prec"weekly" -> B.Weekly <$> field"onetime" -> nullField *> pure B.OneTime_ -> emptyin field >>= prec - replacement in lib/Aftok/Database/PostgreSQL.hs at line 264
<*> fmap toThyme field<*> fmap toThyme field<*> fmap toThyme field<*> fmap toThyme field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 283
ids <- lift . lift $ query conn q dids <- lift . lift $ query conn q d - replacement in lib/Aftok/Database/PostgreSQL.hs at line 299[4.532]→[4.263:264](∅→∅),[4.263]→[4.263:264](∅→∅),[4.264]→[4.18673:18813](∅→∅),[4.517]→[4.384:385](∅→∅),[4.623]→[4.384:385](∅→∅),[4.1089]→[4.384:385](∅→∅),[4.4268]→[4.384:385](∅→∅),[4.18813]→[4.384:385](∅→∅),[4.384]→[4.384:385](∅→∅),[4.385]→[4.18814:18936](∅→∅),[4.746]→[4.248:249](∅→∅),[4.18936]→[4.248:249](∅→∅),[4.248]→[4.248:249](∅→∅)
storeEvent (CreateSubscription uid bid t) = Just $ storeEventJSON(Just uid)"create_subscription"(createSubscriptionJSON uid bid t)storeEvent (CreatePaymentRequest req) = Just$ storeEventJSON Nothing "create_payment_request" (paymentRequestJSON req)storeEvent (CreateSubscription uid bid t) =Just $storeEventJSON(Just uid)"create_subscription"(createSubscriptionJSON uid bid t)storeEvent (CreatePaymentRequest req) =Just $storeEventJSON Nothing "create_payment_request" (paymentRequestJSON req) - edit in lib/Aftok/Database/PostgreSQL.hs at line 310
- replacement in lib/Aftok/Database/PostgreSQL.hs at line 339[4.14581]→[4.19203:19250](∅→∅),[4.19250]→[4.95:123](∅→∅),[4.123]→[4.58364:58396](∅→∅),[4.58396]→[4.19284:19349](∅→∅),[4.19284]→[4.19284:19349](∅→∅)
( pid, uid, creditToName c, renderNetworkId nid, addrToText network addr, eventName e, fromThyme $ e ^. eventTime, m( pid,uid,creditToName c,renderNetworkId nid,addrToText network addr,eventName e,fromThyme $ e ^. eventTime,m - replacement in lib/Aftok/Database/PostgreSQL.hs at line 348[4.2276]→[4.762:763](∅→∅),[4.4546]→[4.762:763](∅→∅),[4.10338]→[4.762:763](∅→∅),[4.19357]→[4.762:763](∅→∅),[4.762]→[4.762:763](∅→∅),[4.763]→[4.19358:19438](∅→∅)
CreditToProject pid' -> pinsertEventId[sql| INSERT INTO work_eventsCreditToProject pid' ->pinsertEventId[sql| INSERT INTO work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 356[4.14850]→[4.19439:19570](∅→∅),[4.974]→[4.1807:1808](∅→∅),[4.1090]→[4.1807:1808](∅→∅),[4.2557]→[4.1807:1808](∅→∅),[4.4908]→[4.1807:1808](∅→∅),[4.10601]→[4.1807:1808](∅→∅),[4.19570]→[4.1807:1808](∅→∅),[4.3405]→[4.1807:1808](∅→∅),[4.1808]→[4.19571:19648](∅→∅)
( pid, uid, creditToName c, pid' ^. _ProjectId, eventName e, fromThyme $ e ^. eventTime, m)CreditToUser uid' -> pinsertEventId[sql| INSERT INTO work_events( pid,uid,creditToName c,pid' ^. _ProjectId,eventName e,fromThyme $ e ^. eventTime,m)CreditToUser uid' ->pinsertEventId[sql| INSERT INTO work_events - replacement in lib/Aftok/Database/PostgreSQL.hs at line 371[4.15099]→[4.19649:19777](∅→∅),[4.1230]→[4.3405:3406](∅→∅),[4.1714]→[4.3405:3406](∅→∅),[4.2097]→[4.3405:3406](∅→∅),[4.5259]→[4.3405:3406](∅→∅),[4.19777]→[4.3405:3406](∅→∅),[4.3405]→[4.3405:3406](∅→∅)
( pid, uid, creditToName c, uid' ^. _UserId, eventName e, fromThyme $ e ^. eventTime, m)( pid,uid,creditToName c,uid' ^. _UserId,eventName e,fromThyme $ e ^. eventTime,m) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 381
headMay <$> pquery(qdbLogEntryParser mode)[sql| SELECT project_id, user_id,headMay<$> pquery(qdbLogEntryParser mode)[sql| SELECT project_id, user_id, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 389[4.15373]→[4.5540:5555](∅→∅),[4.5540]→[4.5540:5555](∅→∅),[4.432]→[4.1083:1084](∅→∅),[4.2034]→[4.1083:1084](∅→∅),[4.2226]→[4.1083:1084](∅→∅),[4.5555]→[4.1083:1084](∅→∅),[4.1083]→[4.1083:1084](∅→∅)
(Only eid)(Only eid) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 393[4.2347]→[4.2347:2372](∅→∅),[4.2372]→[4.19861:19889](∅→∅),[4.19861]→[4.19861:19889](∅→∅),[4.19889]→[4.695:730](∅→∅)
(Before e) -> pquery(logEntryParser mode)[sql| SELECT credit_to_type,(Before e) ->pquery(logEntryParser mode)[sql| SELECT credit_to_type, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 405[4.2522]→[4.2522:2586](∅→∅),[4.2586]→[4.20043:20071](∅→∅),[4.20043]→[4.20043:20071](∅→∅),[4.20071]→[4.831:866](∅→∅)
(pid, uid, fromThyme e, limit)(During s e) -> pquery(logEntryParser mode)[sql| SELECT credit_to_type,(pid, uid, fromThyme e, limit)(During s e) ->pquery(logEntryParser mode)[sql| SELECT credit_to_type, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 418[4.2719]→[4.2719:2793](∅→∅),[4.2793]→[4.20235:20263](∅→∅),[4.20235]→[4.20235:20263](∅→∅),[4.20263]→[4.967:1002](∅→∅)
(pid, uid, fromThyme s, fromThyme e, limit)(After s) -> pquery(logEntryParser mode)[sql| SELECT credit_to_type,(pid, uid, fromThyme s, fromThyme e, limit)(After s) ->pquery(logEntryParser mode)[sql| SELECT credit_to_type, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 430
(pid, uid, fromThyme s, limit)(Always) -> pquery(logEntryParser mode)[sql| SELECT credit_to_type,(pid, uid, fromThyme s, limit)(Always) ->pquery(logEntryParser mode)[sql| SELECT credit_to_type, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 443[4.3399]→[4.3399:3423](∅→∅),[4.317]→[4.1951:1952](∅→∅),[4.2276]→[4.1951:1952](∅→∅),[4.3423]→[4.1951:1952](∅→∅),[4.6355]→[4.1951:1952](∅→∅),[4.8155]→[4.1951:1952](∅→∅),[4.12014]→[4.1951:1952](∅→∅),[4.1951]→[4.1951:1952](∅→∅),[4.1952]→[4.20390:20508](∅→∅)
(pid, uid, limit)pgEval (AmendEvent (EventId eid) (TimeChange mt t)) = pinsertAmendmentId[sql| INSERT INTO event_time_amendments(pid, uid, limit)pgEval (AmendEvent (EventId eid) (TimeChange mt t)) =pinsertAmendmentId[sql| INSERT INTO event_time_amendments - replacement in lib/Aftok/Database/PostgreSQL.hs at line 450[4.16519]→[4.20509:20558](∅→∅),[4.1617]→[4.2903:2904](∅→∅),[4.2902]→[4.2903:2904](∅→∅),[4.3401]→[4.2903:2904](∅→∅),[4.6609]→[4.2903:2904](∅→∅),[4.20558]→[4.2903:2904](∅→∅),[4.2527]→[4.2903:2904](∅→∅)
(eid, fromThyme $ mt ^. _ModTime, fromThyme t)(eid, fromThyme $ mt ^. _ModTime, fromThyme t) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 461
( eid, fromThyme $ mt ^. _ModTime, creditToName c, renderNetworkId nid, addrToText network addr( eid,fromThyme $ mt ^. _ModTime,creditToName c,renderNetworkId nid,addrToText network addr - replacement in lib/Aftok/Database/PostgreSQL.hs at line 467[4.2984]→[4.1932:1933](∅→∅),[4.6998]→[4.1932:1933](∅→∅),[4.12532]→[4.1932:1933](∅→∅),[4.20716]→[4.1932:1933](∅→∅),[4.1932]→[4.1932:1933](∅→∅),[4.1933]→[4.20717:20821](∅→∅)
CreditToProject pid -> pinsertAmendmentId[sql| INSERT INTO event_credit_to_amendmentsCreditToProject pid ->pinsertAmendmentId[sql| INSERT INTO event_credit_to_amendments - replacement in lib/Aftok/Database/PostgreSQL.hs at line 473[4.16933]→[4.20822:20897](∅→∅),[4.3092]→[4.2208:2209](∅→∅),[4.7298]→[4.2208:2209](∅→∅),[4.12767]→[4.2208:2209](∅→∅),[4.20897]→[4.2208:2209](∅→∅),[4.2208]→[4.2208:2209](∅→∅),[4.2209]→[4.20898:20999](∅→∅)
(eid, fromThyme $ mt ^. _ModTime, creditToName c, pid ^. _ProjectId)CreditToUser uid -> pinsertAmendmentId[sql| INSERT INTO event_credit_to_amendments(eid, fromThyme $ mt ^. _ModTime, creditToName c, pid ^. _ProjectId)CreditToUser uid ->pinsertAmendmentId[sql| INSERT INTO event_credit_to_amendments - replacement in lib/Aftok/Database/PostgreSQL.hs at line 480[4.17138]→[4.21000:21072](∅→∅),[4.2764]→[4.4597:4598](∅→∅),[4.7587]→[4.4597:4598](∅→∅),[4.21072]→[4.4597:4598](∅→∅),[4.4597]→[4.4597:4598](∅→∅),[4.4598]→[4.21073:21199](∅→∅)
(eid, fromThyme $ mt ^. _ModTime, creditToName c, uid ^. _UserId)pgEval (AmendEvent (EventId eid) (MetadataChange mt v)) = pinsertAmendmentId[sql| INSERT INTO event_metadata_amendments(eid, fromThyme $ mt ^. _ModTime, creditToName c, uid ^. _UserId)pgEval (AmendEvent (EventId eid) (MetadataChange mt v)) =pinsertAmendmentId[sql| INSERT INTO event_metadata_amendments - replacement in lib/Aftok/Database/PostgreSQL.hs at line 487[4.17304]→[4.21200:21239](∅→∅),[4.2998]→[4.4861:4862](∅→∅),[4.7842]→[4.4861:4862](∅→∅),[4.21239]→[4.4861:4862](∅→∅),[4.4861]→[4.4861:4862](∅→∅)
(eid, fromThyme $ mt ^. _ModTime, v)(eid, fromThyme $ mt ^. _ModTime, v) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 489
mode <- askNetworkModelogEntries <- pquery(logEntryParser mode)[sql| SELECT credit_to_type,mode <- askNetworkModelogEntries <-pquery(logEntryParser mode)[sql| SELECT credit_to_type, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 498
(Only pid)(Only pid) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 500[4.254]→[4.5182:5183](∅→∅),[4.541]→[4.5182:5183](∅→∅),[4.585]→[4.5182:5183](∅→∅),[4.760]→[4.5182:5183](∅→∅),[4.760]→[4.5182:5183](∅→∅),[4.3079]→[4.5182:5183](∅→∅),[4.3239]→[4.5182:5183](∅→∅),[4.8077]→[4.5182:5183](∅→∅),[4.5182]→[4.5182:5183](∅→∅),[4.5183]→[4.21321:21452](∅→∅)
pgEval (CreateAuction auc) = pinsertA.AuctionId[sql| INSERT INTO auctions (project_id, initiator_id, raise_amount, end_time)pgEval (CreateAuction auc) =pinsertA.AuctionId[sql| INSERT INTO auctions (project_id, initiator_id, raise_amount, end_time) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 505[4.17710]→[4.21453:21608](∅→∅),[4.3373]→[4.5424:5425](∅→∅),[4.3440]→[4.5424:5425](∅→∅),[4.8414]→[4.5424:5425](∅→∅),[4.21608]→[4.5424:5425](∅→∅),[4.5424]→[4.5424:5425](∅→∅),[4.5425]→[4.21609:21761](∅→∅)
( auc ^. (A.projectId . _ProjectId), auc ^. (A.initiator . _UserId), auc ^. (A.raiseAmount . satoshi), auc ^. (A.auctionEnd . to fromThyme))pgEval (FindAuction aucId) = headMay <$> pqueryauctionParser[sql| SELECT project_id, initiator_id, created_at, raise_amount, start_time, end_time( auc ^. (A.projectId . _ProjectId),auc ^. (A.initiator . _UserId),auc ^. (A.raiseAmount . satoshi),auc ^. (A.auctionEnd . to fromThyme))pgEval (FindAuction aucId) =headMay<$> pqueryauctionParser[sql| SELECT project_id, initiator_id, created_at, raise_amount, start_time, end_time - replacement in lib/Aftok/Database/PostgreSQL.hs at line 517[4.17889]→[4.21762:21795](∅→∅),[4.703]→[4.5524:5525](∅→∅),[4.3430]→[4.5524:5525](∅→∅),[4.3799]→[4.5524:5525](∅→∅),[4.8632]→[4.5524:5525](∅→∅),[4.21795]→[4.5524:5525](∅→∅),[4.5524]→[4.5524:5525](∅→∅),[4.5525]→[4.21796:21943](∅→∅)
(Only (aucId ^. A._AuctionId))pgEval (CreateBid (A.AuctionId aucId) bid) = pinsertA.BidId[sql| INSERT INTO bids (auction_id, bidder_id, bid_seconds, bid_amount, bid_time)(Only (aucId ^. A._AuctionId))pgEval (CreateBid (A.AuctionId aucId) bid) =pinsertA.BidId[sql| INSERT INTO bids (auction_id, bidder_id, bid_seconds, bid_amount, bid_time) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 523[4.18045]→[4.21944:22117](∅→∅),[4.647]→[4.667:668](∅→∅),[4.3588]→[4.667:668](∅→∅),[4.3976]→[4.667:668](∅→∅),[4.9007]→[4.667:668](∅→∅),[4.22117]→[4.667:668](∅→∅),[4.273]→[4.667:668](∅→∅),[4.668]→[4.22118:22325](∅→∅),[4.273]→[4.704:705](∅→∅),[4.913]→[4.704:705](∅→∅),[4.963]→[4.704:705](∅→∅),[4.3217]→[4.704:705](∅→∅),[4.3651]→[4.704:705](∅→∅),[4.3717]→[4.704:705](∅→∅),[4.4200]→[4.704:705](∅→∅),[4.9180]→[4.704:705](∅→∅),[4.22325]→[4.704:705](∅→∅),[4.5525]→[4.704:705](∅→∅)
( aucId, bid ^. (A.bidUser . _UserId), case bid ^. A.bidSeconds of(Seconds i) -> i, bid ^. (A.bidAmount . satoshi), bid ^. (A.bidTime . to fromThyme))pgEval (FindBids aucId) = pquery((,) <$> idParser A.BidId <*> bidParser)[sql| SELECT id, bidder_id, bid_seconds, bid_amount, bid_time FROM bids WHERE auction_id = ? |](Only (aucId ^. A._AuctionId))( aucId,bid ^. (A.bidUser . _UserId),case bid ^. A.bidSeconds of(Seconds i) -> i,bid ^. (A.bidAmount . satoshi),bid ^. (A.bidTime . to fromThyme))pgEval (FindBids aucId) =pquery((,) <$> idParser A.BidId <*> bidParser)[sql| SELECT id, bidder_id, bid_seconds, bid_amount, bid_time FROM bids WHERE auction_id = ? |](Only (aucId ^. A._AuctionId)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 540
( user' ^. (username . _UserName), user' ^? userAccountRecovery . _RecoverByEmail . _Email, user' ^? userAccountRecovery . _RecoverByZAddr . _ZAddr( user' ^. (username . _UserName),user' ^? userAccountRecovery . _RecoverByEmail . _Email,user' ^? userAccountRecovery . _RecoverByZAddr . _ZAddr - edit in lib/Aftok/Database/PostgreSQL.hs at line 544
- replacement in lib/Aftok/Database/PostgreSQL.hs at line 545[4.14281]→[4.22422:22443](∅→∅),[4.22443]→[4.1945:2043](∅→∅),[4.1430]→[4.9648:9663](∅→∅),[4.2043]→[4.9648:9663](∅→∅),[4.18409]→[4.9648:9663](∅→∅),[4.9648]→[4.9648:9663](∅→∅),[4.9663]→[4.3218:3219](∅→∅),[4.4565]→[4.3218:3219](∅→∅)
headMay <$> pqueryuserParser[sql| SELECT handle, recovery_email, recovery_zaddr FROM users WHERE id = ? |](Only uid)headMay<$> pqueryuserParser[sql| SELECT handle, recovery_email, recovery_zaddr FROM users WHERE id = ? |](Only uid) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 551
headMay <$> pquery((,) <$> idParser UserId <*> userParser)[sql| SELECT id, handle, recovery_email, recovery_zaddr FROM users WHERE handle = ? |](Only h)headMay<$> pquery((,) <$> idParser UserId <*> userParser)[sql| SELECT id, handle, recovery_email, recovery_zaddr FROM users WHERE handle = ? |](Only h) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 558[4.14388]→[4.22466:22487](∅→∅),[4.22487]→[4.2266:2399](∅→∅),[4.2399]→[4.9825:9826](∅→∅),[4.9825]→[4.9825:9826](∅→∅)
headMay <$> pquery(btcAddressParser mode)[sql| SELECT default_payment_network, default_payment_addr FROM users WHERE id = ? |](Only uid)headMay<$> pquery(btcAddressParser mode)[sql| SELECT default_payment_network, default_payment_addr FROM users WHERE id = ? |](Only uid) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 565
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 569
(pid, uid, e, P.renderInvCode invCode, fromThyme t)(pid, uid, e, P.renderInvCode invCode, fromThyme t) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 571
pgEval (FindInvitation ic) = headMay <$> pqueryinvitationParser[sql| SELECT project_id, invitor_id, invitee_email, invitation_time, acceptance_timepgEval (FindInvitation ic) =headMay<$> pqueryinvitationParser[sql| SELECT project_id, invitor_id, invitee_email, invitation_time, acceptance_time - replacement in lib/Aftok/Database/PostgreSQL.hs at line 577[4.18895]→[4.22693:22723](∅→∅),[4.3556]→[4.3741:3742](∅→∅),[4.4565]→[4.3741:3742](∅→∅),[4.10399]→[4.3741:3742](∅→∅),[4.22723]→[4.3741:3742](∅→∅),[4.1369]→[4.3741:3742](∅→∅)
(Only $ P.renderInvCode ic)(Only $ P.renderInvCode ic) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 579[4.5088]→[4.14780:14795](∅→∅),[4.14795]→[4.18912:18993](∅→∅),[4.18912]→[4.18912:18993](∅→∅),[4.18993]→[4.10558:10596](∅→∅),[4.10558]→[4.10558:10596](∅→∅),[4.10596]→[4.18994:18995](∅→∅),[4.18995]→[4.14796:14897](∅→∅)
void $ pexec[sql| UPDATE invitations SET acceptance_time = ? WHERE invitation_key = ? |](fromThyme t, P.renderInvCode ic)void $ pexec[sql| INSERT INTO project_companions (project_id, user_id, invited_by, joined_at)void $pexec[sql| UPDATE invitations SET acceptance_time = ? WHERE invitation_key = ? |](fromThyme t, P.renderInvCode ic)void $pexec[sql| INSERT INTO project_companions (project_id, user_id, invited_by, joined_at) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 589[4.19219]→[4.10800:10843](∅→∅),[4.10800]→[4.10800:10843](∅→∅),[4.10843]→[4.3835:3836](∅→∅),[4.3835]→[4.3835:3836](∅→∅),[4.3836]→[4.22724:22862](∅→∅)
(uid, fromThyme t, P.renderInvCode ic)pgEval (CreateProject p) = pinsertProjectId[sql| INSERT INTO projects (project_name, inception_date, initiator_id, depreciation_fn)(uid, fromThyme t, P.renderInvCode ic)pgEval (CreateProject p) =pinsertProjectId[sql| INSERT INTO projects (project_name, inception_date, initiator_id, depreciation_fn) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 595[4.19383]→[4.22863:23010](∅→∅),[4.15248]→[4.19384:19385](∅→∅),[4.23010]→[4.19384:19385](∅→∅),[4.11143]→[4.19384:19385](∅→∅)
( p ^. P.projectName, p ^. (P.inceptionDate . to fromThyme), p ^. (P.initiator . _UserId), toJSON $ p ^. P.depf . to SerDepFunction)( 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 602
pgEval (FindSubscribers pid) = pquery(idParser UserId)[sql| SELECT s.user_idpgEval (FindSubscribers pid) =pquery(idParser UserId)[sql| SELECT s.user_id - replacement in lib/Aftok/Database/PostgreSQL.hs at line 609[4.19689]→[4.23162:23191](∅→∅),[4.11143]→[4.4290:4291](∅→∅),[4.15420]→[4.4290:4291](∅→∅),[4.19722]→[4.4290:4291](∅→∅),[4.23191]→[4.4290:4291](∅→∅),[4.4290]→[4.4290:4291](∅→∅),[4.4291]→[4.23192:23384](∅→∅),[4.696]→[4.946:947](∅→∅),[4.4398]→[4.946:947](∅→∅),[4.4842]→[4.946:947](∅→∅),[4.11340]→[4.946:947](∅→∅),[4.23384]→[4.946:947](∅→∅),[4.5654]→[4.946:947](∅→∅),[4.947]→[4.23385:23482](∅→∅),[4.23482]→[4.3887:4013](∅→∅)
(Only (pid ^. _ProjectId))pgEval (FindProject (ProjectId pid)) = headMay <$> pqueryprojectParser[sql| SELECT project_name, inception_date, initiator_id, depreciation_fn FROM projects WHERE id = ? |](Only pid)pgEval (FindUserProjects (UserId uid)) = pquery((,) <$> idParser ProjectId <*> projectParser)[sql| SELECT DISTINCT ON (p.inception_date, p.id) p.id, p.project_name, p.inception_date, p.initiator_id, p.depreciation_fn(Only (pid ^. _ProjectId))pgEval (FindProject (ProjectId pid)) =headMay<$> pqueryprojectParser[sql| SELECT project_name, inception_date, initiator_id, depreciation_fn FROM projects WHERE id = ? |](Only pid)pgEval (FindUserProjects (UserId uid)) =pquery((,) <$> idParser ProjectId <*> projectParser)[sql| SELECT DISTINCT ON (p.inception_date, p.id) p.id, p.project_name, p.inception_date, p.initiator_id, p.depreciation_fn - replacement in lib/Aftok/Database/PostgreSQL.hs at line 624[4.4091]→[4.23572:23585](∅→∅),[4.20174]→[4.23572:23585](∅→∅),[4.5054]→[4.1013:1014](∅→∅),[4.11657]→[4.1013:1014](∅→∅),[4.23585]→[4.1013:1014](∅→∅),[4.1013]→[4.1013:1014](∅→∅),[4.1014]→[4.23586:23794](∅→∅),[4.5465]→[4.1042:1043](∅→∅),[4.11872]→[4.1042:1043](∅→∅),[4.15832]→[4.1042:1043](∅→∅),[4.23794]→[4.1042:1043](∅→∅),[4.5766]→[4.1042:1043](∅→∅)
(uid, uid)pgEval (AddUserToProject pid current new) = void $ pexec[sql| INSERT INTO project_companions (project_id, user_id, invited_by) VALUES (?, ?, ?) |](pid ^. _ProjectId, new ^. _UserId, current ^. _UserId)(uid, uid)pgEval (AddUserToProject pid current new) =void $pexec[sql| INSERT INTO project_companions (project_id, user_id, invited_by) VALUES (?, ?, ?) |](pid ^. _ProjectId, new ^. _UserId, current ^. _UserId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 641[4.20634]→[4.16070:16106](∅→∅),[4.5356]→[4.12210:12236](∅→∅),[4.16106]→[4.12210:12236](∅→∅),[4.12210]→[4.12210:12236](∅→∅),[4.12236]→[4.5357:5529](∅→∅),[4.5529]→[4.3017:3044](∅→∅),[4.3044]→[4.20635:20720](∅→∅)
( b ^. (B.project . _ProjectId), eventId ^. _EventId, 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), b ^. (B.paymentRequestEmailTemplate), b ^. (B.paymentRequestMemoTemplate)( b ^. (B.project . _ProjectId),eventId ^. _EventId,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),b ^. (B.paymentRequestEmailTemplate),b ^. (B.paymentRequestMemoTemplate) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 652
pgEval (FindBillable bid) = headMay <$> pquerybillableParser[sql| SELECT b.project_id, e.created_by, b.name, b.description,pgEval (FindBillable bid) =headMay<$> pquerybillableParser[sql| SELECT b.project_id, e.created_by, b.name, b.description, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 662[4.21120]→[4.23954:23986](∅→∅),[4.23986]→[4.21121:21122](∅→∅),[4.5628]→[4.21121:21122](∅→∅),[4.21122]→[4.23987:24148](∅→∅)
(Only (bid ^. B._BillableId))pgEval (FindBillables pid) = pquery((,) <$> idParser B.BillableId <*> billableParser)[sql| SELECT b.id, b.project_id, e.created_by, b.name, b.description,(Only (bid ^. B._BillableId))pgEval (FindBillables pid) =pquery((,) <$> idParser B.BillableId <*> billableParser)[sql| SELECT b.id, b.project_id, e.created_by, b.name, b.description, - replacement in lib/Aftok/Database/PostgreSQL.hs at line 672[4.21589]→[4.24149:24178](∅→∅),[4.5628]→[4.3942:3943](∅→∅),[4.12804]→[4.3942:3943](∅→∅),[4.16712]→[4.3942:3943](∅→∅),[4.21622]→[4.3942:3943](∅→∅),[4.24178]→[4.3942:3943](∅→∅),[4.3942]→[4.3942:3943](∅→∅)
(Only (pid ^. _ProjectId))(Only (pid ^. _ProjectId)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 680[4.21790]→[4.24211:24240](∅→∅),[4.24240]→[4.590:619](∅→∅),[4.590]→[4.590:619](∅→∅),[4.619]→[4.24241:24274](∅→∅),[4.24274]→[4.1327:1354](∅→∅),[4.647]→[4.1327:1354](∅→∅)
( view _UserId uid, view B._BillableId bid, view _EventId eventId, fromThyme start_date( view _UserId uid,view B._BillableId bid,view _EventId eventId,fromThyme start_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 685[4.653]→[4.3074:3075](∅→∅),[4.5781]→[4.3074:3075](∅→∅),[4.3075]→[4.24275:24347](∅→∅),[4.24347]→[4.3914:3982](∅→∅)
pgEval (FindSubscription sid) = headMay <$> pquerysubscriptionParser[sql| SELECT id, billable_id, contact_email, start_date, end_datepgEval (FindSubscription sid) =headMay<$> pquerysubscriptionParser[sql| SELECT id, billable_id, contact_email, start_date, end_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 692[4.21948]→[4.24401:24437](∅→∅),[4.3287]→[4.5781:5782](∅→∅),[4.24437]→[4.5781:5782](∅→∅),[4.5781]→[4.5781:5782](∅→∅),[4.5782]→[4.24438:24543](∅→∅),[4.24543]→[4.3983:4062](∅→∅)
(Only (sid ^. B._SubscriptionId))pgEval (FindSubscriptions uid pid) = pquery((,) <$> idParser B.SubscriptionId <*> subscriptionParser)[sql| SELECT s.id, user_id, billable_id, contact_email, start_date, end_date(Only (sid ^. B._SubscriptionId))pgEval (FindSubscriptions uid pid) =pquery((,) <$> idParser B.SubscriptionId <*> subscriptionParser)[sql| SELECT s.id, user_id, billable_id, contact_email, start_date, end_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 701[4.22234]→[4.24608:24646](∅→∅),[4.6107]→[4.811:812](∅→∅),[4.17304]→[4.811:812](∅→∅),[4.24646]→[4.811:812](∅→∅),[4.811]→[4.811:812](∅→∅),[4.812]→[4.6108:6109](∅→∅)
(uid ^. _UserId, pid ^. _ProjectId)(uid ^. _UserId, pid ^. _ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 709[4.656]→[4.6158:6206](∅→∅),[4.3476]→[4.6158:6206](∅→∅),[4.22445]→[4.6158:6206](∅→∅),[4.1044]→[4.6158:6206](∅→∅),[4.6206]→[4.1540:1566](∅→∅),[4.1093]→[4.1540:1566](∅→∅),[4.1566]→[4.1029:1129](∅→∅),[4.684]→[4.3477:3568](∅→∅),[4.1129]→[4.3477:3568](∅→∅),[4.1180]→[4.3477:3568](∅→∅)
( req ^. (subscription . B._SubscriptionId), eventId ^. _EventId, req ^. (paymentRequest . to (runPut . encodeMessage)), req ^. (paymentKey . _PaymentKey), req ^. (paymentRequestTime . to fromThyme), req ^. (billingDate . to fromThyme)( req ^. (subscription . B._SubscriptionId),eventId ^. _EventId,req ^. (paymentRequest . to (runPut . encodeMessage)),req ^. (paymentKey . _PaymentKey),req ^. (paymentRequestTime . to fromThyme),req ^. (billingDate . to fromThyme) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 716[4.1186]→[4.1567:1568](∅→∅),[4.1568]→[4.24679:24806](∅→∅),[4.24806]→[4.17588:17674](∅→∅),[4.17588]→[4.17588:17674](∅→∅)
pgEval (FindPaymentRequest (PaymentKey k)) = headMay <$> pquery((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_datepgEval (FindPaymentRequest (PaymentKey k)) =headMay<$> pquery((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 724[4.1379]→[4.753:764](∅→∅),[4.22741]→[4.753:764](∅→∅),[4.753]→[4.753:764](∅→∅),[4.764]→[4.22742:22743](∅→∅),[4.22743]→[4.24807:24905](∅→∅),[4.24905]→[4.17731:17813](∅→∅),[4.22841]→[4.17731:17813](∅→∅)
(Only k)pgEval (FindPaymentRequestId (PaymentRequestId prid)) = headMay <$> pquerypaymentRequestParser[sql| SELECT subscription_id, request_data, url_key, request_time, billing_date(Only k)pgEval (FindPaymentRequestId (PaymentRequestId prid)) =headMay<$> pquerypaymentRequestParser[sql| SELECT subscription_id, request_data, url_key, request_time, billing_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 732[4.22979]→[4.22979:22993](∅→∅),[4.764]→[4.1590:1591](∅→∅),[4.22993]→[4.1590:1591](∅→∅),[4.3796]→[4.1590:1591](∅→∅),[4.1591]→[4.24906:25011](∅→∅),[4.25011]→[4.17914:18000](∅→∅),[4.17914]→[4.17914:18000](∅→∅)
(Only prid)pgEval (FindPaymentRequests sid) = pquery((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_date(Only prid)pgEval (FindPaymentRequests sid) =pquery((,) <$> idParser PaymentRequestId <*> paymentRequestParser)[sql| SELECT id, subscription_id, request_data, url_key, request_time, billing_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 739
(Only (sid ^. B._SubscriptionId))(Only (sid ^. B._SubscriptionId)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 743
(,,,)<$> (PaymentKey <$> field)<*> paymentRequestParser<*> subscriptionParser<*> billableParserin pquery(,,,)<$> (PaymentKey <$> field)<*> paymentRequestParser<*> subscriptionParser<*> billableParserin pquery - edit in lib/Aftok/Database/PostgreSQL.hs at line 763
- replacement in lib/Aftok/Database/PostgreSQL.hs at line 770[4.24201]→[4.4218:4259](∅→∅),[4.4218]→[4.4218:4259](∅→∅),[4.4259]→[4.260:286](∅→∅),[4.260]→[4.260:286](∅→∅),[4.286]→[4.4260:4351](∅→∅),[4.4351]→[4.369:394](∅→∅)
( p ^. (request . _PaymentRequestId), eventId ^. _EventId, p ^. (payment . to (runPut . encodeMessage)), p ^. (paymentDate . to fromThyme), p ^. exchangeRates( p ^. (request . _PaymentRequestId),eventId ^. _EventId,p ^. (payment . to (runPut . encodeMessage)),p ^. (paymentDate . to fromThyme),p ^. exchangeRates - replacement in lib/Aftok/Database/PostgreSQL.hs at line 776[4.345]→[4.4352:4353](∅→∅),[4.4353]→[4.25310:25394](∅→∅),[4.25394]→[4.18756:18822](∅→∅),[4.18756]→[4.18756:18822](∅→∅)
pgEval (FindPayments rid) = pquery((,) <$> idParser PaymentId <*> paymentParser)[sql| SELECT id, payment_request_id, payment_data, payment_datepgEval (FindPayments rid) =pquery((,) <$> idParser PaymentId <*> paymentParser)[sql| SELECT id, payment_request_id, payment_data, payment_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 782[4.24389]→[4.4553:4589](∅→∅),[4.4553]→[4.4553:4589](∅→∅),[4.345]→[4.1044:1045](∅→∅),[4.3943]→[4.1044:1045](∅→∅),[4.4589]→[4.1044:1045](∅→∅),[4.5684]→[4.1044:1045](∅→∅),[4.12988]→[4.1044:1045](∅→∅),[4.751]→[4.1044:1045](∅→∅)
(Only (rid ^. _PaymentRequestId))(Only (rid ^. _PaymentRequestId)) - replacement in lib/Aftok/Database.hs at line 2[4.39]→[4.1657:1693](∅→∅),[4.1693]→[4.6343:6379](∅→∅),[4.39]→[4.6343:6379](∅→∅),[4.6379]→[4.1694:1730](∅→∅),[4.1730]→[4.6380:6416](∅→∅),[4.75]→[4.6380:6416](∅→∅),[4.6416]→[4.24426:24462](∅→∅)
{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE GADTs #-}{-# LANGUAGE TupleSections #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE GADTs #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE TupleSections #-} - replacement in lib/Aftok/Database.hs at line 11[4.4986]→[4.2692:2693](∅→∅),[4.2693]→[4.25396:25684](∅→∅),[4.1844]→[4.173:207](∅→∅),[4.4647]→[4.173:207](∅→∅),[4.6460]→[4.173:207](∅→∅),[4.25747]→[4.173:207](∅→∅),[4.173]→[4.173:207](∅→∅),[4.207]→[4.25748:25908](∅→∅),[4.3484]→[4.25908:25968](∅→∅),[4.25908]→[4.25908:25968](∅→∅),[4.246]→[4.6576:6577](∅→∅),[4.1410]→[4.6576:6577](∅→∅),[4.1893]→[4.6576:6577](∅→∅),[4.2726]→[4.6576:6577](∅→∅),[4.4553]→[4.6576:6577](∅→∅),[4.5900]→[4.6576:6577](∅→∅),[4.25968]→[4.6576:6577](∅→∅),[4.6576]→[4.6576:6577](∅→∅),[4.6577]→[4.18846:18875](∅→∅),[4.18875]→[4.25969:26021](∅→∅),[4.26021]→[2.4963:5015](∅→∅),[2.5015]→[4.26073:26135](∅→∅),[4.26073]→[4.26073:26135](∅→∅),[4.770]→[4.301:333](∅→∅),[4.800]→[4.301:333](∅→∅),[4.1183]→[4.301:333](∅→∅),[4.1990]→[4.301:333](∅→∅),[4.3988]→[4.301:333](∅→∅),[4.18931]→[4.301:333](∅→∅),[4.26135]→[4.301:333](∅→∅),[4.301]→[4.301:333](∅→∅),[4.333]→[4.6461:6499](∅→∅),[4.6499]→[4.26136:26188](∅→∅),[4.840]→[4.333:364](∅→∅),[4.2039]→[4.333:364](∅→∅),[4.26188]→[4.333:364](∅→∅),[4.333]→[4.333:364](∅→∅),[4.4051]→[4.364:392](∅→∅),[4.364]→[4.364:392](∅→∅)
import Control.Lens ( view, (^.), makeClassyPrisms, traverseOf)import Data.AffineSpaceimport Data.Thyme.Clock as Cimport Data.Thyme.Time as T( Day )import Safe ( headMay )import Aftok.Typesimport Aftok.Auction as Aimport Aftok.Billing as Bimport Aftok.Currency.Bitcoin ( NetworkId )import Aftok.Intervalimport Aftok.Payments.Typesimport Aftok.Project as Pimport Aftok.TimeLogimport Aftok.Utilimport Aftok.Auction as Aimport Aftok.Billing as Bimport Aftok.Currency.Bitcoin (NetworkId)import Aftok.Intervalimport Aftok.Payments.Typesimport Aftok.Project as Pimport Aftok.TimeLogimport Aftok.Typesimport Aftok.Utilimport Control.Lens( (^.),makeClassyPrisms,traverseOf,view,)import Data.AffineSpaceimport Data.Thyme.Clock as Cimport Data.Thyme.Time as T( Day,)import Haskoin.Address (Address)import Safe (headMay) - replacement in lib/Aftok/Database.hs at line 34
import Haskoin.Address ( Address )type KeyedLogEntry a = (ProjectId, UserId, LogEntry a) - edit in lib/Aftok/Database.hs at line 36
type KeyedLogEntry a = (ProjectId, UserId, LogEntry a) - edit in lib/Aftok/Database.hs at line 37
- replacement in lib/Aftok/Database.hs at line 43
CreateUser :: User -> DBOp UserIdFindUser :: UserId -> DBOp (Maybe User)FindUserByName :: UserName -> DBOp (Maybe (UserId, User))CreateUser :: User -> DBOp UserIdFindUser :: UserId -> DBOp (Maybe User)FindUserByName :: UserName -> DBOp (Maybe (UserId, User)) - replacement in lib/Aftok/Database.hs at line 47[4.1961]→[4.6305:6306](∅→∅),[4.2615]→[4.6305:6306](∅→∅),[4.4710]→[4.6305:6306](∅→∅),[4.19328]→[4.6305:6306](∅→∅),[4.26462]→[4.6305:6306](∅→∅),[4.6305]→[4.6305:6306](∅→∅),[4.6306]→[4.1962:2154](∅→∅)
CreateProject :: Project -> DBOp ProjectIdFindProject :: ProjectId -> DBOp (Maybe Project)ListProjects :: DBOp [ProjectId]FindSubscribers :: ProjectId -> DBOp [UserId]CreateProject :: Project -> DBOp ProjectIdFindProject :: ProjectId -> DBOp (Maybe Project)ListProjects :: DBOp [ProjectId]FindSubscribers :: ProjectId -> DBOp [UserId] - replacement in lib/Aftok/Database.hs at line 54
FindInvitation :: InvitationCode -> DBOp (Maybe Invitation)FindInvitation :: InvitationCode -> DBOp (Maybe Invitation) - replacement in lib/Aftok/Database.hs at line 56[4.2513]→[4.6534:6535](∅→∅),[4.4781]→[4.6534:6535](∅→∅),[4.27005]→[4.6534:6535](∅→∅),[4.6534]→[4.6534:6535](∅→∅),[4.6535]→[4.2514:2886](∅→∅),[4.2886]→[4.6857:6858](∅→∅),[4.19690]→[4.6857:6858](∅→∅),[4.27362]→[4.6857:6858](∅→∅),[4.6857]→[4.6857:6858](∅→∅),[4.6858]→[4.2887:3099](∅→∅),[4.3099]→[4.4052:4053](∅→∅),[4.4827]→[4.4052:4053](∅→∅),[4.27571]→[4.4052:4053](∅→∅),[4.7074]→[4.4052:4053](∅→∅),[4.4053]→[4.3100:3284](∅→∅),[4.3284]→[4.13382:13383](∅→∅),[4.4886]→[4.13382:13383](∅→∅),[4.24705]→[4.13382:13383](∅→∅),[4.27753]→[4.13382:13383](∅→∅),[4.13382]→[4.13382:13383](∅→∅)
CreateEvent :: ProjectId -> UserId -> LogEntry BTCNet -> DBOp EventIdAmendEvent :: EventId -> EventAmendment BTCNet -> DBOp AmendmentIdFindEvent :: EventId -> DBOp (Maybe (KeyedLogEntry BTCNet))FindEvents :: ProjectId -> UserId -> RangeQuery -> Word32 -> DBOp [LogEntry BTCNet]ReadWorkIndex :: ProjectId -> DBOp (WorkIndex BTCNet)CreateAuction :: Auction -> DBOp AuctionIdFindAuction :: AuctionId -> DBOp (Maybe Auction)CreateBid :: AuctionId -> Bid -> DBOp BidIdFindBids :: AuctionId -> DBOp [(BidId, Bid)]CreateBillable :: UserId -> Billable -> DBOp BillableIdFindBillable :: BillableId -> DBOp (Maybe Billable)FindBillables :: ProjectId -> DBOp [(BillableId, Billable)]CreateEvent :: ProjectId -> UserId -> LogEntry BTCNet -> DBOp EventIdAmendEvent :: EventId -> EventAmendment BTCNet -> DBOp AmendmentIdFindEvent :: EventId -> DBOp (Maybe (KeyedLogEntry BTCNet))FindEvents :: ProjectId -> UserId -> RangeQuery -> Word32 -> DBOp [LogEntry BTCNet]ReadWorkIndex :: ProjectId -> DBOp (WorkIndex BTCNet)CreateAuction :: Auction -> DBOp AuctionIdFindAuction :: AuctionId -> DBOp (Maybe Auction)CreateBid :: AuctionId -> Bid -> DBOp BidIdFindBids :: AuctionId -> DBOp [(BidId, Bid)]CreateBillable :: UserId -> Billable -> DBOp BillableIdFindBillable :: BillableId -> DBOp (Maybe Billable)FindBillables :: ProjectId -> DBOp [(BillableId, Billable)] - replacement in lib/Aftok/Database.hs at line 69[4.3362]→[4.3362:3515](∅→∅),[4.1865]→[4.4199:4200](∅→∅),[4.3515]→[4.4199:4200](∅→∅),[4.6654]→[4.4199:4200](∅→∅),[4.13451]→[4.4199:4200](∅→∅),[4.27981]→[4.4199:4200](∅→∅),[4.4199]→[4.4199:4200](∅→∅),[4.4200]→[4.3516:3897](∅→∅),[4.991]→[4.5194:5195](∅→∅),[4.1755]→[4.5194:5195](∅→∅),[4.1929]→[4.5194:5195](∅→∅),[4.3897]→[4.5194:5195](∅→∅),[4.24781]→[4.5194:5195](∅→∅),[4.28358]→[4.5194:5195](∅→∅),[4.5194]→[4.5194:5195](∅→∅),[4.5195]→[4.3898:4012](∅→∅)
FindSubscription :: SubscriptionId -> DBOp (Maybe Subscription)FindSubscriptions :: UserId -> ProjectId -> DBOp [(SubscriptionId, Subscription)]CreatePaymentRequest :: PaymentRequest -> DBOp PaymentRequestIdFindPaymentRequests :: SubscriptionId -> DBOp [(PaymentRequestId, PaymentRequest)]FindUnpaidRequests :: SubscriptionId -> DBOp [BillDetail]FindPaymentRequest :: PaymentKey -> DBOp (Maybe (PaymentRequestId, PaymentRequest))FindPaymentRequestId :: PaymentRequestId -> DBOp (Maybe PaymentRequest)CreatePayment :: Payment -> DBOp PaymentIdFindPayments :: PaymentRequestId -> DBOp [(PaymentId, Payment)]FindSubscription :: SubscriptionId -> DBOp (Maybe Subscription)FindSubscriptions :: UserId -> ProjectId -> DBOp [(SubscriptionId, Subscription)]CreatePaymentRequest :: PaymentRequest -> DBOp PaymentRequestIdFindPaymentRequests :: SubscriptionId -> DBOp [(PaymentRequestId, PaymentRequest)]FindUnpaidRequests :: SubscriptionId -> DBOp [BillDetail]FindPaymentRequest :: PaymentKey -> DBOp (Maybe (PaymentRequestId, PaymentRequest))FindPaymentRequestId :: PaymentRequestId -> DBOp (Maybe PaymentRequest)CreatePayment :: Payment -> DBOp PaymentIdFindPayments :: PaymentRequestId -> DBOp [(PaymentId, Payment)]RaiseDBError :: forall x y. DBError -> DBOp x -> DBOp y - replacement in lib/Aftok/Database.hs at line 80
RaiseDBError :: forall x y. DBError -> DBOp x -> DBOp ydata OpForbiddenReason= UserNotProjectMember| UserNotEventLogger| UserNotSubscriber SubscriptionId| InvitationExpired| InvitationAlreadyAccepted| AuctionEndedderiving (Eq, Show, Typeable) - replacement in lib/Aftok/Database.hs at line 89[4.7205]→[4.7205:7295](∅→∅),[4.7295]→[4.1930:1988](∅→∅),[4.1988]→[4.4843:4937](∅→∅),[4.7295]→[4.4843:4937](∅→∅),[4.4937]→[4.66:104](∅→∅),[4.104]→[4.4937:4990](∅→∅),[4.4937]→[4.4937:4990](∅→∅)
data OpForbiddenReason = UserNotProjectMember| UserNotEventLogger| UserNotSubscriber SubscriptionId| InvitationExpired| InvitationAlreadyAccepted| AuctionEndedderiving (Eq, Show, Typeable)data DBError= OpForbidden UserId OpForbiddenReason| SubjectNotFound| EventStorageFailedderiving (Eq, Show, Typeable) - edit in lib/Aftok/Database.hs at line 95[4.4991]→[4.4991:5074](∅→∅),[4.5074]→[4.13603:13637](∅→∅),[4.13637]→[4.5074:5117](∅→∅),[4.5074]→[4.5074:5117](∅→∅)
data DBError = OpForbidden UserId OpForbiddenReason| SubjectNotFound| EventStorageFailedderiving (Eq, Show, Typeable) - replacement in lib/Aftok/Database.hs at line 168
addUserToProject:: (MonadDB m) => ProjectId -> InvitingUID -> InvitedUID -> m ()addUserToProject ::(MonadDB m) => ProjectId -> InvitingUID -> InvitedUID -> m () - replacement in lib/Aftok/Database.hs at line 173
createInvitation:: (MonadDB m)=> ProjectId-> InvitingUID-> Email-> C.UTCTime-> m InvitationCodecreateInvitation ::(MonadDB m) =>ProjectId ->InvitingUID ->Email ->C.UTCTime ->m InvitationCode - replacement in lib/Aftok/Database.hs at line 192[4.8285]→[4.677:757](∅→∅),[4.28892]→[4.677:757](∅→∅),[4.6140]→[4.677:757](∅→∅),[4.757]→[4.8286:8335](∅→∅),[4.8335]→[4.758:803](∅→∅),[4.6275]→[4.758:803](∅→∅),[4.803]→[4.8336:8393](∅→∅)
Just i | t .-. (i ^. invitationTime) > fromSeconds (60 * 60 * 72 :: Int) ->raiseOpForbidden uid InvitationExpired actJust i | isJust (i ^. acceptanceTime) ->raiseOpForbidden uid InvitationAlreadyAccepted actJust i| t .-. (i ^. invitationTime) > fromSeconds (60 * 60 * 72 :: Int) ->raiseOpForbidden uid InvitationExpired actJust i| isJust (i ^. acceptanceTime) ->raiseOpForbidden uid InvitationAlreadyAccepted act - replacement in lib/Aftok/Database.hs at line 203
createEvent:: (MonadDB m) => ProjectId -> UserId -> LogEntry BTCNet -> m EventIdcreateEvent ::(MonadDB m) => ProjectId -> UserId -> LogEntry BTCNet -> m EventId - replacement in lib/Aftok/Database.hs at line 207
amendEvent:: (MonadDB m) => UserId -> EventId -> EventAmendment BTCNet -> m AmendmentIdamendEvent ::(MonadDB m) => UserId -> EventId -> EventAmendment BTCNet -> m AmendmentId - replacement in lib/Aftok/Database.hs at line 211
let act = AmendEvent eid alet act = AmendEvent eid a - replacement in lib/Aftok/Database.hs at line 213
missing = raiseSubjectNotFound actmaybe missing(\(_, uid', _) -> if uid' == uid then liftdb act else forbidden)evmissing = raiseSubjectNotFound actmaybemissing(\(_, uid', _) -> if uid' == uid then liftdb act else forbidden)ev - replacement in lib/Aftok/Database.hs at line 222
findEvents:: (MonadDB m)=> ProjectId-> UserId-> RangeQuery-> Word32-> m [LogEntry BTCNet]findEvents ::(MonadDB m) =>ProjectId ->UserId ->RangeQuery ->Word32 ->m [LogEntry BTCNet] - replacement in lib/Aftok/Database.hs at line 243
findSubscriptions:: (MonadDB m) => UserId -> ProjectId -> m [(SubscriptionId, Subscription)]findSubscriptions ::(MonadDB m) => UserId -> ProjectId -> m [(SubscriptionId, Subscription)] - replacement in lib/Aftok/Database.hs at line 247
findSubscriptionBillable:: (MonadDB m) => SubscriptionId -> MaybeT m (Subscription' UserId Billable)findSubscriptionBillable ::(MonadDB m) => SubscriptionId -> MaybeT m (Subscription' UserId Billable) - replacement in lib/Aftok/Database.hs at line 253
findPaymentRequests:: (MonadDB m) => SubscriptionId -> m [(PaymentRequestId, PaymentRequest)]findPaymentRequests ::(MonadDB m) => SubscriptionId -> m [(PaymentRequestId, PaymentRequest)] - replacement in lib/Aftok/Database.hs at line 257
findPaymentRequest:: (MonadDB m) => PaymentKey -> MaybeT m (PaymentRequestId, PaymentRequest)findPaymentRequest ::(MonadDB m) => PaymentKey -> MaybeT m (PaymentRequestId, PaymentRequest) - replacement in lib/Aftok/Database.hs at line 261
findPaymentRequestId:: (MonadDB m) => PaymentRequestId -> MaybeT m PaymentRequestfindPaymentRequestId ::(MonadDB m) => PaymentRequestId -> MaybeT m PaymentRequest - replacement in lib/Aftok/Database.hs at line 282
in doin do - replacement in lib/Aftok/Database.hs at line 284
_ <- lift $ checkProjectAuth (auc ^. A.projectId) uid findOp_ <- lift $ checkProjectAuth (auc ^. A.projectId) uid findOp - replacement in lib/Aftok/Database.hs at line 290
in doin do - replacement in lib/Aftok/Database.hs at line 292
_ <- traverse(\auc -> checkProjectAuth (auc ^. A.projectId) uid findOp)maybeAuc_ <-traverse(\auc -> checkProjectAuth (auc ^. A.projectId) uid findOp)maybeAuc - replacement in lib/Aftok/Database.hs at line 301
in doin do - replacement in lib/Aftok/Interval.hs at line 4[4.3657]→[4.30369:30426](∅→∅),[4.30426]→[4.3715:3749](∅→∅),[4.3749]→[4.30458:30517](∅→∅),[4.30458]→[4.30458:30517](∅→∅),[4.30517]→[4.55:77](∅→∅),[4.3228]→[4.55:77](∅→∅)
( Interval(..), interval, start, end, ilen, RangeQuery(..), rangeQuery, start', end', intervalJSON, parseIntervalJSON, containsInclusive( Interval (..),interval,start,end,ilen,RangeQuery (..),rangeQuery,start',end',intervalJSON,parseIntervalJSON,containsInclusive, - replacement in lib/Aftok/Interval.hs at line 19
import Control.Lens( (^.),makeLenses,)import Data.Aesonimport Data.Aeson.Typesimport Data.AffineSpaceimport Data.Thyme.Clock as Cimport Data.Thyme.Format.Aeson ()import Data.Thyme.LocalTime () - replacement in lib/Aftok/Interval.hs at line 30[4.2729]→[4.30529:30695](∅→∅),[4.30695]→[4.3750:3846](∅→∅),[4.3750]→[4.3750:3846](∅→∅),[4.3846]→[4.30696:30852](∅→∅)
import Control.Lens ( makeLenses, (^.))import Data.Aesonimport Data.Aeson.Typesimport Data.AffineSpaceimport Data.Thyme.Clock as Cimport Data.Thyme.Format.Aeson ( )import Data.Thyme.LocalTime ( )data Interval= Interval{ _start :: C.UTCTime,_end :: C.UTCTime}deriving (Show, Eq, Ord) - edit in lib/Aftok/Interval.hs at line 37[4.1545]→[4.540:587](∅→∅),[4.587]→[4.3981:4028](∅→∅),[4.4028]→[4.78:130](∅→∅),[4.635]→[4.78:130](∅→∅)
data Interval = Interval { _start :: C.UTCTime, _end :: C.UTCTime} deriving (Show, Eq, Ord) - replacement in lib/Aftok/Interval.hs at line 40
= Before { _end' :: C.UTCTime }| During { _start' :: C.UTCTime, _end' :: C.UTCTime }| After { _start' :: C.UTCTime }= Before {_end' :: C.UTCTime}| During {_start' :: C.UTCTime, _end' :: C.UTCTime}| After {_start' :: C.UTCTime} - edit in lib/Aftok/Interval.hs at line 44
- replacement in lib/Aftok/Interval.hs at line 64
parseIntervalJSON _ = mzero[4.3543]parseIntervalJSON _ = mzero - replacement in lib/Aftok/Json.hs at line 2[4.3609]→[4.966:1002](∅→∅),[4.1002]→[4.20345:20381](∅→∅),[4.20381]→[4.2335:2371](∅→∅),[4.1002]→[4.2335:2371](∅→∅),[4.1002]→[4.881:917](∅→∅),[4.2371]→[4.881:917](∅→∅),[4.3609]→[4.881:917](∅→∅),[4.917]→[4.20382:20418](∅→∅),[4.20418]→[4.10049:10085](∅→∅),[4.917]→[4.10049:10085](∅→∅)
{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE LambdaCase #-}{-# LANGUAGE RankNTypes #-}{-# LANGUAGE RecordWildCards #-}{-# LANGUAGE TupleSections #-}{-# LANGUAGE TypeApplications #-}{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE LambdaCase #-}{-# LANGUAGE RankNTypes #-}{-# LANGUAGE RecordWildCards #-}{-# LANGUAGE TupleSections #-}{-# LANGUAGE TypeApplications #-} - edit in lib/Aftok/Json.hs at line 10[4.1667]→[4.155:156](∅→∅),[4.155]→[4.155:156](∅→∅),[4.949]→[4.1965:1966](∅→∅),[4.1553]→[4.1965:1966](∅→∅),[4.20510]→[4.1965:1966](∅→∅),[4.177]→[4.1965:1966](∅→∅),[4.1966]→[4.30854:31084](∅→∅),[4.31084]→[4.4093:4145](∅→∅),[4.20654]→[4.1014:1076](∅→∅),[4.31150]→[4.1014:1076](∅→∅),[4.1014]→[4.1014:1076](∅→∅),[4.1076]→[4.31151:31360](∅→∅),[4.454]→[4.1132:1159](∅→∅),[4.1691]→[4.1132:1159](∅→∅),[4.31360]→[4.1132:1159](∅→∅),[4.1132]→[4.1132:1159](∅→∅),[4.1159]→[4.31361:31977](∅→∅),[4.36]→[4.231:232](∅→∅),[4.790]→[4.231:232](∅→∅),[4.1270]→[4.231:232](∅→∅),[4.1438]→[4.231:232](∅→∅),[4.3149]→[4.231:232](∅→∅),[4.3769]→[4.231:232](∅→∅),[4.31977]→[4.231:232](∅→∅),[4.231]→[4.231:232](∅→∅),[4.232]→[4.4173:4231](∅→∅),[4.4231]→[4.32036:32160](∅→∅),[4.58573]→[4.32036:32160](∅→∅),[4.32036]→[4.32036:32160](∅→∅),[4.32160]→[4.58574:58635](∅→∅),[4.58635]→[4.32223:32273](∅→∅),[4.32223]→[4.32223:32273](∅→∅),[4.32273]→[4.20815:20856](∅→∅),[4.20815]→[4.20815:20856](∅→∅),[4.4212]→[4.32274:32326](∅→∅),[4.20856]→[4.32274:32326](∅→∅),[4.32326]→[2.5017:5069](∅→∅),[2.5069]→[4.1326:1358](∅→∅),[4.32378]→[4.1326:1358](∅→∅),[4.1326]→[4.1326:1358](∅→∅),[4.1358]→[4.519:551](∅→∅),[4.32442]→[4.32442:32494](∅→∅),[4.171]→[4.1358:1389](∅→∅),[4.1029]→[4.1358:1389](∅→∅),[4.10114]→[4.1358:1389](∅→∅),[4.32494]→[4.1358:1389](∅→∅),[4.1358]→[4.1358:1389](∅→∅),[4.1389]→[4.172:201](∅→∅),[4.201]→[4.32495:32560](∅→∅)
import Control.FromSum ( fromMaybeM, fromEitherM)import Control.Lens hiding ( (.=) )import qualified Control.Lens as Limport Data.Aesonimport Data.Aeson.Typesimport qualified Data.Attoparsec.ByteString.Char8as PCimport qualified Data.ByteString.Base64 as B64import qualified Data.ByteString.Char8 as Cimport Data.Dataimport Data.HashMap.Strict as Oimport Data.List.NonEmpty as Limport Data.Map.Strict as MSimport Data.ProtocolBuffers ( encodeMessage )import Data.Serialize.Put ( runPut )import qualified Data.Text as Timport qualified Data.Text.Encoding as Timport Data.Thyme.Calendar ( showGregorian )import Data.Thyme.Clock as Clockimport Data.Thyme.Time ( Day )import Data.UUID as Uimport Haskoin.Address ( Address, addrToJSON, addrFromJSON, textToAddr)import Aftok.Currency.Bitcoinimport Aftok.Auction as Aimport qualified Aftok.Billing as Bimport Aftok.Intervalimport Aftok.Paymentsimport Aftok.Project as Pimport Aftok.TimeLogimport Aftok.Typesimport Aftok.Util ( traverseKeys ) - replacement in lib/Aftok/Json.hs at line 11
import qualified Language.Haskell.TH as THimport Language.Haskell.TH.Quoteimport Aftok.Auction as Aimport qualified Aftok.Billing as Bimport Aftok.Currency.Bitcoinimport Aftok.Intervalimport Aftok.Paymentsimport Aftok.Project as Pimport Aftok.TimeLogimport Aftok.Typesimport Aftok.Util (traverseKeys)import Control.FromSum( fromEitherM,fromMaybeM,)import Control.Lens hiding ((.=))import qualified Control.Lens as Limport Data.Aesonimport Data.Aeson.Typesimport qualified Data.Attoparsec.ByteString.Char8 as PCimport qualified Data.ByteString.Base64 as B64import qualified Data.ByteString.Char8 as Cimport Data.Dataimport Data.HashMap.Strict as Oimport Data.List.NonEmpty as Limport Data.Map.Strict as MSimport Data.ProtocolBuffers (encodeMessage)import Data.Serialize.Put (runPut)import qualified Data.Text as Timport qualified Data.Text.Encoding as Timport Data.Thyme.Calendar (showGregorian)import Data.Thyme.Clock as Clockimport Data.Thyme.Time (Day)import Data.UUID as Uimport Haskoin.Address( Address,addrFromJSON,addrToJSON,textToAddr,)import qualified Language.Haskell.TH as THimport Language.Haskell.TH.Quote - replacement in lib/Aftok/Json.hs at line 52
data Version = Version { majorVersion :: Word8, minorVersion :: Word8} deriving (Typeable, Data)data Version= Version{ majorVersion :: Word8,minorVersion :: Word8}deriving (Typeable, Data) - replacement in lib/Aftok/Json.hs at line 73
v = 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."}v =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 91
{-|- Convenience function to allow dispatch of different serialized- versions to different parsers.-}-- |-- - Convenience function to allow dispatch of different serialized-- - versions to different parsers. - replacement in lib/Aftok/Json.hs at line 97
vers <- fromEitherM fail $ PC.parseOnly versionParser (T.encodeUtf8 verstr)vers <- fromEitherM fail $ PC.parseOnly versionParser (T.encodeUtf8 verstr) - replacement in lib/Aftok/Json.hs at line 111
unv1 name f = unversion name $ p wherep (Version 1 0) = fp ver = badVersion name verunv1 name f = unversion name $ pwherep (Version 1 0) = fp ver = badVersion name ver - replacement in lib/Aftok/Json.hs at line 116
badVersion :: forall v a . String -> Version -> v -> Parser abadVersion :: forall v a. String -> Version -> v -> Parser a - replacement in lib/Aftok/Json.hs at line 118
const . fail $ "Unrecognized " <> name <> " schema version: " <> T.unpack(printVersion ver)const . fail $"Unrecognized " <> name <> " schema version: "<> T.unpack(printVersion ver) - replacement in lib/Aftok/Json.hs at line 131
idValue :: forall a . Getter a UUID -> a -> ValueidValue :: forall a. Getter a UUID -> a -> Value - replacement in lib/Aftok/Json.hs at line 134
idJSON :: forall a . Text -> Getter a UUID -> a -> ValueidJSON :: forall a. Text -> Getter a UUID -> a -> Value - replacement in lib/Aftok/Json.hs at line 145
projectJSON p = v1 $ obj[ "projectName" .= (p ^. projectName), "inceptionDate" .= (p ^. inceptionDate), "initiator" .= (p ^. P.initiator . _UserId)]projectJSON p =v1 $obj[ "projectName" .= (p ^. projectName),"inceptionDate" .= (p ^. inceptionDate),"initiator" .= (p ^. P.initiator . _UserId)] - replacement in lib/Aftok/Json.hs at line 160
auctionJSON x = v1 $ obj[ "projectId" .= idValue (A.projectId . _ProjectId) x, "initiator" .= idValue (A.initiator . _UserId) x, "raiseAmount" .= (x ^. (raiseAmount . satoshi))]auctionJSON x =v1 $obj[ "projectId" .= idValue (A.projectId . _ProjectId) x,"initiator" .= idValue (A.initiator . _UserId) x,"raiseAmount" .= (x ^. (raiseAmount . satoshi))] - replacement in lib/Aftok/Json.hs at line 176
creditToJSON nmode (CreditToCurrency (netId, addr)) = v2 $ obj[ "creditToAddress" .= addrToJSON (toNetwork nmode netId) addr, "creditToNetwork" .= renderNetworkId netId]creditToJSON nmode (CreditToCurrency (netId, addr)) =v2 $obj[ "creditToAddress" .= addrToJSON (toNetwork nmode netId) addr,"creditToNetwork" .= renderNetworkId netId] - replacement in lib/Aftok/Json.hs at line 191
ver -> badVersion "EventAmendment" verver -> badVersion "EventAmendment" ver - replacement in lib/Aftok/Json.hs at line 193
parseBtcAddr:: NetworkMode -> NetworkId -> Text -> Parser (CreditTo (NetworkId, Address))parseBtcAddr nmode net addrText = maybe( fail. T.unpack$ "Address "<> addrText<> " cannot be parsed as a BTC network address.")(pure . CreditToCurrency . (net, ))(textToAddr (toNetwork nmode net) addrText)parseBtcAddr ::NetworkMode -> NetworkId -> Text -> Parser (CreditTo (NetworkId, Address))parseBtcAddr nmode net addrText =maybe( fail. T.unpack$ "Address "<> addrText<> " cannot be parsed as a BTC network address.")(pure . CreditToCurrency . (net,))(textToAddr (toNetwork nmode net) addrText) - replacement in lib/Aftok/Json.hs at line 206
parseCreditToV1:: NetworkMode -> Object -> Parser (CreditTo (NetworkId, Address))parseCreditToV1 ::NetworkMode -> Object -> Parser (CreditTo (NetworkId, Address)) - replacement in lib/Aftok/Json.hs at line 211
parseCreditToV2:: NetworkMode -> Object -> Parser (CreditTo (NetworkId, Address))parseCreditToV2 ::NetworkMode -> Object -> Parser (CreditTo (NetworkId, Address)) - replacement in lib/Aftok/Json.hs at line 214
letparseCreditToAddr = donetName <- o .: "creditToNetwork"net <- fromMaybeM(fail . T.unpack $ "Currency network " <> netName <> " not recognized.")(parseNetworkId netName)addrValue <- o .: "creditToAddress"CreditToCurrency. (net, )<$> addrFromJSON (toNetwork nmode net) addrValuelet 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 - edit in lib/Aftok/Json.hs at line 235[4.23543]→[4.34994:35084](∅→∅),[4.35084]→[4.23637:23638](∅→∅),[4.23637]→[4.23637:23638](∅→∅),[4.23638]→[4.35085:35187](∅→∅),[4.35187]→[4.23744:23745](∅→∅),[4.23744]→[4.23744:23745](∅→∅),[4.23745]→[4.35188:35377](∅→∅),[4.35377]→[4.23831:23832](∅→∅),[4.23831]→[4.23831:23832](∅→∅)
parseCreditToUser =fmap CreditToUser . parseId _UserId =<< o .: "creditToUser"parseCreditToProject =fmap CreditToProject . parseId _ProjectId =<< o .: "creditToProject"notFound =fail $ "Value " <> show o <> " does not represent a CreditTo value."inparseCreditToAddr<|> parseCreditToUser<|> parseCreditToProject<|> notFound - replacement in lib/Aftok/Json.hs at line 241[4.35478]→[4.35478:35725](∅→∅),[4.35725]→[4.24181:24182](∅→∅),[4.2139]→[4.24181:24182](∅→∅),[4.24182]→[4.35726:35810](∅→∅),[4.35810]→[4.24264:24385](∅→∅),[4.24264]→[4.24264:24385](∅→∅),[4.24385]→[4.35811:35923](∅→∅)
v2$ let payoutsRec :: (CreditTo (NetworkId, Address), Rational) -> ValuepayoutsRec (c, r) =object ["creditTo" .= creditToJSON nmode c, "payoutRatio" .= r]in obj $ ["payouts" .= fmap payoutsRec (MS.assocs m)]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))v2 $let payoutsRec :: (CreditTo (NetworkId, Address), Rational) -> ValuepayoutsRec (c, r) =object ["creditTo" .= creditToJSON nmode c, "payoutRatio" .= r]in obj $ ["payouts" .= fmap payoutsRec (MS.assocs m)] - replacement in lib/Aftok/Json.hs at line 247
p (Version 2 0) val =let parsePayoutRecord x =parsePayoutsJSON ::NetworkMode -> Value -> Parser (Payouts (NetworkId, Address))parsePayoutsJSON nmode = unversion "Payouts" $ pwherep :: 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 = - replacement in lib/Aftok/Json.hs at line 261
in Payouts. MS.fromList<$> (traverse parsePayoutRecord =<< parseJSON (Object val))in Payouts. MS.fromList<$> (traverse parsePayoutRecord =<< parseJSON (Object val))p ver x = badVersion "Payouts" ver x - edit in lib/Aftok/Json.hs at line 266[4.24756]→[4.36186:36225](∅→∅),[4.1439]→[4.1904:1905](∅→∅),[4.2139]→[4.1904:1905](∅→∅),[4.3622]→[4.1904:1905](∅→∅),[4.5410]→[4.1904:1905](∅→∅),[4.24799]→[4.1904:1905](∅→∅),[4.36225]→[4.1904:1905](∅→∅),[4.1904]→[4.1904:1905](∅→∅)
p ver x = badVersion "Payouts" ver x - replacement in lib/Aftok/Json.hs at line 271
workIndexJSON nmode (WorkIndex widx) = v2$ obj ["workIndex" .= fmap widxRec (MS.assocs widx)]wherewidxRec :: (CreditTo (NetworkId, Address), NonEmpty Interval) -> ValuewidxRec (c, l) = object[ "creditTo" .= creditToJSON nmode c, "intervals" .= (intervalJSON <$> L.toList l)]workIndexJSON nmode (WorkIndex widx) =v2 $obj ["workIndex" .= fmap widxRec (MS.assocs widx)]wherewidxRec :: (CreditTo (NetworkId, Address), NonEmpty Interval) -> ValuewidxRec (c, l) =object[ "creditTo" .= creditToJSON nmode c,"intervals" .= (intervalJSON <$> L.toList l)] - replacement in lib/Aftok/Json.hs at line 294
[ "creditTo" .= creditToJSON nmode c, "event" .= logEventJSON' ev, "eventMeta" .= m[ "creditTo" .= creditToJSON nmode c,"event" .= logEventJSON' ev,"eventMeta" .= m - replacement in lib/Aftok/Json.hs at line 310[4.2627]→[4.36805:36887](∅→∅),[4.36887]→[4.2726:2768](∅→∅),[4.2726]→[4.2726:2768](∅→∅),[4.2768]→[4.36888:36988](∅→∅),[4.36988]→[4.2874:2916](∅→∅),[4.2874]→[4.2874:2916](∅→∅),[4.2916]→[4.25241:25322](∅→∅)
[ "projectId" .= idValue (B.project . _ProjectId) b, "name" .= (b ^. B.name), "description" .= (b ^. B.description), "recurrence" .= recurrenceJSON' (b ^. B.recurrence), "amount" .= (b ^. (B.amount . satoshi)), "gracePeriod" .= (b ^. B.gracePeriod), "requestExpiryPeriod" .= (Clock.toSeconds' <$> (b ^. B.requestExpiryPeriod))[ "projectId" .= idValue (B.project . _ProjectId) b,"name" .= (b ^. B.name),"description" .= (b ^. B.description),"recurrence" .= recurrenceJSON' (b ^. B.recurrence),"amount" .= (b ^. (B.amount . satoshi)),"gracePeriod" .= (b ^. B.gracePeriod),"requestExpiryPeriod" .= (Clock.toSeconds' <$> (b ^. B.requestExpiryPeriod)) - replacement in lib/Aftok/Json.hs at line 324
recurrenceJSON' B.Annually = object ["annually" .= Null]recurrenceJSON' B.Annually = object ["annually" .= Null] - replacement in lib/Aftok/Json.hs at line 327
recurrenceJSON' (B.Weekly i) = object ["weekly " .= object ["weeks" .= i]]recurrenceJSON' B.OneTime = object ["onetime" .= Null]recurrenceJSON' (B.Weekly i) = object ["weekly " .= object ["weeks" .= i]]recurrenceJSON' B.OneTime = object ["onetime" .= Null] - replacement in lib/Aftok/Json.hs at line 331
createSubscriptionJSON uid bid d = v1 $ obj[ "user_id" .= idValue _UserId uid, "billable_id" .= idValue B._BillableId bid, "start_date" .= showGregorian d]createSubscriptionJSON uid bid d =v1 $obj[ "user_id" .= idValue _UserId uid,"billable_id" .= idValue B._BillableId bid,"start_date" .= showGregorian d] - replacement in lib/Aftok/Json.hs at line 344[4.3359]→[4.37433:37485](∅→∅),[4.37485]→[4.2608:2670](∅→∅),[4.2608]→[4.2608:2670](∅→∅),[4.2670]→[4.37486:37564](∅→∅)
[ "user_id" .= idValue (B.customer . _UserId) sub, "billable_id" .= idValue (B.billable . B._BillableId) sub, "start_time" .= view B.startTime sub, "end_time" .= view B.endTime sub[ "user_id" .= idValue (B.customer . _UserId) sub,"billable_id" .= idValue (B.billable . B._BillableId) sub,"start_time" .= view B.startTime sub,"end_time" .= view B.endTime sub - replacement in lib/Aftok/Json.hs at line 358
[ "subscription_id" .= idValue (subscription . B._SubscriptionId) r, "payment_request_protobuf_64" .= view prBytes r, "url_key" .= view (paymentKey . _PaymentKey) r, "payment_request_time" .= view paymentRequestTime r, "billing_date" .= view (billingDate . to showGregorian) r[ "subscription_id" .= idValue (subscription . B._SubscriptionId) r,"payment_request_protobuf_64" .= view prBytes r,"url_key" .= view (paymentKey . _PaymentKey) r,"payment_request_time" .= view paymentRequestTime r,"billing_date" .= view (billingDate . to showGregorian) r - replacement in lib/Aftok/Json.hs at line 364
whereprBytes =paymentRequest . to (T.decodeUtf8 . B64.encode . runPut . encodeMessage)whereprBytes =paymentRequest . to (T.decodeUtf8 . B64.encode . runPut . encodeMessage) - replacement in lib/Aftok/Json.hs at line 372
billDetailJSON r = obj $ concat[ ["payment_request_id" .= view (_1 . _PaymentKey) r], paymentRequestKV $ view _2 r, subscriptionKV $ view _3 r, billableKV $ view _4 r]billDetailJSON r =obj $concat[ ["payment_request_id" .= view (_1 . _PaymentKey) r],paymentRequestKV $ view _2 r,subscriptionKV $ view _3 r,billableKV $ view _4 r] - replacement in lib/Aftok/Json.hs at line 385
paymentJSON r = v1 $ obj[ "payment_request_id" .= idValue (request . _PaymentRequestId) r, "payment_protobuf_64" .= view paymentBytes r, "payment_date" .= (r ^. paymentDate)]wherepaymentBytes =payment . to (T.decodeUtf8 . B64.encode . runPut . encodeMessage)paymentJSON r =v1 $obj[ "payment_request_id" .= idValue (request . _PaymentRequestId) r,"payment_protobuf_64" .= view paymentBytes r,"payment_date" .= (r ^. paymentDate)]wherepaymentBytes =payment . to (T.decodeUtf8 . B64.encode . runPut . encodeMessage) - replacement in lib/Aftok/Json.hs at line 402
maybe (fail $ "Value " <> str <> "Could not be parsed as a valid UUID.") pure$ U.fromString strmaybe (fail $ "Value " <> str <> "Could not be parsed as a valid UUID.") pure $U.fromString str - replacement in lib/Aftok/Json.hs at line 405
parseId :: forall a . Prism' a UUID -> Value -> Parser aparseId :: forall a. Prism' a UUID -> Value -> Parser a - replacement in lib/Aftok/Json.hs at line 408
parseEventAmendment:: NetworkMode-> ModTime-> Value-> Parser (EventAmendment (NetworkId, Address))parseEventAmendment nmode t = unversion "EventAmendment" $ p wherep (Version 1 _) = parseEventAmendmentV1 nmode tp (Version 2 0) = parseEventAmendmentV2 nmode tp ver = badVersion "EventAmendment" verparseEventAmendment ::NetworkMode ->ModTime ->Value ->Parser (EventAmendment (NetworkId, Address))parseEventAmendment nmode t = unversion "EventAmendment" $ pwherep (Version 1 _) = parseEventAmendmentV1 nmode tp (Version 2 0) = parseEventAmendmentV2 nmode tp ver = badVersion "EventAmendment" ver - replacement in lib/Aftok/Json.hs at line 419
parseEventAmendmentV1:: NetworkMode-> ModTime-> Object-> Parser (EventAmendment (NetworkId, Address))parseEventAmendmentV1 ::NetworkMode ->ModTime ->Object ->Parser (EventAmendment (NetworkId, Address)) - replacement in lib/Aftok/Json.hs at line 425
letparseA :: Text -> Parser (EventAmendment (NetworkId, Address))parseA "timeChange" = TimeChange t <$> o .: "eventTime"parseA "addrChange" = CreditToChange t <$> parseCreditToV1 nmode oparseA "metadataChange" = MetadataChange t <$> o .: "eventMeta"parseA tid =fail . T.unpack $ "Amendment type " <> tid <> " not recognized."ino .: "amendment" >>= parseAlet parseA :: Text -> Parser (EventAmendment (NetworkId, Address))parseA "timeChange" = TimeChange t <$> o .: "eventTime"parseA "addrChange" = CreditToChange t <$> parseCreditToV1 nmode oparseA "metadataChange" = MetadataChange t <$> o .: "eventMeta"parseA tid =fail . T.unpack $ "Amendment type " <> tid <> " not recognized."in o .: "amendment" >>= parseA - replacement in lib/Aftok/Json.hs at line 433
parseEventAmendmentV2:: NetworkMode-> ModTime-> Object-> Parser (EventAmendment (NetworkId, Address))parseEventAmendmentV2 ::NetworkMode ->ModTime ->Object ->Parser (EventAmendment (NetworkId, Address)) - replacement in lib/Aftok/Json.hs at line 439
letparseA :: Text -> Parser (EventAmendment (NetworkId, Address))parseA "timeChange" = TimeChange t <$> o .: "eventTime"parseA "creditToChange" = CreditToChange t <$> parseCreditToV2 nmode oparseA "metadataChange" = MetadataChange t <$> o .: "eventMeta"parseA tid =fail . T.unpack $ "Amendment type " <> tid <> " not recognized."ino .: "amendment" >>= parseAlet parseA :: Text -> Parser (EventAmendment (NetworkId, Address))parseA "timeChange" = TimeChange t <$> o .: "eventTime"parseA "creditToChange" = CreditToChange t <$> parseCreditToV2 nmode oparseA "metadataChange" = MetadataChange t <$> o .: "eventMeta"parseA tid =fail . T.unpack $ "Amendment type " <> tid <> " not recognized."in o .: "amendment" >>= parseA - replacement in lib/Aftok/Json.hs at line 447[4.3863]→[4.26463:26658](∅→∅),[4.148]→[4.4722:4747](∅→∅),[4.1445]→[4.4722:4747](∅→∅),[4.26658]→[4.4722:4747](∅→∅),[4.4722]→[4.4722:4747](∅→∅),[4.4747]→[4.39178:39316](∅→∅),[4.236]→[4.4801:4837](∅→∅),[4.26754]→[4.4801:4837](∅→∅),[4.39316]→[4.4801:4837](∅→∅),[4.4801]→[4.4801:4837](∅→∅),[4.39]→[4.138:191](∅→∅),[4.4837]→[4.138:191](∅→∅),[4.347]→[4.138:191](∅→∅)
parseLogEntry:: NetworkMode-> UserId-> (UTCTime -> LogEvent)-> Value-> Parser (UTCTime -> (LogEntry (NetworkId, Address)))parseLogEntry nmode uid f = unversion "LogEntry" p wherep (Version 2 0) o = docreditTo' <- o .:? "creditTo" >>= maybe (pure $ CreditToUser uid)(parseCreditToV2 nmode)eventMeta' <- o .:? "eventMeta"pure $ \t -> LogEntry creditTo' (f t) eventMeta'parseLogEntry ::NetworkMode ->UserId ->(UTCTime -> LogEvent) ->Value ->Parser (UTCTime -> (LogEntry (NetworkId, Address)))parseLogEntry nmode uid f = unversion "LogEntry" pwherep (Version 2 0) o = docreditTo' <-o .:? "creditTo">>= maybe(pure $ CreditToUser uid)(parseCreditToV2 nmode)eventMeta' <- o .:? "eventMeta"pure $ \t -> LogEntry creditTo' (f t) eventMeta'p ver o = badVersion "LogEntry" ver o - edit in lib/Aftok/Json.hs at line 465
p ver o = badVersion "LogEntry" ver o - replacement in lib/Aftok/Json.hs at line 467[4.26816]→[4.39317:39616](∅→∅),[4.3263]→[4.987:988](∅→∅),[4.4874]→[4.987:988](∅→∅),[4.27850]→[4.987:988](∅→∅),[4.39616]→[4.987:988](∅→∅),[4.987]→[4.987:988](∅→∅),[4.988]→[4.39617:39875](∅→∅)
letparseAnnually o' = const (pure B.Annually) <$> O.lookup "annually" o'parseMonthly o' = fmap B.Monthly . parseJSON <$> O.lookup "monthly" o'parseWeekly o' = fmap B.Weekly . parseJSON <$> O.lookup "weekly" o'parseOneTime o' = const (pure B.OneTime) <$> O.lookup "one-time" o'notFound =fail $ "Value " <> show o <> " does not represent a Recurrence value."parseV val =parseAnnually val<|> parseMonthly val<|> parseWeekly val<|> parseOneTime valinfromMaybe notFound $ parseV olet parseAnnually o' = const (pure B.Annually) <$> O.lookup "annually" o'parseMonthly o' = fmap B.Monthly . parseJSON <$> O.lookup "monthly" o'parseWeekly o' = fmap B.Weekly . parseJSON <$> O.lookup "weekly" o'parseOneTime o' = const (pure B.OneTime) <$> O.lookup "one-time" o'notFound =fail $ "Value " <> show o <> " does not represent a Recurrence value."parseV val =parseAnnually val<|> parseMonthly val<|> parseWeekly val<|> parseOneTime valin fromMaybe notFound $ parseV o - replacement in lib/Aftok/Payments/Types.hs at line 1
{-# LANGUAGE DeriveFoldable #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE DeriveFoldable #-}{-# LANGUAGE DeriveFunctor #-} - replacement in lib/Aftok/Payments/Types.hs at line 4
{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE ExplicitForAll #-}{-# LANGUAGE TemplateHaskell #-} - edit in lib/Aftok/Payments/Types.hs at line 9
import Aftok.Billing( Billable,Subscription,SubscriptionId,)import qualified Bippy.Proto as Pimport Bippy.Types( Satoshi (..),expiryTime,getExpires,getPaymentDetails,)import Control.Lens( makeLenses,makePrisms,view,)import Data.Aeson (Value)import qualified Data.Text as Timport Data.Thyme.Clock as Cimport Data.Thyme.Time as Cimport Data.UUIDimport Haskoin.Address.Base58 (decodeBase58Check) - edit in lib/Aftok/Payments/Types.hs at line 33
newtype PaymentRequestId = PaymentRequestId UUID deriving (Show, Eq) - edit in lib/Aftok/Payments/Types.hs at line 35[4.3603]→[4.39878:40105](∅→∅),[4.1973]→[4.10703:10704](∅→∅),[4.2308]→[4.10703:10704](∅→∅),[4.4485]→[4.10703:10704](∅→∅),[4.40105]→[4.10703:10704](∅→∅),[4.10703]→[4.10703:10704](∅→∅),[4.10704]→[4.40106:40320](∅→∅),[4.2064]→[4.10746:10774](∅→∅),[4.2351]→[4.10746:10774](∅→∅),[4.3694]→[4.10746:10774](∅→∅),[4.40320]→[4.10746:10774](∅→∅),[4.10746]→[4.10746:10774](∅→∅),[4.10774]→[4.4689:4802](∅→∅),[4.4802]→[4.40434:40675](∅→∅),[4.58782]→[4.40434:40675](∅→∅),[4.40434]→[4.40434:40675](∅→∅),[4.40675]→[4.4803:4873](∅→∅),[4.1241]→[4.10816:10817](∅→∅),[4.2433]→[4.10816:10817](∅→∅),[4.4873]→[4.10816:10817](∅→∅),[4.27112]→[4.10816:10817](∅→∅),[4.40745]→[4.10816:10817](∅→∅),[4.58845]→[4.10816:10817](∅→∅),[4.10816]→[4.10816:10817](∅→∅),[4.10817]→[2.5072:5131](∅→∅),[2.5131]→[4.40805:40983](∅→∅),[4.40805]→[4.40805:40983](∅→∅),[4.2317]→[4.10857:10927](∅→∅),[4.2488]→[4.10857:10927](∅→∅),[4.4564]→[4.10857:10927](∅→∅),[4.40983]→[4.10857:10927](∅→∅),[4.10857]→[4.10857:10927](∅→∅)
import Control.Lens ( makeLenses, makePrisms, view)import Data.Aeson ( Value )import Data.Thyme.Clock as Cimport Data.Thyme.Time as Cimport qualified Data.Text as Timport Data.UUIDimport qualified Bippy.Proto as Pimport Bippy.Types ( expiryTime, getExpires, getPaymentDetails, Satoshi(..))import Haskoin.Address.Base58 ( decodeBase58Check )import Aftok.Billing ( Billable, Subscription, SubscriptionId)newtype PaymentRequestId = PaymentRequestId UUID deriving (Show, Eq) - edit in lib/Aftok/Payments/Types.hs at line 38
- edit in lib/Aftok/Payments/Types.hs at line 44
- replacement in lib/Aftok/Payments/Types.hs at line 47[4.11037]→[4.11037:11150](∅→∅),[4.11150]→[4.2318:2356](∅→∅),[4.2356]→[4.6796:6833](∅→∅),[4.11150]→[4.6796:6833](∅→∅),[4.6833]→[4.3695:3728](∅→∅),[4.3728]→[4.6866:6912](∅→∅),[4.6866]→[4.6866:6912](∅→∅)
data PaymentRequest' s = PaymentRequest{ _subscription :: s, _paymentRequest :: P.PaymentRequest, _paymentKey :: PaymentKey, _paymentRequestTime :: C.UTCTime, _billingDate :: C.Day} deriving (Functor, Foldable, Traversable)data PaymentRequest' s= PaymentRequest{ _subscription :: s,_paymentRequest :: P.PaymentRequest,_paymentKey :: PaymentKey,_paymentRequestTime :: C.UTCTime,_billingDate :: C.Day}deriving (Functor, Foldable, Traversable) - replacement in lib/Aftok/Payments/Types.hs at line 61[4.11275]→[4.11275:11301](∅→∅),[4.11301]→[4.822:944](∅→∅),[4.944]→[4.6913:6959](∅→∅),[4.11383]→[4.6913:6959](∅→∅)
data Payment' r = Payment{ _request :: r, _payment :: P.Payment, _paymentDate :: C.UTCTime, _exchangeRates :: Maybe Value} deriving (Functor, Foldable, Traversable)data Payment' r= Payment{ _request :: r,_payment :: P.Payment,_paymentDate :: C.UTCTime,_exchangeRates :: Maybe Value}deriving (Functor, Foldable, Traversable) - replacement in lib/Aftok/Payments/Types.hs at line 79
isExpired :: forall s . C.UTCTime -> PaymentRequest' s -> BoolisExpired :: forall s. C.UTCTime -> PaymentRequest' s -> Bool - replacement in lib/Aftok/Payments/Types.hs at line 82
-- using error here is reasonable since it would indicate-- a serialization problemin either (error . T.pack) (check . getExpires)$ getPaymentDetails (view paymentRequest req)in -- using error here is reasonable since it would indicate-- a serialization problemeither (error . T.pack) (check . getExpires) $getPaymentDetails (view paymentRequest req) - replacement in lib/Aftok/Payments.hs at line 1
{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE FlexibleContexts #-} - replacement in lib/Aftok/Payments.hs at line 3
{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE TemplateHaskell #-} - replacement in lib/Aftok/Payments.hs at line 6
( module Aftok.Payments, module Aftok.Payments.Types( module Aftok.Payments,module Aftok.Payments.Types, - replacement in lib/Aftok/Payments.hs at line 11
import Aftok.Billingimport Aftok.Currency.Bitcoin( NetworkId (..),NetworkMode,satoshi,toNetwork,)import Aftok.Databaseimport Aftok.Payments.Typesimport Aftok.Project (depf)import qualified Aftok.TimeLog as TLimport Aftok.Types( ProjectId,UserId,)import qualified Bippy as Bimport qualified Bippy.Proto as Pimport qualified Bippy.Types as BTimport Control.Error.Util (maybeT)import Control.Lens( (%~),(^.),makeClassy,makeClassyPrisms,review,traverseOf,view,)import Control.Lens.Tupleimport Control.Monad.Except( MonadError,throwError,)import qualified Crypto.PubKey.RSA.Types as RSA( Error (..),PrivateKey,)import Crypto.Random.Types( MonadRandom,getRandomBytes,)import Data.AffineSpace ((.+^))import Data.Map.Strict (assocs)import Data.Thyme.Clock as Cimport Data.Thyme.Time as Timport Haskoin.Address (Address (..))import Haskoin.Address.Base58 (encodeBase58Check)import Haskoin.Script (ScriptOutput (..))import Network.URI - replacement in lib/Aftok/Payments.hs at line 61[4.3883]→[4.4886:5406](∅→∅),[4.2905]→[4.11677:11713](∅→∅),[4.5406]→[4.11677:11713](∅→∅),[4.7517]→[4.11677:11713](∅→∅),[4.28572]→[4.11677:11713](∅→∅),[4.11677]→[4.11677:11713](∅→∅),[4.11713]→[4.5407:5981](∅→∅),[4.586]→[4.5839:5840](∅→∅),[4.2275]→[4.5839:5840](∅→∅),[4.2429]→[4.5839:5840](∅→∅),[4.3100]→[4.5839:5840](∅→∅),[4.5981]→[4.5839:5840](∅→∅),[4.11880]→[4.5839:5840](∅→∅),[4.5839]→[4.5839:5840](∅→∅),[4.5840]→[4.5982:6203](∅→∅),[4.3292]→[4.5916:5917](∅→∅),[4.6203]→[4.5916:5917](∅→∅),[4.12016]→[4.5916:5917](∅→∅),[4.5916]→[4.5916:5917](∅→∅),[4.5917]→[4.6204:6564](∅→∅),[4.3493]→[4.12157:12186](∅→∅),[4.6564]→[4.12157:12186](∅→∅),[4.59122]→[4.12157:12186](∅→∅),[4.12157]→[4.12157:12186](∅→∅),[4.12186]→[4.5959:5960](∅→∅),[4.5959]→[4.5959:5960](∅→∅),[4.5960]→[4.6565:6682](∅→∅),[4.6744]→[4.6744:6794](∅→∅),[4.6794]→[2.5133:5164](∅→∅),[2.5164]→[4.6795:7089](∅→∅),[4.2352]→[4.6795:7089](∅→∅),[4.7089]→[4.3624:3656](∅→∅),[4.27489]→[4.3624:3656](∅→∅),[4.2352]→[4.3624:3656](∅→∅),[4.3656]→[4.12296:12334](∅→∅),[4.2352]→[4.12296:12334](∅→∅),[4.12334]→[4.7090:7200](∅→∅)
import Control.Error.Util ( maybeT )import Control.Lens ( makeClassy, makeClassyPrisms, review, view, (%~), (^.), traverseOf)import Control.Lens.Tupleimport Control.Monad.Except ( MonadError, throwError)import qualified Crypto.PubKey.RSA.Types as RSA( Error(..), PrivateKey)import Crypto.Random.Types ( MonadRandom, getRandomBytes)import Data.AffineSpace ( (.+^) )import Data.Map.Strict ( assocs )import Data.Thyme.Clock as Cimport Data.Thyme.Time as Timport qualified Bippy as Bimport qualified Bippy.Proto as Pimport qualified Bippy.Types as BTimport Haskoin.Address ( Address(..) )import Haskoin.Address.Base58 ( encodeBase58Check )import Haskoin.Script ( ScriptOutput(..) )import Network.URIimport Aftok.Types ( UserId, ProjectId)import Aftok.Billingimport Aftok.Currency.Bitcoin ( NetworkId(..), NetworkMode, satoshi, toNetwork)import Aftok.Databaseimport Aftok.Payments.Typesimport Aftok.Project ( depf )import qualified Aftok.TimeLog as TLdata PaymentsConfig= PaymentsConfig{ _networkMode :: !NetworkMode,_signingKey :: !RSA.PrivateKey,_pkiData :: !BT.PKIData} - edit in lib/Aftok/Payments.hs at line 68[4.12460]→[4.28644:28681](∅→∅),[4.28681]→[4.27539:27643](∅→∅),[4.3876]→[4.12579:12583](∅→∅),[4.27643]→[4.12579:12583](∅→∅),[4.28778]→[4.12579:12583](∅→∅),[4.12579]→[4.12579:12583](∅→∅)
data PaymentsConfig = PaymentsConfig{ _networkMode :: !NetworkMode, _signingKey :: !RSA.PrivateKey, _pkiData :: !BT.PKIData} - replacement in lib/Aftok/Payments.hs at line 70[4.7760]→[4.7760:7803](∅→∅),[4.7803]→[4.2492:2525](∅→∅),[4.2525]→[4.28808:29071](∅→∅),[4.29071]→[4.2613:2657](∅→∅),[4.2613]→[4.2613:2657](∅→∅),[4.2657]→[4.27644:27735](∅→∅),[4.27735]→[4.29164:29196](∅→∅),[4.29164]→[4.29164:29196](∅→∅),[4.29196]→[4.2703:2743](∅→∅),[4.2703]→[4.2703:2743](∅→∅),[4.2743]→[4.29197:29427](∅→∅),[4.29427]→[4.27736:27775](∅→∅),[4.2837]→[4.8102:8106](∅→∅),[4.5100]→[4.8102:8106](∅→∅),[4.27775]→[4.8102:8106](∅→∅),[4.29467]→[4.8102:8106](∅→∅),[4.8102]→[4.8102:8106](∅→∅)
data BillingOps (m :: * -> *) = BillingOps{ -- | generator for user memomemoGen :: Subscription' UserId Billable -- ^ subscription being billed-> T.Day -- ^ billing date-> C.UTCTime -- ^ payment request generation time-> m (Maybe Text)-- | generator for payment response URL, uriGen :: PaymentKey -- ^ payment key to be included in the URL-> m (Maybe URI)-- | generator for merchant payload, payloadGen :: Subscription' UserId Billable -- ^ subscription being billed-> T.Day -- ^ billing date-> C.UTCTime -- ^ payment request generation time-> m (Maybe ByteString)}data BillingOps (m :: * -> *)= BillingOps{ -- | generator for user memomemoGen ::Subscription' UserId Billable -> -- subscription being billedT.Day -> -- billing dateC.UTCTime -> -- payment request generation timem (Maybe Text),-- | generator for payment response URLuriGen ::PaymentKey -> -- payment key to be included in the URLm (Maybe URI),-- | generator for merchant payloadpayloadGen ::Subscription' UserId Billable -> -- subscription being billedT.Day -> -- billing dateC.UTCTime -> -- payment request generation timem (Maybe ByteString)} - replacement in lib/Aftok/Payments.hs at line 91
= Paid !Payment -- ^ the request was paid with the specified payment| Unpaid !PaymentRequest -- ^ the request has not been paid, but has not yet expired| Expired !PaymentRequest -- ^ the request was not paid prior to the expiration date= -- | the request was paid with the specified paymentPaid !Payment| -- | the request has not been paid, but has not yet expiredUnpaid !PaymentRequest| -- | the request was not paid prior to the expiration dateExpired !PaymentRequest - edit in lib/Aftok/Payments.hs at line 102
- replacement in lib/Aftok/Payments.hs at line 110
createPaymentRequests:: ( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError e, MonadDB m)=> BillingOps m -- ^ generators for payment request components-> C.UTCTime -- ^ timestamp for payment request creation-> UserId -- ^ customer responsible for payment-> ProjectId -- ^ project whose worklog is to be paid-> m [PaymentRequestId]createPaymentRequests ::( MonadRandom m,MonadReader r m,HasPaymentsConfig r,MonadError e m,AsPaymentError e,MonadDB m) =>-- | generators for payment request componentsBillingOps m ->-- | timestamp for payment request creationC.UTCTime ->-- | customer responsible for paymentUserId ->-- | project whose worklog is to be paidProjectId ->m [PaymentRequestId] - replacement in lib/Aftok/Payments.hs at line 131[4.9183]→[4.7633:7784](∅→∅),[4.7784]→[4.9325:9342](∅→∅),[4.9325]→[4.9325:9342](∅→∅),[4.9342]→[4.4262:4287](∅→∅),[4.4287]→[4.9369:9384](∅→∅),[4.9369]→[4.9369:9384](∅→∅),[4.9396]→[4.9396:9458](∅→∅)
createSubscriptionPaymentRequests:: ( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError e, MonadDB m)=> BillingOps m-> C.UTCTime-> (SubscriptionId, Subscription)-> m [PaymentRequestId]createSubscriptionPaymentRequests ::( MonadRandom m,MonadReader r m,HasPaymentsConfig r,MonadError e m,AsPaymentError e,MonadDB m) =>BillingOps m ->C.UTCTime ->(SubscriptionId, Subscription) ->m [PaymentRequestId] - replacement in lib/Aftok/Payments.hs at line 145
maybeT (raiseSubjectNotFound . FindBillable $ sub ^. billable) pure$ traverseOf billable findBillable submaybeT (raiseSubjectNotFound . FindBillable $ sub ^. billable) pure $traverseOf billable findBillable sub - replacement in lib/Aftok/Payments.hs at line 148
billableDates <-billableDates <- - replacement in lib/Aftok/Payments.hs at line 150
$ takeWhile (< view _utctDay now)$ billingSchedule billableSub$ takeWhile (< view _utctDay now)$ billingSchedule billableSub - replacement in lib/Aftok/Payments.hs at line 154[4.9950]→[4.8084:8222](∅→∅),[4.8222]→[4.10079:10096](∅→∅),[4.10079]→[4.10079:10096](∅→∅),[4.10096]→[4.4313:4338](∅→∅),[4.4338]→[4.10123:10138](∅→∅),[4.10123]→[4.10123:10138](∅→∅),[4.10150]→[4.10150:10170](∅→∅),[4.10170]→[4.5101:5136](∅→∅),[4.5136]→[4.10198:10233](∅→∅),[4.10198]→[4.10198:10233](∅→∅)
createPaymentRequest:: ( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError e, MonadDB m)=> BillingOps m-> C.UTCTime-> SubscriptionId-> Subscription' UserId Billable-> T.Day-> m PaymentRequestIdcreatePaymentRequest ::( MonadRandom m,MonadReader r m,HasPaymentsConfig r,MonadError e m,AsPaymentError e,MonadDB m) =>BillingOps m ->C.UTCTime ->SubscriptionId ->Subscription' UserId Billable ->T.Day ->m PaymentRequestId - replacement in lib/Aftok/Payments.hs at line 169
cfg <- askcfg <- ask - replacement in lib/Aftok/Payments.hs at line 171
pkey <- PaymentKey . encodeBase58Check <$> getRandomBytes 32memo <- memoGen ops sub bday nowuri <- uriGen ops pkeypkey <- PaymentKey . encodeBase58Check <$> getRandomBytes 32memo <- memoGen ops sub bday nowuri <- uriGen ops pkey - replacement in lib/Aftok/Payments.hs at line 176
reqErr <- B.createPaymentRequest (cfg ^. signingKey) (cfg ^. pkiData) detailsreq <- either (throwError . review _SigningError) pure reqErrreqErr <- B.createPaymentRequest (cfg ^. signingKey) (cfg ^. pkiData) detailsreq <- either (throwError . review _SigningError) pure reqErr - replacement in lib/Aftok/Payments.hs at line 184
findUnbilledDates:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime -- ^ the date against which payment request expiration should be checked-> Billable-> [(PaymentRequestId, PaymentRequest)] -- ^ the list of existing payment requests-> [T.Day] -- ^ the list of expected billing days-> m [T.Day] -- ^ the list of billing days for which no payment request existsfindUnbilledDates ::(MonadDB m, MonadError e m, AsPaymentError e) =>-- | the date against which payment request expiration should be checkedC.UTCTime ->Billable ->-- | the list of existing payment requests[(PaymentRequestId, PaymentRequest)] ->-- | the list of expected billing days[T.Day] ->-- | the list of billing days for which no payment request existsm [T.Day] - replacement in lib/Aftok/Payments.hs at line 197
EQ -> getRequestStatus now p >>= \s -> case s ofExpired r ->if view _utctDay now > addDays (view gracePeriod b) (view billingDate r)then throwError (review _Overdue (r ^. subscription))else fmap (d :) $ findUnbilledDates now b px dx -- d will be rebilled_ -> findUnbilledDates now b ps ds -- if paid or unpaid, nothing to doEQ ->getRequestStatus now p >>= \s -> case s ofExpired r ->if view _utctDay now > addDays (view gracePeriod b) (view billingDate r)then throwError (review _Overdue (r ^. subscription))else fmap (d :) $ findUnbilledDates now b px dx -- d will be rebilled_ -> findUnbilledDates now b ps ds -- if paid or unpaid, nothing to do - edit in lib/Aftok/Payments.hs at line 208
- replacement in lib/Aftok/Payments.hs at line 211
getRequestStatus:: (MonadDB m)=> C.UTCTime -- ^ the date against which request expiration should be checked-> (PaymentRequestId, PaymentRequest) -- ^ the request for which to find a payment-> m PaymentRequestStatusgetRequestStatus ::(MonadDB m) =>-- | the date against which request expiration should be checkedC.UTCTime ->-- | the request for which to find a payment(PaymentRequestId, PaymentRequest) ->m PaymentRequestStatus - replacement in lib/Aftok/Payments.hs at line 220
in maybe ifUnpaid Paid <$> runMaybeT (findPayment reqid)in maybe ifUnpaid Paid <$> runMaybeT (findPayment reqid) - replacement in lib/Aftok/Payments.hs at line 224[4.12639]→[4.27872:27914](∅→∅),[4.27914]→[4.9237:9333](∅→∅),[4.9333]→[4.27999:28354](∅→∅),[4.27999]→[4.27999:28354](∅→∅)
createPaymentDetails:: ( 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.PaymentDetailscreatePaymentDetails ::( MonadRandom m,MonadReader r m,HasPaymentsConfig r,MonadError e m,AsPaymentError e,MonadDB m) =>-- | payout date (billing date)T.Day ->-- | timestamp of payment request creationC.UTCTime ->-- | user memoMaybe Text ->-- | payment response URLMaybe URI ->-- | merchant payloadMaybe ByteString ->-- | billing informationBillable ->m P.PaymentDetails - replacement in lib/Aftok/Payments.hs at line 252
pure $ B.createPaymentDetails (toNetwork (cfg ^. networkMode) BTC)outputs(T.fromThyme billingTime)expirymemouripayloadwhere payoutTime = T.mkUTCTime payoutDate (fromInteger 0)pure $B.createPaymentDetails(toNetwork (cfg ^. networkMode) BTC)outputs(T.fromThyme billingTime)expirymemouripayloadwherepayoutTime = T.mkUTCTime payoutDate (fromInteger 0) - replacement in lib/Aftok/Payments.hs at line 264
getProjectPayouts:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime-> ProjectId-> m (TL.Payouts (NetworkId, Address))getProjectPayouts ::(MonadDB m, MonadError e m, AsPaymentError e) =>C.UTCTime ->ProjectId ->m (TL.Payouts (NetworkId, Address)) - replacement in lib/Aftok/Payments.hs at line 272
in maybe (raiseSubjectNotFound projectOp) pure =<< liftdb projectOpin maybe (raiseSubjectNotFound projectOp) pure =<< liftdb projectOp - replacement in lib/Aftok/Payments.hs at line 276
createPayoutsOutputs:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime-> BT.Satoshi-> TL.Payouts (NetworkId, Address)-> 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 285
in join <$> traverse (uncurry (createOutputs t)) payoutFractionsin join <$> traverse (uncurry (createOutputs t)) payoutFractions - replacement in lib/Aftok/Payments.hs at line 287[4.642]→[4.6029:6030](∅→∅),[4.15323]→[4.6029:6030](∅→∅),[4.6029]→[4.6029:6030](∅→∅),[4.6030]→[4.28773:28926](∅→∅)
createOutputs:: (MonadDB m, MonadError e m, AsPaymentError e)=> C.UTCTime-> TL.CreditTo (NetworkId, Address)-> BT.Satoshi-> m [BT.Output]createOutputs ::(MonadDB m, MonadError e m, AsPaymentError e) =>C.UTCTime ->TL.CreditTo (NetworkId, Address) ->BT.Satoshi ->m [BT.Output] - edit in lib/Aftok/Payments.hs at line 295
- edit in lib/Aftok/Payments.hs at line 297
- replacement in lib/Aftok/Payments.hs at line 301[4.29228]→[4.9825:9890](∅→∅),[4.744]→[4.6287:6288](∅→∅),[4.9890]→[4.6287:6288](∅→∅),[4.15733]→[4.6287:6288](∅→∅),[4.29283]→[4.6287:6288](∅→∅),[4.30520]→[4.6287:6288](∅→∅),[4.6287]→[4.6287:6288](∅→∅)
other -> throwError $ review _IllegalAddress otherother -> throwError $ review _IllegalAddress other - edit in lib/Aftok/Payments.hs at line 305
- replacement in lib/Aftok/Payments.hs at line 309
findPayableRequests:: (MonadDB m) => UserId -> SubscriptionId -> C.UTCTime -> m [BillDetail]findPayableRequests ::(MonadDB m) => UserId -> SubscriptionId -> C.UTCTime -> m [BillDetail] - replacement in lib/Aftok/Payments.hs at line 315
wherefindOp = FindUnpaidRequests sidcheckAccess d = if view (_3 . customer) d == uidthen pure [d]else raiseOpForbidden uid (UserNotSubscriber sid) findOp[4.10076]wherefindOp = FindUnpaidRequests sidcheckAccess d =if view (_3 . customer) d == uidthen pure [d]else raiseOpForbidden uid (UserNotSubscriber sid) findOp - edit in lib/Aftok/Project.hs at line 5
import Aftok.Typesimport Control.Lens( makeLenses,makePrisms,)import Crypto.Random.Types( MonadRandom,getRandomBytes,)import qualified Data.ByteString as BSimport Data.ByteString.Base64.URL as B64import Data.Thyme.Clock as C - edit in lib/Aftok/Project.hs at line 18[4.1129]→[4.3885:3886](∅→∅),[4.3886]→[4.41340:41689](∅→∅),[4.16058]→[4.6468:6469](∅→∅),[4.41689]→[4.6468:6469](∅→∅),[4.1198]→[4.6468:6469](∅→∅),[4.6469]→[4.41690:41849](∅→∅),[4.41849]→[4.1381:1382](∅→∅),[4.1381]→[4.1381:1382](∅→∅),[4.1382]→[4.29285:29314](∅→∅),[4.29314]→[4.1460:1461](∅→∅),[4.1460]→[4.1460:1461](∅→∅)
import Control.Lens ( makeLenses, makePrisms)import Crypto.Random.Types ( MonadRandom, getRandomBytes)import qualified Data.ByteString as BSimport Data.ByteString.Base64.URL as B64import Data.Thyme.Clock as Cimport Aftok.Types - replacement in lib/Aftok/Project.hs at line 20
data Project = Project{ _projectName :: ProjectName, _inceptionDate :: C.UTCTime, _initiator :: UserId, _depf :: DepreciationFunction}data Project= Project{ _projectName :: ProjectName,_inceptionDate :: C.UTCTime,_initiator :: UserId,_depf :: DepreciationFunction} - edit in lib/Aftok/Project.hs at line 31
- replacement in lib/Aftok/Project.hs at line 47
data Invitation = Invitation{ _projectId :: ProjectId, _invitingUser :: UserId, _invitedEmail :: Email, _invitationTime :: C.UTCTime, _acceptanceTime :: Maybe C.UTCTime}data Invitation= Invitation{ _projectId :: ProjectId,_invitingUser :: UserId,_invitedEmail :: Email,_invitationTime :: C.UTCTime,_acceptanceTime :: Maybe C.UTCTime} - edit in lib/Aftok/Project.hs at line 57
- replacement in lib/Aftok/TimeLog/Serialization.hs at line 1
{-# LANGUAGE LambdaCase #-}{-# LANGUAGE LambdaCase #-} - replacement in lib/Aftok/TimeLog/Serialization.hs at line 4
( depfFromJSON, depfToJSON( depfFromJSON,depfToJSON, - edit in lib/Aftok/TimeLog/Serialization.hs at line 9
import Aftok.Typesimport Data.Aeson( (.:),(.=),Value (..),object,)import Data.Aeson.Types (Parser)import Data.Text (unpack) - edit in lib/Aftok/TimeLog/Serialization.hs at line 19[4.29546]→[4.41922:42258](∅→∅),[4.42316]→[4.42316:42375](∅→∅),[4.4005]→[4.29676:29677](∅→∅),[4.42375]→[4.29676:29677](∅→∅),[4.29676]→[4.29676:29677](∅→∅),[4.29677]→[4.42376:42405](∅→∅),[4.42405]→[4.29696:29697](∅→∅),[4.29696]→[4.29696:29697](∅→∅)
import Data.Aeson ( Value(..), (.=), (.:), object)import Data.Aeson.Types ( Parser )import Data.Text ( unpack )import Aftok.Types - replacement in lib/Aftok/TimeLog/Serialization.hs at line 21
LinearDepreciation (Months up) (Months dp) -> object[ "type" .= ("LinearDepreciation" :: Text), "arguments" .= object ["undep" .= up, "dep" .= dp]]LinearDepreciation (Months up) (Months dp) ->object[ "type" .= ("LinearDepreciation" :: Text),"arguments" .= object ["undep" .= up, "dep" .= dp]] - replacement in lib/Aftok/TimeLog/Serialization.hs at line 30
t <- v .: "type" :: Parser Textt <- v .: "type" :: Parser Text - replacement in lib/Aftok/TimeLog/Serialization.hs at line 35
dep = Months <$> (args .: "dep")in LinearDepreciation <$> undep <*> depdep = Months <$> (args .: "dep")in LinearDepreciation <$> undep <*> dep - edit in lib/Aftok/TimeLog/Serialization.hs at line 38
- edit in lib/Aftok/TimeLog/Serialization.hs at line 39
- replacement in lib/Aftok/TimeLog.hs at line 1
{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE TemplateHaskell #-} - replacement in lib/Aftok/TimeLog.hs at line 5[4.4159]→[4.10249:10599](∅→∅),[4.10599]→[4.6557:6580](∅→∅),[4.5584]→[4.6557:6580](∅→∅),[4.6580]→[4.10600:10675](∅→∅),[4.24]→[4.961:973](∅→∅),[4.107]→[4.961:973](∅→∅),[4.5371]→[4.961:973](∅→∅),[4.5635]→[4.961:973](∅→∅),[4.10675]→[4.961:973](∅→∅),[4.961]→[4.961:973](∅→∅),[4.987]→[4.25:48](∅→∅)
( LogEntry(..), creditTo, event, eventMeta, CreditTo(..), _CreditToCurrency, _CreditToUser, _CreditToProject, creditToName, LogEvent(..), eventName, nameEvent, eventTime, WorkIndex(WorkIndex), _WorkIndex, workIndex, DepF, toDepF, EventId(EventId), _EventId, ModTime(ModTime), _ModTime, EventAmendment(..), AmendmentId(AmendmentId), _AmendmentId, Payouts(..), _Payouts, payouts, linearDepreciation( LogEntry (..),creditTo,event,eventMeta,CreditTo (..),_CreditToCurrency,_CreditToUser,_CreditToProject,creditToName,LogEvent (..),eventName,nameEvent,eventTime,WorkIndex (WorkIndex),_WorkIndex,workIndex,DepF,toDepF,EventId (EventId),_EventId,ModTime (ModTime),_ModTime,EventAmendment (..),AmendmentId (AmendmentId),_AmendmentId,Payouts (..),_Payouts,payouts,linearDepreciation, - replacement in lib/Aftok/TimeLog.hs at line 37[4.998]→[4.10687:10745](∅→∅),[4.10745]→[4.4192:4258](∅→∅),[4.30765]→[4.4192:4258](∅→∅),[4.587]→[4.4192:4258](∅→∅),[4.4258]→[4.10746:10798](∅→∅),[4.10798]→[4.4299:4333](∅→∅),[4.4299]→[4.4299:4333](∅→∅),[4.4333]→[4.10799:12005](∅→∅),[4.12005]→[4.4578:4639](∅→∅),[4.4578]→[4.4578:4639](∅→∅),[4.4639]→[4.12006:12221](∅→∅),[4.862]→[4.618:619](∅→∅),[4.4639]→[4.618:619](∅→∅),[4.12221]→[4.618:619](∅→∅),[4.31256]→[4.618:619](∅→∅),[4.122]→[4.618:619](∅→∅),[4.4663]→[4.4663:4695](∅→∅),[4.4695]→[4.31257:31286](∅→∅)
import Control.Arrow ( (&&&) )import Control.Lensimport Data.AdditiveGroupimport Data.Aeson as Aimport Data.AffineSpaceimport Data.Eq ( Eq, (==))import Data.Either ( Either(..), rights)import Data.Foldable as Fimport Data.Function ( ($), (.), id)import Data.Functor ( fmap )import Data.Heap as Himport Data.List.NonEmpty as Limport Data.Maybe ( Maybe(..) )import Data.Map.Strict as MSimport Data.Ord ( Ord(..), Ordering(..))import Data.Ratio ( Rational )import Data.Text ( Text )import Data.Thyme.Clock as Cimport Data.UUIDimport Data.VectorSpaceimport Prelude ( (/), (*))import Text.Show ( Show )import Aftok.Intervalimport Aftok.Typesimport Aftok.Intervalimport Aftok.Typesimport Control.Arrow ((&&&))import Control.Lensimport Data.AdditiveGroupimport Data.Aeson as Aimport Data.AffineSpaceimport Data.Either( Either (..),rights,)import Data.Eq( (==),Eq,)import Data.Foldable as Fimport Data.Function( ($),(.),id,)import Data.Functor (fmap)import Data.Heap as Himport Data.List.NonEmpty as Limport Data.Map.Strict as MSimport Data.Maybe (Maybe (..))import Data.Ord( Ord (..),Ordering (..),)import Data.Ratio (Rational)import Data.Text (Text)import Data.Thyme.Clock as Cimport Data.UUIDimport Data.VectorSpaceimport Text.Show (Show)import Prelude( (*),(/),) - replacement in lib/Aftok/TimeLog.hs at line 80
{-|- 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.-}-- |-- - 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. - replacement in lib/Aftok/TimeLog.hs at line 86[4.31552]→[4.30522:30632](∅→∅),[4.1225]→[4.30522:30632](∅→∅),[4.2178]→[4.1237:1271](∅→∅),[4.30632]→[4.1237:1271](∅→∅),[4.1237]→[4.1237:1271](∅→∅)
data LogEvent = StartWork { _eventTime :: !C.UTCTime }| StopWork { _eventTime :: !C.UTCTime }deriving (Show, Eq)data LogEvent= StartWork {_eventTime :: !C.UTCTime}| StopWork {_eventTime :: !C.UTCTime}deriving (Show, Eq) - replacement in lib/Aftok/TimeLog.hs at line 94
compare (StartWork t0) (StopWork t1) = if t0 == t1 then GT else compare t0 t1compare (StopWork t0) (StartWork t1) = if t0 == t1 then LT else compare t0 t1compare (StartWork t0) (StopWork t1) = if t0 == t1 then GT else compare t0 t1compare (StopWork t0) (StartWork t1) = if t0 == t1 then LT else compare t0 t1 - replacement in lib/Aftok/TimeLog.hs at line 97
compare (StopWork t0) (StopWork t1) = compare t0 t1compare (StopWork t0) (StopWork t1) = compare t0 t1 - replacement in lib/Aftok/TimeLog.hs at line 101
eventName (StopWork _) = "stop"eventName (StopWork _) = "stop" - replacement in lib/Aftok/TimeLog.hs at line 105
nameEvent "stop" = Just StopWorknameEvent _ = NothingnameEvent "stop" = Just StopWorknameEvent _ = Nothing - replacement in lib/Aftok/TimeLog.hs at line 108[4.5442]→[4.31702:31761](∅→∅),[4.31761]→[4.30749:30812](∅→∅),[4.30749]→[4.30749:30812](∅→∅),[4.1816]→[4.613:637](∅→∅),[4.4238]→[4.613:637](∅→∅),[4.30812]→[4.613:637](∅→∅),[4.613]→[4.613:637](∅→∅)
data LogEntry a = LogEntry{ _creditTo :: !(CreditTo a), _event :: !LogEvent, _eventMeta :: !(Maybe A.Value)} deriving (Show, Eq)data LogEntry a= LogEntry{ _creditTo :: !(CreditTo a),_event :: !LogEvent,_eventMeta :: !(Maybe A.Value)}deriving (Show, Eq) - replacement in lib/Aftok/TimeLog.hs at line 121
in ordElems a `compare` ordElems bin ordElems a `compare` ordElems b - edit in lib/Aftok/TimeLog.hs at line 124
- edit in lib/Aftok/TimeLog.hs at line 128
- edit in lib/Aftok/TimeLog.hs at line 137
- edit in lib/Aftok/TimeLog.hs at line 141
- edit in lib/Aftok/TimeLog.hs at line 145
- replacement in lib/Aftok/TimeLog.hs at line 152
{-|- Given a depreciation function, the "current" time, and a foldable functor of log intervals,- produce the total, depreciated length of work to be credited to an address.-}-- |-- - Given a depreciation function, the "current" time, and a foldable functor of log intervals,-- - produce the total, depreciated length of work to be credited to an address. - replacement in lib/Aftok/TimeLog.hs at line 158
{-|- Payouts are determined by computing a depreciated duration value for- each work interval. This function computes the percentage of the total- work allocated to each address.-}-- |-- - Payouts are determined by computing a depreciated duration value for-- - each work interval. This function computes the percentage of the total-- - work allocated to each address. - replacement in lib/Aftok/TimeLog.hs at line 166[4.12354]→[4.12354:12412](∅→∅),[4.213]→[4.1011:1012](∅→∅),[4.573]→[4.1011:1012](∅→∅),[4.884]→[4.1011:1012](∅→∅),[4.1199]→[4.1011:1012](∅→∅),[4.1905]→[4.1011:1012](∅→∅),[4.4956]→[4.1011:1012](∅→∅),[4.6834]→[4.1011:1012](∅→∅),[4.12412]→[4.1011:1012](∅→∅),[4.1011]→[4.1011:1012](∅→∅)
(^+^ total) &&& id $ workCredit dep ptime ivals(^+^ total) &&& id $ workCredit dep ptime ivals - replacement in lib/Aftok/TimeLog.hs at line 168
in Payouts $ fmap ((/ toSeconds totalTime) . toSeconds) keyTimesin Payouts $ fmap ((/ toSeconds totalTime) . toSeconds) keyTimes - replacement in lib/Aftok/TimeLog.hs at line 170
workIndex :: forall a f . (Ord a, Foldable f) => f (LogEntry a) -> (WorkIndex a)workIndex :: forall a f. (Ord a, Foldable f) => f (LogEntry a) -> (WorkIndex a) - replacement in lib/Aftok/TimeLog.hs at line 173[4.1461]→[4.12497:12566](∅→∅),[4.1525]→[4.844:845](∅→∅),[4.12566]→[4.844:845](∅→∅),[4.844]→[4.844:845](∅→∅),[4.845]→[4.12567:12737](∅→∅)
rawIndex = F.foldl' appendLogEntry MS.empty sortedEntriesaccum:: (CreditTo a)-> [Either LogEvent Interval]-> Map (CreditTo a) (NonEmpty Interval)-> Map (CreditTo a) (NonEmpty Interval)rawIndex = F.foldl' appendLogEntry MS.empty sortedEntriesaccum ::(CreditTo a) ->[Either LogEvent Interval] ->Map (CreditTo a) (NonEmpty Interval) ->Map (CreditTo a) (NonEmpty Interval) - replacement in lib/Aftok/TimeLog.hs at line 182
in WorkIndex $ MS.foldrWithKey accum MS.empty rawIndexin WorkIndex $ MS.foldrWithKey accum MS.empty rawIndex - replacement in lib/Aftok/TimeLog.hs at line 184
{-|- The values of the raw index map are either complete intervals (which may be- extended if a new start is encountered at the same instant as the end of the- interval) or start events awaiting completion.-}-- |-- - The values of the raw index map are either complete intervals (which may be-- - extended if a new start is encountered at the same instant as the end of the-- - interval) or start events awaiting completion. - replacement in lib/Aftok/TimeLog.hs at line 193
combine (StartWork t) (StopWork t') | t' > t = Right $ Interval t t'combine (StartWork t) (StopWork t') | t' > t = Right $ Interval t t' - replacement in lib/Aftok/TimeLog.hs at line 195
combine (e1@(StopWork _)) (e2@(StopWork _)) = Left $ min e1 e2 -- ignore redundant endscombine _ e2 = Left e2combine (e1@(StopWork _)) (e2@(StopWork _)) = Left $ min e1 e2 -- ignore redundant endscombine _ e2 = Left e2 - replacement in lib/Aftok/TimeLog.hs at line 199
extension ival (StartWork t) | containsInclusive t ival =extension ival (StartWork t)| containsInclusive t ival = - edit in lib/Aftok/TimeLog.hs at line 203[4.320]→[4.2252:2253](∅→∅),[4.1002]→[4.2252:2253](∅→∅),[4.1069]→[4.2252:2253](∅→∅),[4.2782]→[4.2252:2253](∅→∅),[4.4694]→[4.2252:2253](∅→∅),[4.2252]→[4.2252:2253](∅→∅)
- replacement in lib/Aftok/TimeLog.hs at line 211
_ -> [Left ev]in MS.insert k ivals idx_ -> [Left ev]in MS.insert k ivals idx - replacement in lib/Aftok/TimeLog.hs at line 214
{-|- A very simple linear function for calculating depreciation.-}linearDepreciation:: Months -- ^ The number of initial months during which no depreciation occurs-> Months -- ^ The number of months over which each logged interval will be depreciated-> DepF -- ^ The resulting configured depreciation function.-- |-- - A very simple linear function for calculating depreciation.linearDepreciation ::-- | The number of initial months during which no depreciation occursMonths ->-- | The number of months over which each logged interval will be depreciatedMonths ->-- | The resulting configured depreciation function.DepF - edit in lib/Aftok/TimeLog.hs at line 226
- edit in lib/Aftok/TimeLog.hs at line 228[4.375]→[4.970:971](∅→∅),[4.389]→[4.970:971](∅→∅),[4.1131]→[4.970:971](∅→∅),[4.2613]→[4.970:971](∅→∅),[4.5246]→[4.970:971](∅→∅),[4.10010]→[4.970:971](∅→∅),[4.970]→[4.970:971](∅→∅)
- replacement in lib/Aftok/TimeLog.hs at line 229
depPct dt = if dt < monthsLength undepLengththen 1else toSeconds (max zeroV (maxDepreciable ^-^ dt))/ toSeconds maxDepreciablein \ptime ival ->depPct dt =if dt < monthsLength undepLengththen 1elsetoSeconds (max zeroV (maxDepreciable ^-^ dt))/ toSeconds maxDepreciablein \ptime ival -> - replacement in lib/Aftok/TimeLog.hs at line 237
in depreciation *^ ilen ival[4.13768]in depreciation *^ ilen ival - replacement in lib/Aftok/Types.hs at line 1
{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE TemplateHaskell #-} - edit in lib/Aftok/Types.hs at line 5[4.6638]→[4.876:877](∅→∅),[4.32493]→[4.876:877](∅→∅),[4.876]→[4.876:877](∅→∅),[4.877]→[4.42692:42864](∅→∅),[4.42922]→[4.42922:43324](∅→∅),[4.43324]→[4.3888:3946](∅→∅)
import Control.Lens ( makeLenses, makePrisms)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 )import Aftok.Currency.Zcash ( ZAddr ) - edit in lib/Aftok/Types.hs at line 6
import Aftok.Currency.Zcash (ZAddr)import Control.Lens( makeLenses,makePrisms,)import Data.Eq (Eq)import Data.Functor (Functor)import Data.Ord (Ord)import Data.Text (Text)import Data.UUID (UUID)import Text.Show (Show)import Prelude (Integer) - edit in lib/Aftok/Types.hs at line 20
- edit in lib/Aftok/Types.hs at line 24
- edit in lib/Aftok/Types.hs at line 28
- edit in lib/Aftok/Types.hs at line 34
- edit in lib/Aftok/Types.hs at line 36
data User= User{ _username :: !UserName,_userAccountRecovery :: !(AccountRecovery ZAddr)} - edit in lib/Aftok/Types.hs at line 43[4.3318]→[4.3318:3374](∅→∅),[4.3374]→[4.3993:4047](∅→∅),[4.3420]→[4.33266:33270](∅→∅),[4.4047]→[4.33266:33270](∅→∅),[4.33266]→[4.33266:33270](∅→∅)
data User = User{ _username :: !UserName, _userAccountRecovery :: !(AccountRecovery ZAddr)} - edit in lib/Aftok/Types.hs at line 46
- replacement in lib/Aftok/Types.hs at line 50
-- 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 !ProjectId= -- payouts are made directly via a cryptocurrency networkCreditToCurrency !a| -- payouts are distributed as requested by the specified contributorCreditToUser !UserId| -- payouts are distributed to this project's contributorsCreditToProject !ProjectId - edit in lib/Aftok/Types.hs at line 57
- replacement in lib/Aftok/Types.hs at line 62
creditToName (CreditToUser _) = "credit_to_user"creditToName (CreditToProject _) = "credit_to_project"creditToName (CreditToUser _) = "credit_to_user"creditToName (CreditToProject _) = "credit_to_project" - replacement in lib/Aftok/Util/Http.hs at line 3
import Data.Attoparsec.ByteStringimport Data.ByteString (split)import qualified Data.ByteString.Base64 as B64 - edit in lib/Aftok/Util/Http.hs at line 7[4.4011]→[4.5357:5401](∅→∅),[4.317]→[4.5357:5401](∅→∅),[4.5401]→[4.43437:43549](∅→∅),[4.5504]→[4.430:431](∅→∅),[4.43549]→[4.430:431](∅→∅),[4.430]→[4.430:431](∅→∅)
import Data.Attoparsec.ByteStringimport Data.ByteString ( split )import qualified Data.ByteString.Base64 as B64 - replacement in lib/Aftok/Util/Http.hs at line 16
b64 <- string "Basic " *> takeWhile1 isBase64Charb64 <- string "Basic " *> takeWhile1 isBase64Char - edit in lib/Aftok/Util/Http.hs at line 22
- replacement in lib/Aftok/Util.hs at line 2
{-# LANGUAGE RankNTypes #-}{-# LANGUAGE RankNTypes #-} - edit in lib/Aftok/Util.hs at line 5
- replacement in lib/Aftok/Util.hs at line 6[4.30980]→[4.4013:4014](∅→∅),[4.4014]→[4.43797:43856](∅→∅),[4.31025]→[4.5594:5637](∅→∅),[4.43856]→[4.5594:5637](∅→∅),[4.5594]→[4.5594:5637](∅→∅),[4.43916]→[4.31078:31079](∅→∅),[4.31078]→[4.31078:31079](∅→∅),[4.31079]→[4.5637:5676](∅→∅),[4.5637]→[4.5637:5676](∅→∅),[4.5676]→[4.43917:43969](∅→∅)
import Control.Error.Util ( maybeT )import Control.Monad.Free.Churchimport Data.Functor.Coyonedaimport Data.Map.Strict as Mimport Control.Error.Util (maybeT)import Control.Monad.Free.Churchimport Data.Functor.Coyonedaimport Data.Map.Strict as M - replacement in lib/Aftok/Util.hs at line 11
newtype Program (f :: * -> *) (a :: *) = Program{ runProgram :: F (Coyoneda f) a }newtype Program (f :: * -> *) (a :: *)= Program{runProgram :: F (Coyoneda f) a} - replacement in lib/Aftok/Util.hs at line 17
interpret :: Monad m => (forall x . f x -> m x) -> Program f a -> m ainterpret :: Monad m => (forall x. f x -> m x) -> Program f a -> m a - replacement in lib/Aftok/Util.hs at line 27
in foldrWithKey insf (pure M.empty) min foldrWithKey insf (pure M.empty) m - edit in server/Aftok/QConfig.hs at line 1
{-# LANGUAGE TemplateHaskell #-} - edit in server/Aftok/QConfig.hs at line 2
{-# LANGUAGE TemplateHaskell #-} - edit in server/Aftok/QConfig.hs at line 5
- replacement in server/Aftok/QConfig.hs at line 6[4.4552]→[4.44117:44283](∅→∅),[4.4067]→[4.32426:32479](∅→∅),[4.24991]→[4.32426:32479](∅→∅),[4.44283]→[4.32426:32479](∅→∅),[4.4552]→[4.32426:32479](∅→∅),[4.32479]→[4.6593:6698](∅→∅),[4.6593]→[4.6593:6698](∅→∅),[4.6698]→[4.4068:4120](∅→∅),[4.4120]→[4.44284:44575](∅→∅),[4.4237]→[4.4736:4737](∅→∅),[4.6900]→[4.4736:4737](∅→∅),[4.7805]→[4.4736:4737](∅→∅),[4.25162]→[4.4736:4737](∅→∅),[4.32612]→[4.4736:4737](∅→∅),[4.44575]→[4.4736:4737](∅→∅),[4.4736]→[4.4736:4737](∅→∅),[4.4737]→[4.6901:7028](∅→∅)
import Control.Lens ( makeLenses, (^.))import qualified Data.ByteString.Char8 as C8import qualified Data.Configurator as Cimport qualified Data.Configurator.Types as CTimport qualified Data.List as Limport System.Environment ( getEnvironment )import Filesystem.Path.CurrentOS ( fromText, encodeString)import qualified Filesystem.Path.CurrentOS as Pimport Snap.Coreimport qualified Snap.Http.Server.Config as SCimport Snap.Snaplet.PostgresqlSimpleimport Aftok.Configimport Aftok.Currency.Zcash (ZcashdConfig (..))import Aftok.Snaplet.Users (CaptchaConfig (..))import Control.Lens( (^.),makeLenses,)import qualified Data.ByteString.Char8 as C8import qualified Data.Configurator as Cimport qualified Data.Configurator.Types as CTimport qualified Data.List as Limport Filesystem.Path.CurrentOS( encodeString,fromText,)import qualified Filesystem.Path.CurrentOS as Pimport Snap.Coreimport qualified Snap.Http.Server.Config as SCimport Snap.Snaplet.PostgresqlSimpleimport System.Environment (getEnvironment) - replacement in server/Aftok/QConfig.hs at line 27[4.4839]→[4.4449:4506](∅→∅),[4.4506]→[4.32613:32643](∅→∅),[4.4839]→[4.32613:32643](∅→∅),[4.32643]→[4.3989:4046](∅→∅)
import Aftok.Currency.Zcash (ZcashdConfig(..))import Aftok.Configimport Aftok.Snaplet.Users (CaptchaConfig(..))data QConfig= QConfig{ _hostname :: C8.ByteString,_port :: Int,_authSiteKey :: P.FilePath,_cookieTimeout :: Maybe Int,_pgsConfig :: PGSConfig,_smtpConfig :: SmtpConfig,_billingConfig :: BillingConfig,_templatePath :: P.FilePath,_staticAssetPath :: P.FilePath,_recaptchaSecret :: CaptchaConfig,_zcashdConfig :: ZcashdConfig} - edit in server/Aftok/QConfig.hs at line 42[4.217]→[4.4840:4863](∅→∅),[4.4840]→[4.4840:4863](∅→∅),[4.4863]→[4.4238:4274](∅→∅),[4.4274]→[4.25196:25222](∅→∅),[4.25196]→[4.25196:25222](∅→∅),[4.25222]→[4.4275:4308](∅→∅),[4.4308]→[4.25253:25386](∅→∅),[4.25253]→[4.25253:25386](∅→∅),[4.25386]→[4.4309:4377](∅→∅),[4.4377]→[4.4047:4085](∅→∅),[4.4085]→[4.4507:4542](∅→∅),[4.4085]→[4.534:538](∅→∅),[4.4377]→[4.534:538](∅→∅),[4.4542]→[4.534:538](∅→∅),[4.7325]→[4.534:538](∅→∅),[4.9618]→[4.534:538](∅→∅),[4.25450]→[4.534:538](∅→∅),[4.32737]→[4.534:538](∅→∅),[4.34143]→[4.534:538](∅→∅),[4.534]→[4.534:538](∅→∅)
data QConfig = QConfig{ _hostname :: C8.ByteString, _port :: Int, _authSiteKey :: P.FilePath, _cookieTimeout :: Maybe Int, _pgsConfig :: PGSConfig, _smtpConfig :: SmtpConfig, _billingConfig :: BillingConfig, _templatePath :: P.FilePath, _staticAssetPath :: P.FilePath, _recaptchaSecret :: CaptchaConfig, _zcashdConfig :: ZcashdConfig} - replacement in server/Aftok/QConfig.hs at line 61
<*> (fromText <$> C.lookupDefault "/opt/aftok/server/templates/"cfg"templatePath"<*> ( fromText<$> C.lookupDefault"/opt/aftok/server/templates/"cfg"templatePath" - replacement in server/Aftok/QConfig.hs at line 67
<*> (fromText <$> C.lookupDefault "/opt/aftok/server/static/"cfg"staticAssetPath"<*> ( fromText<$> C.lookupDefault"/opt/aftok/server/static/"cfg"staticAssetPath" - replacement in server/Aftok/QConfig.hs at line 79
<*> C.require cfg "rpcPort"<*> C.require cfg "rpcUser"<*> C.require cfg "rpcPassword"<*> C.require cfg "rpcPort"<*> C.require cfg "rpcUser"<*> C.require cfg "rpcPassword" - edit in server/Aftok/QConfig.hs at line 90
- replacement in server/Aftok/Snaplet/Auctions.hs at line 4
( auctionCreateHandler, auctionGetHandler, auctionBidHandler( auctionCreateHandler,auctionGetHandler,auctionBidHandler, - edit in server/Aftok/Snaplet/Auctions.hs at line 9[4.45343]→[4.2541:2542](∅→∅),[4.2541]→[4.2541:2542](∅→∅),[4.2542]→[4.4525:4526](∅→∅),[4.4526]→[4.33151:33152](∅→∅),[4.2573]→[4.33151:33152](∅→∅),[4.33152]→[4.45344:45406](∅→∅),[4.33207]→[4.2573:2636](∅→∅),[4.45406]→[4.2573:2636](∅→∅),[4.2573]→[4.2573:2636](∅→∅),[4.2636]→[4.45407:45523](∅→∅),[4.45523]→[4.5646:5647](∅→∅),[4.1843]→[4.5646:5647](∅→∅),[4.5647]→[4.45524:45576](∅→∅),[4.1843]→[4.2723:2724](∅→∅),[4.5690]→[4.2723:2724](∅→∅),[4.45576]→[4.2723:2724](∅→∅),[4.2723]→[4.2723:2724](∅→∅),[4.2724]→[4.45577:46158](∅→∅),[4.860]→[4.2837:2865](∅→∅),[4.963]→[4.2837:2865](∅→∅),[4.2050]→[4.2837:2865](∅→∅),[4.46158]→[4.2837:2865](∅→∅),[4.2837]→[4.2837:2865](∅→∅),[4.2865]→[4.46159:46222](∅→∅)
import Control.Monad.Trans.Maybe ( mapMaybeT )import Data.Aesonimport Data.Aeson.Typesimport Data.Hourglass.Types ( Seconds(..) )import Data.Thyme.Clock as Cimport Snap.Snaplet as Simport Aftok.Types ( UserId )import Aftok.Auction ( Auction(..), AuctionId, Bid(..), BidId)import Aftok.Database ( createAuction, createBid, findAuction)import Aftok.Jsonimport Aftok.Util ( fromMaybeT ) - replacement in server/Aftok/Snaplet/Auctions.hs at line 10[4.2895]→[4.5691:5722](∅→∅),[4.5722]→[4.2926:2962](∅→∅),[4.17233]→[4.2926:2962](∅→∅),[4.2926]→[4.2926:2962](∅→∅),[4.2962]→[4.13811:13875](∅→∅)
import Aftok.Snapletimport Aftok.Snaplet.Authimport Bippy.Types ( Satoshi(..) )import Aftok.Auction( Auction (..),AuctionId,Bid (..),BidId,)import Aftok.Database( createAuction,createBid,findAuction,)import Aftok.Jsonimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Types (UserId)import Aftok.Util (fromMaybeT)import Bippy.Types (Satoshi (..))import Control.Monad.Trans.Maybe (mapMaybeT)import Data.Aesonimport Data.Aeson.Typesimport Data.Hourglass.Types (Seconds (..))import Data.Thyme.Clock as Cimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Auctions.hs at line 34
data AuctionCreateRequest = CA { raiseAmount :: Word64, auctionStart :: C.UTCTime , auctionEnd :: C.UTCTime }data AuctionCreateRequest = CA {raiseAmount :: Word64, auctionStart :: C.UTCTime, auctionEnd :: C.UTCTime} - replacement in server/Aftok/Snaplet/Auctions.hs at line 37
auctionCreateParser = unv1 "auctions" p wherep o = CA <$> o .: "raiseAmount" <*> o .: "auctionStart" <*> o .: "auctionEnd"auctionCreateParser = unv1 "auctions" pwherep o = CA <$> o .: "raiseAmount" <*> o .: "auctionStart" <*> o .: "auctionEnd" - replacement in server/Aftok/Snaplet/Auctions.hs at line 42
bidCreateParser uid t = unv1 "bids" p wherep o =Bid uid<$> (Seconds <$> o .: "bidSeconds")<*> (Satoshi <$> o .: "bidAmount")<*> pure tbidCreateParser uid t = unv1 "bids" pwherep o =Bid uid<$> (Seconds <$> o .: "bidSeconds")<*> (Satoshi <$> o .: "bidAmount")<*> pure t - replacement in server/Aftok/Snaplet/Auctions.hs at line 52
uid <- requireUserIdpid <- requireProjectIduid <- requireUserIdpid <- requireProjectId - replacement in server/Aftok/Snaplet/Auctions.hs at line 55
req <- either (snapError 400 . show) pure$ parseEither auctionCreateParser requestBodyreq <-either (snapError 400 . show) pure $parseEither auctionCreateParser requestBody - replacement in server/Aftok/Snaplet/Auctions.hs at line 59
snapEval . createAuction $ Auction piduidt(Satoshi . raiseAmount $ req)(auctionStart req)(auctionEnd req)snapEval . createAuction $Auctionpiduidt(Satoshi . raiseAmount $ req)(auctionStart req)(auctionEnd req) - replacement in server/Aftok/Snaplet/Auctions.hs at line 72
fromMaybeT (snapError 404 $ "Auction not found for id " <> show aid)(mapMaybeT snapEval $ findAuction aid uid) -- this will verify auction accessfromMaybeT(snapError 404 $ "Auction not found for id " <> show aid)(mapMaybeT snapEval $ findAuction aid uid) -- this will verify auction access - replacement in server/Aftok/Snaplet/Auctions.hs at line 78
uid <- requireUserIdaid <- requireAuctionIdtimestamp <- liftIO C.getCurrentTimeuid <- requireUserIdaid <- requireAuctionIdtimestamp <- liftIO C.getCurrentTime - replacement in server/Aftok/Snaplet/Auctions.hs at line 82
bid <- either (snapError 400 . show) pure$ parseEither (bidCreateParser uid timestamp) requestBodybid <-either (snapError 400 . show) pure $parseEither (bidCreateParser uid timestamp) requestBody - replacement in server/Aftok/Snaplet/Auth.hs at line 6[4.263]→[4.7636:7666](∅→∅),[4.7666]→[4.47407:47528](∅→∅),[4.47528]→[4.13877:14038](∅→∅),[4.14038]→[4.47528:47590](∅→∅),[4.310217]→[4.47528:47590](∅→∅),[4.47528]→[4.47528:47590](∅→∅),[4.1993]→[4.423:424](∅→∅),[4.5780]→[4.423:424](∅→∅),[4.7800]→[4.423:424](∅→∅),[4.8267]→[4.423:424](∅→∅),[4.10832]→[4.423:424](∅→∅),[4.47590]→[4.423:424](∅→∅),[4.423]→[4.423:424](∅→∅),[4.424]→[4.34290:34319](∅→∅),[4.1293]→[4.7824:7856](∅→∅),[4.2113]→[4.7824:7856](∅→∅),[4.34319]→[4.7824:7856](∅→∅),[4.7824]→[4.7824:7856](∅→∅),[4.3758]→[4.2114:2145](∅→∅),[4.2145]→[4.47591:47660](∅→∅)
import Control.Lensimport Control.Error.Util ( maybeT )import Control.Monad.Trans.Maybe ( mapMaybeT )import Data.Aeson ( (.:) )import qualified Data.Aeson as Aimport qualified Data.Aeson.Types as Aimport Data.Attoparsec.ByteString ( parseOnly )import Aftok.Typesimport Aftok.Databaseimport Aftok.Snapletimport Aftok.Util.Http ( authHeaderParser )import Aftok.Databaseimport Aftok.Snapletimport Aftok.Typesimport Aftok.Util.Http (authHeaderParser)import Control.Error.Util (maybeT)import Control.Lensimport Control.Monad.Trans.Maybe (mapMaybeT)import Data.Aeson ((.:))import qualified Data.Aeson as Aimport qualified Data.Aeson.Types as Aimport Data.Attoparsec.ByteString (parseOnly)import Snap.Coreimport Snap.Snaplet as Simport qualified Snap.Snaplet.Auth as AU - replacement in server/Aftok/Snaplet/Auth.hs at line 21
import Snap.Coreimport Snap.Snaplet as Simport qualified Snap.Snaplet.Auth as AUdata LoginRequest= LoginRequest{ loginUser :: Text,loginPass :: Text} - edit in server/Aftok/Snaplet/Auth.hs at line 27
data LoginRequest = LoginRequest{ loginUser :: Text, loginPass :: Text} - replacement in server/Aftok/Snaplet/Auth.hs at line 36
requireLoginWith:: (forall a . () -> S.Handler App App a) -> S.Handler App App AU.AuthUserrequireLoginWith ::(forall a. () -> S.Handler App App a) -> S.Handler App App AU.AuthUser - replacement in server/Aftok/Snaplet/Auth.hs at line 41
(uname, pwd) <- either (throwDenied . AU.AuthError) pure$ parseOnly authHeaderParser rawHeader(uname, pwd) <-either (throwDenied . AU.AuthError) pure $parseOnly authHeaderParser rawHeader - replacement in server/Aftok/Snaplet/Auth.hs at line 52
Left _ -> snapError 400 $ "Unable to parse login credentials object."Left _ -> snapError 400 $ "Unable to parse login credentials object." - replacement in server/Aftok/Snaplet/Auth.hs at line 54
authResult <- with auth $ AU.loginByUsername(loginUser credentials)(AU.ClearText (encodeUtf8 $ loginPass credentials))FalseauthResult <-with auth $AU.loginByUsername(loginUser credentials)(AU.ClearText (encodeUtf8 $ loginPass credentials))False - replacement in server/Aftok/Snaplet/Auth.hs at line 80
modifyResponse$ (setResponseStatus 401 "Unauthorized"). (setHeader "WWW-Authenticate" "Basic realm=aftok")modifyResponse $(setResponseStatus 401 "Unauthorized"). (setHeader "WWW-Authenticate" "Basic realm=aftok") - edit in server/Aftok/Snaplet/Auth.hs at line 90
- replacement in server/Aftok/Snaplet/Billing.hs at line 4
( billableCreateHandler, billableListHandler, subscribeHandler( billableCreateHandler,billableListHandler,subscribeHandler, - replacement in server/Aftok/Snaplet/Billing.hs at line 10
import Aftok.Billingimport Aftok.Database( DBOp (..),createBillable,liftdb,withProjectAuth,)import Aftok.Jsonimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Typesimport Bippy.Types (Satoshi (..))import Control.Lens ((^.))import Data.Aesonimport Data.Aeson.Typesimport Data.Thyme.Clock as Cimport Data.Thyme.Time.Core (toThyme)import Snap.Snaplet as S - edit in server/Aftok/Snaplet/Billing.hs at line 29[4.33908]→[4.48274:48331](∅→∅),[4.48331]→[4.33945:34007](∅→∅),[4.33945]→[4.33945:34007](∅→∅),[4.34007]→[4.48332:48444](∅→∅),[4.48444]→[4.34098:34099](∅→∅),[4.34098]→[4.34098:34099](∅→∅),[4.34099]→[4.48445:48497](∅→∅),[4.48497]→[4.34142:34143](∅→∅),[4.34142]→[4.34142:34143](∅→∅),[4.34143]→[2.5347:5378](∅→∅),[2.5378]→[4.14755:14819](∅→∅),[4.34401]→[4.14755:14819](∅→∅),[4.14819]→[4.34229:34286](∅→∅),[4.34452]→[4.34229:34286](∅→∅),[4.48622]→[4.34229:34286](∅→∅),[4.59532]→[4.34229:34286](∅→∅),[4.34229]→[4.34229:34286](∅→∅),[4.34286]→[4.48623:48920](∅→∅),[4.48920]→[4.34407:34476](∅→∅),[4.34407]→[4.34407:34476](∅→∅)
import Control.Lens ( (^.) )import Data.Aesonimport Data.Aeson.Typesimport Data.Thyme.Clock as Cimport Data.Thyme.Time.Core ( toThyme )import Snap.Snaplet as Simport Aftok.Billingimport Bippy.Types ( Satoshi(..) )import Aftok.Jsonimport Aftok.Typesimport Aftok.Database ( createBillable, withProjectAuth, liftdb, DBOp(..))import Aftok.Snapletimport Aftok.Snaplet.Auth - replacement in server/Aftok/Snaplet/Billing.hs at line 30[4.34547]→[4.34547:34606](∅→∅),[4.34606]→[4.34453:34475](∅→∅),[4.34475]→[4.48921:49321](∅→∅),[4.49321]→[4.35053:35054](∅→∅),[4.35053]→[4.35053:35054](∅→∅),[4.35054]→[4.34476:34516](∅→∅)
parseCreateBillable uid pid = unversion "Billable" p wherep (Version 1 0) o =Billable<$> pure pid<*> pure uid<*> o.: "name"<*> o.: "description"<*> (parseRecurrence' =<< o .: "recurrence")<*> (Satoshi <$> o .: "amount")<*> o.: "gracePeriod"<*> (fmap toThyme <$> o .: "requestExpiryPeriod")<*> o.:? "paymentRequestEmailTemplate"<*> o.:? "paymentRequestMemoTemplate"p ver o = badVersion "Billable" ver oparseCreateBillable uid pid = unversion "Billable" pwherep (Version 1 0) o =Billable<$> pure pid<*> pure uid<*> o.: "name"<*> o.: "description"<*> (parseRecurrence' =<< o .: "recurrence")<*> (Satoshi <$> o .: "amount")<*> o.: "gracePeriod"<*> (fmap toThyme <$> o .: "requestExpiryPeriod")<*> o.:? "paymentRequestEmailTemplate"<*> o.:? "paymentRequestMemoTemplate"p ver o = badVersion "Billable" ver o - replacement in server/Aftok/Snaplet/Billing.hs at line 53
uid <- requireUserIdpid <- requireProjectIduid <- requireUserIdpid <- requireProjectId - replacement in server/Aftok/Snaplet/Billing.hs at line 56
b <- either (snapError 400 . show) pure$ parseEither (parseCreateBillable uid pid) requestBodyb <-either (snapError 400 . show) pure $parseEither (parseCreateBillable uid pid) requestBody - replacement in server/Aftok/Snaplet/Billing.hs at line 71
t <- liftIO C.getCurrentTimet <- liftIO C.getCurrentTime - edit in server/Aftok/Snaplet/Billing.hs at line 73
- replacement in server/Aftok/Snaplet/Payments.hs at line 4
( listPayableRequestsHandler, getPaymentRequestHandler, paymentResponseHandler( listPayableRequestsHandler,getPaymentRequestHandler,paymentResponseHandler, - edit in server/Aftok/Snaplet/Payments.hs at line 9[4.3505]→[4.9799:9800](∅→∅),[4.49546]→[4.9799:9800](∅→∅),[4.9799]→[4.9799:9800](∅→∅),[4.35902]→[4.5782:5783](∅→∅),[4.9831]→[4.5782:5783](∅→∅),[4.5783]→[4.4941:4942](∅→∅),[4.4942]→[4.49547:49879](∅→∅),[4.49933]→[4.49933:50211](∅→∅),[4.4987]→[4.36052:36053](∅→∅),[4.50211]→[4.36052:36053](∅→∅),[4.36052]→[4.36052:36053](∅→∅),[4.36053]→[4.50212:50445](∅→∅),[4.50445]→[4.14821:14873](∅→∅),[4.14873]→[4.1384:1429](∅→∅),[4.50497]→[4.1384:1429](∅→∅),[4.59578]→[4.1384:1429](∅→∅),[4.3750]→[4.1384:1429](∅→∅),[4.1429]→[4.50498:51235](∅→∅),[4.1663]→[4.9831:9832](∅→∅),[4.3750]→[4.9831:9832](∅→∅),[4.5919]→[4.9831:9832](∅→∅),[4.51235]→[4.9831:9832](∅→∅),[4.9831]→[4.9831:9832](∅→∅),[4.9832]→[4.51236:51463](∅→∅)
import Control.Lens ( view, _1, _2, _Right, _Left, preview, (.~), (^.))import Control.Monad.Trans.Maybe ( mapMaybeT )import Control.Exception ( try )import Data.ProtocolBuffers ( decodeMessage )import Data.Serialize.Get ( runGetLazy )import Data.Thyme.Clock as Cimport qualified Data.Text.Encoding as Timport qualified Bippy.Proto as Pimport Network.HTTP.Client.OpenSSLimport Network.HTTP.Client ( defaultManagerSettings, managerResponseTimeout, responseTimeoutMicro, HttpException)import Network.Wreq ( asValue, responseBody, defaults, manager, getWith)import OpenSSL.Session ( context )import Snap.Core ( readRequestBody, logError)import Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Payments.hs at line 10[4.5963]→[4.51464:51517](∅→∅),[4.51517]→[2.5380:5411](∅→∅),[2.5411]→[4.3851:3883](∅→∅),[4.5996]→[4.3851:3883](∅→∅),[4.3883]→[4.5032:5064](∅→∅),[4.5064]→[4.51518:51581](∅→∅),[4.1595]→[4.9900:9901](∅→∅),[4.6028]→[4.9900:9901](∅→∅),[4.36179]→[4.9900:9901](∅→∅),[4.51581]→[4.9900:9901](∅→∅),[4.9900]→[4.9900:9901](∅→∅),[4.1775]→[4.6029:6096](∅→∅),[4.9901]→[4.6029:6096](∅→∅)
import Aftok.Config as ACimport Aftok.Billingimport Aftok.Databaseimport Aftok.Paymentsimport Aftok.Util ( fromMaybeT )import Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Billingimport Aftok.Config as ACimport Aftok.Databaseimport Aftok.Paymentsimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Util (fromMaybeT)import qualified Bippy.Proto as Pimport Control.Exception (try)import Control.Lens( (.~),(^.),_1,_2,_Left,_Right,preview,view,)import Control.Monad.Trans.Maybe (mapMaybeT)import Data.ProtocolBuffers (decodeMessage)import Data.Serialize.Get (runGetLazy)import qualified Data.Text.Encoding as Timport Data.Thyme.Clock as Cimport Network.HTTP.Client( HttpException,defaultManagerSettings,managerResponseTimeout,responseTimeoutMicro,)import Network.HTTP.Client.OpenSSLimport Network.Wreq( asValue,defaults,getWith,manager,responseBody,)import OpenSSL.Session (context)import Snap.Core( logError,readRequestBody,)import Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Payments.hs at line 69
preq <- getPaymentRequestHandler'pmnt <- either(\msg -> snapError 400 $ "Could not decode payment response: " <> show msg)pure(runGetLazy decodeMessage requestBody)preq <- getPaymentRequestHandler'pmnt <-either(\msg -> snapError 400 $ "Could not decode payment response: " <> show msg)pure(runGetLazy decodeMessage requestBody) - replacement in server/Aftok/Snaplet/Payments.hs at line 76[4.51816]→[4.1883:1884](∅→∅),[4.4331]→[4.1883:1884](∅→∅),[4.1884]→[4.51817:52090](∅→∅),[4.250]→[4.2063:2064](∅→∅),[4.52090]→[4.2063:2064](∅→∅),[4.2063]→[4.2063:2064](∅→∅)
letopts =defaults& manager.~ Left (opensslManagerSettings context)& manager.~ Left(defaultManagerSettings{ managerResponseTimeout = responseTimeoutMicro 10000})let opts =defaults& manager.~ Left (opensslManagerSettings context)& manager.~ Left( defaultManagerSettings{ managerResponseTimeout = responseTimeoutMicro 10000}) - replacement in server/Aftok/Snaplet/Payments.hs at line 88
. try @HttpException$ asValue=<< (withOpenSSL $ getWith opts (cfg ^. exchangeRateServiceURI)). try @HttpException$ asValue=<< (withOpenSSL $ getWith opts (cfg ^. exchangeRateServiceURI)) - replacement in server/Aftok/Snaplet/Payments.hs at line 92
let newPayment = Payment (view _1 preq)pmntnow(preview (_Right . responseBody) exchResp)let newPayment =Payment(view _1 preq)pmntnow(preview (_Right . responseBody) exchResp) - replacement in server/Aftok/Snaplet/Payments.hs at line 100
getPaymentRequestHandler':: S.Handler App App (PaymentRequestId, PaymentRequest)getPaymentRequestHandler' ::S.Handler App App (PaymentRequestId, PaymentRequest) - replacement in server/Aftok/Snaplet/Payments.hs at line 104
pkey <- maybe(snapError 400 $ "parameter paymentRequestKey is formatted incorrectly.")pure(parsePaymentKey pkBytes)pkey <-maybe(snapError 400 $ "parameter paymentRequestKey is formatted incorrectly.")pure(parsePaymentKey pkBytes) - replacement in server/Aftok/Snaplet/Payments.hs at line 110
( snapError 404$ "Outstanding payment request not found for key "<> (view _PaymentKey pkey)( snapError 404 $"Outstanding payment request not found for key "<> (view _PaymentKey pkey) - edit in server/Aftok/Snaplet/Payments.hs at line 115[4.4686]→[4.5392:5393](∅→∅),[4.36521]→[4.5392:5393](∅→∅),[4.17958]→[4.5392:5393](∅→∅),[4.5393]→[4.6833:6835](∅→∅)
- replacement in server/Aftok/Snaplet/Projects.hs at line 5
( projectCreateHandler, projectListHandler, projectGetHandler, projectInviteHandler( projectCreateHandler,projectListHandler,projectGetHandler,projectInviteHandler, - edit in server/Aftok/Snaplet/Projects.hs at line 12
import Aftok.Configimport Aftok.Databaseimport Aftok.Projectimport Aftok.QConfig as QCimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.TimeLog.Serialization (depfFromJSON)import Aftok.Typesimport Aftok.Util (fromMaybeT)import Control.Lensimport Control.Monad.Trans.Maybe (mapMaybeT)import Data.Aeson as Aimport Data.Attoparsec.ByteString (takeByteString)import Data.Thyme.Clock as Cimport Filesystem.Path.CurrentOS (encodeString)import qualified Filesystem.Path.CurrentOS as Fimport Network.Mail.Mimeimport Network.Mail.SMTP as SMTPimport Snap.Coreimport Snap.Snaplet as Simport Text.StringTemplate - replacement in server/Aftok/Snaplet/Projects.hs at line 34[4.2486]→[4.2074:2104](∅→∅),[4.2104]→[4.14875:14937](∅→∅),[4.14937]→[4.52924:53212](∅→∅),[4.52924]→[4.52924:53212](∅→∅),[4.5454]→[4.2263:2298](∅→∅),[4.36708]→[4.2263:2298](∅→∅),[4.53212]→[4.2263:2298](∅→∅),[4.2263]→[4.2263:2298](∅→∅),[4.2298]→[4.53213:53268](∅→∅),[4.53268]→[4.2405:2442](∅→∅),[4.2405]→[4.2405:2442](∅→∅)
import Control.Lensimport Control.Monad.Trans.Maybe ( mapMaybeT )import Data.Aeson as Aimport Data.Attoparsec.ByteString ( takeByteString )import Data.Thyme.Clock as Cimport Filesystem.Path.CurrentOS ( encodeString )import qualified Filesystem.Path.CurrentOS as Fimport Network.Mail.Mimeimport Network.Mail.SMTP as SMTPimport Text.StringTemplatedata ProjectCreateRequest = CP {cpn :: Text, cpdepf :: DepreciationFunction} - edit in server/Aftok/Snaplet/Projects.hs at line 36[4.8817]→[4.34520:34549](∅→∅),[4.34549]→[4.36709:36739](∅→∅),[4.2466]→[4.36709:36739](∅→∅),[4.36739]→[4.2466:2498](∅→∅),[4.2466]→[4.2466:2498](∅→∅),[4.2498]→[4.3897:3928](∅→∅),[4.3928]→[4.53269:53322](∅→∅),[4.36777]→[4.2529:2596](∅→∅),[4.53322]→[4.2529:2596](∅→∅),[4.2529]→[4.2529:2596](∅→∅),[4.2596]→[4.53323:53451](∅→∅),[4.2497]→[4.2650:2651](∅→∅),[4.2596]→[4.2650:2651](∅→∅),[4.36819]→[4.2650:2651](∅→∅),[4.53451]→[4.2650:2651](∅→∅),[4.2650]→[4.2650:2651](∅→∅),[4.2651]→[4.2597:2624](∅→∅),[4.2624]→[4.53452:53504](∅→∅),[4.2654]→[4.2725:2726](∅→∅),[4.18009]→[4.2725:2726](∅→∅),[4.53504]→[4.2725:2726](∅→∅),[4.2725]→[4.2725:2726](∅→∅),[4.2726]→[4.3929:4008](∅→∅),[4.4008]→[4.2791:2792](∅→∅),[4.12066]→[4.2791:2792](∅→∅),[4.2791]→[4.2791:2792](∅→∅)
import Aftok.Typesimport Aftok.Configimport Aftok.Databaseimport Aftok.Projectimport Aftok.QConfig as QCimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.TimeLog.Serialization ( depfFromJSON )import Aftok.Util ( fromMaybeT )import Snap.Coreimport Snap.Snaplet as Sdata ProjectCreateRequest = CP { cpn :: Text, cpdepf :: DepreciationFunction } - replacement in server/Aftok/Snaplet/Projects.hs at line 43
uid <- requireUserIduid <- requireUserId - replacement in server/Aftok/Snaplet/Projects.hs at line 45
cp <- either (snapError 400 . show) pure $ A.eitherDecode requestBodyt <- liftIO C.getCurrentTimecp <- either (snapError 400 . show) pure $ A.eitherDecode requestBodyt <- liftIO C.getCurrentTime - replacement in server/Aftok/Snaplet/Projects.hs at line 58
fromMaybeT (snapError 404 $ "Project not found for id " <> show pid)(mapMaybeT snapEval $ findUserProject uid pid)fromMaybeT(snapError 404 $ "Project not found for id " <> show pid)(mapMaybeT snapEval $ findUserProject uid pid) - replacement in server/Aftok/Snaplet/Projects.hs at line 64
uid <- requireUserIdpid <- requireProjectIduid <- requireUserIdpid <- requireProjectId - replacement in server/Aftok/Snaplet/Projects.hs at line 67
t <- liftIO C.getCurrentTimet <- liftIO C.getCurrentTime - replacement in server/Aftok/Snaplet/Projects.hs at line 69[4.4321]→[4.54038:54051](∅→∅),[4.54038]→[4.54038:54051](∅→∅),[4.54051]→[4.4322:4380](∅→∅),[4.4380]→[4.54145:54279](∅→∅),[4.54145]→[4.54145:54279](∅→∅),[4.54279]→[4.4381:4443](∅→∅),[4.4443]→[4.54330:54414](∅→∅),[4.54330]→[4.54330:54414](∅→∅),[4.54414]→[4.988:989](∅→∅),[4.988]→[4.988:989](∅→∅)
snapEval$ (,)<$> (runMaybeT $ findUserProject uid pid)<*> createInvitation pid uid toEmail tliftIO $ sendProjectInviteEmail cfg(p ^. projectName)(Email "noreply@aftok.com")toEmailinvCodesnapEval $(,)<$> (runMaybeT $ findUserProject uid pid)<*> createInvitation pid uid toEmail tliftIO $sendProjectInviteEmailcfg(p ^. projectName)(Email "noreply@aftok.com")toEmailinvCode - replacement in server/Aftok/Snaplet/Projects.hs at line 81
sendProjectInviteEmail:: QConfig-> ProjectName-> Email -- Inviting user's email address-> Email -- Invitee's email address-> InvitationCode-> IO ()sendProjectInviteEmail ::QConfig ->ProjectName ->Email -> -- Inviting user's email addressEmail -> -- Invitee's email addressInvitationCode ->IO () - replacement in server/Aftok/Snaplet/Projects.hs at line 90
mailer = maybe (sendMailWithLogin _smtpHost)(sendMailWithLogin' _smtpHost)_smtpPortin buildProjectInviteEmail (cfg ^. templatePath) pn fromEmail toEmail invCodemailer =maybe(sendMailWithLogin _smtpHost)(sendMailWithLogin' _smtpHost)_smtpPortin buildProjectInviteEmail (cfg ^. templatePath) pn fromEmail toEmail invCode - replacement in server/Aftok/Snaplet/Projects.hs at line 98[4.1578]→[4.9687:9688](∅→∅),[4.2922]→[4.9687:9688](∅→∅),[4.9687]→[4.9687:9688](∅→∅),[4.9688]→[4.54923:55107](∅→∅)
buildProjectInviteEmail:: F.FilePath-> ProjectName-> Email -- Inviting user's email address-> Email -- Invitee's email address-> InvitationCode-> IO MailbuildProjectInviteEmail ::F.FilePath ->ProjectName ->Email -> -- Inviting user's email addressEmail -> -- Invitee's email addressInvitationCode ->IO Mail - replacement in server/Aftok/Snaplet/Projects.hs at line 111
setAttribute "from_email" (fromEmail ^. _Email). setAttribute "project_name" pn. setAttribute "to_email" (toEmail ^. _Email). setAttribute "inv_code" (renderInvCode invCode)setAttribute "from_email" (fromEmail ^. _Email). setAttribute "project_name" pn. setAttribute "to_email" (toEmail ^. _Email). setAttribute "inv_code" (renderInvCode invCode) - replacement in server/Aftok/Snaplet/Projects.hs at line 116[4.2424]→[4.2424:2481](∅→∅),[4.2481]→[4.55377:55435](∅→∅),[4.55435]→[4.59580:59640](∅→∅),[4.59640]→[4.2604:2676](∅→∅),[4.2604]→[4.2604:2676](∅→∅),[4.2676]→[4.3685:3686](∅→∅),[4.10398]→[4.3685:3686](∅→∅),[4.3685]→[4.3685:3686](∅→∅),[4.3686]→[4.10399:10400](∅→∅)
toAddr = Address Nothing (toEmail ^. _Email)subject = "Welcome to the " <> pn <> " Aftok!"body = plainPart . render $ setAttrs templatein pure $ SMTP.simpleMail fromAddr [toAddr] [] [] subject [body][4.2424]toAddr = Address Nothing (toEmail ^. _Email)subject = "Welcome to the " <> pn <> " Aftok!"body = plainPart . render $ setAttrs templatein pure $ SMTP.simpleMail fromAddr [toAddr] [] [] subject [body] - replacement in server/Aftok/Snaplet/Users.hs at line 1
{-# LANGUAGE OverloadedStrings #-}{-# LANGUAGE OverloadedStrings #-} - replacement in server/Aftok/Snaplet/Users.hs at line 3
{-# LANGUAGE TupleSections #-}{-# LANGUAGE TupleSections #-} - replacement in server/Aftok/Snaplet/Users.hs at line 6[4.8604]→[4.4249:4319](∅→∅),[4.4319]→[4.9796:9856](∅→∅),[4.477]→[4.9796:9856](∅→∅),[4.9856]→[4.4765:4785](∅→∅)
( acceptInvitationHandler, checkZAddrHandler, registerHandler, CaptchaConfig(..), CaptchaError(..), checkCaptcha, RegisterOps(..)( acceptInvitationHandler,checkZAddrHandler,registerHandler,CaptchaConfig (..),CaptchaError (..),checkCaptcha,RegisterOps (..), - replacement in server/Aftok/Snaplet/Users.hs at line 16[4.8636]→[4.3509:3510](∅→∅),[4.3509]→[4.3509:3510](∅→∅),[4.3510]→[4.5631:5632](∅→∅),[4.5632]→[2.5413:5482](∅→∅),[2.5482]→[4.4445:4508](∅→∅),[4.8667]→[4.4445:4508](∅→∅),[4.4508]→[4.9857:9909](∅→∅),[4.8667]→[4.9857:9909](∅→∅),[4.9909]→[4.4509:4620](∅→∅),[4.4620]→[2.5483:5538](∅→∅),[2.5538]→[4.4620:4670](∅→∅),[4.4620]→[4.4620:4670](∅→∅),[4.4670]→[4.55500:55604](∅→∅),[4.9970]→[4.55500:55604](∅→∅),[4.55500]→[4.55500:55604](∅→∅),[4.55604]→[4.9971:10023](∅→∅),[4.10023]→[4.55604:55656](∅→∅),[4.55604]→[4.55604:55656](∅→∅),[4.55656]→[4.34766:34767](∅→∅),[4.8790]→[4.34766:34767](∅→∅),[4.34767]→[4.4671:4970](∅→∅),[4.4970]→[4.10127:10193](∅→∅),[4.10127]→[4.10127:10193](∅→∅),[4.10193]→[4.4971:5196](∅→∅),[4.5196]→[4.10271:10334](∅→∅),[4.10271]→[4.10271:10334](∅→∅),[4.8790]→[4.10431:10432](∅→∅),[4.10334]→[4.10431:10432](∅→∅),[4.15002]→[4.10431:10432](∅→∅),[4.34823]→[4.10431:10432](∅→∅),[4.55722]→[4.10431:10432](∅→∅),[4.59697]→[4.10431:10432](∅→∅),[4.10431]→[4.10431:10432](∅→∅),[4.10432]→[2.5539:5628](∅→∅),[4.4378]→[4.4786:4948](∅→∅),[2.5628]→[4.4786:4948](∅→∅),[4.10432]→[4.4786:4948](∅→∅),[4.5016]→[4.5016:5337](∅→∅),[4.5337]→[4.5289:5290](∅→∅),[4.5289]→[4.5289:5290](∅→∅),[4.4087]→[4.8846:8913](∅→∅),[4.5290]→[4.8846:8913](∅→∅),[4.8846]→[4.8846:8913](∅→∅)
import Control.Lens ( makeLenses, (^.) )import Control.FromSum ( fromMaybeM )import qualified Data.Aeson as Aimport Data.Aeson ( (.:), (.:?), (.=))import qualified Data.Map.Strict as Mimport Data.Text as Timport Data.Text.Encoding as Timport Data.Thyme.Clock as Cimport Network.HTTP.Client ( parseRequest, responseBody, responseStatus, httpLbs)import Network.HTTP.Client.TLS ( newTlsManager )import Network.HTTP.Client.MultipartFormData( formDataBody, partBS)import Network.HTTP.Types.Status ( statusCode )import Aftok.Currency.Zcash ( ZAddr, RPCError, ZValidateAddressErr )import Aftok.Database ( createUser, acceptInvitation )import Aftok.Project ( InvitationCode, parseInvCode )import Aftok.Types ( UserId, User(..), AccountRecovery(..), Email(..), UserName(..), _UserName)import Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Currency.Zcash (RPCError, ZAddr, ZValidateAddressErr)import Aftok.Database (acceptInvitation, createUser)import Aftok.Project (InvitationCode, parseInvCode)import Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Types( AccountRecovery (..),Email (..),User (..),UserId,UserName (..),_UserName,)import Control.FromSum (fromMaybeM)import Control.Lens ((^.), makeLenses)import Data.Aeson( (.:),(.:?),(.=),)import qualified Data.Aeson as Aimport qualified Data.Map.Strict as Mimport Data.Text as Timport Data.Text.Encoding as Timport Data.Thyme.Clock as Cimport Network.HTTP.Client( httpLbs,parseRequest,responseBody,responseStatus,)import Network.HTTP.Client.MultipartFormData( formDataBody,partBS,)import Network.HTTP.Client.TLS (newTlsManager)import Network.HTTP.Types.Status (statusCode)import qualified Snap.Core as Simport qualified Snap.Snaplet as Simport qualified Snap.Snaplet.Auth as AU - replacement in server/Aftok/Snaplet/Users.hs at line 57[4.3651]→[4.5291:5395](∅→∅),[4.5395]→[4.55950:56003](∅→∅),[4.10439]→[4.55950:56003](∅→∅),[4.55950]→[4.55950:56003](∅→∅)
import qualified Snap.Core as Simport qualified Snap.Snaplet as Simport qualified Snap.Snaplet.Auth as AUdata RegisterOps m= RegisterOps{ validateZAddr :: Text -> m (Either (RPCError ZValidateAddressErr) ZAddr),sendConfirmationEmail :: Email -> m ()} - replacement in server/Aftok/Snaplet/Users.hs at line 63
data RegisterOps m = RegisterOps{ validateZAddr :: Text -> m (Either (RPCError ZValidateAddressErr) ZAddr), sendConfirmationEmail :: Email -> m ()}data RegUser= RegUser{ _username :: !UserName,_userAccountRecovery :: !(AccountRecovery Text)} - edit in server/Aftok/Snaplet/Users.hs at line 69
data RegUser = RegUser{ _username :: !UserName, _userAccountRecovery :: !(AccountRecovery Text)} - replacement in server/Aftok/Snaplet/Users.hs at line 71[4.269]→[4.5396:5435](∅→∅),[4.5435]→[4.5480:5512](∅→∅),[4.5464]→[4.9043:9078](∅→∅),[4.5512]→[4.9043:9078](∅→∅),[4.34955]→[4.9043:9078](∅→∅),[4.9043]→[4.9043:9078](∅→∅),[4.9078]→[4.5465:5494](∅→∅),[4.5494]→[4.10433:10474](∅→∅),[4.9078]→[4.10433:10474](∅→∅),[4.345]→[4.10433:10474](∅→∅),[4.10474]→[4.345:349](∅→∅),[4.345]→[4.345:349](∅→∅)
data RegisterRequest = RegisterRequest{ _regUser :: RegUser, _password :: ByteString, _captchaToken :: Text, _invitationCodes :: [InvitationCode]}data RegisterRequest= RegisterRequest{ _regUser :: RegUser,_password :: ByteString,_captchaToken :: Text,_invitationCodes :: [InvitationCode]} - replacement in server/Aftok/Snaplet/Users.hs at line 86
"zaddr" -> RecoverByZAddr <$> v .: "recoveryZAddr""zaddr" -> RecoverByZAddr <$> v .: "recoveryZAddr" - replacement in server/Aftok/Snaplet/Users.hs at line 88[4.5823]→[4.5571:5664](∅→∅),[4.5664]→[4.10651:10652](∅→∅),[4.5910]→[4.10651:10652](∅→∅),[4.10540]→[4.10651:10652](∅→∅),[4.56168]→[4.10651:10652](∅→∅),[4.10651]→[4.10651:10652](∅→∅)
user <- RegUser <$> (UserName <$> v .: "username")<*> pure recoveryuser <-RegUser <$> (UserName <$> v .: "username")<*> pure recovery - edit in server/Aftok/Snaplet/Users.hs at line 95[3.269]→[4.10820:10821](∅→∅),[4.5801]→[4.10820:10821](∅→∅),[4.56316]→[4.10820:10821](∅→∅),[4.10820]→[4.10820:10821](∅→∅)
- replacement in server/Aftok/Snaplet/Users.hs at line 96
parseInvitationCodes c = either(\e -> fail $ "Invitation code was rejected as invalid: " <> e)pure(traverse parseInvCode c)parseInvitationCodes c =either(\e -> fail $ "Invitation code was rejected as invalid: " <> e)pure(traverse parseInvCode c) - replacement in server/Aftok/Snaplet/Users.hs at line 110
RegParseError msg -> A.object[ "parseError" .= msg ]RegCaptchaError e -> A.object[ "captchaError" .= (show e :: Text) ]RegZAddrError zerr -> A.object[ "zaddrError" .= (show zerr :: Text) ]RegParseError msg ->A.object["parseError" .= msg]RegCaptchaError e ->A.object["captchaError" .= (show e :: Text)]RegZAddrError zerr ->A.object["zaddrError" .= (show zerr :: Text)] - replacement in server/Aftok/Snaplet/Users.hs at line 123
zaddrBytes <- maybe (snapError 400 "zaddr parameter is required")pure(listToMaybe =<< M.lookup "zaddr" params)zaddrBytes <-maybe(snapError 400 "zaddr parameter is required")pure(listToMaybe =<< M.lookup "zaddr" params) - replacement in server/Aftok/Snaplet/Users.hs at line 130
Left _ ->Left _ -> - edit in server/Aftok/Snaplet/Users.hs at line 134
- replacement in server/Aftok/Snaplet/Users.hs at line 137
rbody <- S.readRequestBody 4096rbody <- S.readRequestBody 4096 - edit in server/Aftok/Snaplet/Users.hs at line 139
- edit in server/Aftok/Snaplet/Users.hs at line 145
- replacement in server/Aftok/Snaplet/Users.hs at line 152
Left err ->Left err -> - edit in server/Aftok/Snaplet/Users.hs at line 157
- replacement in server/Aftok/Snaplet/Users.hs at line 158[4.6499]→[4.56546:56552](∅→∅),[4.6636]→[4.56546:56552](∅→∅),[4.59777]→[4.56546:56552](∅→∅),[4.56546]→[4.56546:56552](∅→∅),[4.56552]→[4.6500:6621](∅→∅),[4.6621]→[4.56684:56716](∅→∅),[4.56684]→[4.56684:56716](∅→∅),[4.56716]→[4.6622:6675](∅→∅),[4.6675]→[4.6684:6784](∅→∅),[4.6684]→[4.6684:6784](∅→∅)
letuname = userData ^. (regUser . username)createSUser = AU.createUser (uname ^. _UserName) (userData ^. password)createQUser = snapEval $ douserId <- createUser $ User uname acctRecoveryvoid $ traverse (acceptInvitation userId now) (userData ^. invitationCodes)pure userIdlet uname = userData ^. (regUser . username)createSUser = AU.createUser (uname ^. _UserName) (userData ^. password)createQUser = snapEval $ douserId <- createUser $ User uname acctRecoveryvoid $ traverse (acceptInvitation userId now) (userData ^. invitationCodes)pure userId - edit in server/Aftok/Snaplet/Users.hs at line 166
- replacement in server/Aftok/Snaplet/Users.hs at line 169[4.660]→[4.56910:56938](∅→∅),[4.56938]→[4.6785:6823](∅→∅),[4.6823]→[4.10596:10622](∅→∅),[4.56976]→[4.10596:10622](∅→∅),[4.10622]→[4.57000:57068](∅→∅),[4.57000]→[4.57000:57068](∅→∅),[4.57068]→[4.10623:10691](∅→∅),[4.10691]→[4.57134:57182](∅→∅),[4.57134]→[4.57134:57182](∅→∅)
uid <- requireUserIdnow <- liftIO C.getCurrentTimeparams <- S.getParamsinvCodes <- maybe (snapError 400 "invCode parameter is required")(pure . traverse (parseInvCode . T.decodeUtf8))(M.lookup "invCode" params)uid <- requireUserIdnow <- liftIO C.getCurrentTimeparams <- S.getParamsinvCodes <-maybe(snapError 400 "invCode parameter is required")(pure . traverse (parseInvCode . T.decodeUtf8))(M.lookup "invCode" params) - replacement in server/Aftok/Snaplet/Users.hs at line 178
(\e ->snapError 400 $ "Invitation code was rejected as invalid: " <> T.pack e( \e ->snapError 400 $ "Invitation code was rejected as invalid: " <> T.pack e - edit in server/Aftok/Snaplet/Users.hs at line 183
- replacement in server/Aftok/Snaplet/Users.hs at line 196
data CaptchaConfig = CaptchaConfig{ secretKey :: Text }data CaptchaConfig= CaptchaConfig{secretKey :: Text} - replacement in server/Aftok/Snaplet/Users.hs at line 200
data CaptchaResponse = CaptchaResponse{ success :: Bool, errorCodes :: [CaptchaError]}data CaptchaResponse= CaptchaResponse{ success :: Bool,errorCodes :: [CaptchaError]} - replacement in server/Aftok/Snaplet/Users.hs at line 210
.: "success".: "success" - replacement in server/Aftok/Snaplet/Users.hs at line 212
wheretoError = \case"missing-input-secret" -> MissingInputSecret"invalid-input-secret" -> InvalidInputSecret"missing-input-response" -> MissingInputResponse"invalid-input-response" -> InvalidInputResponse"bad-request" -> BadRequest"timeout-or-duplicate" -> TimeoutOrDuplicateother -> CaptchaError $ "Unexpected error code: " <> otherwheretoError = \case"missing-input-secret" -> MissingInputSecret"invalid-input-secret" -> InvalidInputSecret"missing-input-response" -> MissingInputResponse"invalid-input-response" -> InvalidInputResponse"bad-request" -> BadRequest"timeout-or-duplicate" -> TimeoutOrDuplicateother -> CaptchaError $ "Unexpected error code: " <> other - replacement in server/Aftok/Snaplet/Users.hs at line 225
request <- parseRequest "https://www.google.com/recaptcha/api/siteverify"reqWithBody <- formDataBody[ partBS "secret" (T.encodeUtf8 $ secretKey cfg), partBS "response" (T.encodeUtf8 token)]requestmanager <- newTlsManagerrequest <- parseRequest "https://www.google.com/recaptcha/api/siteverify"reqWithBody <-formDataBody[ partBS "secret" (T.encodeUtf8 $ secretKey cfg),partBS "response" (T.encodeUtf8 token)]requestmanager <- newTlsManager - replacement in server/Aftok/Snaplet/Users.hs at line 240
Left$ [CaptchaError $ "Unexpected status code: " <> T.pack (show errCode)][4.12433]Left $[CaptchaError $ "Unexpected status code: " <> T.pack (show errCode)] - replacement in server/Aftok/Snaplet/Util.hs at line 3[4.4267]→[4.15004:15176](∅→∅),[4.8504]→[4.5709:5710](∅→∅),[4.15176]→[4.5709:5710](∅→∅),[4.4267]→[4.5709:5710](∅→∅),[4.5710]→[4.57280:57384](∅→∅),[4.57384]→[4.9495:9563](∅→∅),[4.9495]→[4.9495:9563](∅→∅)
import Data.Attoparsec.ByteString ( parseOnly )import Data.Attoparsec.ByteString.Char8( decimal )import Data.ByteString.Char8 as Bimport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.Time.ISO8601import Data.Attoparsec.ByteString (parseOnly)import Data.Attoparsec.ByteString.Char8( decimal,)import Data.ByteString.Char8 as Bimport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.Time.ISO8601import Snap.Core - edit in server/Aftok/Snaplet/Util.hs at line 13
import Snap.Core - replacement in server/Aftok/Snaplet/Util.hs at line 16
t <- MaybeT . pure . parseISO8601 $ B.unpack bst <- MaybeT . pure . parseISO8601 $ B.unpack bs - replacement in server/Aftok/Snaplet/WorkLog.hs at line 1[4.5424]→[4.5304:5340](∅→∅),[4.5340]→[4.2746:2781](∅→∅),[4.5424]→[4.2746:2781](∅→∅),[4.2781]→[4.5521:5522](∅→∅),[4.3286]→[4.5521:5522](∅→∅),[4.5521]→[4.5521:5522](∅→∅),[4.9624]→[4.5544:5545](∅→∅),[4.5544]→[4.5544:5545](∅→∅),[4.5545]→[4.5712:5713](∅→∅),[4.5713]→[4.15178:15235](∅→∅),[4.62]→[4.57438:57500](∅→∅),[4.15235]→[4.57438:57500](∅→∅),[4.9655]→[4.57438:57500](∅→∅),[4.57500]→[4.37362:37363](∅→∅),[4.37362]→[4.37362:37363](∅→∅),[4.37363]→[4.57501:57553](∅→∅),[4.57553]→[4.15236:15293](∅→∅),[4.118]→[4.311005:311057](∅→∅),[4.15293]→[4.311005:311057](∅→∅),[4.57553]→[4.311005:311057](∅→∅),[4.311057]→[4.57554:57710](∅→∅),[4.9730]→[4.57554:57710](∅→∅),[4.57710]→[4.15294:15352](∅→∅),[4.15352]→[4.59829:59890](∅→∅),[4.59829]→[4.59829:59890](∅→∅),[4.59890]→[4.57831:57881](∅→∅),[4.57831]→[4.57831:57881](∅→∅),[4.3024]→[4.5641:5642](∅→∅),[4.4322]→[4.5641:5642](∅→∅),[4.9812]→[4.5641:5642](∅→∅),[4.35269]→[4.5641:5642](∅→∅),[4.57881]→[4.5641:5642](∅→∅),[4.5641]→[4.5641:5642](∅→∅),[4.5642]→[4.57882:57946](∅→∅),[4.57946]→[4.119:181](∅→∅),[4.181]→[4.57946:58056](∅→∅),[4.57946]→[4.57946:58056](∅→∅),[4.1102]→[4.9836:9928](∅→∅),[4.2230]→[4.9836:9928](∅→∅),[4.35337]→[4.9836:9928](∅→∅),[4.58056]→[4.9836:9928](∅→∅),[4.9836]→[4.9836:9928](∅→∅),[4.9928]→[4.4089:4120](∅→∅),[4.4120]→[4.9928:9959](∅→∅),[4.9928]→[4.9928:9959](∅→∅),[4.9959]→[4.15353:15522](∅→∅),[4.268]→[4.58122:58185](∅→∅),[4.15522]→[4.58122:58185](∅→∅),[4.59963]→[4.58122:58185](∅→∅),[4.58122]→[4.58122:58185](∅→∅)
{-# LANGUAGE TupleSections #-}module Aftok.Snaplet.WorkLog whereimport Control.Lens ( (^.) )import Control.Monad.Trans.Maybe ( mapMaybeT )import qualified Data.Aeson as Aimport Data.Aeson ( (.=) )import qualified Data.Aeson.Types as Aimport qualified Data.Text as Timport Data.Thyme.Clock as Cimport Data.UUID as Uimport Haskoin.Address ( Address, textToAddr)import Aftok.Currency.Bitcoin ( NetworkId(..), NetworkMode, toNetwork)import Aftok.Databaseimport Aftok.Intervalimport Aftok.Jsonimport Aftok.Projectimport Aftok.TimeLogimport Aftok.Types ( _ProjectId, _UserId)import Aftok.Util ( fromMaybeT ){-# LANGUAGE TupleSections #-} - replacement in server/Aftok/Snaplet/WorkLog.hs at line 3
import Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Snaplet.Utilmodule Aftok.Snaplet.WorkLog where - replacement in server/Aftok/Snaplet/WorkLog.hs at line 5
import Snap.Coreimport Snap.Snaplet as Simport Aftok.Currency.Bitcoin( NetworkId (..),NetworkMode,toNetwork,)import Aftok.Databaseimport Aftok.Intervalimport Aftok.Jsonimport Aftok.Projectimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Snaplet.Utilimport Aftok.TimeLogimport Aftok.Types( _ProjectId,_UserId,)import Aftok.Util (fromMaybeT)import Control.Lens ((^.))import Control.Monad.Trans.Maybe (mapMaybeT)import Data.Aeson ((.=))import qualified Data.Aeson as Aimport qualified Data.Aeson.Types as Aimport qualified Data.Text as Timport Data.Thyme.Clock as Cimport Data.UUID as Uimport Haskoin.Address( Address,textToAddr,)import Snap.Coreimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/WorkLog.hs at line 38
logWorkHandler:: (C.UTCTime -> LogEvent)-> S.Handler App App (EventId, KeyedLogEntry BTCNet)logWorkHandler ::(C.UTCTime -> LogEvent) ->S.Handler App App (EventId, KeyedLogEntry BTCNet) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 42
uid <- requireUserIdpid <- requireProjectIdnmode <- getNetworkModeuid <- requireUserIdpid <- requireProjectIdnmode <- getNetworkMode - replacement in server/Aftok/Snaplet/WorkLog.hs at line 46[4.283]→[4.58337:58385](∅→∅),[4.58385]→[4.15623:15714](∅→∅),[4.15714]→[4.58466:58555](∅→∅),[4.311141]→[4.58466:58555](∅→∅),[4.58466]→[4.58466:58555](∅→∅)
timestamp <- liftIO C.getCurrentTimecaseA.eitherDecode requestBody>>= A.parseEither (parseLogEntry nmode uid evCtr)ofLeft err ->snapError 400$ "Unable to parse log entry "timestamp <- liftIO C.getCurrentTimecase A.eitherDecode requestBody>>= A.parseEither (parseLogEntry nmode uid evCtr) ofLeft err ->snapError 400 $"Unable to parse log entry " - replacement in server/Aftok/Snaplet/WorkLog.hs at line 55[4.58627]→[4.5437:5579](∅→∅),[4.5579]→[4.15715:15854](∅→∅),[4.15854]→[4.5695:5708](∅→∅),[4.5695]→[4.5695:5708](∅→∅)
Right entry -> doeid <- snapEval $ createEvent pid uid (entry timestamp)ev <- snapEval $ findEvent eidmaybe( snapError 500$ "An error occured retrieving the newly created event record.")(pure . (eid, ))evRight entry -> doeid <- snapEval $ createEvent pid uid (entry timestamp)ev <- snapEval $ findEvent eidmaybe( snapError 500 $"An error occured retrieving the newly created event record.")(pure . (eid,))ev - replacement in server/Aftok/Snaplet/WorkLog.hs at line 67
uid <- requireUserIdpid <- requireProjectIduid <- requireUserIdpid <- requireProjectId - replacement in server/Aftok/Snaplet/WorkLog.hs at line 71
addrBytes <- getParam "btcAddr"addrBytes <- getParam "btcAddr" - replacement in server/Aftok/Snaplet/WorkLog.hs at line 73
timestamp <- liftIO C.getCurrentTimetimestamp <- liftIO C.getCurrentTime - replacement in server/Aftok/Snaplet/WorkLog.hs at line 76
snapError 400$ "Unable to parse bitcoin address from "<> (show addrBytes)Just addr -> snapEval . createEvent pid uid $ LogEntry(CreditToCurrency (BTC, addr))(evCtr timestamp)(A.decode requestBody)snapError 400 $"Unable to parse bitcoin address from "<> (show addrBytes)Just addr ->snapEval . createEvent pid uid $LogEntry(CreditToCurrency (BTC, addr))(evCtr timestamp)(A.decode requestBody) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 94
uid <- requireUserIdpid <- requireProjectIduid <- requireUserIdpid <- requireProjectId - replacement in server/Aftok/Snaplet/WorkLog.hs at line 98
(Just s , Just e ) -> During s e(Nothing, Just e ) -> Before e(Just s , Nothing) -> After s(Just s, Just e) -> During s e(Nothing, Just e) -> Before e(Just s, Nothing) -> After s - replacement in server/Aftok/Snaplet/WorkLog.hs at line 110[4.10203]→[4.59426:59483](∅→∅),[4.59483]→[4.37406:37430](∅→∅),[4.13074]→[4.37406:37430](∅→∅),[4.37430]→[4.5933:5995](∅→∅),[4.5995]→[4.37493:37544](∅→∅),[4.37493]→[4.37493:37544](∅→∅),[4.37544]→[4.59484:59528](∅→∅)
uid <- requireUserIdpid <- requireProjectIdproject <- fromMaybeT(snapError 400 $ "Project not found for id " <> show pid)(mapMaybeT snapEval $ findUserProject uid pid)widx <- snapEval $ readWorkIndex pid uiduid <- requireUserIdpid <- requireProjectIdproject <-fromMaybeT(snapError 400 $ "Project not found for id " <> show pid)(mapMaybeT snapEval $ findUserProject uid pid)widx <- snapEval $ readWorkIndex pid uid - replacement in server/Aftok/Snaplet/WorkLog.hs at line 122
uid <- requireUserIdnmode <- getNetworkModeuid <- requireUserIdnmode <- getNetworkMode - replacement in server/Aftok/Snaplet/WorkLog.hs at line 125
eventId <- maybe (snapError 400 "eventId parameter is required")(pure . EventId)(eventIdBytes >>= U.fromASCIIBytes)modTime <- ModTime <$> liftIO C.getCurrentTimeeventId <-maybe(snapError 400 "eventId parameter is required")(pure . EventId)(eventIdBytes >>= U.fromASCIIBytes)modTime <- ModTime <$> liftIO C.getCurrentTime - replacement in server/Aftok/Snaplet/WorkLog.hs at line 132
either (snapError 400 . T.pack)(snapEval . amendEvent uid eventId)(A.parseEither (parseEventAmendment nmode modTime) requestJSON)either(snapError 400 . T.pack)(snapEval . amendEvent uid eventId)(A.parseEither (parseEventAmendment nmode modTime) requestJSON) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 137
keyedLogEntryJSON:: NetworkMode -> (EventId, KeyedLogEntry (NetworkId, Address)) -> A.ValuekeyedLogEntryJSON ::NetworkMode -> (EventId, KeyedLogEntry (NetworkId, Address)) -> A.Value - replacement in server/Aftok/Snaplet/WorkLog.hs at line 141
. obj$ [ "eventId" .= idValue _EventId eid, "projectId" .= idValue _ProjectId pid, "loggedBy" .= idValue _UserId uid]<> logEntryFields nmode ev[4.16094]. obj$ [ "eventId" .= idValue _EventId eid,"projectId" .= idValue _ProjectId pid,"loggedBy" .= idValue _UserId uid]<> logEntryFields nmode ev - replacement in server/Aftok/Snaplet.hs at line 2
{-# LANGUAGE TemplateHaskell #-}{-# LANGUAGE TemplateHaskell #-} - replacement in server/Aftok/Snaplet.hs at line 6[4.10458]→[4.1214:1215](∅→∅),[4.1214]→[4.1214:1215](∅→∅),[4.1215]→[4.6027:6028](∅→∅),[4.6028]→[4.10459:10489](∅→∅),[4.1215]→[4.10459:10489](∅→∅),[4.37606]→[4.10608:10660](∅→∅),[4.60037]→[4.10608:10660](∅→∅),[4.10608]→[4.10608:10660](∅→∅),[4.10660]→[4.60038:60270](∅→∅),[4.60270]→[2.6654:6727](∅→∅),[2.6727]→[4.1324:1325](∅→∅),[4.6996]→[4.1324:1325](∅→∅),[4.10727]→[4.1324:1325](∅→∅),[4.11434]→[4.1324:1325](∅→∅),[4.1324]→[4.1324:1325](∅→∅),[4.1325]→[4.60271:60405](∅→∅),[4.60405]→[2.6728:7012](∅→∅),[2.7012]→[4.60406:60581](∅→∅),[4.10826]→[4.60406:60581](∅→∅),[4.7126]→[4.10826:10854](∅→∅),[4.36384]→[4.10826:10854](∅→∅),[4.60581]→[4.10826:10854](∅→∅),[4.10826]→[4.10826:10854](∅→∅),[4.3093]→[4.1432:1433](∅→∅),[4.10854]→[4.1432:1433](∅→∅),[4.13497]→[4.1432:1433](∅→∅),[4.1432]→[4.1432:1433](∅→∅),[4.1433]→[2.7013:7748](∅→∅),[2.7748]→[4.18755:18807](∅→∅),[4.10882]→[4.18755:18807](∅→∅),[4.18807]→[4.10912:10965](∅→∅),[4.10912]→[4.10912:10965](∅→∅),[4.10965]→[2.7749:8120](∅→∅)
import Control.Lensimport qualified Data.Aeson as Aimport Data.Attoparsec.ByteString ( Parser, parseOnly, takeByteString)import Data.UUID ( UUID, fromASCIIBytes )import Aftok.Auction ( AuctionId(..) )import Aftok.Currency.Bitcoin ( NetworkMode(..) )import Aftok.Database ( DBError(..), DBOp, liftdb)import Aftok.Database.PostgreSQL ( runQDBM )import Aftok.Types ( UserId(..), ProjectId(..))import Aftok.Utilimport Snap.Core ( MonadSnap, getParam, readRequestBody, setResponseCode, modifyResponse, finishWith, getResponse, writeText, writeLBS, setResponseStatus, logError)import Snap.Snaplet as Simport qualified Snap.Snaplet.Auth as AUimport Snap.Snaplet.PostgresqlSimple ( Postgres, HasPostgres(..), setLocalPostgresState, liftPG)import Snap.Snaplet.Session ( SessionManager )import Aftok.Auction (AuctionId (..))import Aftok.Currency.Bitcoin (NetworkMode (..))import Aftok.Database( DBError (..),DBOp,liftdb,)import Aftok.Database.PostgreSQL (runQDBM)import Aftok.Types( ProjectId (..),UserId (..),)import Aftok.Utilimport Control.Lensimport qualified Data.Aeson as Aimport Data.Attoparsec.ByteString( Parser,parseOnly,takeByteString,)import Data.UUID (UUID, fromASCIIBytes)import Snap.Core( MonadSnap,finishWith,getParam,getResponse,logError,modifyResponse,readRequestBody,setResponseCode,setResponseStatus,writeLBS,writeText,)import Snap.Snaplet as Simport qualified Snap.Snaplet.Auth as AUimport Snap.Snaplet.PostgresqlSimple( HasPostgres (..),Postgres,liftPG,setLocalPostgresState,)import Snap.Snaplet.Session (SessionManager) - edit in server/Aftok/Snaplet.hs at line 50
data App= App{ _networkMode :: NetworkMode,_sess :: Snaplet SessionManager,_db :: Snaplet Postgres,_auth :: Snaplet (AU.AuthManager App)} - edit in server/Aftok/Snaplet.hs at line 58[2.8122]→[4.11051:11066](∅→∅),[4.1689]→[4.11051:11066](∅→∅),[4.11066]→[4.36385:36453](∅→∅),[4.13534]→[4.1770:1846](∅→∅),[4.36453]→[4.1770:1846](∅→∅),[4.1770]→[4.1770:1846](∅→∅)
data App = App{ _networkMode :: NetworkMode, _sess :: Snaplet SessionManager, _db :: Snaplet Postgres, _auth :: Snaplet (AU.AuthManager App)} - replacement in server/Aftok/Snaplet.hs at line 70
snapEval:: (MonadSnap m, HasPostgres m, HasNetworkMode m) => Program DBOp a -> m asnapEval ::(MonadSnap m, HasPostgres m, HasNetworkMode m) => Program DBOp a -> m a - replacement in server/Aftok/Snaplet.hs at line 75
handleDBError (SubjectNotFound) = snapError404"The subject of the requested operation could not be found."handleDBError (SubjectNotFound) =snapError404"The subject of the requested operation could not be found." - edit in server/Aftok/Snaplet.hs at line 81
- replacement in server/Aftok/Snaplet.hs at line 82
e <- liftPG$ \conn -> liftIO $ runExceptT (runQDBM nmode conn $ interpret liftdb p)e <- liftPG $\conn -> liftIO $ runExceptT (runQDBM nmode conn $ interpret liftdb p) - edit in server/Aftok/Snaplet.hs at line 102
- replacement in server/Aftok/Snaplet.hs at line 110
maybe (snapError 400 $ "Parameter " <> show name <> " is required")puremaybeBytesmaybe(snapError 400 $ "Parameter " <> show name <> " is required")puremaybeBytes - replacement in server/Aftok/Snaplet.hs at line 115
parseParam:: MonadSnap m=> Text -- ^ the name of the parameter to be parsed-> Parser a -- ^ parser for the value of the parameter-> m a -- ^ the parsed valueparseParam ::MonadSnap m =>-- | the name of the parameter to be parsedText ->-- | parser for the value of the parameterParser a ->-- | the parsed valuem a - replacement in server/Aftok/Snaplet.hs at line 126
( const. snapError 400$ "Value of parameter "<> show name<> " could not be parsed to a valid value."( const. snapError 400$ "Value of parameter "<> show name<> " could not be parsed to a valid value." - replacement in server/Aftok/Snaplet.hs at line 135
requireId:: MonadSnap m=> Text -- ^ name of the parameter-> (UUID -> a) -- ^ constructor for the identifier-> m arequireId ::MonadSnap m =>-- | name of the parameterText ->-- | constructor for the identifier(UUID -> a) ->m a - replacement in server/Aftok/Snaplet.hs at line 145
(snapError 400 $ "Value of parameter \"" <> name <> "\" is not a valid UUID"( snapError 400 $ "Value of parameter \"" <> name <> "\" is not a valid UUID" - replacement in server/Aftok/Snaplet.hs at line 149
whereidParser = dobs <- takeByteStringpure $ f <$> fromASCIIBytes bswhereidParser = dobs <- takeByteStringpure $ f <$> fromASCIIBytes bs - edit in server/Aftok/Snaplet.hs at line 167
- replacement in server/Main.hs at line 5[4.1461]→[4.61762:62333](∅→∅),[4.62333]→[4.6680:6776](∅→∅),[4.6776]→[4.11294:11330](∅→∅),[4.8139]→[4.11294:11330](∅→∅),[4.37846]→[4.11294:11330](∅→∅),[4.62333]→[4.11294:11330](∅→∅),[4.11294]→[4.11294:11330](∅→∅),[4.11330]→[4.62334:62394](∅→∅),[4.626]→[4.918:919](∅→∅),[4.1661]→[4.918:919](∅→∅),[4.6443]→[4.918:919](∅→∅),[4.7624]→[4.918:919](∅→∅),[4.7747]→[4.918:919](∅→∅),[4.11330]→[4.918:919](∅→∅),[4.62394]→[4.918:919](∅→∅),[4.256]→[4.918:919](∅→∅),[4.919]→[4.6777:6846](∅→∅),[4.6846]→[4.11331:11390](∅→∅),[4.919]→[4.11331:11390](∅→∅),[4.648]→[4.942:943](∅→∅),[4.1188]→[4.942:943](∅→∅),[4.3134]→[4.942:943](∅→∅),[4.6917]→[4.942:943](∅→∅),[4.11390]→[4.942:943](∅→∅),[4.2567]→[4.942:943](∅→∅),[4.943]→[4.62395:62499](∅→∅),[4.36849]→[4.11422:11453](∅→∅),[4.62499]→[4.11422:11453](∅→∅),[4.11422]→[4.11422:11453](∅→∅),[4.11489]→[4.4122:4162](∅→∅),[4.4162]→[4.37847:37886](∅→∅),[4.37886]→[4.2232:2268](∅→∅),[4.4162]→[4.2232:2268](∅→∅),[4.2268]→[4.8140:8180](∅→∅),[4.2268]→[4.11489:11605](∅→∅),[4.4162]→[4.11489:11605](∅→∅),[4.8180]→[4.11489:11605](∅→∅),[4.11489]→[4.11489:11605](∅→∅)
import Control.Lens ( (^.), to)import Control.Exception ( try )import qualified Data.Aeson as Aimport Data.ProtocolBuffers ( encodeMessage )import Data.Serialize.Put ( runPutLazy )import Filesystem.Path.CurrentOS ( decodeString, encodeString)import Network.HTTP.Client ( Manager, newManager, defaultManagerSettings )import System.Environmentimport System.IO.Error ( IOError )import Aftok.Currency.Zcash ( rpcValidateZAddr )import Aftok.Jsonimport Aftok.TimeLogimport qualified Aftok.Config as Cimport Aftok.QConfig as Qimport Aftok.Snapletimport Aftok.Snaplet.Auctionsimport Aftok.Snaplet.Billingimport Aftok.Snaplet.Authimport Aftok.Snaplet.Paymentsimport Aftok.Snaplet.Projectsimport Aftok.Snaplet.Usersimport Aftok.Snaplet.WorkLogimport qualified Aftok.Config as Cimport Aftok.Currency.Zcash (rpcValidateZAddr)import Aftok.Jsonimport Aftok.QConfig as Qimport Aftok.Snapletimport Aftok.Snaplet.Auctionsimport Aftok.Snaplet.Authimport Aftok.Snaplet.Billingimport Aftok.Snaplet.Paymentsimport Aftok.Snaplet.Projectsimport Aftok.Snaplet.Usersimport Aftok.Snaplet.WorkLogimport Aftok.TimeLogimport Control.Exception (try)import Control.Lens( (^.),to,)import qualified Data.Aeson as Aimport Data.ProtocolBuffers (encodeMessage)import Data.Serialize.Put (runPutLazy)import Filesystem.Path.CurrentOS( decodeString,encodeString,)import Network.HTTP.Client (Manager, defaultManagerSettings, newManager)import Snap.Coreimport Snap.Snapletimport qualified Snap.Snaplet.Auth as AUimport Snap.Snaplet.Auth.Backends.PostgresqlSimpleimport Snap.Snaplet.PostgresqlSimpleimport Snap.Snaplet.Session.Backends.CookieSessionimport Snap.Util.FileServe (serveDirectory)import System.Environmentimport System.IO.Error (IOError) - edit in server/Main.hs at line 41[4.783]→[4.11606:11663](∅→∅),[4.11663]→[4.16280:16333](∅→∅),[4.11379]→[4.11724:11771](∅→∅),[4.16333]→[4.11724:11771](∅→∅),[4.11724]→[4.11724:11771](∅→∅),[4.11771]→[4.2179:2240](∅→∅),[4.2240]→[4.11771:11832](∅→∅),[4.11771]→[4.11771:11832](∅→∅),[4.11832]→[4.62500:62567](∅→∅),[4.2285]→[4.314:315](∅→∅),[4.8170]→[4.314:315](∅→∅),[4.11832]→[4.314:315](∅→∅),[4.62567]→[4.314:315](∅→∅),[4.314]→[4.314:315](∅→∅)
import Snap.Coreimport Snap.Snapletimport qualified Snap.Snaplet.Auth as AUimport Snap.Snaplet.PostgresqlSimpleimport Snap.Snaplet.Auth.Backends.PostgresqlSimpleimport Snap.Snaplet.Session.Backends.CookieSessionimport Snap.Util.FileServe ( serveDirectory ) - replacement in server/Main.hs at line 44
cfg <- loadQConfig . decodeString $ fromRight "conf/aftok.cfg" cfgPathsconf <- snapConfig cfgcfg <- loadQConfig . decodeString $ fromRight "conf/aftok.cfg" cfgPathsconf <- snapConfig cfg - replacement in server/Main.hs at line 49[4.6970]→[4.6970:7004](∅→∅),[4.7004]→[2.8522:8583](∅→∅),[4.5225]→[4.7109:7157](∅→∅),[2.8583]→[4.7109:7157](∅→∅),[4.7109]→[4.7109:7157](∅→∅)
registerOps mgr cfg = RegisterOps{ validateZAddr = rpcValidateZAddr mgr (_zcashdConfig cfg), sendConfirmationEmail = const $ pure ()}registerOps mgr cfg =RegisterOps{ validateZAddr = rpcValidateZAddr mgr (_zcashdConfig cfg),sendConfirmationEmail = const $ pure ()} - replacement in server/Main.hs at line 60
sesss <- nestSnaplet "sessions" sess$ initCookieSessionManagersesss <-nestSnaplet "sessions" sess $initCookieSessionManager - replacement in server/Main.hs at line 67[4.11552]→[4.26670:26731](∅→∅),[4.16487]→[4.26670:26731](∅→∅),[4.62847]→[4.26670:26731](∅→∅),[4.26670]→[4.26670:26731](∅→∅)
pgs <- nestSnaplet "db" db $ pgsInit' (cfg ^. pgsConfig)pgs <- nestSnaplet "db" db $ pgsInit' (cfg ^. pgsConfig) - replacement in server/Main.hs at line 69[4.2064]→[4.2397:2398](∅→∅),[4.12738]→[4.2397:2398](∅→∅),[4.38514]→[4.2397:2398](∅→∅),[4.2397]→[4.2397:2398](∅→∅),[4.2398]→[4.62848:62915](∅→∅),[4.37297]→[4.38517:38518](∅→∅),[4.62915]→[4.38517:38518](∅→∅),[4.2570]→[4.38517:38518](∅→∅),[4.38518]→[4.11553:11620](∅→∅),[4.11620]→[4.311217:311276](∅→∅),[4.62984]→[4.311217:311276](∅→∅),[4.311276]→[4.11621:11732](∅→∅),[4.2644]→[4.12970:12971](∅→∅),[4.38772]→[4.12970:12971](∅→∅),[4.63099]→[4.12970:12971](∅→∅),[4.12970]→[4.12970:12971](∅→∅),[4.12971]→[4.5226:5294](∅→∅),[4.5294]→[4.7246:7337](∅→∅),[4.12971]→[4.7246:7337](∅→∅),[4.7337]→[4.63100:63237](∅→∅),[4.8158]→[4.63100:63237](∅→∅),[4.12576]→[4.63100:63237](∅→∅),[4.12971]→[4.63100:63237](∅→∅),[4.1802]→[4.4230:4231](∅→∅),[4.1914]→[4.4230:4231](∅→∅),[4.2893]→[4.4230:4231](∅→∅),[4.37382]→[4.4230:4231](∅→∅),[4.38941]→[4.4230:4231](∅→∅),[4.63237]→[4.4230:4231](∅→∅),[4.4230]→[4.4230:4231](∅→∅),[4.4231]→[4.63238:63421](∅→∅),[4.2495]→[4.8383:8384](∅→∅),[4.4874]→[4.8383:8384](∅→∅),[4.39213]→[4.8383:8384](∅→∅),[4.63421]→[4.8383:8384](∅→∅),[4.8383]→[4.8383:8384](∅→∅),[4.8384]→[4.16488:16560](∅→∅),[4.16560]→[4.15247:15275](∅→∅),[4.15247]→[4.15247:15275](∅→∅),[4.15275]→[4.4952:5020](∅→∅),[4.5020]→[4.8961:9051](∅→∅),[4.15343]→[4.8961:9051](∅→∅),[4.9051]→[4.2549:2550](∅→∅),[4.15343]→[4.2549:2550](∅→∅),[4.26901]→[4.2549:2550](∅→∅),[4.39532]→[4.2549:2550](∅→∅),[4.63689]→[4.2549:2550](∅→∅),[4.2979]→[4.2549:2550](∅→∅),[4.2570]→[4.5710:5806](∅→∅),[4.5806]→[4.15429:15523](∅→∅),[4.15523]→[4.16561:16640](∅→∅),[4.16640]→[4.5021:5112](∅→∅),[4.15608]→[4.5021:5112](∅→∅),[4.5112]→[4.15706:15796](∅→∅),[4.15706]→[4.15706:15796](∅→∅),[4.15796]→[4.317:318](∅→∅),[4.64011]→[4.317:318](∅→∅),[4.1201]→[4.317:318](∅→∅),[4.318]→[4.64012:64102](∅→∅),[4.64102]→[4.16641:16790](∅→∅),[4.854]→[4.321:322](∅→∅),[4.9213]→[4.321:322](∅→∅),[4.16790]→[4.321:322](∅→∅),[4.39909]→[4.321:322](∅→∅),[4.64251]→[4.321:322](∅→∅),[4.13275]→[4.321:322](∅→∅),[4.322]→[4.64252:64528](∅→∅),[4.64528]→[4.8385:8386](∅→∅),[4.1979]→[4.8385:8386](∅→∅),[4.8386]→[4.64529:64886](∅→∅),[4.1864]→[4.4299:4300](∅→∅),[4.1979]→[4.4299:4300](∅→∅),[4.2440]→[4.4299:4300](∅→∅),[4.4930]→[4.4299:4300](∅→∅),[4.8577]→[4.4299:4300](∅→∅),[4.40062]→[4.4299:4300](∅→∅),[4.64886]→[4.4299:4300](∅→∅),[4.4299]→[4.4299:4300](∅→∅)
letnmode = cfg ^. billingConfig . C.networkModeloginRoute = method GET requireLogin >> redirect "/app"xhrLoginRoute = void $ method POST requireLoginXHRcheckLoginRoute = void $ method GET requireUserlogoutRoute = method GET (with auth AU.logout)checkZAddrRoute = void $ method GET (checkZAddrHandler rops)registerRoute = void $ method POST (registerHandler rops (cfg ^. recaptchaSecret))inviteRoute = void $ method POST (projectInviteHandler cfg)acceptInviteRoute = void $ method POST acceptInvitationHandlerprojectCreateRoute =serveJSON projectIdJSON $ method POST projectCreateHandlerprojectListRoute =serveJSON (fmap qdbProjectJSON) $ method GET projectListHandlerprojectRoute = serveJSON projectJSON $ method GET projectGetHandlerprojectWorkIndexRoute =serveJSON (workIndexJSON nmode) (method GET projectWorkIndex)projectPayoutsRoute =serveJSON (payoutsJSON nmode) $ method GET payoutsHandlerlogWorkRoute f =serveJSON (keyedLogEntryJSON nmode) $ method POST (logWorkHandler f)-- logWorkBTCRoute f =-- serveJSON eventIdJSON $ method POST (logWorkBTCHandler f)amendEventRoute = serveJSON amendmentIdJSON $ method PUT amendEventHandleruserEventsRoute =serveJSON (fmap $ logEntryJSON nmode) $ method GET userEventsuserWorkIndexRoute =serveJSON (workIndexJSON nmode) $ method GET userWorkIndexauctionCreateRoute =serveJSON auctionIdJSON $ method POST auctionCreateHandlerauctionRoute = serveJSON auctionJSON $ method GET auctionGetHandlerauctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandlerbillableCreateRoute =serveJSON billableIdJSON $ method POST billableCreateHandlerbillableListRoute =serveJSON (fmap qdbBillableJSON) $ method GET billableListHandlersubscribeRoute =serveJSON subscriptionIdJSON $ method POST subscribeHandlerpayableRequestsRoute =serveJSON billDetailsJSON $ method GET listPayableRequestsHandlergetPaymentRequestRoute =writeLBS. runPutLazy. encodeMessage=<< method GET getPaymentRequestHandlersubmitPaymentRoute = serveJSON paymentIdJSON$ method POST (paymentResponseHandler $ cfg ^. billingConfig)let nmode = cfg ^. billingConfig . C.networkModeloginRoute = method GET requireLogin >> redirect "/app"xhrLoginRoute = void $ method POST requireLoginXHRcheckLoginRoute = void $ method GET requireUserlogoutRoute = method GET (with auth AU.logout)checkZAddrRoute = void $ method GET (checkZAddrHandler rops)registerRoute = void $ method POST (registerHandler rops (cfg ^. recaptchaSecret))inviteRoute = void $ method POST (projectInviteHandler cfg)acceptInviteRoute = void $ method POST acceptInvitationHandlerprojectCreateRoute =serveJSON projectIdJSON $ method POST projectCreateHandlerprojectListRoute =serveJSON (fmap qdbProjectJSON) $ method GET projectListHandlerprojectRoute = serveJSON projectJSON $ method GET projectGetHandlerprojectWorkIndexRoute =serveJSON (workIndexJSON nmode) (method GET projectWorkIndex)projectPayoutsRoute =serveJSON (payoutsJSON nmode) $ method GET payoutsHandlerlogWorkRoute f =serveJSON (keyedLogEntryJSON nmode) $ method POST (logWorkHandler f)-- logWorkBTCRoute f =-- serveJSON eventIdJSON $ method POST (logWorkBTCHandler f)amendEventRoute = serveJSON amendmentIdJSON $ method PUT amendEventHandleruserEventsRoute =serveJSON (fmap $ logEntryJSON nmode) $ method GET userEventsuserWorkIndexRoute =serveJSON (workIndexJSON nmode) $ method GET userWorkIndexauctionCreateRoute =serveJSON auctionIdJSON $ method POST auctionCreateHandlerauctionRoute = serveJSON auctionJSON $ method GET auctionGetHandlerauctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandlerbillableCreateRoute =serveJSON billableIdJSON $ method POST billableCreateHandlerbillableListRoute =serveJSON (fmap qdbBillableJSON) $ method GET billableListHandlersubscribeRoute =serveJSON subscriptionIdJSON $ method POST subscribeHandlerpayableRequestsRoute =serveJSON billDetailsJSON $ method GET listPayableRequestsHandlergetPaymentRequestRoute =writeLBS. runPutLazy. encodeMessage=<< method GET getPaymentRequestHandlersubmitPaymentRoute =serveJSON paymentIdJSON $method POST (paymentResponseHandler $ cfg ^. billingConfig) - replacement in server/Main.hs at line 117[4.64899]→[4.64899:64972](∅→∅),[4.64972]→[4.16791:16973](∅→∅),[4.16973]→[4.5295:5337](∅→∅),[4.5337]→[4.16973:17035](∅→∅),[4.16973]→[4.16973:17035](∅→∅),[4.17035]→[4.15797:15954](∅→∅),[4.65217]→[4.15797:15954](∅→∅),[4.15954]→[4.17036:17806](∅→∅),[4.16733]→[4.66061:66436](∅→∅),[4.17806]→[4.66061:66436](∅→∅),[4.66061]→[4.66061:66436](∅→∅)
[ ("static", serveDirectory . encodeString $ cfg ^. staticAssetPath), ("login" , loginRoute), ("login" , xhrLoginRoute), ("logout" , logoutRoute), ("login/check", checkLoginRoute), ("register" , registerRoute), ("validate_zaddr", checkZAddrRoute), ( "accept_invitation", acceptInviteRoute)-- , ("projects/:projectId/logStart/:btcAddr" , logWorkBTCRoute StartWork)-- , ("projects/:projectId/logEnd/:btcAddr" , logWorkBTCRoute StopWork), ("user/projects/:projectId/logStart" , logWorkRoute StartWork), ("user/projects/:projectId/logEnd" , logWorkRoute StopWork), ("user/projects/:projectId/events" , userEventsRoute), ("user/projects/:projectId/workIndex", userWorkIndexRoute), ("projects/:projectId/workIndex" , projectWorkIndexRoute), ( "projects/:projectId/auctions", auctionCreateRoute) -- <|> auctionListRoute), ( "projects/:projectId/billables", billableCreateRoute <|> billableListRoute), ("projects/:projectId/payouts", projectPayoutsRoute), ("projects/:projectId/invite" , inviteRoute), ("projects/:projectId" , projectRoute), ("projects" , projectCreateRoute <|> projectListRoute), ("auctions/:auctionId" , auctionRoute), ("auctions/:auctionId/bid" , auctionBidRoute), ("subscribe/:billableId" , subscribeRoute), ("subscriptions/:subscriptionId/payment_requests", payableRequestsRoute), ("pay/:paymentRequestKey", getPaymentRequestRoute <|> submitPaymentRoute), ("events/:eventId/amend" , amendEventRoute)[ ("static", serveDirectory . encodeString $ cfg ^. staticAssetPath),("login", loginRoute),("login", xhrLoginRoute),("logout", logoutRoute),("login/check", checkLoginRoute),("register", registerRoute),("validate_zaddr", checkZAddrRoute),( "accept_invitation",acceptInviteRoute),-- , ("projects/:projectId/logStart/:btcAddr" , logWorkBTCRoute StartWork)-- , ("projects/:projectId/logEnd/:btcAddr" , logWorkBTCRoute StopWork)("user/projects/:projectId/logStart", logWorkRoute StartWork),("user/projects/:projectId/logEnd", logWorkRoute StopWork),("user/projects/:projectId/events", userEventsRoute),("user/projects/:projectId/workIndex", userWorkIndexRoute),("projects/:projectId/workIndex", projectWorkIndexRoute),( "projects/:projectId/auctions",auctionCreateRoute), -- <|> auctionListRoute)( "projects/:projectId/billables",billableCreateRoute <|> billableListRoute),("projects/:projectId/payouts", projectPayoutsRoute),("projects/:projectId/invite", inviteRoute),("projects/:projectId", projectRoute),("projects", projectCreateRoute <|> projectListRoute),("auctions/:auctionId", auctionRoute),("auctions/:auctionId/bid", auctionBidRoute),("subscribe/:billableId", subscribeRoute),("subscriptions/:subscriptionId/payment_requests", payableRequestsRoute),("pay/:paymentRequestKey", getPaymentRequestRoute <|> submitPaymentRoute),("events/:eventId/amend", amendEventRoute) - edit in shell.nix at line 23
haskellPackages.brittany - replacement in test/Aftok/AuctionSpec.hs at line 2
( main, spec( main,spec, - replacement in test/Aftok/AuctionSpec.hs at line 7[4.277]→[4.542:543](∅→∅),[4.543]→[4.6495:6496](∅→∅),[4.6496]→[4.543:573](∅→∅),[4.543]→[4.543:573](∅→∅),[4.573]→[4.277:309](∅→∅),[4.277]→[4.277:309](∅→∅),[4.309]→[4.17841:17898](∅→∅),[4.58]→[4.66500:66552](∅→∅),[4.17898]→[4.66500:66552](∅→∅),[4.309]→[4.66500:66552](∅→∅),[4.66552]→[4.17899:17951](∅→∅),[4.112]→[4.66553:66610](∅→∅),[4.17951]→[4.66553:66610](∅→∅),[4.336]→[4.66553:66610](∅→∅)
import Control.Lensimport Data.Hourglassimport Data.List ( (!!) )import Data.Thyme.Clock ( )import qualified Data.UUID.V4 as Uimport Text.Read ( read )import Aftok.Auctionimport Aftok.Generatorsimport Aftok.Typesimport Bippy.Test.Types (arbitrarySatoshi)import Bippy.Types (Satoshi (..))import Control.Lensimport Data.Hourglassimport Data.List ((!!))import Data.Thyme.Clock ()import qualified Data.UUID.V4 as Uimport Haskoin.Constants (btc)import Test.HUnit.Base (assertFailure)import Test.Hspecimport Test.QuickCheckimport Text.Read (read) - edit in test/Aftok/AuctionSpec.hs at line 23[4.64073]→[4.64073:64129](∅→∅),[4.64129]→[4.204:205](∅→∅),[4.66610]→[4.204:205](∅→∅),[4.784]→[4.204:205](∅→∅),[4.205]→[4.64130:64263](∅→∅),[4.64263]→[4.228:323](∅→∅),[4.228]→[4.228:323](∅→∅),[4.323]→[4.336:365](∅→∅),[4.650]→[4.336:365](∅→∅),[4.784]→[4.336:365](∅→∅),[4.336]→[4.336:365](∅→∅),[4.365]→[4.66611:66677](∅→∅),[4.66677]→[4.835:868](∅→∅),[4.835]→[4.835:868](∅→∅),[4.965]→[4.965:966](∅→∅)
import Haskoin.Constants ( btc )import Bippy.Types ( Satoshi(..) )import Bippy.Test.Types ( arbitrarySatoshi )import Aftok.Auctionimport Aftok.Generatorsimport Aftok.Typesimport Test.Hspecimport Test.HUnit.Base ( assertFailure )import Test.QuickCheck - replacement in test/Aftok/AuctionSpec.hs at line 26
<$> (UserId <$> genUUID)<*> (Seconds <$> arbitrary `suchThat` (>= 0))<*> arbitrarySatoshi btc<$> (UserId <$> genUUID)<*> (Seconds <$> arbitrary `suchThat` (>= 0))<*> arbitrarySatoshi btc - replacement in test/Aftok/AuctionSpec.hs at line 30
<*> arbitrary<*> arbitrary - replacement in test/Aftok/AuctionSpec.hs at line 38
let testB0 = Bid (users !! 0)(Seconds 3)(Satoshi 100)(read "2016-03-05 15:59:20.000000 UTC")testB1 = Bid (users !! 1)(Seconds 60)(Satoshi 1000)(read "2016-03-05 15:59:21.000000 UTC")testB2 = Bid (users !! 2)(Seconds 60)(Satoshi 100)(read "2016-03-05 15:59:22.000000 UTC")testB3 = Bid (users !! 3)(Seconds 90)(Satoshi 100)(read "2016-03-05 15:59:23.000000 UTC")testB4 = Bid (users !! 4)(Seconds 60)(Satoshi 100)(read "2016-03-05 15:59:24.000000 UTC")let testB0 =Bid(users !! 0)(Seconds 3)(Satoshi 100)(read "2016-03-05 15:59:20.000000 UTC")testB1 =Bid(users !! 1)(Seconds 60)(Satoshi 1000)(read "2016-03-05 15:59:21.000000 UTC")testB2 =Bid(users !! 2)(Seconds 60)(Satoshi 100)(read "2016-03-05 15:59:22.000000 UTC")testB3 =Bid(users !! 3)(Seconds 90)(Satoshi 100)(read "2016-03-05 15:59:23.000000 UTC")testB4 =Bid(users !! 4)(Seconds 60)(Satoshi 100)(read "2016-03-05 15:59:24.000000 UTC") - edit in test/Aftok/AuctionSpec.hs at line 73
- edit in test/Aftok/AuctionSpec.hs at line 75[4.1303]→[4.290:291](∅→∅),[4.1463]→[4.290:291](∅→∅),[4.67992]→[4.290:291](∅→∅),[4.839]→[4.290:291](∅→∅)
- replacement in test/Aftok/AuctionSpec.hs at line 76[4.1335]→[4.17952:18031](∅→∅),[4.18031]→[4.1422:1434](∅→∅),[4.1422]→[4.1422:1434](∅→∅),[4.1434]→[4.18032:18051](∅→∅)
it "determines a sufficient number of winners to fulfill the raise amount"$ letresult =it "determines a sufficient number of winners to fulfill the raise amount" $let result = - replacement in test/Aftok/AuctionSpec.hs at line 82
incase result ofin case result of - edit in test/Aftok/AuctionSpec.hs at line 84[4.1843]→[4.1605:1606](∅→∅),[4.18211]→[4.1605:1606](∅→∅),[4.68584]→[4.1605:1606](∅→∅),[4.1605]→[4.1605:1606](∅→∅)
- edit in test/Aftok/AuctionSpec.hs at line 87[4.428]→[4.839:840](∅→∅),[4.1742]→[4.839:840](∅→∅),[4.1852]→[4.839:840](∅→∅),[4.1999]→[4.839:840](∅→∅),[4.68752]→[4.839:840](∅→∅),[4.839]→[4.839:840](∅→∅)
- replacement in test/Aftok/AuctionSpec.hs at line 90
WinningBids xs -> bidsTotal xs == raiseAmount'InsufficientBids t -> t == (raiseAmount' `subs` bidsTotal bids)WinningBids xs -> bidsTotal xs == raiseAmount'InsufficientBids t -> t == (raiseAmount' `subs` bidsTotal bids) - edit in test/Aftok/Generators.hs at line 2[4.429]→[4.429:430](∅→∅),[4.461]→[4.461:462](∅→∅),[4.462]→[4.6498:6499](∅→∅),[4.6499]→[4.462:489](∅→∅),[4.462]→[4.462:489](∅→∅)
import Data.UUID - replacement in test/Aftok/Generators.hs at line 3
import Test.QuickCheckimport Data.UUIDimport Test.QuickCheck - edit in test/Aftok/Generators.hs at line 8
- replacement in test/Aftok/PaymentsSpec.hs at line 4
( main, spec( main,spec, - edit in test/Aftok/PaymentsSpec.hs at line 9
import Test.Hspec - edit in test/Aftok/PaymentsSpec.hs at line 11
import Test.Hspec - replacement in test/Aftok/PaymentsSpec.hs at line 15
--it "returns the billing date in the presence of an expired payment request" $-- forAll ((,) <$> genSatoshi <*> listOf genBid) $-- \(raiseAmount', bids) ->-- case runAuction' raiseAmount' bids of-- WinningBids xs -> bidsTotal xs == raiseAmount'-- InsufficientBids t -> t == (raiseAmount' - bidsTotal bids)--it "returns the billing date in the presence of an expired payment request" $-- forAll ((,) <$> genSatoshi <*> listOf genBid) $-- \(raiseAmount', bids) ->-- case runAuction' raiseAmount' bids of-- WinningBids xs -> bidsTotal xs == raiseAmount'-- InsufficientBids t -> t == (raiseAmount' - bidsTotal bids) - edit in test/Aftok/PaymentsSpec.hs at line 25
- replacement in test/Aftok/TimeLogSpec.hs at line 1
{-# LANGUAGE OverloadedStrings #-}{-# LANGUAGE OverloadedStrings #-} - replacement in test/Aftok/TimeLogSpec.hs at line 6
( main, spec( main,spec, - replacement in test/Aftok/TimeLogSpec.hs at line 11
import qualified Aftok.Interval as Iimport Aftok.TimeLogimport Control.Lens ((^.))import Data.AffineSpaceimport qualified Data.List.NonEmpty as Limport qualified Data.Map.Strict as Mimport Data.Thyme.Time as Timport Data.Time.ISO8601import Haskoin.Address (Address)import Haskoin.Util.Arbitrary.Address (arbitraryAddress)import Test.Hspecimport Test.QuickCheck - edit in test/Aftok/TimeLogSpec.hs at line 24[4.2657]→[4.69477:69534](∅→∅),[4.69534]→[4.12210:12244](∅→∅),[4.12210]→[4.12210:12244](∅→∅),[4.12244]→[4.69535:69691](∅→∅),[4.69691]→[4.12367:12402](∅→∅),[4.12367]→[4.12367:12402](∅→∅),[4.12402]→[4.18213:18273](∅→∅),[4.12402]→[4.1860:1861](∅→∅),[4.18273]→[4.1860:1861](∅→∅),[4.64591]→[4.1860:1861](∅→∅),[4.1860]→[4.1860:1861](∅→∅),[4.1861]→[4.64592:64644](∅→∅),[4.64644]→[4.12467:12498](∅→∅),[4.69744]→[4.12467:12498](∅→∅),[4.12467]→[4.12467:12498](∅→∅),[4.1887]→[4.269:270](∅→∅),[4.3615]→[4.269:270](∅→∅),[4.5683]→[4.269:270](∅→∅),[4.12498]→[4.269:270](∅→∅),[4.269]→[4.269:270](∅→∅),[4.270]→[4.12499:12560](∅→∅),[4.12560]→[4.18274:18343](∅→∅),[4.357]→[4.2088:2089](∅→∅),[4.1962]→[4.2088:2089](∅→∅),[4.2188]→[4.2088:2089](∅→∅),[4.3491]→[4.2088:2089](∅→∅),[4.18343]→[4.2088:2089](∅→∅),[4.64712]→[4.2088:2089](∅→∅),[4.2088]→[4.2088:2089](∅→∅)
import Control.Lens ( (^.) )import Data.AffineSpaceimport qualified Data.List.NonEmpty as Limport qualified Data.Map.Strict as Mimport Data.Thyme.Time as Timport Data.Time.ISO8601import Haskoin.Address ( Address )import qualified Aftok.Interval as Iimport Aftok.TimeLogimport Test.Hspecimport Test.QuickCheckimport Haskoin.Util.Arbitrary.Address ( arbitraryAddress ) - replacement in test/Aftok/TimeLogSpec.hs at line 33[4.69822]→[4.69822:69918](∅→∅),[4.2530]→[4.3532:3533](∅→∅),[4.69918]→[4.3532:3533](∅→∅),[4.3532]→[4.3532:3533](∅→∅)
fmap T.fromSeconds<$> ((listOf $ choose (0, 72 * 60 * 60)) :: Gen [Int])fmap T.fromSeconds<$> ((listOf $ choose (0, 72 * 60 * 60)) :: Gen [Int]) - replacement in test/Aftok/TimeLogSpec.hs at line 36
buildIntervals t (d : s : dx) | d > 0 =buildIntervals t (d : s : dx)| d > 0 = - replacement in test/Aftok/TimeLogSpec.hs at line 39
in ival : buildIntervals (ival ^. I.end .+^ s) dxin ival : buildIntervals (ival ^. I.end .+^ s) dx - replacement in test/Aftok/TimeLogSpec.hs at line 41
in doin do - replacement in test/Aftok/TimeLogSpec.hs at line 50
addr <- arbitraryAddressaddr <- arbitraryAddress - replacement in test/Aftok/TimeLogSpec.hs at line 53
in WorkIndex . M.fromList <$> listOf recordGenin WorkIndex . M.fromList <$> listOf recordGen - replacement in test/Aftok/TimeLogSpec.hs at line 60[4.65287]→[4.65287:65328](∅→∅),[4.82]→[4.2466:2516](∅→∅),[4.12834]→[4.2466:2516](∅→∅),[4.65328]→[4.2466:2516](∅→∅),[4.2466]→[4.2466:2516](∅→∅),[4.2516]→[4.70451:70515](∅→∅),[4.761]→[4.4253:4254](∅→∅),[4.1368]→[4.4253:4254](∅→∅),[4.2568]→[4.4253:4254](∅→∅),[4.3807]→[4.4253:4254](∅→∅),[4.70515]→[4.4253:4254](∅→∅),[4.4253]→[4.4253:4254](∅→∅),[4.4254]→[4.70516:70555](∅→∅),[4.12876]→[4.4127:4177](∅→∅),[4.70555]→[4.4127:4177](∅→∅),[4.125]→[4.4127:4177](∅→∅),[4.4177]→[4.70556:70620](∅→∅),[4.151]→[4.417:418](∅→∅),[4.772]→[4.417:418](∅→∅),[4.1126]→[4.417:418](∅→∅),[4.1421]→[4.417:418](∅→∅),[4.2789]→[4.417:418](∅→∅),[4.2973]→[4.417:418](∅→∅),[4.3212]→[4.417:418](∅→∅),[4.3949]→[4.417:418](∅→∅),[4.70620]→[4.417:418](∅→∅),[4.4526]→[4.417:418](∅→∅)
let starts = toThyme <$> catMaybes[ parseISO8601 "2014-01-01T00:08:00Z", parseISO8601 "2014-01-01T00:12:00Z"]ends = toThyme <$> catMaybes[ parseISO8601 "2014-01-01T00:11:59Z", parseISO8601 "2014-01-01T00:18:00Z"]let starts =toThyme<$> catMaybes[ parseISO8601 "2014-01-01T00:08:00Z",parseISO8601 "2014-01-01T00:12:00Z"]ends =toThyme<$> catMaybes[ parseISO8601 "2014-01-01T00:11:59Z",parseISO8601 "2014-01-01T00:18:00Z"] - replacement in test/Aftok/TimeLogSpec.hs at line 74
addr <- testAddrsaddr <- testAddrs - edit in test/Aftok/TimeLogSpec.hs at line 77[4.286]→[4.1452:1453](∅→∅),[4.1854]→[4.1452:1453](∅→∅),[4.65503]→[4.1452:1453](∅→∅),[4.3173]→[4.1452:1453](∅→∅)
- edit in test/Aftok/TimeLogSpec.hs at line 81[4.485]→[4.3173:3174](∅→∅),[4.1751]→[4.3173:3174](∅→∅),[4.4256]→[4.3173:3174](∅→∅),[4.3173]→[4.3173:3174](∅→∅)
- replacement in test/Aftok/TimeLogSpec.hs at line 82
expected = WorkIndex $ fmap (L.reverse . L.sort) expected'expected = WorkIndex $ fmap (L.reverse . L.sort) expected' - edit in test/Aftok/TimeLogSpec.hs at line 84[4.631]→[4.2824:2825](∅→∅),[4.1332]→[4.2824:2825](∅→∅),[4.1935]→[4.2824:2825](∅→∅),[4.3322]→[4.2824:2825](∅→∅),[4.3330]→[4.2824:2825](∅→∅),[4.65667]→[4.2824:2825](∅→∅),[4.70730]→[4.2824:2825](∅→∅),[4.493]→[4.2824:2825](∅→∅)
- replacement in test/Aftok/TimeLogSpec.hs at line 87
letmergeAdjacent ((I.Interval s e) : (I.Interval s' e') : xs)let mergeAdjacent ((I.Interval s e) : (I.Interval s' e') : xs) - replacement in test/Aftok/TimeLogSpec.hs at line 90
mergeAdjacent [] = []mergeAdjacent [] = [] - edit in test/Aftok/TimeLogSpec.hs at line 95[4.183]→[4.4635:4636](∅→∅),[4.601]→[4.4635:4636](∅→∅),[4.1625]→[4.4635:4636](∅→∅),[4.2239]→[4.4635:4636](∅→∅),[4.3085]→[4.4635:4636](∅→∅),[4.3656]→[4.4635:4636](∅→∅),[4.4029]→[4.4635:4636](∅→∅),[4.4505]→[4.4635:4636](∅→∅),[4.71187]→[4.4635:4636](∅→∅),[4.4635]→[4.4635:4636](∅→∅)
- replacement in test/Aftok/TimeLogSpec.hs at line 96
widx' = fmap(L.fromList . mergeAdjacent . sortOn I._start . L.toList)widxwidx' =fmap(L.fromList . mergeAdjacent . sortOn I._start . L.toList)widx - replacement in test/Aftok/TimeLogSpec.hs at line 101
inworkIndex logEntriesin workIndex logEntries - replacement in test/Aftok/Util/HttpSpec.hs at line 1
{-# LANGUAGE OverloadedStrings #-}{-# LANGUAGE OverloadedStrings #-} - edit in test/Aftok/Util/HttpSpec.hs at line 5[4.3704]→[4.5045:5046](∅→∅),[4.5045]→[4.5045:5046](∅→∅),[4.5046]→[4.6508:6509](∅→∅),[4.6509]→[4.5067:5068](∅→∅),[4.13050]→[4.5067:5068](∅→∅),[4.5067]→[4.5067:5068](∅→∅),[4.5068]→[4.13051:13128](∅→∅)
import Aftok.Util.Httpimport Data.Attoparsec.ByteString - replacement in test/Aftok/Util/HttpSpec.hs at line 6
import Test.Hspecimport Aftok.Util.Httpimport Data.Attoparsec.ByteStringimport Test.Hspec - edit in test/Aftok/Util/HttpSpec.hs at line 15
- edit in test/Aftok/Util/HttpSpec.hs at line 20