1
- import React , { useState , useEffect , useCallback } from 'react' ;
1
+ import React , { useState , useEffect , useCallback , useMemo } from 'react' ;
2
2
3
3
import { Alert } from 'react-native' ;
4
4
import PropTypes from 'prop-types' ;
@@ -66,35 +66,48 @@ import { useMetrics } from '../../../components/hooks/useMetrics';
66
66
import { selectShouldUseSmartTransaction } from '../../../selectors/smartTransactionsController' ;
67
67
import { STX_NO_HASH_ERROR } from '../../../util/smart-transactions/smart-publish-hook' ;
68
68
import { getSmartTransactionMetricsProperties } from '../../../util/smart-transactions' ;
69
+ import { cloneDeep , isEqual } from 'lodash' ;
69
70
70
71
///: BEGIN:ONLY_INCLUDE_IF(preinstalled-snaps,external-snaps)
71
72
import InstallSnapApproval from '../../Approvals/InstallSnapApproval' ;
72
73
///: END:ONLY_INCLUDE_IF
73
74
74
75
const hstInterface = new ethers . utils . Interface ( abi ) ;
75
76
76
- export const useSwapConfirmedEvent = ( {
77
- TransactionController,
78
- swapsTransactions,
79
- trackSwaps,
80
- } ) => {
77
+ function useSwapsTransactions ( ) {
78
+ const swapTransactions = useSelector (
79
+ ( state ) =>
80
+ state . engine . backgroundState . TransactionController . swapsTransactions ,
81
+ isEqual ,
82
+ ) ;
83
+
84
+ // Memo prevents fresh fallback empty object on every render.
85
+ return useMemo ( ( ) => swapTransactions ?? { } , [ swapTransactions ] ) ;
86
+ }
87
+
88
+ export const useSwapConfirmedEvent = ( { trackSwaps } ) => {
81
89
const [ transactionMetaIdsForListening , setTransactionMetaIdsForListening ] =
82
90
useState ( [ ] ) ;
83
91
84
- const addTransactionMetaIdForListening = ( txMetaId ) => {
85
- setTransactionMetaIdsForListening ( [
86
- ...transactionMetaIdsForListening ,
87
- txMetaId ,
88
- ] ) ;
89
- } ;
92
+ const addTransactionMetaIdForListening = useCallback (
93
+ ( txMetaId ) => {
94
+ setTransactionMetaIdsForListening ( [
95
+ ...transactionMetaIdsForListening ,
96
+ txMetaId ,
97
+ ] ) ;
98
+ } ,
99
+ [ transactionMetaIdsForListening ] ,
100
+ ) ;
101
+
102
+ const swapsTransactions = useSwapsTransactions ( ) ;
90
103
91
104
useEffect ( ( ) => {
92
105
// Cannot directly call trackSwaps from the event listener in autoSign due to stale closure of swapsTransactions
93
106
const [ txMetaId , ...restTxMetaIds ] = transactionMetaIdsForListening ;
94
107
95
108
if ( txMetaId && swapsTransactions [ txMetaId ] ) {
96
- TransactionController . hub . once (
97
- ` ${ txMetaId } :confirmed` ,
109
+ Engine . controllerMessenger . subscribeOnceIf (
110
+ 'TransactionController:transactionConfirmed' ,
98
111
( transactionMeta ) => {
99
112
if (
100
113
swapsTransactions [ transactionMeta . id ] ?. analytics &&
@@ -107,15 +120,11 @@ export const useSwapConfirmedEvent = ({
107
120
) ;
108
121
}
109
122
} ,
123
+ ( transactionMeta ) => transactionMeta . id === txMetaId ,
110
124
) ;
111
125
setTransactionMetaIdsForListening ( restTxMetaIds ) ;
112
126
}
113
- } , [
114
- trackSwaps ,
115
- transactionMetaIdsForListening ,
116
- swapsTransactions ,
117
- TransactionController ,
118
- ] ) ;
127
+ } , [ trackSwaps , transactionMetaIdsForListening , swapsTransactions ] ) ;
119
128
120
129
return {
121
130
addTransactionMetaIdForListening,
@@ -152,29 +161,25 @@ const RootRPCMethodsUI = (props) => {
152
161
TransactionController . state . transactions . find (
153
162
( { id } ) => id === approvalTransactionMetaId ,
154
163
) ;
155
- const ethBalance = await query (
156
- TransactionController . ethQuery ,
157
- 'getBalance' ,
158
- [ props . selectedAddress ] ,
159
- ) ;
160
- const receipt = await query (
161
- TransactionController . ethQuery ,
162
- 'getTransactionReceipt' ,
163
- [ transactionMeta . hash ] ,
164
- ) ;
165
164
166
- const currentBlock = await query (
167
- TransactionController . ethQuery ,
168
- 'getBlockByHash' ,
169
- [ receipt . blockHash , false ] ,
170
- ) ;
165
+ const ethQuery = Engine . getGlobalEthQuery ( ) ;
166
+
167
+ const ethBalance = await query ( ethQuery , 'getBalance' , [
168
+ props . selectedAddress ,
169
+ ] ) ;
170
+ const receipt = await query ( ethQuery , 'getTransactionReceipt' , [
171
+ transactionMeta . hash ,
172
+ ] ) ;
173
+
174
+ const currentBlock = await query ( ethQuery , 'getBlockByHash' , [
175
+ receipt . blockHash ,
176
+ false ,
177
+ ] ) ;
171
178
let approvalReceipt ;
172
179
if ( approvalTransaction ?. hash ) {
173
- approvalReceipt = await query (
174
- TransactionController . ethQuery ,
175
- 'getTransactionReceipt' ,
176
- [ approvalTransaction . hash ] ,
177
- ) ;
180
+ approvalReceipt = await query ( ethQuery , 'getTransactionReceipt' , [
181
+ approvalTransaction . hash ,
182
+ ] ) ;
178
183
}
179
184
const tokensReceived = swapsUtils . getSwapsTokensReceived (
180
185
receipt ,
@@ -191,8 +196,8 @@ const RootRPCMethodsUI = (props) => {
191
196
newSwapsTransactions [ transactionMeta . id ] . receivedDestinationAmount =
192
197
new BigNumber ( tokensReceived , 16 ) . toString ( 10 ) ;
193
198
}
194
- TransactionController . update ( {
195
- swapsTransactions : newSwapsTransactions ,
199
+ TransactionController . update ( ( state ) => {
200
+ state . swapsTransactions = newSwapsTransactions ;
196
201
} ) ;
197
202
198
203
const timeToMine = currentBlock . timestamp - sentAt ;
@@ -253,19 +258,19 @@ const RootRPCMethodsUI = (props) => {
253
258
) ;
254
259
255
260
const { addTransactionMetaIdForListening } = useSwapConfirmedEvent ( {
256
- TransactionController : Engine . context . TransactionController ,
257
- swapsTransactions : props . swapsTransactions ,
258
261
trackSwaps,
259
262
} ) ;
260
263
264
+ const swapsTransactions = useSwapsTransactions ( ) ;
265
+
261
266
const autoSign = useCallback (
262
267
async ( transactionMeta ) => {
263
- const { TransactionController , KeyringController } = Engine . context ;
264
- const swapsTransactions = props . swapsTransactions ;
268
+ const { KeyringController } = Engine . context ;
269
+ const { id : transactionId } = transactionMeta ;
265
270
266
271
try {
267
- TransactionController . hub . once (
268
- ` ${ transactionMeta . id } :finished` ,
272
+ Engine . controllerMessenger . subscribeOnceIf (
273
+ 'TransactionController:transactionFinished' ,
269
274
( transactionMeta ) => {
270
275
if ( transactionMeta . status === 'submitted' ) {
271
276
NotificationManager . watchSubmittedTransaction ( {
@@ -283,6 +288,7 @@ const RootRPCMethodsUI = (props) => {
283
288
throw transactionMeta . error ;
284
289
}
285
290
} ,
291
+ ( transactionMeta ) => transactionMeta . id === transactionId ,
286
292
) ;
287
293
288
294
// Queue txMetaId to listen for confirmation event
@@ -331,13 +337,15 @@ const RootRPCMethodsUI = (props) => {
331
337
props . navigation ,
332
338
trackSwaps ,
333
339
trackEvent ,
334
- props . swapsTransactions ,
340
+ swapsTransactions ,
335
341
addTransactionMetaIdForListening ,
336
342
] ,
337
343
) ;
338
344
339
345
const onUnapprovedTransaction = useCallback (
340
- async ( transactionMeta ) => {
346
+ async ( transactionMetaOriginal ) => {
347
+ const transactionMeta = cloneDeep ( transactionMetaOriginal ) ;
348
+
341
349
if ( transactionMeta . origin === TransactionTypes . MMM ) return ;
342
350
343
351
const to = transactionMeta . txParams . to ?. toLowerCase ( ) ;
@@ -404,7 +412,6 @@ const RootRPCMethodsUI = (props) => {
404
412
transactionMeta . txParams . to = toAddress ;
405
413
406
414
setTransactionObject ( {
407
- type : 'INDIVIDUAL_TOKEN_TRANSACTION' ,
408
415
selectedAsset : asset ,
409
416
id : transactionMeta . id ,
410
417
origin : transactionMeta . origin ,
@@ -448,13 +455,13 @@ const RootRPCMethodsUI = (props) => {
448
455
449
456
// unapprovedTransaction effect
450
457
useEffect ( ( ) => {
451
- Engine . context . TransactionController . hub . on (
452
- 'unapprovedTransaction ' ,
458
+ Engine . controllerMessenger . subscribe (
459
+ 'TransactionController:unapprovedTransactionAdded ' ,
453
460
onUnapprovedTransaction ,
454
461
) ;
455
462
return ( ) => {
456
- Engine . context . TransactionController . hub . removeListener (
457
- 'unapprovedTransaction ' ,
463
+ Engine . controllerMessenger . unsubscribe (
464
+ 'TransactionController:unapprovedTransactionAdded ' ,
458
465
onUnapprovedTransaction ,
459
466
) ;
460
467
} ;
@@ -498,7 +505,6 @@ const RootRPCMethodsUI = (props) => {
498
505
} ;
499
506
500
507
RootRPCMethodsUI . propTypes = {
501
- swapsTransactions : PropTypes . object ,
502
508
/**
503
509
* Object that represents the navigator
504
510
*/
@@ -533,8 +539,6 @@ const mapStateToProps = (state) => ({
533
539
selectedAddress : selectSelectedInternalAccountChecksummedAddress ( state ) ,
534
540
chainId : selectChainId ( state ) ,
535
541
tokens : selectTokens ( state ) ,
536
- swapsTransactions :
537
- state . engine . backgroundState . TransactionController . swapsTransactions || { } ,
538
542
providerType : selectProviderType ( state ) ,
539
543
shouldUseSmartTransaction : selectShouldUseSmartTransaction ( state ) ,
540
544
} ) ;
0 commit comments