@metamask-previews/assets-controllers 73.0.1-preview-e4e5ca5c → 73.0.2-preview-037d305
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -2
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs +4 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs +4 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -1
- package/dist/selectors/balanceSelectors.cjs +9 -40
- package/dist/selectors/balanceSelectors.cjs.map +1 -1
- package/dist/selectors/balanceSelectors.d.cts +57 -53
- package/dist/selectors/balanceSelectors.d.cts.map +1 -1
- package/dist/selectors/balanceSelectors.d.mts +57 -53
- package/dist/selectors/balanceSelectors.d.mts.map +1 -1
- package/dist/selectors/balanceSelectors.mjs +9 -40
- package/dist/selectors/balanceSelectors.mjs.map +1 -1
- package/dist/utils/stateAdapter.cjs +46 -0
- package/dist/utils/stateAdapter.cjs.map +1 -0
- package/dist/utils/stateAdapter.d.cts +34 -0
- package/dist/utils/stateAdapter.d.cts.map +1 -0
- package/dist/utils/stateAdapter.d.mts +34 -0
- package/dist/utils/stateAdapter.d.mts.map +1 -0
- package/dist/utils/stateAdapter.mjs +42 -0
- package/dist/utils/stateAdapter.mjs.map +1 -0
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balanceSelectors.mjs","sourceRoot":"","sources":["../../src/selectors/balanceSelectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountWalletObject } from '@metamask/account-tree-controller';\nimport type { AccountGroupObject } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { EntropySourceId } from '@metamask/keyring-api';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { Hex } from '@metamask/utils';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\n/**\n * Root state type for all controllers used in selectors\n */\nexport type RootState = {\n TokenBalancesController: TokenBalancesControllerState;\n CurrencyRateController: CurrencyRateState;\n TokenRatesController: TokenRatesControllerState;\n MultichainAssetsRatesController: MultichainAssetsRatesControllerState;\n MultichainBalancesController: MultichainBalancesControllerState;\n TokensController: TokensControllerState;\n AccountsController: AccountsControllerState;\n AccountTreeController: AccountTreeControllerState;\n};\n\n/**\n * Helper function to get internal accounts for a specific group.\n * Uses AccountTreeController state to find accounts.\n *\n * @param accountTreeState - AccountTreeController state\n * @param accountsState - AccountsController state\n * @param groupId - The account group ID (format: \"walletId/groupIndex\")\n * @returns Array of internal accounts in the group\n */\nconst getInternalAccountsForGroup = (\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n groupId: string,\n) => {\n // Extract walletId from groupId (format: \"walletId/groupIndex\")\n const walletId = groupId.split('/')[0] as EntropySourceId;\n\n const wallet = (\n accountTreeState.accountTree.wallets as Record<string, AccountWalletObject>\n )[walletId];\n if (!wallet) {\n return [];\n }\n\n const group = (wallet.groups as Record<string, AccountGroupObject>)[groupId];\n if (!group) {\n return [];\n }\n\n // Map account IDs to actual account objects\n return group.accounts\n .map(\n (accountId: string) => accountsState.internalAccounts.accounts[accountId],\n )\n .filter(Boolean);\n};\n\n/**\n * Selector to get aggregated balances for a specific account group.\n * Returns total balance in user's selected currency, aggregating all tokens across accounts in the group.\n *\n * @param groupId - The account group ID (format: \"walletId/groupIndex\", e.g., \"entropy:entropy-source-1/0\")\n * @returns Aggregated balance for the account group\n */\nexport const selectBalanceByAccountGroup = (groupId: string) =>\n createSelector(\n [\n (state: RootState) => state.AccountTreeController,\n (state: RootState) => state.AccountsController,\n (state: RootState) => state.TokenBalancesController,\n (state: RootState) => state.TokenRatesController,\n (state: RootState) => state.MultichainAssetsRatesController,\n (state: RootState) => state.MultichainBalancesController,\n (state: RootState) => state.TokensController,\n (state: RootState) => state.CurrencyRateController,\n ],\n (\n accountTreeState,\n accountsState,\n tokenBalancesState,\n tokenRatesState,\n multichainRatesState,\n multichainBalancesState,\n tokensState,\n currencyRateState,\n ): AccountGroupBalance => {\n // Extract walletId from groupId\n const walletId = groupId.split('/')[0] as EntropySourceId;\n\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n\n if (accounts.length === 0) {\n return {\n walletId,\n groupId,\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n };\n }\n\n let totalBalanceInUserCurrency = 0;\n\n // Process each account's balances\n for (const account of accounts) {\n const isEvmAccount = isEvmAccountType(account.type);\n\n if (isEvmAccount) {\n // Handle EVM account balances from TokenBalancesController\n // Structure: tokenBalances[chainId][accountAddress][tokenAddress] = balance\n for (const [chainId, chainBalances] of Object.entries(\n tokenBalancesState.tokenBalances,\n )) {\n const accountBalances = chainBalances[account.address as Hex];\n if (accountBalances) {\n for (const [tokenAddress, balance] of Object.entries(\n accountBalances,\n )) {\n // Find token in TokensController state\n const chainTokens = tokensState.allTokens[chainId as Hex];\n const accountTokens = chainTokens?.[account.address];\n const token = accountTokens?.find(\n (t) => t.address === tokenAddress,\n );\n if (!token) {\n continue;\n }\n\n const decimals = token.decimals || 18;\n const balanceInSmallestUnit = parseInt(balance as string, 16);\n\n // Skip invalid balance values to prevent NaN propagation\n if (Number.isNaN(balanceInSmallestUnit)) {\n continue;\n }\n\n const balanceInTokenUnits =\n balanceInSmallestUnit / Math.pow(10, decimals);\n\n // Get token rate in native currency from TokenRatesController\n const chainMarketData =\n tokenRatesState.marketData[chainId as Hex];\n const tokenMarketData = chainMarketData?.[tokenAddress as Hex];\n if (tokenMarketData?.price) {\n // Convert token price to user currency using native currency conversion rate\n const nativeCurrency = tokenMarketData.currency;\n const nativeToUserRate =\n currencyRateState.currencyRates[nativeCurrency]\n ?.conversionRate;\n\n if (nativeToUserRate) {\n // Convert token price to user currency: tokenPrice * nativeToUserRate\n const tokenPriceInUserCurrency =\n tokenMarketData.price * nativeToUserRate;\n const balanceInUserCurrency =\n balanceInTokenUnits * tokenPriceInUserCurrency;\n totalBalanceInUserCurrency += balanceInUserCurrency;\n }\n }\n }\n }\n }\n } else {\n // Handle non-EVM account balances from MultichainBalancesController\n const accountBalances = multichainBalancesState.balances[account.id];\n if (accountBalances) {\n for (const [assetId, balanceData] of Object.entries(\n accountBalances,\n )) {\n const balanceAmount = parseFloat(balanceData.amount);\n\n // Skip invalid balance values to prevent NaN propagation\n if (Number.isNaN(balanceAmount)) {\n continue;\n }\n\n // Get conversion rate for this asset (already in user currency)\n const conversionRate =\n multichainRatesState.conversionRates[assetId as CaipAssetType];\n if (conversionRate) {\n const conversionRateValue = parseFloat(conversionRate.rate);\n\n // Skip invalid conversion rate values to prevent NaN propagation\n if (Number.isNaN(conversionRateValue)) {\n continue;\n }\n\n // MultichainAssetsRatesController already provides rates in user currency\n const balanceInUserCurrency =\n balanceAmount * conversionRateValue;\n totalBalanceInUserCurrency += balanceInUserCurrency;\n }\n }\n }\n }\n }\n\n return {\n walletId,\n groupId,\n totalBalanceInUserCurrency,\n userCurrency: currencyRateState.currentCurrency,\n };\n },\n );\n\n/**\n * Aggregated balance for an account group\n */\nexport type AccountGroupBalance = {\n walletId: string;\n groupId: string;\n totalBalanceInUserCurrency: number; // not formatted\n userCurrency: string;\n};\n\n/**\n * Aggregated balance for a wallet (all groups)\n */\nexport type WalletBalance = {\n walletId: string;\n groups: Record<string, AccountGroupBalance>;\n totalBalanceInUserCurrency: number; // not formatted\n userCurrency: string;\n};\n\n/**\n * Aggregated balance for all wallets\n */\nexport type AllWalletsBalance = {\n wallets: Record<string, WalletBalance>;\n totalBalanceInUserCurrency: number; // not formatted\n userCurrency: string;\n};\n\n/**\n * Selector to get aggregated balances for all account groups in a wallet.\n * Returns total balance in user's selected currency, aggregating all tokens across all groups in the wallet.\n *\n * @param walletId - The wallet ID (entropy source)\n * @returns Aggregated balance for all groups in the wallet\n */\nexport const selectBalanceByWallet = (walletId: EntropySourceId) =>\n createSelector(\n [\n (state: RootState) => state.AccountTreeController,\n (state: RootState) => state.AccountsController,\n (state: RootState) => state.TokenBalancesController,\n (state: RootState) => state.TokenRatesController,\n (state: RootState) => state.MultichainAssetsRatesController,\n (state: RootState) => state.MultichainBalancesController,\n (state: RootState) => state.TokensController,\n (state: RootState) => state.CurrencyRateController,\n ],\n (\n accountTreeState,\n accountsState,\n tokenBalancesState,\n tokenRatesState,\n multichainRatesState,\n multichainBalancesState,\n tokensState,\n currencyRateState,\n ): WalletBalance => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wallet = (accountTreeState.accountTree.wallets as any)[walletId];\n if (!wallet) {\n return {\n walletId,\n groups: {},\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n };\n }\n\n const groupBalances: Record<string, AccountGroupBalance> = {};\n let totalBalanceInUserCurrency = 0;\n\n const groups = Object.keys(wallet.groups || {}) as string[];\n\n for (const groupId of groups) {\n const groupBalance = selectBalanceByAccountGroup(groupId)({\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n });\n\n groupBalances[groupId] = groupBalance;\n totalBalanceInUserCurrency += groupBalance.totalBalanceInUserCurrency;\n }\n\n return {\n walletId,\n groups: groupBalances,\n totalBalanceInUserCurrency,\n userCurrency: currencyRateState.currentCurrency,\n };\n },\n );\n\n/**\n * Selector to get aggregated balances for all wallets and their account groups.\n * Returns total balance in user's selected currency, aggregating all tokens across all wallets.\n *\n * @returns Aggregated balance for all wallets\n */\nexport const selectBalanceForAllWallets = () =>\n createSelector(\n [\n (state: RootState) => state.AccountTreeController,\n (state: RootState) => state.AccountsController,\n (state: RootState) => state.TokenBalancesController,\n (state: RootState) => state.TokenRatesController,\n (state: RootState) => state.MultichainAssetsRatesController,\n (state: RootState) => state.MultichainBalancesController,\n (state: RootState) => state.TokensController,\n (state: RootState) => state.CurrencyRateController,\n ],\n (\n accountTreeState,\n accountsState,\n tokenBalancesState,\n tokenRatesState,\n multichainRatesState,\n multichainBalancesState,\n tokensState,\n currencyRateState,\n ): AllWalletsBalance => {\n const walletBalances: Record<string, WalletBalance> = {};\n let totalBalanceInUserCurrency = 0;\n\n const walletIds = Object.keys(\n accountTreeState.accountTree.wallets,\n ) as string[];\n\n for (const walletId of walletIds) {\n const walletBalance = selectBalanceByWallet(walletId)({\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n });\n\n walletBalances[walletId] = walletBalance;\n totalBalanceInUserCurrency += walletBalance.totalBalanceInUserCurrency;\n }\n\n return {\n wallets: walletBalances,\n totalBalanceInUserCurrency,\n userCurrency: currencyRateState.currentCurrency,\n };\n },\n );\n\n/**\n * Selector to get aggregated balances for the currently selected account group.\n * Returns total balance in user's selected currency, aggregating all tokens in the selected group.\n *\n * @returns Aggregated balance for the currently selected group\n */\nexport const selectBalanceForSelectedAccountGroup = () =>\n createSelector(\n [\n (state: RootState) => state.AccountTreeController,\n (state: RootState) => state.AccountsController,\n (state: RootState) => state.TokenBalancesController,\n (state: RootState) => state.TokenRatesController,\n (state: RootState) => state.MultichainAssetsRatesController,\n (state: RootState) => state.MultichainBalancesController,\n (state: RootState) => state.TokensController,\n (state: RootState) => state.CurrencyRateController,\n ],\n (\n accountTreeState,\n accountsState,\n tokenBalancesState,\n tokenRatesState,\n multichainRatesState,\n multichainBalancesState,\n tokensState,\n currencyRateState,\n ): AccountGroupBalance | null => {\n const selectedGroupId = accountTreeState.accountTree.selectedAccountGroup;\n\n if (!selectedGroupId) {\n return null;\n }\n\n // Validate group ID format\n const parts = selectedGroupId.split('/');\n if (parts.length !== 2) {\n return null;\n }\n\n return selectBalanceByAccountGroup(selectedGroupId)({\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n });\n },\n );\n\n/**\n * Collection of balance-related selectors for assets controllers\n */\nexport const balanceSelectors = {\n selectBalanceByAccountGroup,\n selectBalanceByWallet,\n selectBalanceForAllWallets,\n selectBalanceForSelectedAccountGroup,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"balanceSelectors.mjs","sourceRoot":"","sources":["../../src/selectors/balanceSelectors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,8BAA8B;AAGzD,OAAO,EAAE,cAAc,EAAE,iBAAiB;AAE1C,OAAO,EACL,uBAAuB,EAExB,kCAA8B;AAE/B;;;;;;;;GAQG;AACH,MAAM,2BAA2B,GAAG,CAClC,gBAA4C,EAC5C,aAAsC,EACtC,OAAe,EACf,EAAE;IACF,gEAAgE;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAoB,CAAC;IAE1D,MAAM,MAAM,GACV,gBAAgB,CAAC,WAAW,CAAC,OAC9B,CAAC,QAAQ,CAAC,CAAC;IACZ,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IAED,MAAM,KAAK,GAAI,MAAM,CAAC,MAA6C,CAAC,OAAO,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,EAAE,CAAC;KACX;IAED,4CAA4C;IAC5C,OAAO,KAAK,CAAC,QAAQ;SAClB,GAAG,CACF,CAAC,SAAiB,EAAE,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC1E;SACA,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAe,EAAE,EAAE,CAC7D,cAAc,CACZ,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EACpD,CAAC,cAAmC,EAAuB,EAAE;IAC3D,MAAM,EACJ,qBAAqB,EAAE,gBAAgB,EACvC,kBAAkB,EAAE,aAAa,EACjC,uBAAuB,EAAE,kBAAkB,EAC3C,oBAAoB,EAAE,eAAe,EACrC,+BAA+B,EAAE,oBAAoB,EACrD,4BAA4B,EAAE,uBAAuB,EACrD,gBAAgB,EAAE,WAAW,EAC7B,sBAAsB,EAAE,iBAAiB,GAC1C,GAAG,cAAc,CAAC;IAEnB,gCAAgC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAoB,CAAC;IAE1D,MAAM,QAAQ,GAAG,2BAA2B,CAC1C,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO;YACL,QAAQ;YACR,OAAO;YACP,0BAA0B,EAAE,CAAC;YAC7B,YAAY,EAAE,iBAAiB,CAAC,eAAe;SAChD,CAAC;KACH;IAED,IAAI,0BAA0B,GAAG,CAAC,CAAC;IAEnC,kCAAkC;IAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,YAAY,EAAE;YAChB,2DAA2D;YAC3D,4EAA4E;YAC5E,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,kBAAkB,CAAC,aAAa,CACjC,EAAE;gBACD,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,OAAc,CAAC,CAAC;gBAC9D,IAAI,eAAe,EAAE;oBACnB,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAClD,eAAe,CAChB,EAAE;wBACD,uCAAuC;wBACvC,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,OAAc,CAAC,CAAC;wBAC1D,MAAM,aAAa,GAAG,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACrD,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAClC,CAAC;wBACF,IAAI,CAAC,KAAK,EAAE;4BACV,SAAS;yBACV;wBAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;wBACtC,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAiB,EAAE,EAAE,CAAC,CAAC;wBAE9D,yDAAyD;wBACzD,IAAI,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE;4BACvC,SAAS;yBACV;wBAED,MAAM,mBAAmB,GACvB,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;wBAEjD,8DAA8D;wBAC9D,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,CAAC,OAAc,CAAC,CAAC;wBAC7C,MAAM,eAAe,GAAG,eAAe,EAAE,CAAC,YAAmB,CAAC,CAAC;wBAC/D,IAAI,eAAe,EAAE,KAAK,EAAE;4BAC1B,6EAA6E;4BAC7E,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC;4BAChD,MAAM,gBAAgB,GACpB,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC;gCAC7C,EAAE,cAAc,CAAC;4BAErB,IAAI,gBAAgB,EAAE;gCACpB,sEAAsE;gCACtE,MAAM,wBAAwB,GAC5B,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC;gCAC3C,MAAM,qBAAqB,GACzB,mBAAmB,GAAG,wBAAwB,CAAC;gCACjD,0BAA0B,IAAI,qBAAqB,CAAC;6BACrD;yBACF;qBACF;iBACF;aACF;SACF;aAAM;YACL,oEAAoE;YACpE,MAAM,eAAe,GAAG,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrE,IAAI,eAAe,EAAE;gBACnB,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CACjD,eAAe,CAChB,EAAE;oBACD,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAErD,yDAAyD;oBACzD,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;wBAC/B,SAAS;qBACV;oBAED,gEAAgE;oBAChE,MAAM,cAAc,GAClB,oBAAoB,CAAC,eAAe,CAAC,OAAwB,CAAC,CAAC;oBACjE,IAAI,cAAc,EAAE;wBAClB,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;wBAE5D,iEAAiE;wBACjE,IAAI,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE;4BACrC,SAAS;yBACV;wBAED,0EAA0E;wBAC1E,MAAM,qBAAqB,GACzB,aAAa,GAAG,mBAAmB,CAAC;wBACtC,0BAA0B,IAAI,qBAAqB,CAAC;qBACrD;iBACF;aACF;SACF;KACF;IAED,OAAO;QACL,QAAQ;QACR,OAAO;QACP,0BAA0B;QAC1B,YAAY,EAAE,iBAAiB,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC,CACF,CAAC;AA+BJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAyB,EAAE,EAAE,CACjE,cAAc,CACZ,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EACpD,CAAC,cAAmC,EAAiB,EAAE;IACrD,MAAM,EACJ,qBAAqB,EAAE,gBAAgB,EACvC,kBAAkB,EAAE,aAAa,EACjC,uBAAuB,EAAE,kBAAkB,EAC3C,oBAAoB,EAAE,eAAe,EACrC,+BAA+B,EAAE,oBAAoB,EACrD,4BAA4B,EAAE,uBAAuB,EACrD,gBAAgB,EAAE,WAAW,EAC7B,sBAAsB,EAAE,iBAAiB,GAC1C,GAAG,cAAc,CAAC;IAEnB,8DAA8D;IAC9D,MAAM,MAAM,GAAI,gBAAgB,CAAC,WAAW,CAAC,OAAe,CAAC,QAAQ,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,EAAE;QACX,OAAO;YACL,QAAQ;YACR,MAAM,EAAE,EAAE;YACV,0BAA0B,EAAE,CAAC;YAC7B,YAAY,EAAE,iBAAiB,CAAC,eAAe;SAChD,CAAC;KACH;IAED,MAAM,aAAa,GAAwC,EAAE,CAAC;IAC9D,IAAI,0BAA0B,GAAG,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAa,CAAC;IAE5D,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;QAC5B,MAAM,YAAY,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;YACxD,qBAAqB,EAAE,gBAAgB;YACvC,kBAAkB,EAAE,aAAa;YACjC,uBAAuB,EAAE,kBAAkB;YAC3C,oBAAoB,EAAE,eAAe;YACrC,+BAA+B,EAAE,oBAAoB;YACrD,4BAA4B,EAAE,uBAAuB;YACrD,gBAAgB,EAAE,WAAW;YAC7B,sBAAsB,EAAE,iBAAiB;SAC1C,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;QACtC,0BAA0B,IAAI,YAAY,CAAC,0BAA0B,CAAC;KACvE;IAED,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,aAAa;QACrB,0BAA0B;QAC1B,YAAY,EAAE,iBAAiB,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC,CACF,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,EAAE,CAC7C,cAAc,CACZ,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EACpD,CAAC,cAAmC,EAAqB,EAAE;IACzD,MAAM,EACJ,qBAAqB,EAAE,gBAAgB,EACvC,kBAAkB,EAAE,aAAa,EACjC,uBAAuB,EAAE,kBAAkB,EAC3C,oBAAoB,EAAE,eAAe,EACrC,+BAA+B,EAAE,oBAAoB,EACrD,4BAA4B,EAAE,uBAAuB,EACrD,gBAAgB,EAAE,WAAW,EAC7B,sBAAsB,EAAE,iBAAiB,GAC1C,GAAG,cAAc,CAAC;IAEnB,MAAM,cAAc,GAAkC,EAAE,CAAC;IACzD,IAAI,0BAA0B,GAAG,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAC3B,gBAAgB,CAAC,WAAW,CAAC,OAAO,CACzB,CAAC;IAEd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAChC,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACpD,qBAAqB,EAAE,gBAAgB;YACvC,kBAAkB,EAAE,aAAa;YACjC,uBAAuB,EAAE,kBAAkB;YAC3C,oBAAoB,EAAE,eAAe;YACrC,+BAA+B,EAAE,oBAAoB;YACrD,4BAA4B,EAAE,uBAAuB;YACrD,gBAAgB,EAAE,WAAW;YAC7B,sBAAsB,EAAE,iBAAiB;SAC1C,CAAC,CAAC;QAEH,cAAc,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;QACzC,0BAA0B,IAAI,aAAa,CAAC,0BAA0B,CAAC;KACxE;IAED,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,0BAA0B;QAC1B,YAAY,EAAE,iBAAiB,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC,CACF,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,EAAE,CACvD,cAAc,CACZ,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EACpD,CAAC,cAAmC,EAA8B,EAAE;IAClE,MAAM,EACJ,qBAAqB,EAAE,gBAAgB,EACvC,kBAAkB,EAAE,aAAa,EACjC,uBAAuB,EAAE,kBAAkB,EAC3C,oBAAoB,EAAE,eAAe,EACrC,+BAA+B,EAAE,oBAAoB,EACrD,4BAA4B,EAAE,uBAAuB,EACrD,gBAAgB,EAAE,WAAW,EAC7B,sBAAsB,EAAE,iBAAiB,GAC1C,GAAG,cAAc,CAAC;IAEnB,MAAM,eAAe,GAAG,gBAAgB,CAAC,WAAW,CAAC,oBAAoB,CAAC;IAE1E,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,IAAI,CAAC;KACb;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,OAAO,IAAI,CAAC;KACb;IAED,OAAO,2BAA2B,CAAC,eAAe,CAAC,CAAC;QAClD,qBAAqB,EAAE,gBAAgB;QACvC,kBAAkB,EAAE,aAAa;QACjC,uBAAuB,EAAE,kBAAkB;QAC3C,oBAAoB,EAAE,eAAe;QACrC,+BAA+B,EAAE,oBAAoB;QACrD,4BAA4B,EAAE,uBAAuB;QACrD,gBAAgB,EAAE,WAAW;QAC7B,sBAAsB,EAAE,iBAAiB;KAC1C,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEJ;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,2BAA2B;IAC3B,qBAAqB;IACrB,0BAA0B;IAC1B,oCAAoC;CACrC,CAAC","sourcesContent":["import type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountWalletObject } from '@metamask/account-tree-controller';\nimport type { AccountGroupObject } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { EntropySourceId } from '@metamask/keyring-api';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { Hex } from '@metamask/utils';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport {\n extractControllerStates,\n type AssetsSelectorState,\n} from '../utils/stateAdapter';\n\n/**\n * Helper function to get internal accounts for a specific group.\n * Uses AccountTreeController state to find accounts.\n *\n * @param accountTreeState - AccountTreeController state\n * @param accountsState - AccountsController state\n * @param groupId - The account group ID (format: \"walletId/groupIndex\")\n * @returns Array of internal accounts in the group\n */\nconst getInternalAccountsForGroup = (\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n groupId: string,\n) => {\n // Extract walletId from groupId (format: \"walletId/groupIndex\")\n const walletId = groupId.split('/')[0] as EntropySourceId;\n\n const wallet = (\n accountTreeState.accountTree.wallets as Record<string, AccountWalletObject>\n )[walletId];\n if (!wallet) {\n return [];\n }\n\n const group = (wallet.groups as Record<string, AccountGroupObject>)[groupId];\n if (!group) {\n return [];\n }\n\n // Map account IDs to actual account objects\n return group.accounts\n .map(\n (accountId: string) => accountsState.internalAccounts.accounts[accountId],\n )\n .filter(Boolean);\n};\n\n/**\n * Selector to get aggregated balances for a specific account group.\n * Returns total balance in user's selected currency, aggregating all tokens across accounts in the group.\n *\n * @param groupId - The account group ID (format: \"walletId/groupIndex\", e.g., \"entropy:entropy-source-1/0\")\n * @returns Aggregated balance for the account group\n */\nexport const selectBalanceByAccountGroup = (groupId: string) =>\n createSelector(\n [(state: unknown) => extractControllerStates(state)],\n (extractedState: AssetsSelectorState): AccountGroupBalance => {\n const {\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n } = extractedState;\n\n // Extract walletId from groupId\n const walletId = groupId.split('/')[0] as EntropySourceId;\n\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n\n if (accounts.length === 0) {\n return {\n walletId,\n groupId,\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n };\n }\n\n let totalBalanceInUserCurrency = 0;\n\n // Process each account's balances\n for (const account of accounts) {\n const isEvmAccount = isEvmAccountType(account.type);\n\n if (isEvmAccount) {\n // Handle EVM account balances from TokenBalancesController\n // Structure: tokenBalances[chainId][accountAddress][tokenAddress] = balance\n for (const [chainId, chainBalances] of Object.entries(\n tokenBalancesState.tokenBalances,\n )) {\n const accountBalances = chainBalances[account.address as Hex];\n if (accountBalances) {\n for (const [tokenAddress, balance] of Object.entries(\n accountBalances,\n )) {\n // Find token in TokensController state\n const chainTokens = tokensState.allTokens[chainId as Hex];\n const accountTokens = chainTokens?.[account.address];\n const token = accountTokens?.find(\n (t) => t.address === tokenAddress,\n );\n if (!token) {\n continue;\n }\n\n const decimals = token.decimals || 18;\n const balanceInSmallestUnit = parseInt(balance as string, 16);\n\n // Skip invalid balance values to prevent NaN propagation\n if (Number.isNaN(balanceInSmallestUnit)) {\n continue;\n }\n\n const balanceInTokenUnits =\n balanceInSmallestUnit / Math.pow(10, decimals);\n\n // Get token rate in native currency from TokenRatesController\n const chainMarketData =\n tokenRatesState.marketData[chainId as Hex];\n const tokenMarketData = chainMarketData?.[tokenAddress as Hex];\n if (tokenMarketData?.price) {\n // Convert token price to user currency using native currency conversion rate\n const nativeCurrency = tokenMarketData.currency;\n const nativeToUserRate =\n currencyRateState.currencyRates[nativeCurrency]\n ?.conversionRate;\n\n if (nativeToUserRate) {\n // Convert token price to user currency: tokenPrice * nativeToUserRate\n const tokenPriceInUserCurrency =\n tokenMarketData.price * nativeToUserRate;\n const balanceInUserCurrency =\n balanceInTokenUnits * tokenPriceInUserCurrency;\n totalBalanceInUserCurrency += balanceInUserCurrency;\n }\n }\n }\n }\n }\n } else {\n // Handle non-EVM account balances from MultichainBalancesController\n const accountBalances = multichainBalancesState.balances[account.id];\n if (accountBalances) {\n for (const [assetId, balanceData] of Object.entries(\n accountBalances,\n )) {\n const balanceAmount = parseFloat(balanceData.amount);\n\n // Skip invalid balance values to prevent NaN propagation\n if (Number.isNaN(balanceAmount)) {\n continue;\n }\n\n // Get conversion rate for this asset (already in user currency)\n const conversionRate =\n multichainRatesState.conversionRates[assetId as CaipAssetType];\n if (conversionRate) {\n const conversionRateValue = parseFloat(conversionRate.rate);\n\n // Skip invalid conversion rate values to prevent NaN propagation\n if (Number.isNaN(conversionRateValue)) {\n continue;\n }\n\n // MultichainAssetsRatesController already provides rates in user currency\n const balanceInUserCurrency =\n balanceAmount * conversionRateValue;\n totalBalanceInUserCurrency += balanceInUserCurrency;\n }\n }\n }\n }\n }\n\n return {\n walletId,\n groupId,\n totalBalanceInUserCurrency,\n userCurrency: currencyRateState.currentCurrency,\n };\n },\n );\n\n/**\n * Aggregated balance for an account group\n */\nexport type AccountGroupBalance = {\n walletId: string;\n groupId: string;\n totalBalanceInUserCurrency: number; // not formatted\n userCurrency: string;\n};\n\n/**\n * Aggregated balance for a wallet (all groups)\n */\nexport type WalletBalance = {\n walletId: string;\n groups: Record<string, AccountGroupBalance>;\n totalBalanceInUserCurrency: number; // not formatted\n userCurrency: string;\n};\n\n/**\n * Aggregated balance for all wallets\n */\nexport type AllWalletsBalance = {\n wallets: Record<string, WalletBalance>;\n totalBalanceInUserCurrency: number; // not formatted\n userCurrency: string;\n};\n\n/**\n * Selector to get aggregated balances for all account groups in a wallet.\n * Returns total balance in user's selected currency, aggregating all tokens across all groups in the wallet.\n *\n * @param walletId - The wallet ID (entropy source)\n * @returns Aggregated balance for all groups in the wallet\n */\nexport const selectBalanceByWallet = (walletId: EntropySourceId) =>\n createSelector(\n [(state: unknown) => extractControllerStates(state)],\n (extractedState: AssetsSelectorState): WalletBalance => {\n const {\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n } = extractedState;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wallet = (accountTreeState.accountTree.wallets as any)[walletId];\n if (!wallet) {\n return {\n walletId,\n groups: {},\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n };\n }\n\n const groupBalances: Record<string, AccountGroupBalance> = {};\n let totalBalanceInUserCurrency = 0;\n\n const groups = Object.keys(wallet.groups || {}) as string[];\n\n for (const groupId of groups) {\n const groupBalance = selectBalanceByAccountGroup(groupId)({\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n });\n\n groupBalances[groupId] = groupBalance;\n totalBalanceInUserCurrency += groupBalance.totalBalanceInUserCurrency;\n }\n\n return {\n walletId,\n groups: groupBalances,\n totalBalanceInUserCurrency,\n userCurrency: currencyRateState.currentCurrency,\n };\n },\n );\n\n/**\n * Selector to get aggregated balances for all wallets and their account groups.\n * Returns total balance in user's selected currency, aggregating all tokens across all wallets.\n *\n * @returns Aggregated balance for all wallets\n */\nexport const selectBalanceForAllWallets = () =>\n createSelector(\n [(state: unknown) => extractControllerStates(state)],\n (extractedState: AssetsSelectorState): AllWalletsBalance => {\n const {\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n } = extractedState;\n\n const walletBalances: Record<string, WalletBalance> = {};\n let totalBalanceInUserCurrency = 0;\n\n const walletIds = Object.keys(\n accountTreeState.accountTree.wallets,\n ) as string[];\n\n for (const walletId of walletIds) {\n const walletBalance = selectBalanceByWallet(walletId)({\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n });\n\n walletBalances[walletId] = walletBalance;\n totalBalanceInUserCurrency += walletBalance.totalBalanceInUserCurrency;\n }\n\n return {\n wallets: walletBalances,\n totalBalanceInUserCurrency,\n userCurrency: currencyRateState.currentCurrency,\n };\n },\n );\n\n/**\n * Selector to get aggregated balances for the currently selected account group.\n * Returns total balance in user's selected currency, aggregating all tokens in the selected group.\n *\n * @returns Aggregated balance for the currently selected group\n */\nexport const selectBalanceForSelectedAccountGroup = () =>\n createSelector(\n [(state: unknown) => extractControllerStates(state)],\n (extractedState: AssetsSelectorState): AccountGroupBalance | null => {\n const {\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n } = extractedState;\n\n const selectedGroupId = accountTreeState.accountTree.selectedAccountGroup;\n\n if (!selectedGroupId) {\n return null;\n }\n\n // Validate group ID format\n const parts = selectedGroupId.split('/');\n if (parts.length !== 2) {\n return null;\n }\n\n return selectBalanceByAccountGroup(selectedGroupId)({\n AccountTreeController: accountTreeState,\n AccountsController: accountsState,\n TokenBalancesController: tokenBalancesState,\n TokenRatesController: tokenRatesState,\n MultichainAssetsRatesController: multichainRatesState,\n MultichainBalancesController: multichainBalancesState,\n TokensController: tokensState,\n CurrencyRateController: currencyRateState,\n });\n },\n );\n\n/**\n * Collection of balance-related selectors for assets controllers\n */\nexport const balanceSelectors = {\n selectBalanceByAccountGroup,\n selectBalanceByWallet,\n selectBalanceForAllWallets,\n selectBalanceForSelectedAccountGroup,\n};\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractControllerStates = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Universal controller state extractor that works with any state structure
|
|
6
|
+
* Supports mobile, extension, and flat state structures
|
|
7
|
+
*
|
|
8
|
+
* @param state - The actual application state (mobile, extension, or flat structure)
|
|
9
|
+
* @param state.engine - Mobile state structure with engine.backgroundState
|
|
10
|
+
* @param state.engine.backgroundState - Mobile controller states
|
|
11
|
+
* @param state.metamask - Extension state structure with metamask namespace
|
|
12
|
+
* @returns Normalized controller state that the selectors expect
|
|
13
|
+
*/
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
const extractControllerStates = (state) => {
|
|
16
|
+
// Try mobile structure first: state.engine.backgroundState.ControllerName
|
|
17
|
+
if (state?.engine?.backgroundState) {
|
|
18
|
+
return {
|
|
19
|
+
AccountTreeController: state.engine.backgroundState.AccountTreeController,
|
|
20
|
+
AccountsController: state.engine.backgroundState.AccountsController,
|
|
21
|
+
TokenBalancesController: state.engine.backgroundState.TokenBalancesController,
|
|
22
|
+
TokenRatesController: state.engine.backgroundState.TokenRatesController,
|
|
23
|
+
MultichainAssetsRatesController: state.engine.backgroundState.MultichainAssetsRatesController,
|
|
24
|
+
MultichainBalancesController: state.engine.backgroundState.MultichainBalancesController,
|
|
25
|
+
TokensController: state.engine.backgroundState.TokensController,
|
|
26
|
+
CurrencyRateController: state.engine.backgroundState.CurrencyRateController,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Try extension structure: state.metamask.ControllerName
|
|
30
|
+
if (state.metamask) {
|
|
31
|
+
return {
|
|
32
|
+
AccountTreeController: state.metamask.AccountTreeController,
|
|
33
|
+
AccountsController: state.metamask.AccountsController,
|
|
34
|
+
TokenBalancesController: state.metamask.TokenBalancesController,
|
|
35
|
+
TokenRatesController: state.metamask.TokenRatesController,
|
|
36
|
+
MultichainAssetsRatesController: state.metamask.MultichainAssetsRatesController,
|
|
37
|
+
MultichainBalancesController: state.metamask.MultichainBalancesController,
|
|
38
|
+
TokensController: state.metamask.TokensController,
|
|
39
|
+
CurrencyRateController: state.metamask.CurrencyRateController,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Fallback to flat structure (default assets-controllers structure)
|
|
43
|
+
return state;
|
|
44
|
+
};
|
|
45
|
+
exports.extractControllerStates = extractControllerStates;
|
|
46
|
+
//# sourceMappingURL=stateAdapter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateAdapter.cjs","sourceRoot":"","sources":["../../src/utils/stateAdapter.ts"],"names":[],"mappings":";;;AAyBA;;;;;;;;;GASG;AACH,8DAA8D;AACvD,MAAM,uBAAuB,GAAG,CAAC,KAAU,EAAuB,EAAE;IACzE,0EAA0E;IAC1E,IAAI,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE;QAClC,OAAO;YACL,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,qBAAqB;YACzE,kBAAkB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,kBAAkB;YACnE,uBAAuB,EACrB,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,uBAAuB;YACtD,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,oBAAoB;YACvE,+BAA+B,EAC7B,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,+BAA+B;YAC9D,4BAA4B,EAC1B,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,4BAA4B;YAC3D,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,gBAAgB;YAC/D,sBAAsB,EACpB,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,sBAAsB;SACtD,CAAC;KACH;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,QAAQ,EAAE;QAClB,OAAO;YACL,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,qBAAqB;YAC3D,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB;YACrD,uBAAuB,EAAE,KAAK,CAAC,QAAQ,CAAC,uBAAuB;YAC/D,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,oBAAoB;YACzD,+BAA+B,EAC7B,KAAK,CAAC,QAAQ,CAAC,+BAA+B;YAChD,4BAA4B,EAAE,KAAK,CAAC,QAAQ,CAAC,4BAA4B;YACzE,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;YACjD,sBAAsB,EAAE,KAAK,CAAC,QAAQ,CAAC,sBAAsB;SAC9D,CAAC;KACH;IAED,oEAAoE;IACpE,OAAO,KAA4B,CAAC;AACtC,CAAC,CAAC;AApCW,QAAA,uBAAuB,2BAoClC","sourcesContent":["import type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\n\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\n/**\n * Normalized controller state interface for assets-controllers selectors\n * This contains the extracted controller state that selectors expect to work with\n */\nexport type AssetsSelectorState = {\n AccountTreeController: AccountTreeControllerState;\n AccountsController: AccountsControllerState;\n TokenBalancesController: TokenBalancesControllerState;\n TokenRatesController: TokenRatesControllerState;\n MultichainAssetsRatesController: MultichainAssetsRatesControllerState;\n MultichainBalancesController: MultichainBalancesControllerState;\n TokensController: TokensControllerState;\n CurrencyRateController: CurrencyRateState;\n};\n\n/**\n * Universal controller state extractor that works with any state structure\n * Supports mobile, extension, and flat state structures\n *\n * @param state - The actual application state (mobile, extension, or flat structure)\n * @param state.engine - Mobile state structure with engine.backgroundState\n * @param state.engine.backgroundState - Mobile controller states\n * @param state.metamask - Extension state structure with metamask namespace\n * @returns Normalized controller state that the selectors expect\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const extractControllerStates = (state: any): AssetsSelectorState => {\n // Try mobile structure first: state.engine.backgroundState.ControllerName\n if (state?.engine?.backgroundState) {\n return {\n AccountTreeController: state.engine.backgroundState.AccountTreeController,\n AccountsController: state.engine.backgroundState.AccountsController,\n TokenBalancesController:\n state.engine.backgroundState.TokenBalancesController,\n TokenRatesController: state.engine.backgroundState.TokenRatesController,\n MultichainAssetsRatesController:\n state.engine.backgroundState.MultichainAssetsRatesController,\n MultichainBalancesController:\n state.engine.backgroundState.MultichainBalancesController,\n TokensController: state.engine.backgroundState.TokensController,\n CurrencyRateController:\n state.engine.backgroundState.CurrencyRateController,\n };\n }\n\n // Try extension structure: state.metamask.ControllerName\n if (state.metamask) {\n return {\n AccountTreeController: state.metamask.AccountTreeController,\n AccountsController: state.metamask.AccountsController,\n TokenBalancesController: state.metamask.TokenBalancesController,\n TokenRatesController: state.metamask.TokenRatesController,\n MultichainAssetsRatesController:\n state.metamask.MultichainAssetsRatesController,\n MultichainBalancesController: state.metamask.MultichainBalancesController,\n TokensController: state.metamask.TokensController,\n CurrencyRateController: state.metamask.CurrencyRateController,\n };\n }\n\n // Fallback to flat structure (default assets-controllers structure)\n return state as AssetsSelectorState;\n};\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AccountTreeControllerState } from "@metamask/account-tree-controller";
|
|
2
|
+
import type { AccountsControllerState } from "@metamask/accounts-controller";
|
|
3
|
+
import type { CurrencyRateState } from "../CurrencyRateController.cjs";
|
|
4
|
+
import type { MultichainAssetsRatesControllerState } from "../MultichainAssetsRatesController/index.cjs";
|
|
5
|
+
import type { MultichainBalancesControllerState } from "../MultichainBalancesController/index.cjs";
|
|
6
|
+
import type { TokenBalancesControllerState } from "../TokenBalancesController.cjs";
|
|
7
|
+
import type { TokenRatesControllerState } from "../TokenRatesController.cjs";
|
|
8
|
+
import type { TokensControllerState } from "../TokensController.cjs";
|
|
9
|
+
/**
|
|
10
|
+
* Normalized controller state interface for assets-controllers selectors
|
|
11
|
+
* This contains the extracted controller state that selectors expect to work with
|
|
12
|
+
*/
|
|
13
|
+
export type AssetsSelectorState = {
|
|
14
|
+
AccountTreeController: AccountTreeControllerState;
|
|
15
|
+
AccountsController: AccountsControllerState;
|
|
16
|
+
TokenBalancesController: TokenBalancesControllerState;
|
|
17
|
+
TokenRatesController: TokenRatesControllerState;
|
|
18
|
+
MultichainAssetsRatesController: MultichainAssetsRatesControllerState;
|
|
19
|
+
MultichainBalancesController: MultichainBalancesControllerState;
|
|
20
|
+
TokensController: TokensControllerState;
|
|
21
|
+
CurrencyRateController: CurrencyRateState;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Universal controller state extractor that works with any state structure
|
|
25
|
+
* Supports mobile, extension, and flat state structures
|
|
26
|
+
*
|
|
27
|
+
* @param state - The actual application state (mobile, extension, or flat structure)
|
|
28
|
+
* @param state.engine - Mobile state structure with engine.backgroundState
|
|
29
|
+
* @param state.engine.backgroundState - Mobile controller states
|
|
30
|
+
* @param state.metamask - Extension state structure with metamask namespace
|
|
31
|
+
* @returns Normalized controller state that the selectors expect
|
|
32
|
+
*/
|
|
33
|
+
export declare const extractControllerStates: (state: any) => AssetsSelectorState;
|
|
34
|
+
//# sourceMappingURL=stateAdapter.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateAdapter.d.cts","sourceRoot":"","sources":["../../src/utils/stateAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AACzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,uBAAuB,EAAE,4BAA4B,CAAC;IACtD,oBAAoB,EAAE,yBAAyB,CAAC;IAChD,+BAA+B,EAAE,oCAAoC,CAAC;IACtE,4BAA4B,EAAE,iCAAiC,CAAC;IAChE,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,sBAAsB,EAAE,iBAAiB,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,UAAW,GAAG,KAAG,mBAoCpD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AccountTreeControllerState } from "@metamask/account-tree-controller";
|
|
2
|
+
import type { AccountsControllerState } from "@metamask/accounts-controller";
|
|
3
|
+
import type { CurrencyRateState } from "../CurrencyRateController.mjs";
|
|
4
|
+
import type { MultichainAssetsRatesControllerState } from "../MultichainAssetsRatesController/index.mjs";
|
|
5
|
+
import type { MultichainBalancesControllerState } from "../MultichainBalancesController/index.mjs";
|
|
6
|
+
import type { TokenBalancesControllerState } from "../TokenBalancesController.mjs";
|
|
7
|
+
import type { TokenRatesControllerState } from "../TokenRatesController.mjs";
|
|
8
|
+
import type { TokensControllerState } from "../TokensController.mjs";
|
|
9
|
+
/**
|
|
10
|
+
* Normalized controller state interface for assets-controllers selectors
|
|
11
|
+
* This contains the extracted controller state that selectors expect to work with
|
|
12
|
+
*/
|
|
13
|
+
export type AssetsSelectorState = {
|
|
14
|
+
AccountTreeController: AccountTreeControllerState;
|
|
15
|
+
AccountsController: AccountsControllerState;
|
|
16
|
+
TokenBalancesController: TokenBalancesControllerState;
|
|
17
|
+
TokenRatesController: TokenRatesControllerState;
|
|
18
|
+
MultichainAssetsRatesController: MultichainAssetsRatesControllerState;
|
|
19
|
+
MultichainBalancesController: MultichainBalancesControllerState;
|
|
20
|
+
TokensController: TokensControllerState;
|
|
21
|
+
CurrencyRateController: CurrencyRateState;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Universal controller state extractor that works with any state structure
|
|
25
|
+
* Supports mobile, extension, and flat state structures
|
|
26
|
+
*
|
|
27
|
+
* @param state - The actual application state (mobile, extension, or flat structure)
|
|
28
|
+
* @param state.engine - Mobile state structure with engine.backgroundState
|
|
29
|
+
* @param state.engine.backgroundState - Mobile controller states
|
|
30
|
+
* @param state.metamask - Extension state structure with metamask namespace
|
|
31
|
+
* @returns Normalized controller state that the selectors expect
|
|
32
|
+
*/
|
|
33
|
+
export declare const extractControllerStates: (state: any) => AssetsSelectorState;
|
|
34
|
+
//# sourceMappingURL=stateAdapter.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateAdapter.d.mts","sourceRoot":"","sources":["../../src/utils/stateAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AACzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,uBAAuB,EAAE,4BAA4B,CAAC;IACtD,oBAAoB,EAAE,yBAAyB,CAAC;IAChD,+BAA+B,EAAE,oCAAoC,CAAC;IACtE,4BAA4B,EAAE,iCAAiC,CAAC;IAChE,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,sBAAsB,EAAE,iBAAiB,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,UAAW,GAAG,KAAG,mBAoCpD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal controller state extractor that works with any state structure
|
|
3
|
+
* Supports mobile, extension, and flat state structures
|
|
4
|
+
*
|
|
5
|
+
* @param state - The actual application state (mobile, extension, or flat structure)
|
|
6
|
+
* @param state.engine - Mobile state structure with engine.backgroundState
|
|
7
|
+
* @param state.engine.backgroundState - Mobile controller states
|
|
8
|
+
* @param state.metamask - Extension state structure with metamask namespace
|
|
9
|
+
* @returns Normalized controller state that the selectors expect
|
|
10
|
+
*/
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
export const extractControllerStates = (state) => {
|
|
13
|
+
// Try mobile structure first: state.engine.backgroundState.ControllerName
|
|
14
|
+
if (state?.engine?.backgroundState) {
|
|
15
|
+
return {
|
|
16
|
+
AccountTreeController: state.engine.backgroundState.AccountTreeController,
|
|
17
|
+
AccountsController: state.engine.backgroundState.AccountsController,
|
|
18
|
+
TokenBalancesController: state.engine.backgroundState.TokenBalancesController,
|
|
19
|
+
TokenRatesController: state.engine.backgroundState.TokenRatesController,
|
|
20
|
+
MultichainAssetsRatesController: state.engine.backgroundState.MultichainAssetsRatesController,
|
|
21
|
+
MultichainBalancesController: state.engine.backgroundState.MultichainBalancesController,
|
|
22
|
+
TokensController: state.engine.backgroundState.TokensController,
|
|
23
|
+
CurrencyRateController: state.engine.backgroundState.CurrencyRateController,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Try extension structure: state.metamask.ControllerName
|
|
27
|
+
if (state.metamask) {
|
|
28
|
+
return {
|
|
29
|
+
AccountTreeController: state.metamask.AccountTreeController,
|
|
30
|
+
AccountsController: state.metamask.AccountsController,
|
|
31
|
+
TokenBalancesController: state.metamask.TokenBalancesController,
|
|
32
|
+
TokenRatesController: state.metamask.TokenRatesController,
|
|
33
|
+
MultichainAssetsRatesController: state.metamask.MultichainAssetsRatesController,
|
|
34
|
+
MultichainBalancesController: state.metamask.MultichainBalancesController,
|
|
35
|
+
TokensController: state.metamask.TokensController,
|
|
36
|
+
CurrencyRateController: state.metamask.CurrencyRateController,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Fallback to flat structure (default assets-controllers structure)
|
|
40
|
+
return state;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=stateAdapter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateAdapter.mjs","sourceRoot":"","sources":["../../src/utils/stateAdapter.ts"],"names":[],"mappings":"AAyBA;;;;;;;;;GASG;AACH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAU,EAAuB,EAAE;IACzE,0EAA0E;IAC1E,IAAI,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE;QAClC,OAAO;YACL,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,qBAAqB;YACzE,kBAAkB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,kBAAkB;YACnE,uBAAuB,EACrB,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,uBAAuB;YACtD,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,oBAAoB;YACvE,+BAA+B,EAC7B,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,+BAA+B;YAC9D,4BAA4B,EAC1B,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,4BAA4B;YAC3D,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,gBAAgB;YAC/D,sBAAsB,EACpB,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,sBAAsB;SACtD,CAAC;KACH;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,QAAQ,EAAE;QAClB,OAAO;YACL,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,qBAAqB;YAC3D,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB;YACrD,uBAAuB,EAAE,KAAK,CAAC,QAAQ,CAAC,uBAAuB;YAC/D,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,oBAAoB;YACzD,+BAA+B,EAC7B,KAAK,CAAC,QAAQ,CAAC,+BAA+B;YAChD,4BAA4B,EAAE,KAAK,CAAC,QAAQ,CAAC,4BAA4B;YACzE,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;YACjD,sBAAsB,EAAE,KAAK,CAAC,QAAQ,CAAC,sBAAsB;SAC9D,CAAC;KACH;IAED,oEAAoE;IACpE,OAAO,KAA4B,CAAC;AACtC,CAAC,CAAC","sourcesContent":["import type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\n\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\n/**\n * Normalized controller state interface for assets-controllers selectors\n * This contains the extracted controller state that selectors expect to work with\n */\nexport type AssetsSelectorState = {\n AccountTreeController: AccountTreeControllerState;\n AccountsController: AccountsControllerState;\n TokenBalancesController: TokenBalancesControllerState;\n TokenRatesController: TokenRatesControllerState;\n MultichainAssetsRatesController: MultichainAssetsRatesControllerState;\n MultichainBalancesController: MultichainBalancesControllerState;\n TokensController: TokensControllerState;\n CurrencyRateController: CurrencyRateState;\n};\n\n/**\n * Universal controller state extractor that works with any state structure\n * Supports mobile, extension, and flat state structures\n *\n * @param state - The actual application state (mobile, extension, or flat structure)\n * @param state.engine - Mobile state structure with engine.backgroundState\n * @param state.engine.backgroundState - Mobile controller states\n * @param state.metamask - Extension state structure with metamask namespace\n * @returns Normalized controller state that the selectors expect\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const extractControllerStates = (state: any): AssetsSelectorState => {\n // Try mobile structure first: state.engine.backgroundState.ControllerName\n if (state?.engine?.backgroundState) {\n return {\n AccountTreeController: state.engine.backgroundState.AccountTreeController,\n AccountsController: state.engine.backgroundState.AccountsController,\n TokenBalancesController:\n state.engine.backgroundState.TokenBalancesController,\n TokenRatesController: state.engine.backgroundState.TokenRatesController,\n MultichainAssetsRatesController:\n state.engine.backgroundState.MultichainAssetsRatesController,\n MultichainBalancesController:\n state.engine.backgroundState.MultichainBalancesController,\n TokensController: state.engine.backgroundState.TokensController,\n CurrencyRateController:\n state.engine.backgroundState.CurrencyRateController,\n };\n }\n\n // Try extension structure: state.metamask.ControllerName\n if (state.metamask) {\n return {\n AccountTreeController: state.metamask.AccountTreeController,\n AccountsController: state.metamask.AccountsController,\n TokenBalancesController: state.metamask.TokenBalancesController,\n TokenRatesController: state.metamask.TokenRatesController,\n MultichainAssetsRatesController:\n state.metamask.MultichainAssetsRatesController,\n MultichainBalancesController: state.metamask.MultichainBalancesController,\n TokensController: state.metamask.TokensController,\n CurrencyRateController: state.metamask.CurrencyRateController,\n };\n }\n\n // Fallback to flat structure (default assets-controllers structure)\n return state as AssetsSelectorState;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/assets-controllers",
|
|
3
|
-
"version": "73.0.
|
|
3
|
+
"version": "73.0.2-preview-037d305",
|
|
4
4
|
"description": "Controllers which manage interactions involving ERC-20, ERC-721, and ERC-1155 tokens (including NFTs)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"@metamask/contract-metadata": "^2.4.0",
|
|
59
59
|
"@metamask/controller-utils": "^11.11.0",
|
|
60
60
|
"@metamask/eth-query": "^4.0.0",
|
|
61
|
-
"@metamask/keyring-api": "^
|
|
61
|
+
"@metamask/keyring-api": "^20.0.0",
|
|
62
62
|
"@metamask/metamask-eth-abis": "^3.1.1",
|
|
63
63
|
"@metamask/polling-controller": "^14.0.0",
|
|
64
64
|
"@metamask/rpc-errors": "^7.0.2",
|
|
@@ -79,15 +79,16 @@
|
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@babel/runtime": "^7.23.9",
|
|
82
|
-
"@metamask/account-api": "^0.
|
|
82
|
+
"@metamask/account-api": "^0.9.0",
|
|
83
83
|
"@metamask/account-tree-controller": "^0.7.0",
|
|
84
84
|
"@metamask/accounts-controller": "^32.0.1",
|
|
85
85
|
"@metamask/approval-controller": "^7.1.3",
|
|
86
86
|
"@metamask/auto-changelog": "^3.4.4",
|
|
87
87
|
"@metamask/ethjs-provider-http": "^0.3.0",
|
|
88
88
|
"@metamask/keyring-controller": "^22.1.0",
|
|
89
|
-
"@metamask/keyring-internal-api": "^
|
|
90
|
-
"@metamask/keyring-snap-client": "^
|
|
89
|
+
"@metamask/keyring-internal-api": "^8.0.0",
|
|
90
|
+
"@metamask/keyring-snap-client": "^7.0.0",
|
|
91
|
+
"@metamask/multichain-account-service": "^0.3.0",
|
|
91
92
|
"@metamask/network-controller": "^24.0.1",
|
|
92
93
|
"@metamask/permission-controller": "^11.0.6",
|
|
93
94
|
"@metamask/phishing-controller": "^13.1.0",
|