@@ -2,7 +2,11 @@ import { createSlice } from "@reduxjs/toolkit"
2
2
import { PayloadAction } from "@reduxjs/toolkit/dist/createAction"
3
3
import { MintingStep , TbtcStateKey , TbtcState } from "../../types/tbtc"
4
4
import { UpdateStateActionPayload } from "../../types/state"
5
- import { BridgeActivityStatus , BridgeActivity } from "../../threshold-ts/tbtc"
5
+ import {
6
+ BridgeActivityStatus ,
7
+ BridgeActivity ,
8
+ UnminBridgeActivityAdditionalData ,
9
+ } from "../../threshold-ts/tbtc"
6
10
import { featureFlags } from "../../constants"
7
11
import { startAppListening } from "../listener"
8
12
import {
@@ -54,9 +58,10 @@ export const tbtcSlice = createSlice({
54
58
amount : string
55
59
depositor : string
56
60
txHash : string
61
+ blockNumber : number
57
62
} >
58
63
) => {
59
- const { amount, txHash, depositKey } = action . payload
64
+ const { amount, txHash, depositKey, blockNumber } = action . payload
60
65
const history = state . bridgeActivity . data
61
66
const { itemToUpdate } = findActivityByDepositKey ( history , depositKey )
62
67
@@ -66,7 +71,14 @@ export const tbtcSlice = createSlice({
66
71
67
72
// Add item only if there is no item with the same deposit key.
68
73
state . bridgeActivity . data = [
69
- { amount, txHash, status : BridgeActivityStatus . PENDING , depositKey } ,
74
+ {
75
+ amount,
76
+ txHash,
77
+ status : BridgeActivityStatus . PENDING ,
78
+ activityKey : depositKey ,
79
+ bridgeProcess : "mint" ,
80
+ blockNumber,
81
+ } ,
70
82
...state . bridgeActivity . data ,
71
83
]
72
84
} ,
@@ -108,6 +120,45 @@ export const tbtcSlice = createSlice({
108
120
}
109
121
} >
110
122
) => { } ,
123
+ redemptionRequested : (
124
+ state ,
125
+ action : PayloadAction < {
126
+ redemptionKey : string
127
+ blockNumber : number
128
+ amount : string
129
+ txHash : string
130
+ additionalData : UnminBridgeActivityAdditionalData
131
+ } >
132
+ ) => {
133
+ const {
134
+ payload : { amount, redemptionKey, blockNumber, txHash, additionalData } ,
135
+ } = action
136
+
137
+ const { itemToUpdate } = findRedemptionActivity (
138
+ state . bridgeActivity . data ,
139
+ redemptionKey ,
140
+ txHash
141
+ )
142
+
143
+ // Do not update an array if there is already an item with the same
144
+ // redemption key and transaction hash- just in case duplicated Ethereum
145
+ // events.
146
+ if ( itemToUpdate ) return
147
+
148
+ // Add item only if there is no item with the same deposit key.
149
+ state . bridgeActivity . data = [
150
+ {
151
+ amount,
152
+ txHash,
153
+ status : BridgeActivityStatus . PENDING ,
154
+ activityKey : redemptionKey ,
155
+ bridgeProcess : "unmint" ,
156
+ blockNumber,
157
+ additionalData,
158
+ } ,
159
+ ...state . bridgeActivity . data ,
160
+ ]
161
+ } ,
111
162
} ,
112
163
} )
113
164
@@ -116,7 +167,26 @@ function findActivityByDepositKey(
116
167
depositKey : string
117
168
) {
118
169
const activityIndexItemToUpdate = bridgeActivities . findIndex (
119
- ( item ) => item . depositKey === depositKey
170
+ ( item ) => item . activityKey === depositKey
171
+ )
172
+
173
+ if ( activityIndexItemToUpdate < 0 ) return { index : - 1 , itemToUpdate : null }
174
+
175
+ const activityItemToUpdate = bridgeActivities [ activityIndexItemToUpdate ]
176
+
177
+ return {
178
+ index : activityIndexItemToUpdate ,
179
+ itemToUpdate : activityItemToUpdate ,
180
+ }
181
+ }
182
+
183
+ function findRedemptionActivity (
184
+ bridgeActivities : BridgeActivity [ ] ,
185
+ redemptionKey : string ,
186
+ txHash : string
187
+ ) {
188
+ const activityIndexItemToUpdate = bridgeActivities . findIndex (
189
+ ( item ) => item . activityKey === redemptionKey && item . txHash === txHash
120
190
)
121
191
122
192
if ( activityIndexItemToUpdate < 0 ) return { index : - 1 , itemToUpdate : null }
0 commit comments