1
1
{-# LANGUAGE DataKinds #-}
2
2
{-# LANGUAGE FlexibleContexts #-}
3
+ {-# LANGUAGE NamedFieldPuns #-}
4
+ {-# LANGUAGE RankNTypes #-}
3
5
4
6
module Cardano.Wallet.Deposit.Pure.API.TxHistory
5
7
( ByCustomer
@@ -10,6 +12,9 @@ module Cardano.Wallet.Deposit.Pure.API.TxHistory
10
12
, TxHistory (.. )
11
13
, firstJust
12
14
, transfers
15
+ , ResolveValueTransfer
16
+ , rollForward
17
+ , getEraSlotOfBlock
13
18
)
14
19
where
15
20
@@ -19,8 +24,9 @@ import Cardano.Wallet.Deposit.Map
19
24
( F
20
25
, Map (.. )
21
26
, W
27
+ , singletonFinger
28
+ , singletonMap
22
29
)
23
-
24
30
import Cardano.Wallet.Deposit.Pure.Address
25
31
( Customer
26
32
)
@@ -29,15 +35,27 @@ import Cardano.Wallet.Deposit.Pure.UTxO.ValueTransfer
29
35
)
30
36
import Cardano.Wallet.Deposit.Read
31
37
( Address
38
+ , WithOrigin (.. )
39
+ , getEraBHeader
40
+ , getEraSlotNo
41
+ , getEraTransactions
32
42
)
33
43
import Cardano.Wallet.Read
34
- ( Slot
44
+ ( Block
45
+ , EraValue (.. )
46
+ , IsEra
47
+ , Slot
48
+ , Tx
35
49
, TxId
36
- , WithOrigin
50
+ , applyEraFun
51
+ , getTxId
37
52
)
38
53
import Data.Foldable
39
54
( Foldable (.. )
40
55
)
56
+ import Data.Maybe
57
+ ( maybeToList
58
+ )
41
59
import Data.Monoid
42
60
( First (.. )
43
61
)
@@ -48,10 +66,13 @@ import Data.Time
48
66
( UTCTime
49
67
)
50
68
69
+ import qualified Data.Map.Strict as Map
70
+
51
71
firstJust :: a -> First a
52
72
firstJust = First . Just
53
73
54
- transfers :: Foldable (Map xs ) => Map xs ValueTransfer -> ValueTransfer
74
+ transfers
75
+ :: Foldable (Map xs ) => Map xs ValueTransfer -> ValueTransfer
55
76
transfers = fold
56
77
57
78
type DownTime = Down (WithOrigin UTCTime )
@@ -85,3 +106,49 @@ instance Monoid TxHistory where
85
106
86
107
type ResolveAddress = Address -> Maybe Customer
87
108
type ResolveSlot = Slot -> Maybe DownTime
109
+ type ResolveValueTransfer =
110
+ forall era . IsEra era = > Tx era -> Map. Map Address ValueTransfer
111
+
112
+ getEraSlotOfBlock :: IsEra era => Block era -> Slot
113
+ getEraSlotOfBlock = At . getEraSlotNo . getEraBHeader
114
+
115
+ rollForward
116
+ :: ResolveValueTransfer
117
+ -> ResolveAddress
118
+ -> ResolveSlot
119
+ -> EraValue Block
120
+ -> TxHistory
121
+ -> TxHistory
122
+ rollForward resolveValueTransfer resolveAddress resolveSlot block =
123
+ (<> txHistory')
124
+ where
125
+ txHistory' =
126
+ applyEraFun
127
+ (blockToTxHistory resolveValueTransfer resolveAddress resolveSlot)
128
+ block
129
+
130
+ blockToTxHistory
131
+ :: IsEra era
132
+ => ResolveValueTransfer
133
+ -> ResolveAddress
134
+ -> ResolveSlot
135
+ -> Block era
136
+ -> TxHistory
137
+ blockToTxHistory resolveValueTransfer resolveAddress resolveSlot block =
138
+ fold $ do
139
+ tx <- getEraTransactions block
140
+ let slot = getEraSlotOfBlock block
141
+ time <- maybeToList $ resolveSlot slot
142
+ (address, valueTransfer) <- Map. toAscList $ resolveValueTransfer tx
143
+ customer <- maybeToList $ resolveAddress address
144
+ let byTime =
145
+ singletonFinger () time
146
+ $ singletonMap (First $ Just slot) customer
147
+ $ singletonMap (First $ Just address) (getTxId tx)
148
+ $ Value valueTransfer
149
+ let byCustomer =
150
+ singletonMap () customer
151
+ $ singletonFinger (First $ Just address) time
152
+ $ singletonMap (First $ Just slot) (getTxId tx)
153
+ $ Value valueTransfer
154
+ pure $ TxHistory {byCustomer, byTime}
0 commit comments