@@ -16,8 +16,11 @@ import type {
16
16
TransactionEventHandlerRequest ,
17
17
TransactionMetricsBuilder ,
18
18
} from '../types' ;
19
- import Logger from '../../../../../util/Logger' ;
20
19
import { getMetaMaskPayProperties } from '../event_properties/metamask-pay' ;
20
+ import Engine from '../../../Engine' ;
21
+ import { createProjectLogger } from '@metamask/utils' ;
22
+
23
+ const log = createProjectLogger ( 'transaction-metrics' ) ;
21
24
22
25
const METRICS_BUILDERS : TransactionMetricsBuilder [ ] = [
23
26
getMetaMaskPayProperties ,
@@ -30,51 +33,57 @@ const createTransactionEventHandler =
30
33
transactionMeta : TransactionMeta ,
31
34
transactionEventHandlerRequest : TransactionEventHandlerRequest ,
32
35
) => {
33
- const defaultTransactionMetricProperties =
34
- await generateDefaultTransactionMetrics (
35
- eventType ,
36
- transactionMeta ,
37
- transactionEventHandlerRequest ,
38
- ) ;
39
-
40
- const metrics = {
41
- properties : defaultTransactionMetricProperties . properties ,
42
- sensitiveProperties :
43
- defaultTransactionMetricProperties . sensitiveProperties ,
44
- } ;
36
+ try {
37
+ const defaultTransactionMetricProperties =
38
+ await generateDefaultTransactionMetrics (
39
+ eventType ,
40
+ transactionMeta ,
41
+ transactionEventHandlerRequest ,
42
+ ) ;
45
43
46
- const allTransactions =
47
- transactionEventHandlerRequest . getState ( ) ?. engine ?. backgroundState
48
- ?. TransactionController ?. transactions ?? [ ] ;
44
+ const metrics = {
45
+ properties : defaultTransactionMetricProperties . properties ,
46
+ sensitiveProperties :
47
+ defaultTransactionMetricProperties . sensitiveProperties ,
48
+ } ;
49
49
50
- const getUIMetrics = getConfirmationMetricProperties . bind (
51
- null ,
52
- transactionEventHandlerRequest . getState ,
53
- ) ;
50
+ const allTransactions =
51
+ transactionEventHandlerRequest . getState ( ) ?. engine ?. backgroundState
52
+ ?. TransactionController ?. transactions ?? [ ] ;
54
53
55
- const getState = transactionEventHandlerRequest . getState ;
54
+ const getUIMetrics = getConfirmationMetricProperties . bind (
55
+ null ,
56
+ transactionEventHandlerRequest . getState ,
57
+ ) ;
56
58
57
- for ( const builder of METRICS_BUILDERS ) {
58
- try {
59
- const currentMetrics = builder ( {
60
- transactionMeta,
61
- allTransactions,
62
- getUIMetrics,
63
- getState,
64
- } ) ;
65
-
66
- merge ( metrics , currentMetrics ) ;
67
- } catch ( error ) {
68
- // Intentionally empty
59
+ const getState = transactionEventHandlerRequest . getState ;
60
+
61
+ for ( const builder of METRICS_BUILDERS ) {
62
+ try {
63
+ const currentMetrics = builder ( {
64
+ transactionMeta,
65
+ allTransactions,
66
+ getUIMetrics,
67
+ getState,
68
+ } ) ;
69
+
70
+ merge ( metrics , currentMetrics ) ;
71
+ } catch ( error ) {
72
+ // Intentionally empty
73
+ }
69
74
}
70
- }
71
75
72
- const event = generateEvent ( {
73
- ...defaultTransactionMetricProperties ,
74
- ...metrics ,
75
- } ) ;
76
+ const event = generateEvent ( {
77
+ ...defaultTransactionMetricProperties ,
78
+ ...metrics ,
79
+ } ) ;
76
80
77
- MetaMetrics . getInstance ( ) . trackEvent ( event ) ;
81
+ log ( 'Event' , event ) ;
82
+
83
+ MetaMetrics . getInstance ( ) . trackEvent ( event ) ;
84
+ } catch ( error ) {
85
+ log ( 'Error in transaction event handler' , error ) ;
86
+ }
78
87
} ;
79
88
80
89
/**
@@ -125,55 +134,91 @@ export async function handleTransactionFinalizedEventForMetrics(
125
134
transactionMeta : TransactionMeta ,
126
135
transactionEventHandlerRequest : TransactionEventHandlerRequest ,
127
136
) : Promise < void > {
128
- // Generate default properties
129
- const defaultTransactionMetricProperties =
130
- await generateDefaultTransactionMetrics (
131
- TRANSACTION_EVENTS . TRANSACTION_FINALIZED ,
132
- transactionMeta ,
133
- transactionEventHandlerRequest ,
134
- ) ;
135
-
136
- // Generate smart transaction properties if applicable
137
- let smartTransactionProperties = { properties : { } , sensitiveProperties : { } } ;
138
137
try {
139
- const { getState, initMessenger, smartTransactionsController } =
140
- transactionEventHandlerRequest ;
141
- const shouldUseSmartTransaction = selectShouldUseSmartTransaction (
142
- getState ( ) ,
143
- transactionMeta . chainId ,
144
- ) ;
145
- if ( shouldUseSmartTransaction ) {
146
- const smartMetrics = await getSmartTransactionMetricsProperties (
147
- smartTransactionsController ,
138
+ if (
139
+ retryIfEngineNotInitialized ( ( ) => {
140
+ handleTransactionFinalizedEventForMetrics (
141
+ transactionMeta ,
142
+ transactionEventHandlerRequest ,
143
+ ) ;
144
+ } )
145
+ ) {
146
+ return ;
147
+ }
148
+
149
+ // Generate default properties
150
+ const defaultTransactionMetricProperties =
151
+ await generateDefaultTransactionMetrics (
152
+ TRANSACTION_EVENTS . TRANSACTION_FINALIZED ,
148
153
transactionMeta ,
149
- true ,
150
- initMessenger as unknown as BaseControllerMessenger ,
154
+ transactionEventHandlerRequest ,
151
155
) ;
152
- smartTransactionProperties = {
153
- properties : smartMetrics ,
154
- sensitiveProperties : { } ,
155
- } ;
156
+
157
+ // Generate smart transaction properties if applicable
158
+ let smartTransactionProperties = {
159
+ properties : { } ,
160
+ sensitiveProperties : { } ,
161
+ } ;
162
+ try {
163
+ const { getState, initMessenger, smartTransactionsController } =
164
+ transactionEventHandlerRequest ;
165
+ const shouldUseSmartTransaction = selectShouldUseSmartTransaction (
166
+ getState ( ) ,
167
+ transactionMeta . chainId ,
168
+ ) ;
169
+ if ( shouldUseSmartTransaction ) {
170
+ const smartMetrics = await getSmartTransactionMetricsProperties (
171
+ smartTransactionsController ,
172
+ transactionMeta ,
173
+ true ,
174
+ initMessenger as unknown as BaseControllerMessenger ,
175
+ ) ;
176
+ smartTransactionProperties = {
177
+ properties : smartMetrics ,
178
+ sensitiveProperties : { } ,
179
+ } ;
180
+ }
181
+ } catch ( error ) {
182
+ log ( 'Error getting smart transaction metrics' , error ) ;
156
183
}
184
+
185
+ // Add RPC properties
186
+ const rpcProperties = generateRPCProperties ( transactionMeta . chainId ) ;
187
+
188
+ // Merge default, smart transaction, and RPC properties
189
+ const mergedEventProperties = merge (
190
+ { } ,
191
+ defaultTransactionMetricProperties ,
192
+ smartTransactionProperties ,
193
+ {
194
+ properties : rpcProperties . properties ,
195
+ sensitiveProperties : rpcProperties . sensitiveProperties ,
196
+ } ,
197
+ ) ;
198
+
199
+ // Generate and track the event
200
+ const event = generateEvent ( mergedEventProperties ) ;
201
+
202
+ log ( 'Finalized event' , event ) ;
203
+
204
+ MetaMetrics . getInstance ( ) . trackEvent ( event ) ;
157
205
} catch ( error ) {
158
- Logger . log ( 'Error getting smart transaction metrics: ' , error ) ;
206
+ log ( 'Error in finalized transaction event handler ' , error ) ;
159
207
}
208
+ }
160
209
161
- // Add RPC properties
162
- const rpcProperties = generateRPCProperties ( transactionMeta . chainId ) ;
163
-
164
- // Merge default, smart transaction, and RPC properties
165
- const mergedEventProperties = merge (
166
- { } ,
167
- defaultTransactionMetricProperties ,
168
- smartTransactionProperties ,
169
- {
170
- properties : rpcProperties . properties ,
171
- sensitiveProperties : rpcProperties . sensitiveProperties ,
172
- } ,
173
- ) ;
210
+ function retryIfEngineNotInitialized ( fn : ( ) => void ) : boolean {
211
+ try {
212
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
213
+ const { context } = Engine ;
214
+ return false ;
215
+ } catch ( e ) {
216
+ log ( 'Transaction controller event before engine initialized' ) ;
174
217
175
- // Generate and track the event
176
- const event = generateEvent ( mergedEventProperties ) ;
218
+ setTimeout ( ( ) => {
219
+ fn ( ) ;
220
+ } , 5000 ) ;
177
221
178
- MetaMetrics . getInstance ( ) . trackEvent ( event ) ;
222
+ return true ;
223
+ }
179
224
}
0 commit comments