Skip to content
Draft
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e51cfbe
feat: improve token detection
salimtb Dec 5, 2025
13b9baa
fix: clean token balances
salimtb Dec 5, 2025
72d64e7
Merge branch 'main' into feat/improve-token-detection
salimtb Dec 8, 2025
04bee5e
fix: clean up
salimtb Dec 8, 2025
772e48d
fix: fix unit tests
salimtb Dec 8, 2025
d72ecd2
Fix: clean up
salimtb Dec 8, 2025
906f515
fix: fix tests
salimtb Dec 8, 2025
a99fabb
fix: clean up
salimtb Dec 8, 2025
7cb1afd
fix: clean up
salimtb Dec 8, 2025
1a88361
fix: refacto
salimtb Dec 8, 2025
e6cd79b
fix: fix changelog
salimtb Dec 9, 2025
3f54dda
fix: fix linter
salimtb Dec 9, 2025
94e214c
fix: add unlock logic to balance controllers
salimtb Dec 9, 2025
9538897
Merge branch 'main' into feat/improve-token-detection
salimtb Dec 9, 2025
781b5c9
fix: fix linter
salimtb Dec 9, 2025
8d92115
fix: fix unit tests
salimtb Dec 9, 2025
bb75ce3
fix: fix lintet
salimtb Dec 9, 2025
48caea1
Merge branch 'main' into feat/improve-token-detection
salimtb Dec 9, 2025
c92c27f
fix: fix lint errors
salimtb Dec 9, 2025
ff51333
fix: export action
salimtb Dec 10, 2025
267e79c
fix: fix linter
salimtb Dec 10, 2025
8eaef62
fix: clean up comments
salimtb Dec 10, 2025
d84f849
fix: clean up
salimtb Dec 11, 2025
1c55e69
fix: fix PR comments
salimtb Dec 11, 2025
2d867cd
Merge branch 'main' into feat/improve-token-detection
salimtb Dec 11, 2025
4b18143
fix: fix tests
salimtb Dec 11, 2025
10463da
fix: websocket token detection should match the use token detection t…
salimtb Dec 11, 2025
cb52272
Merge branch 'main' into fix/improve-core-logic
salimtb Dec 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: fix linter
  • Loading branch information
salimtb committed Dec 9, 2025
commit 3f54dda306d90f4af327da452146d0c0ff5fe6b1
46 changes: 25 additions & 21 deletions packages/assets-controllers/src/TokenBalancesController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
// ────────────────────────────────────────────────────────────────────────
// Init helpers

#subscribeToControllers() {
#subscribeToControllers(): void {
this.messenger.subscribe(
'TokensController:stateChange',
(tokensState: TokensControllerState) => {
Expand Down Expand Up @@ -414,7 +414,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
);
}

#registerActions() {
#registerActions(): void {
this.messenger.registerActionHandler(
`TokenBalancesController:updateChainPollingConfigs`,
this.updateChainPollingConfigs.bind(this),
Expand All @@ -433,7 +433,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
* Normalize all account addresses to lowercase and merge duplicates
* Handles migration from old state where addresses might be checksummed.
*/
#normalizeAccountAddresses() {
#normalizeAccountAddresses(): void {
const currentState = this.state.tokenBalances;
const normalizedBalances: TokenBalances = {};

Expand Down Expand Up @@ -490,7 +490,9 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
return new Web3Provider(client.provider);
};

readonly #getNetworkClient = (chainId: ChainIdHex) => {
readonly #getNetworkClient = (
chainId: ChainIdHex,
): ReturnType<NetworkControllerGetNetworkClientByIdAction['handler']> => {
const { networkConfigurationsByChainId } = this.messenger.call(
'NetworkController:getState',
);
Expand Down Expand Up @@ -520,13 +522,13 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
// ────────────────────────────────────────────────────────────────────────
// Polling overrides

override _startPolling({ chainIds }: { chainIds: ChainIdHex[] }) {
override _startPolling({ chainIds }: { chainIds: ChainIdHex[] }): void {
this.#requestedChainIds = [...chainIds];
this.#isControllerPollingActive = true;
this.#startIntervalGroupPolling(chainIds, true);
}

#startIntervalGroupPolling(chainIds: ChainIdHex[], immediate = true) {
#startIntervalGroupPolling(chainIds: ChainIdHex[], immediate = true): void {
this.#intervalPollingTimers.forEach((timer) => clearInterval(timer));
this.#intervalPollingTimers.clear();

Expand All @@ -548,8 +550,8 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
interval: number,
chainIds: ChainIdHex[],
immediate = true,
) {
const pollFunction = async () => {
): void {
const pollFunction = async (): Promise<void> => {
if (!this.#isControllerPollingActive) {
return;
}
Expand Down Expand Up @@ -580,7 +582,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
interval: number,
chainIds: ChainIdHex[],
pollFunction: () => Promise<void>,
) {
): void {
const existingTimer = this.#intervalPollingTimers.get(interval);
if (existingTimer) {
clearInterval(existingTimer);
Expand All @@ -598,7 +600,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
this.#intervalPollingTimers.set(interval, timer);
}

override _stopPollingByPollingTokenSetId(tokenSetId: string) {
override _stopPollingByPollingTokenSetId(tokenSetId: string): void {
let chainsToStop: ChainIdHex[] = [];

try {
Expand All @@ -622,7 +624,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
}
}

#stopAllPolling() {
#stopAllPolling(): void {
this.#isControllerPollingActive = false;
this.#requestedChainIds = [];
this.#intervalPollingTimers.forEach((timer) => clearInterval(timer));
Expand All @@ -643,7 +645,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
}: {
chainIds: ChainIdHex[];
queryAllAccounts?: boolean;
}) {
}): Promise<void> {
await this.updateBalances({ chainIds, queryAllAccounts });
}

Expand Down Expand Up @@ -672,7 +674,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
chainIds?: ChainIdHex[];
tokenAddresses?: string[];
queryAllAccounts?: boolean;
} = {}) {
} = {}): Promise<void> {
const targetChains = this.#getTargetChains(chainIds);
if (!targetChains.length) {
return;
Expand Down Expand Up @@ -1019,7 +1021,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
});
}

async #importUntrackedTokens(balances: ProcessedBalance[]) {
async #importUntrackedTokens(balances: ProcessedBalance[]): Promise<void> {
const untrackedTokensByChain = new Map<ChainIdHex, string[]>();

for (const balance of balances) {
Expand Down Expand Up @@ -1054,7 +1056,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
}
}

resetState() {
resetState(): void {
this.update(() => ({ tokenBalances: {} }));
}

Expand Down Expand Up @@ -1090,7 +1092,9 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
// ────────────────────────────────────────────────────────────────────────
// TokensController / Network / Accounts events

readonly #onTokensChanged = async (state: TokensControllerState) => {
readonly #onTokensChanged = async (
state: TokensControllerState,
): Promise<void> => {
const changed: ChainIdHex[] = [];
let hasChanges = false;

Expand Down Expand Up @@ -1171,7 +1175,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
}
};

readonly #onNetworkChanged = (state: NetworkState) => {
readonly #onNetworkChanged = (state: NetworkState): void => {
const currentNetworks = new Set(
Object.keys(state.networkConfigurationsByChainId),
);
Expand Down Expand Up @@ -1207,7 +1211,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
});
};

readonly #onAccountRemoved = (addr: string) => {
readonly #onAccountRemoved = (addr: string): void => {
if (!isStrictHexString(addr) || !isValidHexAddress(addr)) {
return;
}
Expand All @@ -1216,7 +1220,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
});
};

readonly #onAccountChanged = () => {
readonly #onAccountChanged = (): void => {
const chainIds = this.#chainIdsWithTokens();
if (!chainIds.length) {
return;
Expand Down Expand Up @@ -1302,7 +1306,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
address: string;
chain: string;
updates: BalanceUpdate[];
}) => {
}): Promise<void> => {
const chainId = caipChainIdToHex(chain);
const checksummedAccount = checksum(address);

Expand Down Expand Up @@ -1359,7 +1363,7 @@ export class TokenBalancesController extends StaticIntervalPollingController<{
}: {
chainIds: string[];
status: 'up' | 'down';
}) => {
}): void => {
for (const chainId of chainIds) {
this.#statusChangeDebouncer.pendingChanges.set(chainId, status);
}
Expand Down
Loading