From 67268875b3752603c7e6c36c7f5f2245736ed2ab Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Wed, 21 Jan 2026 21:29:40 -0600 Subject: [PATCH 1/4] feat(bridge-status): add polling for Tron same-chain swaps Tron swaps use async settlement and need polling to get the destination tx hash. This is used to filter duplicate receive transactions in the activity list. --- packages/bridge-controller/src/index.ts | 1 + .../src/bridge-status-controller.test.ts | 4 ++-- .../src/bridge-status-controller.ts | 12 +++++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/bridge-controller/src/index.ts b/packages/bridge-controller/src/index.ts index 714397be2a2..4be51a55a0e 100644 --- a/packages/bridge-controller/src/index.ts +++ b/packages/bridge-controller/src/index.ts @@ -119,6 +119,7 @@ export { isNativeAddress, isSolanaChainId, isBitcoinChainId, + isTronChainId, isNonEvmChainId, getNativeAssetForChainId, getDefaultBridgeControllerState, diff --git a/packages/bridge-status-controller/src/bridge-status-controller.test.ts b/packages/bridge-status-controller/src/bridge-status-controller.test.ts index d9695b5dfe9..53175b1b54f 100644 --- a/packages/bridge-status-controller/src/bridge-status-controller.test.ts +++ b/packages/bridge-status-controller/src/bridge-status-controller.test.ts @@ -2275,8 +2275,8 @@ describe('BridgeStatusController', () => { expect(mockMessengerCall.mock.calls).toMatchSnapshot(); expect(result).toMatchSnapshot(); - // Swaps don't start polling (only bridges do) - expect(startPollingForBridgeTxStatusSpy).toHaveBeenCalledTimes(0); + // Tron swaps start polling for async settlement + expect(startPollingForBridgeTxStatusSpy).toHaveBeenCalledTimes(1); expect(controller.state.txHistory[result.id]).toMatchSnapshot(); }); diff --git a/packages/bridge-status-controller/src/bridge-status-controller.ts b/packages/bridge-status-controller/src/bridge-status-controller.ts index 555dde64118..947bdf5467c 100644 --- a/packages/bridge-status-controller/src/bridge-status-controller.ts +++ b/packages/bridge-status-controller/src/bridge-status-controller.ts @@ -15,6 +15,7 @@ import { UnifiedSwapBridgeEventName, formatChainIdToCaip, isCrossChain, + isTronChainId, isEvmTxData, isHardwareWallet, MetricsActionType, @@ -252,6 +253,10 @@ export class BridgeStatusController extends StaticIntervalPollingController Date: Thu, 22 Jan 2026 11:52:15 -0600 Subject: [PATCH 2/4] fix: handle Tron same-chain swap polling and metrics --- .../bridge-status-controller.test.ts.snap | 7 --- .../src/bridge-status-controller.ts | 52 +++++++++---------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap b/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap index a3a47e29fa4..dab18481ab5 100644 --- a/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap +++ b/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap @@ -4609,13 +4609,6 @@ Array [ "snapId": "npm:@metamask/tron-snap", }, ], - Array [ - "AccountsController:getAccountByAddress", - "TRX123...", - ], - Array [ - "TransactionController:getState", - ], ] `; diff --git a/packages/bridge-status-controller/src/bridge-status-controller.ts b/packages/bridge-status-controller/src/bridge-status-controller.ts index 947bdf5467c..7ca97013ac6 100644 --- a/packages/bridge-status-controller/src/bridge-status-controller.ts +++ b/packages/bridge-status-controller/src/bridge-status-controller.ts @@ -253,10 +253,6 @@ export class BridgeStatusController extends StaticIntervalPollingController { - const isBridgeTx = isCrossChain( - historyItem.quote.srcChainId, - historyItem.quote.destChainId, - ); - return isBridgeTx; + return this.#shouldPollHistoryItem(historyItem, historyItem.txMetaId); }); incompleteHistoryItems.forEach((historyItem) => { @@ -512,21 +499,30 @@ export class BridgeStatusController extends StaticIntervalPollingController { + const isIntent = txMetaId.startsWith('intent:'); + const isBridgeTx = isCrossChain( + historyItem.quote.srcChainId, + historyItem.quote.destChainId, + ); + + // Tron same-chain swaps use async settlement and need polling + const isTronSameChainSwap = + !isBridgeTx && !isIntent && isTronChainId(historyItem.quote.srcChainId); + + return isBridgeTx || isIntent || isTronSameChainSwap; + }; + /** * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx() * For Solana swap/bridge we start polling in submitTx() @@ -1400,6 +1396,8 @@ export class BridgeStatusController extends StaticIntervalPollingController Date: Thu, 22 Jan 2026 16:06:45 -0600 Subject: [PATCH 3/4] changelog --- packages/bridge-status-controller/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/bridge-status-controller/CHANGELOG.md b/packages/bridge-status-controller/CHANGELOG.md index e8f277378a9..8b942a9c497 100644 --- a/packages/bridge-status-controller/CHANGELOG.md +++ b/packages/bridge-status-controller/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `@metamask/bridge-controller` from `^64.5.1` to `^64.7.0` ([#7667](https://github.com/MetaMask/core/pull/7667), [#7672](https://github.com/MetaMask/core/pull/7672), [#7694](https://github.com/MetaMask/core/pull/7694)) +### Fixed + +- Fix Tron same-chain swap polling and Completed event tracking ([#7697](https://github.com/MetaMask/core/pull/7697)) + ## [64.4.3] ### Changed From 550957810e4edef874388e6bbe97f4a67d10f1d4 Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Fri, 23 Jan 2026 10:44:32 -0600 Subject: [PATCH 4/4] fix: changelog --- packages/bridge-controller/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index c26d8aba4ab..f9ab75f2027 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Export `isTronChainId` from the package entrypoint ([#7697](https://github.com/MetaMask/core/pull/7697)) + ## [64.7.0] ### Changed