Skip to content

Commit d4cff60

Browse files
chore: upgrade transaction controller to 35.0.0 (#10263)
Upgrade `TransactionController` from version `13.0.0` to `35.0.0`. Upgrade `ApprovalController` from version `3.5.2` to `7.0.1`.
1 parent 0161aa9 commit d4cff60

File tree

58 files changed

+3985
-4640
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+3985
-4640
lines changed

app/actions/transaction/index.js

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -144,42 +144,6 @@ export function setEtherTransaction(transaction) {
144144
};
145145
}
146146

147-
/**
148-
* Enable individual ERC20 asset only to send in a transaction
149-
*
150-
* @param {object} token - Token object to be sent
151-
*/
152-
export function setIndividualTokenTransaction(token) {
153-
return {
154-
type: 'SET_INDIVIDUAL_TOKEN_TRANSACTION',
155-
token,
156-
};
157-
}
158-
159-
/**
160-
* Enable individual ERC721 asset only to send in a transaction
161-
*
162-
* @param {object} collectible - Collectible object to be sent
163-
*/
164-
export function setIndividualCollectibleTransaction(collectible) {
165-
return {
166-
type: 'SET_INDIVIDUAL_COLLECTIBLE_TRANSACTION',
167-
collectible,
168-
};
169-
}
170-
171-
/**
172-
* Enable selectable ERC721 assets who's current account is owner of a specific contract to be sent in a transaction
173-
*
174-
* @param {object} collectible - Collectible of the type contract collectible that the user wants to send
175-
*/
176-
export function setCollectibleContractTransaction(collectible) {
177-
return {
178-
type: 'SET_COLLECTIBLE_CONTRACT_TRANSACTION',
179-
collectible,
180-
};
181-
}
182-
183147
export function setNonce(nonce) {
184148
return {
185149
type: 'SET_NONCE',

app/components/Nav/Main/RootRPCMethodsUI.js

Lines changed: 62 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect, useCallback } from 'react';
1+
import React, { useState, useEffect, useCallback, useMemo } from 'react';
22

33
import { Alert } from 'react-native';
44
import PropTypes from 'prop-types';
@@ -66,35 +66,48 @@ import { useMetrics } from '../../../components/hooks/useMetrics';
6666
import { selectShouldUseSmartTransaction } from '../../../selectors/smartTransactionsController';
6767
import { STX_NO_HASH_ERROR } from '../../../util/smart-transactions/smart-publish-hook';
6868
import { getSmartTransactionMetricsProperties } from '../../../util/smart-transactions';
69+
import { cloneDeep, isEqual } from 'lodash';
6970

7071
///: BEGIN:ONLY_INCLUDE_IF(preinstalled-snaps,external-snaps)
7172
import InstallSnapApproval from '../../Approvals/InstallSnapApproval';
7273
///: END:ONLY_INCLUDE_IF
7374

7475
const hstInterface = new ethers.utils.Interface(abi);
7576

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 }) => {
8189
const [transactionMetaIdsForListening, setTransactionMetaIdsForListening] =
8290
useState([]);
8391

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();
90103

91104
useEffect(() => {
92105
// Cannot directly call trackSwaps from the event listener in autoSign due to stale closure of swapsTransactions
93106
const [txMetaId, ...restTxMetaIds] = transactionMetaIdsForListening;
94107

95108
if (txMetaId && swapsTransactions[txMetaId]) {
96-
TransactionController.hub.once(
97-
`${txMetaId}:confirmed`,
109+
Engine.controllerMessenger.subscribeOnceIf(
110+
'TransactionController:transactionConfirmed',
98111
(transactionMeta) => {
99112
if (
100113
swapsTransactions[transactionMeta.id]?.analytics &&
@@ -107,15 +120,11 @@ export const useSwapConfirmedEvent = ({
107120
);
108121
}
109122
},
123+
(transactionMeta) => transactionMeta.id === txMetaId,
110124
);
111125
setTransactionMetaIdsForListening(restTxMetaIds);
112126
}
113-
}, [
114-
trackSwaps,
115-
transactionMetaIdsForListening,
116-
swapsTransactions,
117-
TransactionController,
118-
]);
127+
}, [trackSwaps, transactionMetaIdsForListening, swapsTransactions]);
119128

120129
return {
121130
addTransactionMetaIdForListening,
@@ -152,29 +161,25 @@ const RootRPCMethodsUI = (props) => {
152161
TransactionController.state.transactions.find(
153162
({ id }) => id === approvalTransactionMetaId,
154163
);
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-
);
165164

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+
]);
171178
let approvalReceipt;
172179
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+
]);
178183
}
179184
const tokensReceived = swapsUtils.getSwapsTokensReceived(
180185
receipt,
@@ -191,8 +196,8 @@ const RootRPCMethodsUI = (props) => {
191196
newSwapsTransactions[transactionMeta.id].receivedDestinationAmount =
192197
new BigNumber(tokensReceived, 16).toString(10);
193198
}
194-
TransactionController.update({
195-
swapsTransactions: newSwapsTransactions,
199+
TransactionController.update((state) => {
200+
state.swapsTransactions = newSwapsTransactions;
196201
});
197202

198203
const timeToMine = currentBlock.timestamp - sentAt;
@@ -253,19 +258,19 @@ const RootRPCMethodsUI = (props) => {
253258
);
254259

255260
const { addTransactionMetaIdForListening } = useSwapConfirmedEvent({
256-
TransactionController: Engine.context.TransactionController,
257-
swapsTransactions: props.swapsTransactions,
258261
trackSwaps,
259262
});
260263

264+
const swapsTransactions = useSwapsTransactions();
265+
261266
const autoSign = useCallback(
262267
async (transactionMeta) => {
263-
const { TransactionController, KeyringController } = Engine.context;
264-
const swapsTransactions = props.swapsTransactions;
268+
const { KeyringController } = Engine.context;
269+
const { id: transactionId } = transactionMeta;
265270

266271
try {
267-
TransactionController.hub.once(
268-
`${transactionMeta.id}:finished`,
272+
Engine.controllerMessenger.subscribeOnceIf(
273+
'TransactionController:transactionFinished',
269274
(transactionMeta) => {
270275
if (transactionMeta.status === 'submitted') {
271276
NotificationManager.watchSubmittedTransaction({
@@ -283,6 +288,7 @@ const RootRPCMethodsUI = (props) => {
283288
throw transactionMeta.error;
284289
}
285290
},
291+
(transactionMeta) => transactionMeta.id === transactionId,
286292
);
287293

288294
// Queue txMetaId to listen for confirmation event
@@ -331,13 +337,15 @@ const RootRPCMethodsUI = (props) => {
331337
props.navigation,
332338
trackSwaps,
333339
trackEvent,
334-
props.swapsTransactions,
340+
swapsTransactions,
335341
addTransactionMetaIdForListening,
336342
],
337343
);
338344

339345
const onUnapprovedTransaction = useCallback(
340-
async (transactionMeta) => {
346+
async (transactionMetaOriginal) => {
347+
const transactionMeta = cloneDeep(transactionMetaOriginal);
348+
341349
if (transactionMeta.origin === TransactionTypes.MMM) return;
342350

343351
const to = transactionMeta.txParams.to?.toLowerCase();
@@ -404,7 +412,6 @@ const RootRPCMethodsUI = (props) => {
404412
transactionMeta.txParams.to = toAddress;
405413

406414
setTransactionObject({
407-
type: 'INDIVIDUAL_TOKEN_TRANSACTION',
408415
selectedAsset: asset,
409416
id: transactionMeta.id,
410417
origin: transactionMeta.origin,
@@ -448,13 +455,13 @@ const RootRPCMethodsUI = (props) => {
448455

449456
// unapprovedTransaction effect
450457
useEffect(() => {
451-
Engine.context.TransactionController.hub.on(
452-
'unapprovedTransaction',
458+
Engine.controllerMessenger.subscribe(
459+
'TransactionController:unapprovedTransactionAdded',
453460
onUnapprovedTransaction,
454461
);
455462
return () => {
456-
Engine.context.TransactionController.hub.removeListener(
457-
'unapprovedTransaction',
463+
Engine.controllerMessenger.unsubscribe(
464+
'TransactionController:unapprovedTransactionAdded',
458465
onUnapprovedTransaction,
459466
);
460467
};
@@ -498,7 +505,6 @@ const RootRPCMethodsUI = (props) => {
498505
};
499506

500507
RootRPCMethodsUI.propTypes = {
501-
swapsTransactions: PropTypes.object,
502508
/**
503509
* Object that represents the navigator
504510
*/
@@ -533,8 +539,6 @@ const mapStateToProps = (state) => ({
533539
selectedAddress: selectSelectedInternalAccountChecksummedAddress(state),
534540
chainId: selectChainId(state),
535541
tokens: selectTokens(state),
536-
swapsTransactions:
537-
state.engine.backgroundState.TransactionController.swapsTransactions || {},
538542
providerType: selectProviderType(state),
539543
shouldUseSmartTransaction: selectShouldUseSmartTransaction(state),
540544
});

app/components/Nav/Main/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ const Main = (props) => {
151151
const checkInfuraAvailability = useCallback(async () => {
152152
if (props.providerType !== 'rpc') {
153153
try {
154-
const { TransactionController } = Engine.context;
155-
await query(TransactionController.ethQuery, 'blockNumber', []);
154+
const ethQuery = Engine.getGlobalEthQuery();
155+
await query(ethQuery, 'blockNumber', []);
156156
props.setInfuraAvailabilityNotBlocked();
157157
} catch (e) {
158158
if (e.message === AppConstants.ERRORS.INFURA_BLOCKED_MESSAGE) {

0 commit comments

Comments
 (0)