Autoformat sources.
[?]
Sep 12, 2020, 12:59 AM
UWMGUJOW5X5HQTS76T2FD7MNAJF7SESPQVU5FDIZO52V75TT2X6ACDependencies
- [2]
ZKFETYRKPrint network information in address parse failure message. - [3]
7OTVLW6GProperly ignore redundant interval starts. - [4]
DJATFGICSupport client builds in nix-shell --pure. - [5]
YWNTVA7PFix broken auction test. - [6]
Y3LIJ5USAdd handler for CreatePaymentRequest - [7]
TLQ72DSJLenses, sqlite-simple - [8]
4FDQGIXNMake payment request retrieval key an opaque 32-bit hash. - [9]
POX3UAMTEnabling logging of time to contributor/project accounts - [10]
4R7XIYK3Switch from ClassyPrelude to Relude - [11]
EFSXYZPOAutoformat everything with brittany. - [12]
QMEYU4MWAdd display for prior intervals. - [13]
KNSI575VCleanup of EventLog types. - [14]
RSF6UAJKBreak out api module for timeline. - [15]
MGOF7IUFUpdate TASKS list to reflect completed projects. - [16]
LTSVBVA2Update to a recent haskoin-core. Fix Stack build. - [17]
O722AOKEAdd route to allow crediting of events to users/projects. - [18]
Q5X5RYQLstylish-haskell reformatting - [19]
O227CEAVAdds storage of original event JSON for some DBOp constructors. - [20]
GKGVYBZGAdded JSON serialization to TimeLog - [21]
SLL7262CMake depreciation functions more flexible. - [22]
UILI6PILThe route-based logStart/logStop is nicer. - [23]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [24]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [25]
A6HKMINBAttempting to improve JSON handling. - [26]
SEWTRB6SImplement payment request creation functions. - [27]
Z24SZOGZReturn richer information from event logging calls. - [28]
EW2XN7KUUpdate docker build, clean up migration for payments tables. - [29]
2J37EVJMCheck for an open interval on project switch. - [30]
EMVTF2IWWIP moving back to snap. - [31]
RN7EI6INUpdate database layer to use CreditTo - [32]
2KZPOGRBOnce you get Haskell to compile, the tests pass! - [33]
W35DDBFYFactor common JSON conversions up into client lib module. - [34]
NEDDHXUKReformat via stylish-haskell - [35]
ASF3UPJLAdd auction creation and bid handlers - [36]
GMYPBCWEMake docker-compose work. - [37]
NLZ3JXLOFix formatting with stylish-haskell. - [38]
AWWC6P5ZAdd migration to include payment network with addresses. - [39]
3GBSDS5PFix out-of-date test code, add skeleton for payments spec. - [40]
GLFF5ZDKFactor winningBids for easier testing. - [41]
LAROLAYUWIP - [42]
NAS4BFL4Trivial stylish-haskell reformat. - [43]
JFOEOFGAstylish-haskell formatting. - [44]
XTBSG4C7Adding serveJSON combinator to eliminate some boilerplate from handlers. - [45]
NMWWP4ZNTrying out Hspec - [46]
DFOBMSAOInitial work on payments API - [47]
PBD7LZYQPostgres & auth are beginning to function. - [48]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [49]
NJNMO72SAdd zcash.com submodule and update client to modern halogen. - [50]
UUR6SMCAAdd start of specs for auctions. - [51]
J6S23MDGUse server timestamps for interval start and end. - [52]
RSEB2NFGReplacing Snap with Scotty. - [53]
SCXG6TJWMake log reduction safer in presence of overlapping events. - [54]
LHJ2HFXVAdd property test for auction algorithm. - [55]
B6HWAPDPModularize & update to recent haskoin. - [56]
AL37SVTCImplement payments service endpoints. - [57]
P6NR2CGXBeginning of implementation of depreciation. - [58]
5DRIWGLUImproving TimeLog specs - [59]
5OI44E4EAdd authentication to auction search. - [60]
2OIPAQCBMerge branch 'master' of github.com:nuttycom/ananke - [61]
ZIG57EE6Fix project selection, end log end on project switch. - [62]
HO2PFRABClient login now handles response correctly. - [63]
BROSTG5KBeginning of modularization of server. - [64]
QADKFHARAdds CreatePayment handler implementation. - [65]
Z7KS5XHHVery WIP. Wow. - [66]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [67]
FXJQACESEnsure that auction is not ended at the time of bid - [68]
PT4276XCAdd logout functionality. - [69]
WZFQDWW4Add retrieval/storage of current exchange rate data to payment recording. - [70]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [71]
I2KHGVD4Require project permissions for access to most data. - [72]
HMDM3B55Implement core of payments/billing infrastructure. - [73]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [74]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [75]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [76]
BSIUHCGFAdd payment response handler. - [77]
7DBNV3GVInitial, stack-based impl of time log event reduction. - [78]
NVOCQVASInitial failing tests. - [79]
IPG33FAWAdd billing daemon - [80]
4QX5E5ACInitial compilation of payouts function succeeds. - [81]
N4NDAZYTInitial implementation of payouts. - [82]
EQXRXRZDChanged to use tasty instead of test-framework - [83]
IZEVQF62Work in progress replacing sqlite with postgres. - [84]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [85]
HALRDT2FAdded initial auction create route. - [86]
HBULCDN6Add tests for auction winner determination algorithm. - [87]
7HPY3QPFFix linting errors. (yay hlint!) - [88]
73NDXDEZBegin implementation of billing event persistence. - [*]
ADMKQQGCInitial empty Snap project. - [*]
RFYEVKZQAdd nix-shell based build environment.
Change contents
- replacement in daemon/AftokD/AftokM.hs at line 19[6.645]→[6.57477:57539](∅→∅),[6.57539]→[6.890:1001](∅→∅),[6.890]→[6.890:1001](∅→∅),[6.1063]→[6.1063:1113](∅→∅)
import Control.Monad.Trans.Except ( withExceptT)import Control.Monad.Trans.Reader ( mapReaderT)import Control.Monad.Trans.Except ( withExceptT )import Control.Monad.Trans.Reader ( mapReaderT ) - replacement in daemon/AftokD/AftokM.hs at line 35
import Haskoin.Address ( Address )import Haskoin.Address ( Address ) - replacement in daemon/AftokD/AftokM.hs at line 44
import Bippy.Types ( Satoshi )import Bippy.Types ( Satoshi ) - replacement in lib/Aftok/Auction.hs at line 19
import Bippy.Types ( Satoshi(..) )import Bippy.Types ( Satoshi(..) ) - replacement in lib/Aftok/Billables.hs at line 95[6.645]→[6.725:728](∅→∅),[6.728]→[6.649:708](∅→∅),[6.649]→[6.649:708](∅→∅),[6.708]→[6.729:786](∅→∅),[6.786]→[6.766:787](∅→∅),[6.766]→[6.766:787](∅→∅)
{-- A stream of dates upon which the specified subscription- should be billed, beginning with the first day of the- subscription.-}-- | A stream of dates upon which the specified subscription-- should be billed, beginning with the first day of the-- subscription. - replacement in lib/Aftok/Billables.hs at line 100
let rec = view (billable . recurrence) ssubEndDay = preview (endTime . _Just . C._utctDay) sunfoldr next (Just $ view (startTime . C._utctDay) s)whererec = view (billable . recurrence) ssubEndDay = preview (endTime . _Just . C._utctDay) s - replacement in lib/Aftok/Billables.hs at line 105
next :: Maybe T.Day -> Maybe (T.Day, Maybe T.Day)next d = dod' <- dif (all (d' <) subEndDay) then Just (d', nextRecurrence rec d') else Nothingnext :: Maybe T.Day -> Maybe (T.Day, Maybe T.Day)next d = dod' <- dif (all (d' <) subEndDay) then Just (d', nextRecurrence rec d') else Nothing - edit in lib/Aftok/Billables.hs at line 110
in unfoldr next (Just $ view (startTime . C._utctDay) s) - replacement in lib/Aftok/Config.hs at line 21
import qualified Bippy.Types as BTimport qualified Bippy.Types as BT - replacement in lib/Aftok/Currency/Bitcoin.hs at line 10
import Bippy.Types ( Satoshi(..) )import Bippy.Types ( Satoshi(..) ) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 57
import Bippy.Types ( Satoshi(..) )import Haskoin.Address ( Addressimport Bippy.Types ( Satoshi(..) )import Haskoin.Address ( Address - replacement in lib/Aftok/Database/PostgreSQL.hs at line 62
import Haskoin.Constants ( Network )import Haskoin.Constants ( Network ) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 107[6.454]→[6.15891:15958](∅→∅),[6.58363]→[6.15891:15958](∅→∅),[6.7981]→[6.15891:15958](∅→∅),[6.15958]→[2.4:186](∅→∅)
let err = returnError ConversionFailedf("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 152[6.4400]→[6.4400:4408](∅→∅),[6.4408]→[6.16412:16476](∅→∅),[6.16412]→[6.16412:16476](∅→∅),[6.16476]→[6.4409:4775](∅→∅)
whereparser :: Text -> RowParser (CreditTo (NetworkId, Address))parser = \case"credit_to_address" -> CreditToCurrency <$> (addressParser 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 <$> (addressParser 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.hs at line 32
import Haskoin.Address ( Address )import Haskoin.Address ( Address ) - replacement in lib/Aftok/Database.hs at line 42
CreateUser ::BTCUser -> DBOp UserIdFindUser ::UserId -> DBOp (Maybe BTCUser)FindUserByName ::UserName -> DBOp (Maybe (UserId, BTCUser))CreateUser :: BTCUser -> DBOp UserIdFindUser :: UserId -> DBOp (Maybe BTCUser)FindUserByName :: UserName -> DBOp (Maybe (UserId, BTCUser)) - replacement in lib/Aftok/Database.hs at line 46
CreateProject ::Project -> DBOp ProjectIdFindProject ::ProjectId -> DBOp (Maybe Project)ListProjects ::DBOp [ProjectId]FindSubscribers ::ProjectId -> DBOp [UserId]FindUserProjects ::UserId -> DBOp [(ProjectId, Project)]AddUserToProject ::ProjectId -> InvitingUID -> InvitedUID -> DBOp ()CreateInvitation ::ProjectId -> InvitingUID -> Email -> C.UTCTime -> DBOp InvitationCodeFindInvitation ::InvitationCode -> DBOp (Maybe Invitation)AcceptInvitation ::UserId -> InvitationCode -> C.UTCTime -> DBOp ()CreateProject :: Project -> DBOp ProjectIdFindProject :: ProjectId -> DBOp (Maybe Project)ListProjects :: DBOp [ProjectId]FindSubscribers :: ProjectId -> DBOp [UserId]FindUserProjects :: UserId -> DBOp [(ProjectId, Project)]AddUserToProject :: ProjectId -> InvitingUID -> InvitedUID -> DBOp ()CreateInvitation :: ProjectId -> InvitingUID -> Email -> C.UTCTime -> DBOp InvitationCodeFindInvitation :: InvitationCode -> DBOp (Maybe Invitation)AcceptInvitation :: UserId -> InvitationCode -> C.UTCTime -> DBOp () - replacement in lib/Aftok/Database.hs at line 56[6.6535]→[6.27006:27224](∅→∅),[6.27224]→[6.3485:3576](∅→∅),[6.3576]→[6.27304:27362](∅→∅),[6.8231]→[6.27304:27362](∅→∅),[6.27304]→[6.27304:27362](∅→∅)
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)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) - replacement in lib/Aftok/Database.hs at line 62
CreateAuction ::Auction -> DBOp AuctionIdFindAuction ::AuctionId -> DBOp (Maybe Auction)CreateBid ::AuctionId -> Bid -> DBOp BidIdFindBids ::AuctionId -> DBOp [(BidId, Bid)]CreateAuction :: Auction -> DBOp AuctionIdFindAuction :: AuctionId -> DBOp (Maybe Auction)CreateBid :: AuctionId -> Bid -> DBOp BidIdFindBids :: AuctionId -> DBOp [(BidId, Bid)] - replacement in lib/Aftok/Database.hs at line 67
CreateBillable ::UserId -> Billable -> DBOp BillableIdFindBillable ::BillableId -> DBOp (Maybe Billable)FindBillables ::ProjectId -> DBOp [(BillableId, Billable)]CreateBillable :: UserId -> Billable -> DBOp BillableIdFindBillable :: BillableId -> DBOp (Maybe Billable)FindBillables :: ProjectId -> DBOp [(BillableId, Billable)] - replacement in lib/Aftok/Database.hs at line 71
CreateSubscription ::UserId -> BillableId -> T.Day -> DBOp SubscriptionIdFindSubscription ::SubscriptionId -> DBOp (Maybe Subscription)FindSubscriptions ::UserId -> ProjectId -> DBOp [(SubscriptionId, Subscription)]CreateSubscription :: UserId -> BillableId -> T.Day -> DBOp SubscriptionIdFindSubscription :: SubscriptionId -> DBOp (Maybe Subscription)FindSubscriptions :: UserId -> ProjectId -> DBOp [(SubscriptionId, Subscription)] - replacement in lib/Aftok/Database.hs at line 75
CreatePaymentRequest ::PaymentRequest -> DBOp PaymentRequestIdFindPaymentRequests ::SubscriptionId -> DBOp [(PaymentRequestId, PaymentRequest)]FindUnpaidRequests ::SubscriptionId -> DBOp [BillDetail]FindPaymentRequest ::PaymentKey -> DBOp (Maybe (PaymentRequestId, PaymentRequest))FindPaymentRequestId ::PaymentRequestId -> DBOp (Maybe PaymentRequest)CreatePaymentRequest :: PaymentRequest -> DBOp PaymentRequestIdFindPaymentRequests :: SubscriptionId -> DBOp [(PaymentRequestId, PaymentRequest)]FindUnpaidRequests :: SubscriptionId -> DBOp [BillDetail]FindPaymentRequest :: PaymentKey -> DBOp (Maybe (PaymentRequestId, PaymentRequest))FindPaymentRequestId :: PaymentRequestId -> DBOp (Maybe PaymentRequest) - replacement in lib/Aftok/Database.hs at line 81
CreatePayment ::Payment -> DBOp PaymentIdFindPayments ::PaymentRequestId -> DBOp [(PaymentId, Payment)]CreatePayment :: Payment -> DBOp PaymentIdFindPayments :: PaymentRequestId -> DBOp [(PaymentId, Payment)] - replacement in lib/Aftok/Database.hs at line 84
RaiseDBError :: forall x y. DBError -> DBOp x -> DBOp yRaiseDBError :: forall x y. DBError -> DBOp x -> DBOp y - replacement in lib/Aftok/Database.hs at line 220
:: (MonadDB m) => ProjectId -> UserId -> RangeQuery -> Word32 -> m [LogEntry BTCNet]:: (MonadDB m)=> ProjectId-> UserId-> RangeQuery-> Word32-> m [LogEntry BTCNet] - replacement in lib/Aftok/Json.hs at line 36
import Haskoin.Address ( Addressimport Haskoin.Address ( Address - replacement in lib/Aftok/Json.hs at line 136
v1 $ obj[(name <> "Id") .= idValue _id x, name .= (x ^. _value)]v1 $ obj [(name <> "Id") .= idValue _id x, name .= (x ^. _value)] - replacement in lib/Aftok/Json.hs at line 264
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 311
qdbBillableJSON = qdbJSON "billable" (_1 . B._BillableId) (_2 . to billableJSON)qdbBillableJSON =qdbJSON "billable" (_1 . B._BillableId) (_2 . to billableJSON) - replacement in lib/Aftok/Payments/Types.hs at line 22
import qualified Bippy.Proto as Pimport Bippy.Types ( expiryTimeimport qualified Bippy.Proto as Pimport Bippy.Types ( expiryTime - replacement in lib/Aftok/Payments/Types.hs at line 28
import Haskoin.Address.Base58 ( decodeBase58Check )import Haskoin.Address.Base58 ( decodeBase58Check ) - replacement in lib/Aftok/Payments.hs at line 8
) where)where - replacement in lib/Aftok/Payments.hs at line 13
import Control.Error.Util (maybeT)import Control.Lens (makeClassy, makeClassyPrisms, review,view, (%~), (^.), traverseOf)import Control.Error.Util ( maybeT )import Control.Lens ( makeClassy, makeClassyPrisms, review, view, (%~), (^.), traverseOf) - replacement in lib/Aftok/Payments.hs at line 23[6.11713]→[6.2906:2972](∅→∅),[6.28643]→[6.2972:3045](∅→∅),[6.2972]→[6.2972:3045](∅→∅),[6.3045]→[6.2358:2429](∅→∅)
import Control.Monad.Except (MonadError, throwError)import qualified Crypto.PubKey.RSA.Types as RSA (Error (..), PrivateKey)import Crypto.Random.Types (MonadRandom, getRandomBytes)import Control.Monad.Except ( MonadError, throwError)import qualified Crypto.PubKey.RSA.Types as RSA( Error(..), PrivateKey)import Crypto.Random.Types ( MonadRandom, getRandomBytes) - replacement in lib/Aftok/Payments.hs at line 34
import Data.AffineSpace ((.+^))import Data.Map.Strict (assocs)import Data.Thyme.Clock as Cimport Data.Thyme.Time as Timport Data.AffineSpace ( (.+^) )import Data.Map.Strict ( assocs )import Data.Thyme.Clock as Cimport Data.Thyme.Time as T - replacement in lib/Aftok/Payments.hs at line 39
import 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 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(..) ) - replacement in lib/Aftok/Payments.hs at line 47
import Aftok.Types (UserId, ProjectId, userAddress)import Aftok.Types ( UserId, ProjectId, userAddress) - replacement in lib/Aftok/Payments.hs at line 52
import Aftok.Currency.Bitcoin (NetworkId(..), NetworkMode, satoshi, toNetwork)import Aftok.Currency.Bitcoin ( NetworkId(..), NetworkMode, satoshi, toNetwork) - replacement in lib/Aftok/Payments.hs at line 59
import Aftok.Project (depf)import qualified Aftok.TimeLog as TLimport Aftok.Project ( depf )import qualified Aftok.TimeLog as TL - replacement in lib/Aftok/Payments.hs at line 101[6.29955]→[6.8496:8537](∅→∅),[6.12612]→[6.8496:8537](∅→∅),[6.8537]→[6.29956:30020](∅→∅),[6.30020]→[6.8600:8698](∅→∅),[6.8600]→[6.8600:8698](∅→∅),[6.8698]→[6.4110:4137](∅→∅),[6.4137]→[6.8726:9048](∅→∅),[6.8726]→[6.8726:9048](∅→∅),[6.9048]→[6.13259:13305](∅→∅),[6.13259]→[6.13259:13305](∅→∅)
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)=> 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] - replacement in lib/Aftok/Payments.hs at line 118[6.9183]→[6.4224:4261](∅→∅),[6.4261]→[6.9221:9242](∅→∅),[6.9221]→[6.9221:9242](∅→∅),[6.9242]→[6.30021:30065](∅→∅),[6.30065]→[6.9285:9325](∅→∅),[6.9285]→[6.9285:9325](∅→∅)
createSubscriptionPaymentRequests ::( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError ecreateSubscriptionPaymentRequests:: ( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError e - replacement in lib/Aftok/Payments.hs at line 131
billableSub <- maybeT (raiseSubjectNotFound . FindBillable $ sub ^. billable) pure $traverseOf billable findBillable subbillableSub <-maybeT (raiseSubjectNotFound . FindBillable $ sub ^. billable) pure$ traverseOf billable findBillable sub - replacement in lib/Aftok/Payments.hs at line 135
billableDates <- findUnbilledDates now (view billable billableSub) paymentRequests $takeWhile (< view _utctDay now) $ billingSchedule billableSubbillableDates <-findUnbilledDates now (view billable billableSub) paymentRequests$ takeWhile (< view _utctDay now)$ billingSchedule billableSub - replacement in lib/Aftok/Payments.hs at line 141[6.9950]→[6.4288:4312](∅→∅),[6.4312]→[6.9975:9996](∅→∅),[6.9975]→[6.9975:9996](∅→∅),[6.9996]→[6.30121:30165](∅→∅),[6.30165]→[6.10039:10079](∅→∅),[6.10039]→[6.10039:10079](∅→∅)
createPaymentRequest ::( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError ecreatePaymentRequest:: ( MonadRandom m, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError e - replacement in lib/Aftok/Payments.hs at line 156
cfg <- askcfg <- ask - replacement in lib/Aftok/Payments.hs at line 171[6.10845]→[6.10845:11046](∅→∅),[6.11046]→[6.4341:4442](∅→∅),[6.4442]→[6.11148:11373](∅→∅),[6.11148]→[6.11148:11373](∅→∅)
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 now b (px @ (p : ps)) (dx @ (d : ds)) =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 now b (px@(p : ps)) (dx@(d : ds)) = - replacement in lib/Aftok/Payments.hs at line 181
Expired 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 doExpired 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 - replacement in lib/Aftok/Payments.hs at line 194
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)=> C.UTCTime -- ^ the date against which request expiration should be checked-> (PaymentRequestId, PaymentRequest) -- ^ the request for which to find a payment-> m PaymentRequestStatus - replacement in lib/Aftok/Payments.hs at line 207
, MonadReader r m , HasPaymentsConfig r, MonadError e m, AsPaymentError e, MonadReader r m, HasPaymentsConfig r, MonadError e m, AsPaymentError e - replacement in lib/Aftok/Payments.hs at line 223
let expiry = (BT.Expiry . T.fromThyme . (billingTime .+^)) <$> (b ^. requestExpiryPeriod)let expiry =(BT.Expiry . T.fromThyme . (billingTime .+^))<$> (b ^. requestExpiryPeriod) - replacement in lib/Aftok/Payments.hs at line 227[6.14564]→[6.4755:4787](∅→∅),[6.4787]→[6.28355:28396](∅→∅),[6.28396]→[6.4808:4850](∅→∅),[6.4808]→[6.4808:4850](∅→∅),[6.4850]→[6.13534:13562](∅→∅),[6.13534]→[6.13534:13562](∅→∅),[6.13562]→[6.4851:4859](∅→∅),[6.4859]→[6.13571:13627](∅→∅),[6.13571]→[6.13571:13627](∅→∅)
pure $ B.createPaymentDetails(toNetwork (cfg ^. networkMode) BTC)outputs(T.fromThyme billingTime)expiry memo uri payloadwherepayoutTime = T.mkUTCTime payoutDate (fromInteger 0)pure $ B.createPaymentDetails (toNetwork (cfg ^. networkMode) BTC)outputs(T.fromThyme billingTime)expirymemouripayloadwhere payoutTime = T.mkUTCTime payoutDate (fromInteger 0) - edit in lib/Aftok/Payments.hs at line 260
- replacement in lib/Aftok/Payments.hs at line 280
other -> throwError $ review _IllegalAddress otherother -> throwError $ review _IllegalAddress other - replacement in lib/Aftok/Payments.hs at line 290
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 294
join <$> (traverse checkAccess $ filter (not . isExpired now . view _2) requests)wherefindOp = FindUnpaidRequests sidcheckAccess d =if view (_3 . customer) d == uidthen pure [d]else raiseOpForbidden uid (UserNotSubscriber sid) findOp[6.5367]join<$> (traverse checkAccess $ filter (not . isExpired now . view _2) requests)wherefindOp = FindUnpaidRequests sidcheckAccess d = if view (_3 . customer) d == uidthen pure [d]else raiseOpForbidden uid (UserNotSubscriber sid) findOp - replacement in lib/Aftok/TimeLog.hs at line 5[6.4159]→[6.4354:4399](∅→∅),[6.4399]→[6.30637:30720](∅→∅),[6.5248]→[6.4467:4517](∅→∅),[6.30720]→[6.4467:4517](∅→∅),[6.4467]→[6.4467:4517](∅→∅),[6.2069]→[6.2136:2184](∅→∅),[6.4517]→[6.2136:2184](∅→∅),[6.3594]→[6.2136:2184](∅→∅),[6.2184]→[6.9377:9394](∅→∅),[6.9394]→[6.2185:2216](∅→∅),[6.12]→[6.2185:2216](∅→∅),[6.2216]→[6.5553:5584](∅→∅),[6.5553]→[6.5553:5584](∅→∅)
( 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( 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 - replacement in lib/Aftok/TimeLog.hs at line 28
, AmendmentId(AmendmentId), _AmendmentId, Payouts(..), _Payouts, AmendmentId(AmendmentId), _AmendmentId, Payouts(..), _Payouts - replacement in lib/Aftok/TimeLog.hs at line 34
) where)where - replacement in lib/Aftok/TimeLog.hs at line 37
import Control.Arrow ((&&&))import Control.Arrow ( (&&&) ) - replacement in lib/Aftok/TimeLog.hs at line 40
import Data.Aeson as Aimport Data.Aeson as A - replacement in lib/Aftok/TimeLog.hs at line 42[6.4333]→[6.30766:30870](∅→∅),[6.30870]→[6.4333:4374](∅→∅),[6.4333]→[6.4333:4374](∅→∅),[6.4374]→[6.30871:30965](∅→∅),[6.30965]→[6.4374:4456](∅→∅),[6.4374]→[6.4374:4456](∅→∅),[6.4456]→[6.30966:31014](∅→∅),[6.31014]→[6.4456:4498](∅→∅),[6.4456]→[6.4456:4498](∅→∅),[6.4498]→[6.31015:31165](∅→∅),[6.31165]→[6.4537:4578](∅→∅),[6.4537]→[6.4537:4578](∅→∅)
import 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.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 C - replacement in lib/Aftok/TimeLog.hs at line 66
import Prelude ((/), (*))import Text.Show (Show)import Prelude ( (/), (*))import Text.Show ( Show ) - replacement in lib/Aftok/TimeLog.hs at line 136
toDepF (LinearDepreciation undepLength depLength) = linearDepreciation undepLength depLengthtoDepF (LinearDepreciation undepLength depLength) =linearDepreciation undepLength depLength - replacement in lib/Aftok/TimeLog.hs at line 154
addIntervalDiff total ivals = (^+^ total) &&& id $ workCredit dep ptime ivalsaddIntervalDiff total ivals =(^+^ total) &&& id $ workCredit dep ptime ivals - edit in lib/Aftok/TimeLog.hs at line 158
- replacement in lib/Aftok/TimeLog.hs at line 160
workIndex :: (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 164
rawIndex = F.foldl' appendLogEntry MS.empty sortedEntriesrawIndex = F.foldl' appendLogEntry MS.empty sortedEntries - edit in lib/Aftok/TimeLog.hs at line 166
accum:: (CreditTo a)-> [Either LogEvent Interval]-> Map (CreditTo a) (NonEmpty Interval)-> Map (CreditTo a) (NonEmpty Interval) - edit in lib/Aftok/TimeLog.hs at line 174
- replacement in lib/Aftok/TimeLog.hs at line 185[6.5069]→[6.2211:2286](∅→∅),[6.2211]→[6.2211:2286](∅→∅),[6.2286]→[3.3:105](∅→∅),[3.105]→[6.2388:2488](∅→∅),[6.2388]→[6.2388:2488](∅→∅),[6.2488]→[6.973:1002](∅→∅),[6.973]→[6.973:1002](∅→∅)
let combine (StartWork t) (StopWork t') | t' > t = Right $ Interval t t'combine (e1 @ (StartWork _)) (e2 @ (StartWork _)) = Left $ max e1 e2 -- ignore redundant startscombine (e1 @ (StopWork _)) (e2 @ (StopWork _)) = Left $ min e1 e2 -- ignore redundant endscombine _ e2 = Left e2let combine :: LogEvent -> LogEvent -> Either LogEvent Intervalcombine (StartWork t) (StopWork t') | t' > t = Right $ Interval t t'combine (e1@(StartWork _)) (e2@(StartWork _)) = Left $ max e1 e2 -- ignore redundant startscombine (e1@(StopWork _)) (e2@(StopWork _)) = Left $ min e1 e2 -- ignore redundant endscombine _ e2 = Left e2 - replacement in lib/Aftok/TimeLog.hs at line 193
extension ival (StartWork t) | containsInclusive t ival = Just $ StartWork (ival ^. start)extension ival (StartWork t) | containsInclusive t ival =Just $ StartWork (ival ^. start) - replacement in lib/Aftok/TimeLog.hs at line 205[6.1093]→[6.1526:1549](∅→∅),[6.198]→[6.869:870](∅→∅),[6.1089]→[6.869:870](∅→∅),[6.1157]→[6.869:870](∅→∅),[6.1549]→[6.869:870](∅→∅),[6.3145]→[6.869:870](∅→∅),[6.4779]→[6.869:870](∅→∅),[6.869]→[6.869:870](∅→∅)
_ -> [Left ev]_ -> [Left ev] - replacement in lib/Aftok/TimeLog.hs at line 211
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.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. - replacement in lib/Aftok/TimeLog.hs at line 223[6.2646]→[6.5247:5265](∅→∅),[6.5265]→[6.10011:10059](∅→∅),[6.508]→[6.10011:10059](∅→∅),[6.10059]→[6.2647:2733](∅→∅),[6.556]→[6.2647:2733](∅→∅),[6.2733]→[6.557:558](∅→∅),[6.586]→[6.557:558](∅→∅)
depPct dt =if dt < monthsLength undepLength then 1else toSeconds (max zeroV (maxDepreciable ^-^ dt)) / toSeconds maxDepreciabledepPct dt = if dt < monthsLength undepLengththen 1else toSeconds (max zeroV (maxDepreciable ^-^ dt))/ toSeconds maxDepreciable - replacement in lib/Aftok/TimeLog.hs at line 228
let depreciation = depPct $ ptime .-. (ival ^. end)in depreciation *^ ilen ival[6.5287]let depreciation = depPct $ ptime .-. (ival ^. end)in depreciation *^ ilen ival - replacement in server/Aftok/Snaplet/Auctions.hs at line 36
import Bippy.Types ( Satoshi(..) )import Bippy.Types ( Satoshi(..) ) - replacement in server/Aftok/Snaplet/Auth.hs at line 9
import Data.Aeson ((.:))import qualified Data.Aeson as Aimport qualified Data.Aeson.Types as Aimport Data.Aeson ( (.:) )import qualified Data.Aeson as Aimport qualified Data.Aeson.Types as A - replacement in server/Aftok/Snaplet/Auth.hs at line 29
parseLoginRequest (A.Object o) = LoginRequest <$> o .: "username" <*> o .: "password"parseLoginRequest (A.Object o) =LoginRequest <$> o .: "username" <*> o .: "password" - replacement in server/Aftok/Snaplet/Auth.hs at line 37
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 40
req <- getRequestrawHeader <- maybe (throwMissingAuth ()) pure $ getHeader "Authorization" reqreq <- getRequestrawHeader <- maybe (throwMissingAuth ()) pure $ getHeader "Authorization" req - replacement in server/Aftok/Snaplet/Auth.hs at line 50
credentials <- caseA.eitherDecode requestBody >>= A.parseEither parseLoginRequestofLeft _ -> snapError 400 $ "Unable to parse login credentials object."credentials <-case A.eitherDecode requestBody >>= A.parseEither parseLoginRequest ofLeft _ -> 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 63
maybe (requireLoginWith $ const (throwDenied $ AU.AuthError "Not Authenticated")) pure currentUsermaybe(requireLoginWith $ const (throwDenied $ AU.AuthError "Not Authenticated"))purecurrentUser - replacement in server/Aftok/Snaplet/Billing.hs at line 21
import Bippy.Types ( Satoshi(..) )import Bippy.Types ( Satoshi(..) ) - replacement in server/Aftok/Snaplet/Payments.hs at line 28
import qualified Bippy.Proto as Pimport qualified Bippy.Proto as P - replacement in server/Aftok/Snaplet/Projects.hs at line 14
import Control.Monad.Trans.Maybe ( mapMaybeT)import Control.Monad.Trans.Maybe ( mapMaybeT ) - replacement in server/Aftok/Snaplet/Users.hs at line 18
import Haskoin.Address ( textToAddr )import Haskoin.Address ( textToAddr ) - replacement in server/Aftok/Snaplet/Util.hs at line 3
import Data.Attoparsec.ByteString (parseOnly)import Data.Attoparsec.ByteString.Char8 (decimal)import Data.Attoparsec.ByteString ( parseOnly )import Data.Attoparsec.ByteString.Char8( decimal ) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 6
import Control.Lens ((^.))import Control.Lens ( (^.) ) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 10
import Data.Aeson ((.=))import Data.Aeson ( (.=) ) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 15
import Haskoin.Address ( Addressimport Haskoin.Address ( Address - replacement in server/Aftok/Snaplet/WorkLog.hs at line 28
import Aftok.Types ( _ProjectId, _UserId )import Aftok.Types ( _ProjectId, _UserId) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 40
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 50
A.eitherDecode requestBody >>= A.parseEither (parseLogEntry nmode uid evCtr)A.eitherDecode requestBody>>= A.parseEither (parseLogEntry nmode uid evCtr) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 63
(snapError 500 $ "An error occured retrieving the newly created event record.")(pure . (eid,))( snapError 500$ "An error occured retrieving the newly created event record.")(pure . (eid, )) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 104
limit <- fromMaybe 1 <$> decimalParam "limit"limit <- fromMaybe 1 <$> decimalParam "limit" - replacement in server/Aftok/Snaplet/WorkLog.hs at line 108
userWorkIndex =workIndex <$> userEventsuserWorkIndex = workIndex <$> userEvents - replacement in server/Aftok/Snaplet/WorkLog.hs at line 135
keyedLogEntryJSON :: NetworkMode -> (EventId, KeyedLogEntry (NetworkId, Address)) -> A.ValuekeyedLogEntryJSON nmode (eid, (pid, uid, ev)) = v2 . obj $[ "eventId" .= idValue _EventId eid, "projectId" .= idValue _ProjectId pid, "loggedBy" .= idValue _UserId uid] <> logEntryFields nmode evkeyedLogEntryJSON:: NetworkMode -> (EventId, KeyedLogEntry (NetworkId, Address)) -> A.ValuekeyedLogEntryJSON nmode (eid, (pid, uid, ev)) =v2. obj$ [ "eventId" .= idValue _EventId eid, "projectId" .= idValue _ProjectId pid, "loggedBy" .= idValue _UserId uid]<> logEntryFields nmode ev - replacement in server/Main.hs at line 34
import qualified Snap.Snaplet.Auth as AUimport qualified Snap.Snaplet.Auth as AU - replacement in server/Main.hs at line 50
sesss <- nestSnaplet "sessions" sess $ initCookieSessionManager cookieKey "quookie" Nothing (cfg ^. cookieTimeout)sesss <- nestSnaplet "sessions" sess$ initCookieSessionManagercookieKey"quookie"Nothing(cfg ^. cookieTimeout) - replacement in server/Main.hs at line 76
projectRoute =serveJSON projectJSON $ method GET projectGetHandlerprojectRoute = serveJSON projectJSON $ method GET projectGetHandler - replacement in server/Main.hs at line 86
amendEventRoute =serveJSON amendmentIdJSON $ method PUT amendEventHandleramendEventRoute = serveJSON amendmentIdJSON $ method PUT amendEventHandler - replacement in server/Main.hs at line 95
auctionRoute =serveJSON auctionJSON $ method GET auctionGetHandlerauctionBidRoute =serveJSON bidIdJSON $ method POST auctionBidHandlerauctionRoute = serveJSON auctionJSON $ method GET auctionGetHandlerauctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandler - replacement in server/Main.hs at line 117[6.64972]→[6.64972:65091](∅→∅),[6.65091]→[6.11733:11855](∅→∅),[6.11855]→[6.65091:65217](∅→∅),[6.65091]→[6.65091:65217](∅→∅)
, ("login" , loginRoute), ("login" , xhrLoginRoute), ("logout" , logoutRoute), ("login/check" , checkLoginRoute), ("register" , registerRoute), ("accept_invitation" , acceptInviteRoute), ("login" , loginRoute), ("login" , xhrLoginRoute), ("logout" , logoutRoute), ("login/check", checkLoginRoute), ("register" , registerRoute), ( "accept_invitation", acceptInviteRoute) - replacement in server/Main.hs at line 127[6.15954]→[6.15954:16099](∅→∅),[6.16099]→[6.5113:5179](∅→∅),[6.5179]→[6.16169:16733](∅→∅),[6.16169]→[6.16169:16733](∅→∅)
, ("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), ("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) - edit in shell.nix at line 22[4.38][91.99129]
haskellPackages.brittany - replacement in test/Aftok/AuctionSpec.hs at line 11
import Data.List ((!!))import Data.List ( (!!) ) - replacement in test/Aftok/AuctionSpec.hs at line 13
import qualified Data.UUID.V4 as Uimport qualified Data.UUID.V4 as U - replacement in test/Aftok/AuctionSpec.hs at line 74
it"determines a sufficient number of winners to fulfill the raise amount"it "determines a sufficient number of winners to fulfill the raise amount" - replacement in test/Aftok/AuctionSpec.hs at line 76
result = runAuction' (Satoshi 1250)[testB0, testB1, testB2, testB3, testB4]result =runAuction' (Satoshi 1250) [testB0, testB1, testB2, testB3, testB4] - replacement in test/Aftok/AuctionSpec.hs at line 83
WinningBids winners ->sortBy bidOrder winners `shouldBe` expectedWinningBids winners -> sortBy bidOrder winners `shouldBe` expected - replacement in test/Aftok/TimeLogSpec.hs at line 19
import Haskoin.Address ( Address )import Haskoin.Address ( Address ) - replacement in test/Aftok/TimeLogSpec.hs at line 26
import Haskoin.Util.Arbitrary.Address (arbitraryAddress)import Haskoin.Util.Arbitrary.Address ( arbitraryAddress )