haskoin-store 1.5.13 → 1.5.14
raw patch · 6 files changed
+50/−17 lines, 6 filesdep ~scottyPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: scotty
API changes (from Hackage documentation)
- Haskoin.Store: [block] :: Store -> !BlockStore
- Haskoin.Store: [bloom] :: StoreConfig -> !Bool
- Haskoin.Store: [cache] :: Store -> !Maybe CacheConfig
- Haskoin.Store: [chain] :: CacheConfig -> !Chain
- Haskoin.Store: [connect] :: StoreConfig -> !SockAddr -> WithConnection
- Haskoin.Store: [ctx] :: StoreConfig -> !Ctx
- Haskoin.Store: [db] :: StoreConfig -> !FilePath
- Haskoin.Store: [discover] :: StoreConfig -> !Bool
- Haskoin.Store: [gap] :: StoreConfig -> !Word32
- Haskoin.Store: [initGap] :: StoreConfig -> !Word32
- Haskoin.Store: [initPeers] :: StoreConfig -> ![String]
- Haskoin.Store: [limit] :: Limits -> !Word32
- Haskoin.Store: [maxKeys] :: CacheConfig -> !Integer
- Haskoin.Store: [maxPeerLife] :: StoreConfig -> !NominalDiffTime
- Haskoin.Store: [maxPeers] :: StoreConfig -> !Int
- Haskoin.Store: [metrics] :: CacheConfig -> !Maybe CacheMetrics
- Haskoin.Store: [minAddrs] :: CacheConfig -> !Int
- Haskoin.Store: [net] :: StoreConfig -> !Network
- Haskoin.Store: [noMempool] :: StoreConfig -> !Bool
- Haskoin.Store: [offset] :: Limits -> !Word32
- Haskoin.Store: [peerMgr] :: Store -> !PeerMgr
- Haskoin.Store: [peerTimeout] :: StoreConfig -> !NominalDiffTime
- Haskoin.Store: [pub] :: Store -> !Publisher StoreEvent
- Haskoin.Store: [redisMaxKeys] :: StoreConfig -> !Integer
- Haskoin.Store: [redisMinAddrs] :: StoreConfig -> !Int
- Haskoin.Store: [redisSyncInterval] :: StoreConfig -> !Int
- Haskoin.Store: [redis] :: CacheConfig -> !Connection
- Haskoin.Store: [start] :: Limits -> !Maybe Start
- Haskoin.Store: [stats] :: StoreConfig -> !Maybe Stats
- Haskoin.Store: [syncMempool] :: StoreConfig -> !Bool
- Haskoin.Store: [wipeMempool] :: StoreConfig -> !Bool
- Haskoin.Store.BlockStore: [chain] :: BlockStoreConfig -> !Chain
- Haskoin.Store.BlockStore: [ctx] :: BlockStoreConfig -> !Ctx
- Haskoin.Store.BlockStore: [db] :: BlockStoreConfig -> !DatabaseReader
- Haskoin.Store.BlockStore: [net] :: BlockStoreConfig -> !Network
- Haskoin.Store.BlockStore: [noMempool] :: BlockStoreConfig -> !Bool
- Haskoin.Store.BlockStore: [peerMgr] :: BlockStoreConfig -> !PeerMgr
- Haskoin.Store.BlockStore: [peerTimeout] :: BlockStoreConfig -> !NominalDiffTime
- Haskoin.Store.BlockStore: [pub] :: BlockStoreConfig -> !Publisher StoreEvent
- Haskoin.Store.BlockStore: [stats] :: BlockStoreConfig -> !Maybe Stats
- Haskoin.Store.BlockStore: [syncMempool] :: BlockStoreConfig -> !Bool
- Haskoin.Store.BlockStore: [wipeMempool] :: BlockStoreConfig -> !Bool
- Haskoin.Store.Cache: [chain] :: CacheConfig -> !Chain
- Haskoin.Store.Cache: [maxKeys] :: CacheConfig -> !Integer
- Haskoin.Store.Cache: [metrics] :: CacheConfig -> !Maybe CacheMetrics
- Haskoin.Store.Cache: [minAddrs] :: CacheConfig -> !Int
- Haskoin.Store.Cache: [redis] :: CacheConfig -> !Connection
- Haskoin.Store.Common: [limit] :: Limits -> !Word32
- Haskoin.Store.Common: [offset] :: Limits -> !Word32
- Haskoin.Store.Common: [start] :: Limits -> !Maybe Start
- Haskoin.Store.Database.Reader: [ctx] :: DatabaseReader -> !Ctx
- Haskoin.Store.Database.Reader: [db] :: DatabaseReader -> !DB
- Haskoin.Store.Database.Reader: [initGap] :: DatabaseReader -> !Word32
- Haskoin.Store.Database.Reader: [maxGap] :: DatabaseReader -> !Word32
- Haskoin.Store.Database.Reader: [metrics] :: DatabaseReader -> !Maybe DataMetrics
- Haskoin.Store.Database.Reader: [net] :: DatabaseReader -> !Network
- Haskoin.Store.Database.Types: [address] :: BalKey -> !Address
- Haskoin.Store.Database.Types: [block] :: UnspentVal -> !BlockRef
- Haskoin.Store.Database.Types: [confirmed] :: BalVal -> !Word64
- Haskoin.Store.Database.Types: [hash] :: BlockKey -> BlockHash
- Haskoin.Store.Database.Types: [height] :: HeightKey -> BlockHeight
- Haskoin.Store.Database.Types: [outpoint] :: UnspentKey -> !OutPoint
- Haskoin.Store.Database.Types: [received] :: BalVal -> !Word64
- Haskoin.Store.Database.Types: [script] :: OutVal -> !ByteString
- Haskoin.Store.Database.Types: [short] :: TxKey -> (Word32, Word16)
- Haskoin.Store.Database.Types: [tx] :: AddrTxKey -> !TxRef
- Haskoin.Store.Database.Types: [txid] :: UnspentKey -> !TxHash
- Haskoin.Store.Database.Types: [txs] :: BalVal -> !Word64
- Haskoin.Store.Database.Types: [unconfirmed] :: BalVal -> !Word64
- Haskoin.Store.Database.Types: [utxo] :: BalVal -> !Word64
- Haskoin.Store.Database.Types: [value] :: OutVal -> !Word64
- Haskoin.Store.Manager: [block] :: Store -> !BlockStore
- Haskoin.Store.Manager: [bloom] :: StoreConfig -> !Bool
- Haskoin.Store.Manager: [cache] :: Store -> !Maybe CacheConfig
- Haskoin.Store.Manager: [chain] :: Store -> !Chain
- Haskoin.Store.Manager: [connect] :: StoreConfig -> !SockAddr -> WithConnection
- Haskoin.Store.Manager: [ctx] :: Store -> !Ctx
- Haskoin.Store.Manager: [db] :: Store -> !DatabaseReader
- Haskoin.Store.Manager: [discover] :: StoreConfig -> !Bool
- Haskoin.Store.Manager: [gap] :: StoreConfig -> !Word32
- Haskoin.Store.Manager: [initGap] :: StoreConfig -> !Word32
- Haskoin.Store.Manager: [initPeers] :: StoreConfig -> ![String]
- Haskoin.Store.Manager: [maxPeerLife] :: StoreConfig -> !NominalDiffTime
- Haskoin.Store.Manager: [maxPeers] :: StoreConfig -> !Int
- Haskoin.Store.Manager: [net] :: Store -> !Network
- Haskoin.Store.Manager: [noMempool] :: StoreConfig -> !Bool
- Haskoin.Store.Manager: [peerMgr] :: Store -> !PeerMgr
- Haskoin.Store.Manager: [peerTimeout] :: StoreConfig -> !NominalDiffTime
- Haskoin.Store.Manager: [pub] :: Store -> !Publisher StoreEvent
- Haskoin.Store.Manager: [redisMaxKeys] :: StoreConfig -> !Integer
- Haskoin.Store.Manager: [redisMinAddrs] :: StoreConfig -> !Int
- Haskoin.Store.Manager: [redisSyncInterval] :: StoreConfig -> !Int
- Haskoin.Store.Manager: [redis] :: StoreConfig -> !Maybe String
- Haskoin.Store.Manager: [stats] :: StoreConfig -> !Maybe Stats
- Haskoin.Store.Manager: [syncMempool] :: StoreConfig -> !Bool
- Haskoin.Store.Manager: [wipeMempool] :: StoreConfig -> !Bool
- Haskoin.Store.Web: [blockTimeout] :: WebLimits -> !Word64
- Haskoin.Store.Web: [defItemCount] :: WebLimits -> !Word32
- Haskoin.Store.Web: [healthCheckInterval] :: WebConfig -> !Int
- Haskoin.Store.Web: [host] :: WebConfig -> !String
- Haskoin.Store.Web: [limits] :: WebConfig -> !WebLimits
- Haskoin.Store.Web: [maxFullItemCount] :: WebLimits -> !Word32
- Haskoin.Store.Web: [maxItemCount] :: WebLimits -> !Word32
- Haskoin.Store.Web: [maxLaggingBlocks] :: WebConfig -> !Int
- Haskoin.Store.Web: [maxOffset] :: WebLimits -> !Word32
- Haskoin.Store.Web: [maxPendingTxs] :: WebConfig -> !Int
- Haskoin.Store.Web: [minPeers] :: WebConfig -> !Int
- Haskoin.Store.Web: [noBlockchainInfo] :: WebConfig -> !Bool
- Haskoin.Store.Web: [noMempool] :: WebConfig -> !Bool
- Haskoin.Store.Web: [noSlow] :: WebConfig -> !Bool
- Haskoin.Store.Web: [port] :: WebConfig -> !Int
- Haskoin.Store.Web: [priceHistoryURL] :: WebConfig -> !String
- Haskoin.Store.Web: [stats] :: WebConfig -> !Maybe Stats
- Haskoin.Store.Web: [store] :: WebConfig -> !Store
- Haskoin.Store.Web: [tickerRefresh] :: WebConfig -> !Int
- Haskoin.Store.Web: [tickerURL] :: WebConfig -> !String
- Haskoin.Store.Web: [txTimeout] :: WebLimits -> !Word64
- Haskoin.Store.Web: [version] :: WebConfig -> !String
- Haskoin.Store.Web: [xpubGapInit] :: WebLimits -> !Word32
- Haskoin.Store.Web: [xpubGap] :: WebLimits -> !Word32
+ Haskoin.Store: [$sel:block:Store] :: Store -> !BlockStore
+ Haskoin.Store: [$sel:bloom:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store: [$sel:cache:Store] :: Store -> !Maybe CacheConfig
+ Haskoin.Store: [$sel:chain:CacheConfig] :: CacheConfig -> !Chain
+ Haskoin.Store: [$sel:chain:Store] :: Store -> !Chain
+ Haskoin.Store: [$sel:connect:StoreConfig] :: StoreConfig -> !SockAddr -> WithConnection
+ Haskoin.Store: [$sel:ctx:StoreConfig] :: StoreConfig -> !Ctx
+ Haskoin.Store: [$sel:ctx:Store] :: Store -> !Ctx
+ Haskoin.Store: [$sel:db:StoreConfig] :: StoreConfig -> !FilePath
+ Haskoin.Store: [$sel:db:Store] :: Store -> !DatabaseReader
+ Haskoin.Store: [$sel:discover:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store: [$sel:gap:StoreConfig] :: StoreConfig -> !Word32
+ Haskoin.Store: [$sel:initGap:StoreConfig] :: StoreConfig -> !Word32
+ Haskoin.Store: [$sel:initPeers:StoreConfig] :: StoreConfig -> ![String]
+ Haskoin.Store: [$sel:limit:Limits] :: Limits -> !Word32
+ Haskoin.Store: [$sel:maxKeys:CacheConfig] :: CacheConfig -> !Integer
+ Haskoin.Store: [$sel:maxPeerLife:StoreConfig] :: StoreConfig -> !NominalDiffTime
+ Haskoin.Store: [$sel:maxPeers:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store: [$sel:mempoolTimeout:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store: [$sel:metrics:CacheConfig] :: CacheConfig -> !Maybe CacheMetrics
+ Haskoin.Store: [$sel:minAddrs:CacheConfig] :: CacheConfig -> !Int
+ Haskoin.Store: [$sel:net:StoreConfig] :: StoreConfig -> !Network
+ Haskoin.Store: [$sel:net:Store] :: Store -> !Network
+ Haskoin.Store: [$sel:noMempool:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store: [$sel:offset:Limits] :: Limits -> !Word32
+ Haskoin.Store: [$sel:peerMgr:Store] :: Store -> !PeerMgr
+ Haskoin.Store: [$sel:peerTimeout:StoreConfig] :: StoreConfig -> !NominalDiffTime
+ Haskoin.Store: [$sel:pub:Store] :: Store -> !Publisher StoreEvent
+ Haskoin.Store: [$sel:redis:CacheConfig] :: CacheConfig -> !Connection
+ Haskoin.Store: [$sel:redis:StoreConfig] :: StoreConfig -> !Maybe String
+ Haskoin.Store: [$sel:redisMaxKeys:StoreConfig] :: StoreConfig -> !Integer
+ Haskoin.Store: [$sel:redisMinAddrs:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store: [$sel:redisSyncInterval:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store: [$sel:start:Limits] :: Limits -> !Maybe Start
+ Haskoin.Store: [$sel:stats:StoreConfig] :: StoreConfig -> !Maybe Stats
+ Haskoin.Store: [$sel:syncMempool:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store: [$sel:wipeMempool:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store.BlockStore: [$sel:chain:BlockStoreConfig] :: BlockStoreConfig -> !Chain
+ Haskoin.Store.BlockStore: [$sel:ctx:BlockStoreConfig] :: BlockStoreConfig -> !Ctx
+ Haskoin.Store.BlockStore: [$sel:db:BlockStoreConfig] :: BlockStoreConfig -> !DatabaseReader
+ Haskoin.Store.BlockStore: [$sel:mempoolTimeout:BlockStoreConfig] :: BlockStoreConfig -> !Int
+ Haskoin.Store.BlockStore: [$sel:net:BlockStoreConfig] :: BlockStoreConfig -> !Network
+ Haskoin.Store.BlockStore: [$sel:noMempool:BlockStoreConfig] :: BlockStoreConfig -> !Bool
+ Haskoin.Store.BlockStore: [$sel:peerMgr:BlockStoreConfig] :: BlockStoreConfig -> !PeerMgr
+ Haskoin.Store.BlockStore: [$sel:peerTimeout:BlockStoreConfig] :: BlockStoreConfig -> !NominalDiffTime
+ Haskoin.Store.BlockStore: [$sel:pub:BlockStoreConfig] :: BlockStoreConfig -> !Publisher StoreEvent
+ Haskoin.Store.BlockStore: [$sel:stats:BlockStoreConfig] :: BlockStoreConfig -> !Maybe Stats
+ Haskoin.Store.BlockStore: [$sel:syncMempool:BlockStoreConfig] :: BlockStoreConfig -> !Bool
+ Haskoin.Store.BlockStore: [$sel:wipeMempool:BlockStoreConfig] :: BlockStoreConfig -> !Bool
+ Haskoin.Store.Cache: [$sel:chain:CacheConfig] :: CacheConfig -> !Chain
+ Haskoin.Store.Cache: [$sel:maxKeys:CacheConfig] :: CacheConfig -> !Integer
+ Haskoin.Store.Cache: [$sel:metrics:CacheConfig] :: CacheConfig -> !Maybe CacheMetrics
+ Haskoin.Store.Cache: [$sel:minAddrs:CacheConfig] :: CacheConfig -> !Int
+ Haskoin.Store.Cache: [$sel:redis:CacheConfig] :: CacheConfig -> !Connection
+ Haskoin.Store.Common: [$sel:limit:Limits] :: Limits -> !Word32
+ Haskoin.Store.Common: [$sel:offset:Limits] :: Limits -> !Word32
+ Haskoin.Store.Common: [$sel:start:Limits] :: Limits -> !Maybe Start
+ Haskoin.Store.Database.Reader: [$sel:ctx:DatabaseReader] :: DatabaseReader -> !Ctx
+ Haskoin.Store.Database.Reader: [$sel:db:DatabaseReader] :: DatabaseReader -> !DB
+ Haskoin.Store.Database.Reader: [$sel:initGap:DatabaseReader] :: DatabaseReader -> !Word32
+ Haskoin.Store.Database.Reader: [$sel:maxGap:DatabaseReader] :: DatabaseReader -> !Word32
+ Haskoin.Store.Database.Reader: [$sel:metrics:DatabaseReader] :: DatabaseReader -> !Maybe DataMetrics
+ Haskoin.Store.Database.Reader: [$sel:net:DatabaseReader] :: DatabaseReader -> !Network
+ Haskoin.Store.Database.Types: [$sel:address:AddrOutKey] :: AddrOutKey -> !Address
+ Haskoin.Store.Database.Types: [$sel:address:AddrTxKey] :: AddrTxKey -> !Address
+ Haskoin.Store.Database.Types: [$sel:address:BalKey] :: BalKey -> !Address
+ Haskoin.Store.Database.Types: [$sel:block:AddrOutKey] :: AddrOutKey -> !BlockRef
+ Haskoin.Store.Database.Types: [$sel:block:AddrTxKey] :: AddrTxKey -> !BlockRef
+ Haskoin.Store.Database.Types: [$sel:block:UnspentVal] :: UnspentVal -> !BlockRef
+ Haskoin.Store.Database.Types: [$sel:confirmed:BalVal] :: BalVal -> !Word64
+ Haskoin.Store.Database.Types: [$sel:hash:BlockKey] :: BlockKey -> BlockHash
+ Haskoin.Store.Database.Types: [$sel:height:HeightKey] :: HeightKey -> BlockHeight
+ Haskoin.Store.Database.Types: [$sel:outpoint:AddrOutKey] :: AddrOutKey -> !OutPoint
+ Haskoin.Store.Database.Types: [$sel:outpoint:UnspentKey] :: UnspentKey -> !OutPoint
+ Haskoin.Store.Database.Types: [$sel:received:BalVal] :: BalVal -> !Word64
+ Haskoin.Store.Database.Types: [$sel:script:OutVal] :: OutVal -> !ByteString
+ Haskoin.Store.Database.Types: [$sel:script:UnspentVal] :: UnspentVal -> !ByteString
+ Haskoin.Store.Database.Types: [$sel:short:TxKey] :: TxKey -> (Word32, Word16)
+ Haskoin.Store.Database.Types: [$sel:tx:AddrTxKey] :: AddrTxKey -> !TxRef
+ Haskoin.Store.Database.Types: [$sel:txid:TxKey] :: TxKey -> TxHash
+ Haskoin.Store.Database.Types: [$sel:txid:UnspentKey] :: UnspentKey -> !TxHash
+ Haskoin.Store.Database.Types: [$sel:txs:BalVal] :: BalVal -> !Word64
+ Haskoin.Store.Database.Types: [$sel:unconfirmed:BalVal] :: BalVal -> !Word64
+ Haskoin.Store.Database.Types: [$sel:utxo:BalVal] :: BalVal -> !Word64
+ Haskoin.Store.Database.Types: [$sel:value:OutVal] :: OutVal -> !Word64
+ Haskoin.Store.Database.Types: [$sel:value:UnspentVal] :: UnspentVal -> !Word64
+ Haskoin.Store.Manager: [$sel:block:Store] :: Store -> !BlockStore
+ Haskoin.Store.Manager: [$sel:bloom:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store.Manager: [$sel:cache:Store] :: Store -> !Maybe CacheConfig
+ Haskoin.Store.Manager: [$sel:chain:Store] :: Store -> !Chain
+ Haskoin.Store.Manager: [$sel:connect:StoreConfig] :: StoreConfig -> !SockAddr -> WithConnection
+ Haskoin.Store.Manager: [$sel:ctx:StoreConfig] :: StoreConfig -> !Ctx
+ Haskoin.Store.Manager: [$sel:ctx:Store] :: Store -> !Ctx
+ Haskoin.Store.Manager: [$sel:db:StoreConfig] :: StoreConfig -> !FilePath
+ Haskoin.Store.Manager: [$sel:db:Store] :: Store -> !DatabaseReader
+ Haskoin.Store.Manager: [$sel:discover:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store.Manager: [$sel:gap:StoreConfig] :: StoreConfig -> !Word32
+ Haskoin.Store.Manager: [$sel:initGap:StoreConfig] :: StoreConfig -> !Word32
+ Haskoin.Store.Manager: [$sel:initPeers:StoreConfig] :: StoreConfig -> ![String]
+ Haskoin.Store.Manager: [$sel:maxPeerLife:StoreConfig] :: StoreConfig -> !NominalDiffTime
+ Haskoin.Store.Manager: [$sel:maxPeers:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store.Manager: [$sel:mempoolTimeout:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store.Manager: [$sel:net:StoreConfig] :: StoreConfig -> !Network
+ Haskoin.Store.Manager: [$sel:net:Store] :: Store -> !Network
+ Haskoin.Store.Manager: [$sel:noMempool:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store.Manager: [$sel:peerMgr:Store] :: Store -> !PeerMgr
+ Haskoin.Store.Manager: [$sel:peerTimeout:StoreConfig] :: StoreConfig -> !NominalDiffTime
+ Haskoin.Store.Manager: [$sel:pub:Store] :: Store -> !Publisher StoreEvent
+ Haskoin.Store.Manager: [$sel:redis:StoreConfig] :: StoreConfig -> !Maybe String
+ Haskoin.Store.Manager: [$sel:redisMaxKeys:StoreConfig] :: StoreConfig -> !Integer
+ Haskoin.Store.Manager: [$sel:redisMinAddrs:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store.Manager: [$sel:redisSyncInterval:StoreConfig] :: StoreConfig -> !Int
+ Haskoin.Store.Manager: [$sel:stats:StoreConfig] :: StoreConfig -> !Maybe Stats
+ Haskoin.Store.Manager: [$sel:syncMempool:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store.Manager: [$sel:wipeMempool:StoreConfig] :: StoreConfig -> !Bool
+ Haskoin.Store.Web: [$sel:blockTimeout:WebLimits] :: WebLimits -> !Word64
+ Haskoin.Store.Web: [$sel:defItemCount:WebLimits] :: WebLimits -> !Word32
+ Haskoin.Store.Web: [$sel:healthCheckInterval:WebConfig] :: WebConfig -> !Int
+ Haskoin.Store.Web: [$sel:host:WebConfig] :: WebConfig -> !String
+ Haskoin.Store.Web: [$sel:limits:WebConfig] :: WebConfig -> !WebLimits
+ Haskoin.Store.Web: [$sel:maxFullItemCount:WebLimits] :: WebLimits -> !Word32
+ Haskoin.Store.Web: [$sel:maxItemCount:WebLimits] :: WebLimits -> !Word32
+ Haskoin.Store.Web: [$sel:maxLaggingBlocks:WebConfig] :: WebConfig -> !Int
+ Haskoin.Store.Web: [$sel:maxOffset:WebLimits] :: WebLimits -> !Word32
+ Haskoin.Store.Web: [$sel:maxPendingTxs:WebConfig] :: WebConfig -> !Int
+ Haskoin.Store.Web: [$sel:minPeers:WebConfig] :: WebConfig -> !Int
+ Haskoin.Store.Web: [$sel:noBlockchainInfo:WebConfig] :: WebConfig -> !Bool
+ Haskoin.Store.Web: [$sel:noMempool:WebConfig] :: WebConfig -> !Bool
+ Haskoin.Store.Web: [$sel:noSlow:WebConfig] :: WebConfig -> !Bool
+ Haskoin.Store.Web: [$sel:port:WebConfig] :: WebConfig -> !Int
+ Haskoin.Store.Web: [$sel:priceHistoryURL:WebConfig] :: WebConfig -> !String
+ Haskoin.Store.Web: [$sel:stats:WebConfig] :: WebConfig -> !Maybe Stats
+ Haskoin.Store.Web: [$sel:store:WebConfig] :: WebConfig -> !Store
+ Haskoin.Store.Web: [$sel:tickerRefresh:WebConfig] :: WebConfig -> !Int
+ Haskoin.Store.Web: [$sel:tickerURL:WebConfig] :: WebConfig -> !String
+ Haskoin.Store.Web: [$sel:txTimeout:WebLimits] :: WebLimits -> !Word64
+ Haskoin.Store.Web: [$sel:version:WebConfig] :: WebConfig -> !String
+ Haskoin.Store.Web: [$sel:xpubGap:WebLimits] :: WebLimits -> !Word32
+ Haskoin.Store.Web: [$sel:xpubGapInit:WebLimits] :: WebLimits -> !Word32
- Haskoin.Store: StoreConfig :: !Int -> ![String] -> !Bool -> !FilePath -> !Network -> !Maybe String -> !Ctx -> !Word32 -> !Word32 -> !Int -> !Integer -> !Bool -> !Bool -> !Bool -> !NominalDiffTime -> !NominalDiffTime -> !SockAddr -> WithConnection -> !Maybe Stats -> !Int -> !Bool -> StoreConfig
+ Haskoin.Store: StoreConfig :: !Int -> ![String] -> !Bool -> !FilePath -> !Network -> !Maybe String -> !Ctx -> !Word32 -> !Word32 -> !Int -> !Integer -> !Bool -> !Bool -> !Bool -> !Int -> !NominalDiffTime -> !NominalDiffTime -> !SockAddr -> WithConnection -> !Maybe Stats -> !Int -> !Bool -> StoreConfig
- Haskoin.Store: class Monad m => StoreReadBase (m :: Type -> Type)
+ Haskoin.Store: class (Monad m) => StoreReadBase m
- Haskoin.Store: class StoreReadBase m => StoreReadExtra (m :: Type -> Type)
+ Haskoin.Store: class (StoreReadBase m) => StoreReadExtra m
- Haskoin.Store: isInCache :: forall (m :: Type -> Type). MonadLoggerIO m => XPubSpec -> CacheT m Bool
+ Haskoin.Store: isInCache :: MonadLoggerIO m => XPubSpec -> CacheT m Bool
- Haskoin.Store: type CacheT = ReaderT Maybe CacheConfig
+ Haskoin.Store: type CacheT = ReaderT (Maybe CacheConfig)
- Haskoin.Store.BlockStore: BlockStoreConfig :: !Ctx -> !PeerMgr -> !Chain -> !Publisher StoreEvent -> !DatabaseReader -> !Network -> !Bool -> !Bool -> !Bool -> !NominalDiffTime -> !Maybe Stats -> BlockStoreConfig
+ Haskoin.Store.BlockStore: BlockStoreConfig :: !Ctx -> !PeerMgr -> !Chain -> !Publisher StoreEvent -> !DatabaseReader -> !Network -> !Bool -> !Bool -> !Bool -> !Int -> !NominalDiffTime -> !Maybe Stats -> BlockStoreConfig
- Haskoin.Store.Cache: cacheDelXPubs :: forall (m :: Type -> Type). (MonadLoggerIO m, StoreReadBase m) => [XPubSpec] -> CacheT m Integer
+ Haskoin.Store.Cache: cacheDelXPubs :: (MonadLoggerIO m, StoreReadBase m) => [XPubSpec] -> CacheT m Integer
- Haskoin.Store.Cache: isInCache :: forall (m :: Type -> Type). MonadLoggerIO m => XPubSpec -> CacheT m Bool
+ Haskoin.Store.Cache: isInCache :: MonadLoggerIO m => XPubSpec -> CacheT m Bool
- Haskoin.Store.Cache: type CacheT = ReaderT Maybe CacheConfig
+ Haskoin.Store.Cache: type CacheT = ReaderT (Maybe CacheConfig)
- Haskoin.Store.Common: applyLimitC :: forall (m :: Type -> Type) i. Monad m => Limit -> ConduitT i i m ()
+ Haskoin.Store.Common: applyLimitC :: Monad m => Limit -> ConduitT i i m ()
- Haskoin.Store.Common: applyLimitsC :: forall (m :: Type -> Type) i. Monad m => Limits -> ConduitT i i m ()
+ Haskoin.Store.Common: applyLimitsC :: Monad m => Limits -> ConduitT i i m ()
- Haskoin.Store.Common: class Monad m => StoreReadBase (m :: Type -> Type)
+ Haskoin.Store.Common: class (Monad m) => StoreReadBase m
- Haskoin.Store.Common: class StoreReadBase m => StoreReadExtra (m :: Type -> Type)
+ Haskoin.Store.Common: class (StoreReadBase m) => StoreReadExtra m
- Haskoin.Store.Common: class StoreWrite (m :: Type -> Type)
+ Haskoin.Store.Common: class StoreWrite m
- Haskoin.Store.Common: joinDescStreams :: forall (m :: Type -> Type) a. (Monad m, Ord a) => [ConduitT () a m ()] -> ConduitT () a m ()
+ Haskoin.Store.Common: joinDescStreams :: (Monad m, Ord a) => [ConduitT () a m ()] -> ConduitT () a m ()
- Haskoin.Store.Logic: type MonadImport (m :: Type -> Type) = (MonadError ImportException m, MonadLoggerIO m, StoreReadBase m, StoreWrite m)
+ Haskoin.Store.Logic: type MonadImport m = (MonadError ImportException m, MonadLoggerIO m, StoreReadBase m, StoreWrite m)
- Haskoin.Store.Manager: StoreConfig :: !Int -> ![String] -> !Bool -> !FilePath -> !Network -> !Maybe String -> !Ctx -> !Word32 -> !Word32 -> !Int -> !Integer -> !Bool -> !Bool -> !Bool -> !NominalDiffTime -> !NominalDiffTime -> !SockAddr -> WithConnection -> !Maybe Stats -> !Int -> !Bool -> StoreConfig
+ Haskoin.Store.Manager: StoreConfig :: !Int -> ![String] -> !Bool -> !FilePath -> !Network -> !Maybe String -> !Ctx -> !Word32 -> !Word32 -> !Int -> !Integer -> !Bool -> !Bool -> !Bool -> !Int -> !NominalDiffTime -> !NominalDiffTime -> !SockAddr -> WithConnection -> !Maybe Stats -> !Int -> !Bool -> StoreConfig
- Haskoin.Store.Web: data Except
+ Haskoin.Store.Web: data () => Except
Files
- app/Main.hs +11/−0
- haskoin-store.cabal +4/−4
- src/Haskoin/Store/BlockStore.hs +25/−7
- src/Haskoin/Store/Manager.hs +3/−0
- src/Haskoin/Store/Web.hs +6/−6
- test/Haskoin/StoreSpec.hs +1/−0
app/Main.hs view
@@ -115,6 +115,7 @@ syncMempool :: !Bool, peerTimeout :: !Int, maxPeerLife :: !Int,+ mempoolTimeout :: !Int, maxPeers :: !Int, statsd :: !Bool, statsdHost :: !String,@@ -176,6 +177,8 @@ env "WIPE_MEMPOOL" False parseBool syncMempool <- env "SYNC_MEMPOOL" False parseBool+ mempoolTimeout <-+ env "MEMPOOL_TIMEOUT" 14 readMaybe peerTimeout <- env "PEER_TIMEOUT" 120 readMaybe maxPeerLife <-@@ -427,6 +430,13 @@ flag c.syncMempool True $ long "sync-mempool" <> help "Attempt to download peer mempools"+ mempoolTimeout <-+ option auto $+ metavar "DAYS"+ <> long "mempool-timeout"+ <> help "Cull old mempool transactions"+ <> showDefault+ <> value c.mempoolTimeout peerTimeout <- option auto $ metavar "SECONDS"@@ -574,6 +584,7 @@ wipeMempool = cfg.wipeMempool, noMempool = cfg.noMempool, syncMempool = cfg.syncMempool,+ mempoolTimeout = cfg.mempoolTimeout, peerTimeout = fromIntegral cfg.peerTimeout, maxPeerLife = fromIntegral cfg.maxPeerLife, connect = withConnection,
haskoin-store.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: haskoin-store-version: 1.5.13+version: 1.5.14 synopsis: Storage and index for Bitcoin and Bitcoin Cash description: Please see the README on GitHub at <https://github.com/haskoin/haskoin-store#readme> category: Bitcoin, Finance, Network@@ -66,7 +66,7 @@ , random >=1.1 , rocksdb-haskell-jprupp >=2.1.3 , rocksdb-query >=0.4.0- , scotty >=0.20+ , scotty >=0.22 , statsd-rupp >=0.4 , stm >=2.5.0.0 , string-conversions >=0.4.0.1@@ -121,7 +121,7 @@ , random >=1.1 , rocksdb-haskell-jprupp >=2.1.3 , rocksdb-query >=0.4.0- , scotty >=0.20+ , scotty >=0.22 , statsd-rupp >=0.4 , stm >=2.5.0.0 , string-conversions >=0.4.0.1@@ -180,7 +180,7 @@ , random >=1.1 , rocksdb-haskell-jprupp >=2.1.3 , rocksdb-query >=0.4.0- , scotty >=0.20+ , scotty >=0.22 , statsd-rupp >=0.4 , stm >=2.5.0.0 , string-conversions >=0.4.0.1
src/Haskoin/Store/BlockStore.hs view
@@ -323,6 +323,8 @@ -- | sync mempool from peers syncMempool :: !Bool, -- | disconnect syncing peer if inactive for this long+ mempoolTimeout :: !Int,+ -- | delete transactions older than this number of days from mempool peerTimeout :: !NominalDiffTime, stats :: !(Maybe Stats) }@@ -823,10 +825,30 @@ Left e -> report_error e Right _ -> return () report_error e = do- $(logErrorS) "BlockImport" $+ $(logErrorS) "BlockStore" $ "Error processing mempool: " <> cs (show e) throwIO e +pruneMempool :: (MonadLoggerIO m) => BlockT m ()+pruneMempool =+ guardMempool . notify Nothing $ do+ days <- asks (.config.mempoolTimeout)+ when (days > 0) $ do+ mempool <- reverse <$> getMempool+ time <- (floor . utcTimeToPOSIXSeconds) <$> liftIO getCurrentTime+ let thresh = time - (fromIntegral days * 24 * 60 * 60)+ txs = take 1000 $ map snd $ takeWhile ((< thresh) . fst) mempool+ net <- getNetwork+ ctx <- getCtx+ when (length txs > 0) $ do+ $(logInfoS) "BlockStore" $+ "Deleting " <> cs (show (length txs)) <> " old transactions from mempool"+ runImport net ctx (mapM_ (deleteUnconfirmedTx False) txs) >>= \case+ Left e ->+ $(logErrorS) "BlockStore" $+ "Error pruning mempool: " <> cs (show e)+ Right () -> return ()+ processTxs :: (MonadLoggerIO m) => Peer ->@@ -1184,6 +1206,7 @@ trySyncing processMempool pruneOrphans+ pruneMempool checkTime atomically (r ()) @@ -1191,12 +1214,7 @@ pingMe mbox = forever $ do BlockPing `query` mbox- delay <-- liftIO $- randomRIO- ( 100 * 1000,- 1000 * 1000- )+ delay <- liftIO $ randomRIO (100 * 1000, 1000 * 1000) threadDelay delay blockStorePeerConnect :: (MonadIO m) => Peer -> BlockStore -> m ()
src/Haskoin/Store/Manager.hs view
@@ -146,6 +146,8 @@ -- | sync mempool from peers syncMempool :: !Bool, -- | disconnect peer if message not received for this many seconds+ mempoolTimeout :: !Int,+ -- | delete mempool transactions older than this number of days peerTimeout :: !NominalDiffTime, -- | disconnect peer if it has been connected this long maxPeerLife :: !NominalDiffTime,@@ -222,6 +224,7 @@ noMempool = cfg.noMempool, wipeMempool = cfg.wipeMempool, syncMempool = cfg.syncMempool,+ mempoolTimeout = cfg.mempoolTimeout, peerTimeout = cfg.peerTimeout, stats = cfg.stats }
src/Haskoin/Store/Web.hs view
@@ -649,11 +649,6 @@ toEncoding toJSON pathCompact- (GetMempool <$> paramOptional <*> parseOffset)- (fmap SerialList . scottyMempool)- toEncoding- toJSON- pathCompact (GetAddrTxs <$> paramCapture <*> parseLimits) (fmap SerialList . scottyAddrTxs) toEncoding@@ -679,8 +674,13 @@ toEncoding toJSON S.get "/events" scottyEvents- S.get "/dbstats" scottyDbStats unless cfg.noSlow $ do+ S.get "/dbstats" scottyDbStats+ pathCompact+ (GetMempool <$> paramOptional <*> parseOffset)+ (fmap SerialList . scottyMempool)+ toEncoding+ toJSON pathCompact (GetBlocks <$> paramRequired <*> paramDef) (fmap SerialList . scottyBlocks)
test/Haskoin/StoreSpec.hs view
@@ -104,6 +104,7 @@ noMempool = False, wipeMempool = False, syncMempool = False,+ mempoolTimeout = 14, peerTimeout = 60, maxPeerLife = 48 * 3600, connect = dummyPeerConnect net ad,