@metamask-previews/assets-controllers 74.0.0-preview-f108d6a → 74.0.0-preview-ddceb3a8
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 +6 -0
- package/dist/selectors/token-selectors.cjs +24 -9
- package/dist/selectors/token-selectors.cjs.map +1 -1
- package/dist/selectors/token-selectors.d.cts +96 -20
- package/dist/selectors/token-selectors.d.cts.map +1 -1
- package/dist/selectors/token-selectors.d.mts +96 -20
- package/dist/selectors/token-selectors.d.mts.map +1 -1
- package/dist/selectors/token-selectors.mjs +24 -9
- package/dist/selectors/token-selectors.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
10
10
|
### Changed
|
|
11
11
|
|
|
12
12
|
- Bump `@metamask/base-controller` from `^8.1.0` to `^8.2.0` ([#6355](https://github.com/MetaMask/core/pull/6355))
|
|
13
|
+
- Uses the correct internal account type for the asset ([#6358](https://github.com/MetaMask/core/pull/6358)).
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Ensure that the evm addresses used for an internal mapping are always lowercase to avoid mismatches with client format ([#6358](https://github.com/MetaMask/core/pull/6358)).
|
|
18
|
+
- Prevents mutation of memoized fields, which was causing issues ([#6358](https://github.com/MetaMask/core/pull/6358)).
|
|
13
19
|
|
|
14
20
|
## [74.0.0]
|
|
15
21
|
|
|
@@ -22,7 +22,7 @@ const selectAccountsToGroupIdMap = createAssetListSelector([(state) => state.acc
|
|
|
22
22
|
// TODO: We would not need internalAccounts if evmTokens state had the accountId
|
|
23
23
|
internalAccount.type.startsWith('eip155')
|
|
24
24
|
? internalAccount.address
|
|
25
|
-
: accountId] = accountGroupId;
|
|
25
|
+
: accountId] = { accountGroupId, type: internalAccount.type, accountId };
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -41,7 +41,11 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector([
|
|
|
41
41
|
const groupAssets = {};
|
|
42
42
|
for (const [chainId, chainAccounts] of Object.entries(accountsByChainId)) {
|
|
43
43
|
for (const [accountAddress, accountBalance] of Object.entries(chainAccounts)) {
|
|
44
|
-
const
|
|
44
|
+
const account = accountsMap[accountAddress.toLowerCase()];
|
|
45
|
+
if (!account) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const { accountGroupId, type, accountId } = account;
|
|
45
49
|
groupAssets[accountGroupId] ?? (groupAssets[accountGroupId] = {});
|
|
46
50
|
(_a = groupAssets[accountGroupId])[chainId] ?? (_a[chainId] = []);
|
|
47
51
|
const groupChainAssets = groupAssets[accountGroupId][chainId];
|
|
@@ -57,13 +61,14 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector([
|
|
|
57
61
|
};
|
|
58
62
|
const fiatData = getFiatBalanceForEvmToken(rawBalance, nativeToken.decimals, marketData, currencyRates, chainId, nativeToken.address);
|
|
59
63
|
groupChainAssets.push({
|
|
60
|
-
type:
|
|
64
|
+
type: type,
|
|
61
65
|
assetId: nativeToken.address,
|
|
62
66
|
isNative: true,
|
|
63
67
|
address: nativeToken.address,
|
|
64
68
|
image: nativeToken.image,
|
|
65
69
|
name: nativeToken.name,
|
|
66
70
|
symbol: nativeToken.symbol,
|
|
71
|
+
accountId,
|
|
67
72
|
decimals: nativeToken.decimals,
|
|
68
73
|
balance: (0, stringify_balance_1.stringifyBalanceWithDecimals)((0, utils_1.hexToBigInt)(rawBalance), nativeToken.decimals),
|
|
69
74
|
fiat: fiatData
|
|
@@ -94,7 +99,11 @@ const selectAllEvmAssets = createAssetListSelector([
|
|
|
94
99
|
for (const [accountAddress, addressTokens] of Object.entries(chainTokens)) {
|
|
95
100
|
for (const token of addressTokens) {
|
|
96
101
|
const tokenAddress = token.address;
|
|
97
|
-
const
|
|
102
|
+
const account = accountsMap[accountAddress];
|
|
103
|
+
if (!account) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const { accountGroupId, type, accountId } = account;
|
|
98
107
|
if (ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)) {
|
|
99
108
|
continue;
|
|
100
109
|
}
|
|
@@ -107,13 +116,14 @@ const selectAllEvmAssets = createAssetListSelector([
|
|
|
107
116
|
const groupChainAssets = groupAssets[accountGroupId][chainId];
|
|
108
117
|
const fiatData = getFiatBalanceForEvmToken(rawBalance, token.decimals, marketData, currencyRates, chainId, tokenAddress);
|
|
109
118
|
groupChainAssets.push({
|
|
110
|
-
type:
|
|
119
|
+
type: type,
|
|
111
120
|
assetId: tokenAddress,
|
|
112
121
|
isNative: false,
|
|
113
122
|
address: tokenAddress,
|
|
114
123
|
image: token.image ?? '',
|
|
115
124
|
name: token.name ?? token.symbol,
|
|
116
125
|
symbol: token.symbol,
|
|
126
|
+
accountId,
|
|
117
127
|
decimals: token.decimals,
|
|
118
128
|
balance: (0, stringify_balance_1.stringifyBalanceWithDecimals)((0, utils_1.hexToBigInt)(rawBalance), token.decimals),
|
|
119
129
|
fiat: fiatData
|
|
@@ -152,11 +162,12 @@ const selectAllMultichainAssets = createAssetListSelector([
|
|
|
152
162
|
}
|
|
153
163
|
const { chainId } = caipAsset;
|
|
154
164
|
const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;
|
|
155
|
-
const
|
|
165
|
+
const account = accountsMap[accountId];
|
|
156
166
|
const assetMetadata = multichainAssetsMetadata[assetId];
|
|
157
|
-
if (!
|
|
167
|
+
if (!account || !assetMetadata) {
|
|
158
168
|
continue;
|
|
159
169
|
}
|
|
170
|
+
const { accountGroupId, type } = account;
|
|
160
171
|
groupAssets[accountGroupId] ?? (groupAssets[accountGroupId] = {});
|
|
161
172
|
(_a = groupAssets[accountGroupId])[chainId] ?? (_a[chainId] = []);
|
|
162
173
|
const groupChainAssets = groupAssets[accountGroupId][chainId];
|
|
@@ -167,12 +178,13 @@ const selectAllMultichainAssets = createAssetListSelector([
|
|
|
167
178
|
const fiatData = getFiatBalanceForMultichainAsset(balance, multichainConversionRates, assetId);
|
|
168
179
|
// TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional
|
|
169
180
|
groupChainAssets.push({
|
|
170
|
-
type:
|
|
181
|
+
type: type,
|
|
171
182
|
assetId,
|
|
172
183
|
isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),
|
|
173
184
|
image: assetMetadata.iconUrl,
|
|
174
185
|
name: assetMetadata.name ?? assetMetadata.symbol ?? asset,
|
|
175
186
|
symbol: assetMetadata.symbol ?? asset,
|
|
187
|
+
accountId,
|
|
176
188
|
decimals: assetMetadata.units.find((unit) => unit.name === assetMetadata.name &&
|
|
177
189
|
unit.symbol === assetMetadata.symbol)?.decimals ?? 0,
|
|
178
190
|
balance: balance.amount,
|
|
@@ -218,7 +230,10 @@ function mergeAssets(existingAssets, newAssets) {
|
|
|
218
230
|
for (const [accountGroupId, accountAssets] of Object.entries(newAssets)) {
|
|
219
231
|
const existingAccountGroupAssets = existingAssets[accountGroupId];
|
|
220
232
|
if (!existingAccountGroupAssets) {
|
|
221
|
-
existingAssets[accountGroupId] =
|
|
233
|
+
existingAssets[accountGroupId] = {};
|
|
234
|
+
for (const [network, chainAssets] of Object.entries(accountAssets)) {
|
|
235
|
+
existingAssets[accountGroupId][network] = [...chainAssets];
|
|
236
|
+
}
|
|
222
237
|
}
|
|
223
238
|
else {
|
|
224
239
|
for (const [network, chainAssets] of Object.entries(accountAssets)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-selectors.cjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":";;;AAGA,iEAAiE;AAEjE,2CAA4E;AAC5E,uCAA0C;AAE1C,+DAAmE;AAKnE,qEAA0E;AAa1E,2GAA2G;AAC3G,MAAM,2BAA2B,GAAG;IAClC,kDAAkD;IAClD,oDAAoD;CACrD,CAAC;AA0DF,MAAM,uBAAuB,GAAG,yBAAc,CAAC,SAAS,EAAkB,CAAC;AAE3E,MAAM,0BAA0B,GAAG,uBAAuB,CACxD,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EACjE,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE;IAChC,MAAM,WAAW,GAAmC,EAAE,CAAC;IACvD,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QAC3D,KAAK,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACpE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE;gBAChC,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAE7D,WAAW;gBACT,gFAAgF;gBAChF,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACvC,CAAC,CAAC,eAAe,CAAC,OAAO;oBACzB,CAAC,CAAC,SAAS,CACd,GAAG,cAAc,CAAC;aACpB;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,mGAAmG;AACnG,MAAM,iCAAiC,GAAG,uBAAuB,CAC/D;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB;IAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,8BAA8B;CAChD,EACD,CACE,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,iBAAiB,CAC+B,EAAE;QAClD,KAAK,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3D,aAAa,CACd,EAAE;YACD,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;YACnD,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;YACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,IAAI,KAAK,CAAC;YAEnD,MAAM,cAAc,GAClB,8BAA8B,CAAC,OAAO,CAAC,EAAE,cAAc,IAAI,QAAQ,CAAC;YAEtE,MAAM,WAAW,GAAG;gBAClB,OAAO,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC;gBACvC,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;gBAC5D,MAAM,EAAE,cAAc;gBACtB,uDAAuD;gBACvD,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,WAAW,CAAC,QAAQ,EACpB,UAAU,EACV,aAAa,EACb,OAAO,EACP,WAAW,CAAC,OAAO,CACpB,CAAC;YAEF,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,OAAO,EAAE,IAAA,gDAA4B,EACnC,IAAA,mBAAW,EAAC,UAAU,CAAC,EACvB,WAAW,CAAC,QAAQ,CACrB;gBACD,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;wBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;qBACxC;oBACH,CAAC,CAAC,SAAS;gBACb,OAAO;aACR,CAAC,CAAC;SACJ;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,uBAAuB,CAChD;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB;IACjC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;CACjC,EACD,CACE,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,aAAa,EACb,eAAe,EACf,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAG1D,EAAE;QACH,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAC1D,WAAW,CACQ,EAAE;YACrB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;gBACjC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAc,CAAC;gBAC1C,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;gBAEnD,IACE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EACnE;oBACA,SAAS;iBACV;gBAED,MAAM,UAAU,GACd,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;gBAE3D,IAAI,CAAC,UAAU,EAAE;oBACf,SAAS;iBACV;gBAED,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;gBACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;gBAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;gBAE9D,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,KAAK,CAAC,QAAQ,EACd,UAAU,EACV,aAAa,EACb,OAAO,EACP,YAAY,CACb,CAAC;gBAEF,gBAAgB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;oBACxB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM;oBAChC,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO,EAAE,IAAA,gDAA4B,EACnC,IAAA,mBAAW,EAAC,UAAU,CAAC,EACvB,KAAK,CAAC,QAAQ,CACf;oBACD,IAAI,EAAE,QAAQ;wBACZ,CAAC,CAAC;4BACE,OAAO,EAAE,QAAQ,CAAC,OAAO;4BACzB,QAAQ,EAAE,eAAe;4BACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;yBACxC;wBACH,CAAC,CAAC,SAAS;oBACb,OAAO;iBACR,CAAC,CAAC;aACJ;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,yBAAyB,GAAG,uBAAuB,CACvD;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc;IAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc;IAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;IACzB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;CACjC,EACD,CACE,WAAW,EACX,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;QACzE,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;YACnC,IAAI,SAAgD,CAAC;YACrD,IAAI;gBACF,SAAS,GAAG,IAAA,0BAAkB,EAAC,OAAO,CAAC,CAAC;aACzC;YAAC,MAAM;gBACN,6FAA6F;gBAC7F,SAAS;aACV;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAExE,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE;gBACrC,SAAS;aACV;YAED,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;YACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,OAAO,GAKG,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAEzD,IAAI,CAAC,OAAO,EAAE;gBACZ,SAAS;aACV;YAED,MAAM,QAAQ,GAAG,gCAAgC,CAC/C,OAAO,EACP,yBAAyB,EACzB,OAAO,CACR,CAAC;YAEF,gGAAgG;YAChG,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,YAAY;gBAClB,OAAO;gBACP,QAAQ,EAAE,2BAA2B,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACvD,KAAK,EAAE,aAAa,CAAC,OAAO;gBAC5B,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK;gBACzD,MAAM,EAAE,aAAa,CAAC,MAAM,IAAI,KAAK;gBACrC,QAAQ,EACN,aAAa,CAAC,KAAK,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;oBAChC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CACvC,EAAE,QAAQ,IAAI,CAAC;gBAClB,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;wBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;qBACxC;oBACH,CAAC,CAAC,SAAS;gBACb,OAAO;aACR,CAAC,CAAC;SACJ;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,eAAe,GAAG,uBAAuB,CAC7C;IACE,kBAAkB;IAClB,yBAAyB;IACzB,iCAAiC;CAClC,EACD,CAAC,SAAS,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,EAAE;IACxD,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEpC,WAAW,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE3C,WAAW,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IAEnD,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEW,QAAA,kCAAkC,GAAG,uBAAuB,CACvE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAC/C,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE;IAC3B,MAAM,EAAE,oBAAoB,EAAE,GAAG,WAAW,CAAC;IAC7C,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,EAAE,CAAC;KACX;IACD,OAAO,WAAW,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC,CACF,CAAC;AAEF,6HAA6H;AAC7H;;;;;GAKG;AACH,SAAS,WAAW,CAClB,cAAoC,EACpC,SAA+B;IAE/B,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAGnE,EAAE;QACH,MAAM,0BAA0B,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAElE,IAAI,CAAC,0BAA0B,EAAE;YAC/B,cAAc,CAAC,cAAc,CAAC,GAAG,aAAa,CAAC;SAChD;aAAM;YACL,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAClE,0BAA0B,CAAC,OAAO,MAAlC,0BAA0B,CAAC,OAAO,IAAM,EAAE,EAAC;gBAC3C,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;aAC1D;SACF;KACF;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAChC,UAAe,EACf,QAAgB,EAChB,UAAmD,EACnD,aAAiD,EACjD,OAAY,EACZ,YAAiB;IAEjB,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5D,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE;QACjC,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,WAAW,GACf,CAAC,IAAA,sCAAmB,EAAC,UAAU,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QAClD,eAAe,CAAC,KAAK;QACrB,YAAY,CAAC,cAAc,CAAC;IAE9B,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,cAAc,EAAE,YAAY,CAAC,cAAc;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gCAAgC,CACvC,OAAyC,EACzC,yBAAkF,EAClF,OAAkD;IAElD,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE;QAC1B,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;QAC9D,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport { stringifyBalanceWithDecimals } from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\ntype AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\n// If this gets out of hand with other chains, we should probably have a permanent object that defines them\nconst MULTICHAIN_NATIVE_ASSET_IDS = [\n `bip122:000000000019d6689c085ae165831e93/slip44:0`,\n `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,\n];\n\nexport type Asset = (\n | {\n type: 'evm';\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n type: 'multichain';\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<string, AccountGroupId> = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = accountGroupId;\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const accountGroupId = accountsMap[accountAddress];\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n type: 'evm',\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n decimals: nativeToken.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const accountGroupId = accountsMap[accountAddress];\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n type: 'evm',\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n decimals: token.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const accountGroupId = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!accountGroupId || !assetMetadata) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n if (!balance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n type: 'multichain',\n assetId,\n isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n decimals:\n assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals ?? 0,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = accountAssets;\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"token-selectors.cjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":";;;AAGA,iEAAiE;AAGjE,2CAA4E;AAC5E,uCAA0C;AAE1C,+DAAmE;AAKnE,qEAA0E;AAa1E,2GAA2G;AAC3G,MAAM,2BAA2B,GAAG;IAClC,kDAAkD;IAClD,oDAAoD;CACrD,CAAC;AAiEF,MAAM,uBAAuB,GAAG,yBAAc,CAAC,SAAS,EAAkB,CAAC;AAE3E,MAAM,0BAA0B,GAAG,uBAAuB,CACxD,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EACjE,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE;IAChC,MAAM,WAAW,GAOb,EAAE,CAAC;IACP,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QAC3D,KAAK,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACpE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE;gBAChC,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAE7D,WAAW;gBACT,gFAAgF;gBAChF,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACvC,CAAC,CAAC,eAAe,CAAC,OAAO;oBACzB,CAAC,CAAC,SAAS,CACd,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;aAC/D;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,mGAAmG;AACnG,MAAM,iCAAiC,GAAG,uBAAuB,CAC/D;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB;IAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,8BAA8B;CAChD,EACD,CACE,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,iBAAiB,CAC+B,EAAE;QAClD,KAAK,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3D,aAAa,CACd,EAAE;YACD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,OAAO,EAAE;gBACZ,SAAS;aACV;YAED,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;YAEpD,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;YACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,IAAI,KAAK,CAAC;YAEnD,MAAM,cAAc,GAClB,8BAA8B,CAAC,OAAO,CAAC,EAAE,cAAc,IAAI,QAAQ,CAAC;YAEtE,MAAM,WAAW,GAAG;gBAClB,OAAO,EAAE,IAAA,iCAAqB,EAAC,OAAO,CAAC;gBACvC,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;gBAC5D,MAAM,EAAE,cAAc;gBACtB,uDAAuD;gBACvD,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,WAAW,CAAC,QAAQ,EACpB,UAAU,EACV,aAAa,EACb,OAAO,EACP,WAAW,CAAC,OAAO,CACpB,CAAC;YAEF,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,IAAsB;gBAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,SAAS;gBACT,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,OAAO,EAAE,IAAA,gDAA4B,EACnC,IAAA,mBAAW,EAAC,UAAU,CAAC,EACvB,WAAW,CAAC,QAAQ,CACrB;gBACD,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;wBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;qBACxC;oBACH,CAAC,CAAC,SAAS;gBACb,OAAO;aACR,CAAC,CAAC;SACJ;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,uBAAuB,CAChD;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB;IACjC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;CACjC,EACD,CACE,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,aAAa,EACb,eAAe,EACf,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAG1D,EAAE;QACH,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAC1D,WAAW,CACQ,EAAE;YACrB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;gBACjC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAc,CAAC;gBAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE;oBACZ,SAAS;iBACV;gBAED,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;gBAEpD,IACE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EACnE;oBACA,SAAS;iBACV;gBAED,MAAM,UAAU,GACd,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;gBAE3D,IAAI,CAAC,UAAU,EAAE;oBACf,SAAS;iBACV;gBAED,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;gBACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;gBAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;gBAE9D,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,KAAK,CAAC,QAAQ,EACd,UAAU,EACV,aAAa,EACb,OAAO,EACP,YAAY,CACb,CAAC;gBAEF,gBAAgB,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,IAAsB;oBAC5B,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;oBACxB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM;oBAChC,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS;oBACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO,EAAE,IAAA,gDAA4B,EACnC,IAAA,mBAAW,EAAC,UAAU,CAAC,EACvB,KAAK,CAAC,QAAQ,CACf;oBACD,IAAI,EAAE,QAAQ;wBACZ,CAAC,CAAC;4BACE,OAAO,EAAE,QAAQ,CAAC,OAAO;4BACzB,QAAQ,EAAE,eAAe;4BACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;yBACxC;wBACH,CAAC,CAAC,SAAS;oBACb,OAAO;iBACR,CAAC,CAAC;aACJ;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,yBAAyB,GAAG,uBAAuB,CACvD;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc;IAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc;IAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;IACzB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;CACjC,EACD,CACE,WAAW,EACX,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;QACzE,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;YACnC,IAAI,SAAgD,CAAC;YACrD,IAAI;gBACF,SAAS,GAAG,IAAA,0BAAkB,EAAC,OAAO,CAAC,CAAC;aACzC;YAAC,MAAM;gBACN,6FAA6F;gBAC7F,SAAS;aACV;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAExE,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,EAAE;gBAC9B,SAAS;aACV;YAED,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAEzC,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;YACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,OAAO,GAKG,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAEzD,IAAI,CAAC,OAAO,EAAE;gBACZ,SAAS;aACV;YAED,MAAM,QAAQ,GAAG,gCAAgC,CAC/C,OAAO,EACP,yBAAyB,EACzB,OAAO,CACR,CAAC;YAEF,gGAAgG;YAChG,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,IAA6B;gBACnC,OAAO;gBACP,QAAQ,EAAE,2BAA2B,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACvD,KAAK,EAAE,aAAa,CAAC,OAAO;gBAC5B,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK;gBACzD,MAAM,EAAE,aAAa,CAAC,MAAM,IAAI,KAAK;gBACrC,SAAS;gBACT,QAAQ,EACN,aAAa,CAAC,KAAK,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;oBAChC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CACvC,EAAE,QAAQ,IAAI,CAAC;gBAClB,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;wBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;qBACxC;oBACH,CAAC,CAAC,SAAS;gBACb,OAAO;aACR,CAAC,CAAC;SACJ;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,eAAe,GAAG,uBAAuB,CAC7C;IACE,kBAAkB;IAClB,yBAAyB;IACzB,iCAAiC;CAClC,EACD,CAAC,SAAS,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,EAAE;IACxD,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEpC,WAAW,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE3C,WAAW,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IAEnD,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEW,QAAA,kCAAkC,GAAG,uBAAuB,CACvE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAC/C,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE;IAC3B,MAAM,EAAE,oBAAoB,EAAE,GAAG,WAAW,CAAC;IAC7C,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,EAAE,CAAC;KACX;IACD,OAAO,WAAW,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC,CACF,CAAC;AAEF,6HAA6H;AAC7H;;;;;GAKG;AACH,SAAS,WAAW,CAClB,cAAoC,EACpC,SAA+B;IAE/B,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAGnE,EAAE;QACH,MAAM,0BAA0B,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAElE,IAAI,CAAC,0BAA0B,EAAE;YAC/B,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAClE,cAAc,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;aAC5D;SACF;aAAM;YACL,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAClE,0BAA0B,CAAC,OAAO,MAAlC,0BAA0B,CAAC,OAAO,IAAM,EAAE,EAAC;gBAC3C,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;aAC1D;SACF;KACF;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAChC,UAAe,EACf,QAAgB,EAChB,UAAmD,EACnD,aAAiD,EACjD,OAAY,EACZ,YAAiB;IAEjB,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5D,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE;QACjC,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,WAAW,GACf,CAAC,IAAA,sCAAmB,EAAC,UAAU,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QAClD,eAAe,CAAC,KAAK;QACrB,YAAY,CAAC,cAAc,CAAC;IAE9B,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,cAAc,EAAE,YAAY,CAAC,cAAc;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gCAAgC,CACvC,OAAyC,EACzC,yBAAkF,EAClF,OAAkD;IAElD,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE;QAC1B,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;QAC9D,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport { stringifyBalanceWithDecimals } from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\ntype AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\n// If this gets out of hand with other chains, we should probably have a permanent object that defines them\nconst MULTICHAIN_NATIVE_ASSET_IDS = [\n `bip122:000000000019d6689c085ae165831e93/slip44:0`,\n `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,\n];\n\ntype EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;\ntype MultichainAccountType = Exclude<\n InternalAccount['type'],\n `eip155:${string}`\n>;\n\nexport type Asset = (\n | {\n type: EvmAccountType;\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n type: MultichainAccountType;\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n accountId: string;\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<\n string,\n {\n accountGroupId: AccountGroupId;\n type: InternalAccount['type'];\n accountId: string;\n }\n > = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = { accountGroupId, type: internalAccount.type, accountId };\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const account = accountsMap[accountAddress.toLowerCase()];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n type: type as EvmAccountType,\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n accountId,\n decimals: nativeToken.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const account = accountsMap[accountAddress];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n type: type as EvmAccountType,\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n accountId,\n decimals: token.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const account = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!account || !assetMetadata) {\n continue;\n }\n\n const { accountGroupId, type } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n if (!balance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n type: type as MultichainAccountType,\n assetId,\n isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n accountId,\n decimals:\n assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals ?? 0,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = {};\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAssets[accountGroupId][network] = [...chainAssets];\n }\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AccountGroupId } from "@metamask/account-api";
|
|
2
2
|
import type { AccountTreeControllerState } from "@metamask/account-tree-controller";
|
|
3
3
|
import type { AccountsControllerState } from "@metamask/accounts-controller";
|
|
4
|
+
import type { InternalAccount } from "@metamask/keyring-internal-api";
|
|
4
5
|
import type { NetworkState } from "@metamask/network-controller";
|
|
5
6
|
import { type Hex } from "@metamask/utils";
|
|
6
7
|
import type { CurrencyRateState } from "../CurrencyRateController.cjs";
|
|
@@ -16,16 +17,19 @@ type AssetsByAccountGroup = {
|
|
|
16
17
|
export type AccountGroupAssets = {
|
|
17
18
|
[network: string]: Asset[];
|
|
18
19
|
};
|
|
20
|
+
type EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;
|
|
21
|
+
type MultichainAccountType = Exclude<InternalAccount['type'], `eip155:${string}`>;
|
|
19
22
|
export type Asset = ({
|
|
20
|
-
type:
|
|
23
|
+
type: EvmAccountType;
|
|
21
24
|
assetId: Hex;
|
|
22
25
|
address: Hex;
|
|
23
26
|
chainId: Hex;
|
|
24
27
|
} | {
|
|
25
|
-
type:
|
|
28
|
+
type: MultichainAccountType;
|
|
26
29
|
assetId: `${string}:${string}/${string}:${string}`;
|
|
27
30
|
chainId: `${string}:${string}`;
|
|
28
31
|
}) & {
|
|
32
|
+
accountId: string;
|
|
29
33
|
image: string;
|
|
30
34
|
name: string;
|
|
31
35
|
symbol: string;
|
|
@@ -99,7 +103,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
99
103
|
resultsCount: () => number;
|
|
100
104
|
resetResultsCount: () => void;
|
|
101
105
|
} & {
|
|
102
|
-
resultFunc: (resultFuncArgs_0: Record<string,
|
|
106
|
+
resultFunc: (resultFuncArgs_0: Record<string, {
|
|
107
|
+
accountGroupId: AccountGroupId;
|
|
108
|
+
type: InternalAccount['type'];
|
|
109
|
+
accountId: string;
|
|
110
|
+
}>, resultFuncArgs_1: {
|
|
103
111
|
[chainId: `0x${string}`]: {
|
|
104
112
|
[key: string]: Token[];
|
|
105
113
|
};
|
|
@@ -112,7 +120,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
112
120
|
conversionRate: number | null;
|
|
113
121
|
usdConversionRate: number | null;
|
|
114
122
|
}>, resultFuncArgs_6: string) => AssetsByAccountGroup;
|
|
115
|
-
memoizedResultFunc: ((resultFuncArgs_0: Record<string,
|
|
123
|
+
memoizedResultFunc: ((resultFuncArgs_0: Record<string, {
|
|
124
|
+
accountGroupId: AccountGroupId;
|
|
125
|
+
type: InternalAccount['type'];
|
|
126
|
+
accountId: string;
|
|
127
|
+
}>, resultFuncArgs_1: {
|
|
116
128
|
[chainId: `0x${string}`]: {
|
|
117
129
|
[key: string]: Token[];
|
|
118
130
|
};
|
|
@@ -130,7 +142,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
130
142
|
resetResultsCount: () => void;
|
|
131
143
|
};
|
|
132
144
|
lastResult: () => AssetsByAccountGroup;
|
|
133
|
-
dependencies: [((state: AssetListState) => Record<string,
|
|
145
|
+
dependencies: [((state: AssetListState) => Record<string, {
|
|
146
|
+
accountGroupId: AccountGroupId;
|
|
147
|
+
type: InternalAccount['type'];
|
|
148
|
+
accountId: string;
|
|
149
|
+
}>) & {
|
|
134
150
|
clearCache: () => void;
|
|
135
151
|
resultsCount: () => number;
|
|
136
152
|
resetResultsCount: () => void;
|
|
@@ -176,7 +192,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
176
192
|
methods: string[];
|
|
177
193
|
}>;
|
|
178
194
|
selectedAccount: string;
|
|
179
|
-
}) => Record<string,
|
|
195
|
+
}) => Record<string, {
|
|
196
|
+
accountGroupId: AccountGroupId;
|
|
197
|
+
type: InternalAccount['type'];
|
|
198
|
+
accountId: string;
|
|
199
|
+
}>;
|
|
180
200
|
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
181
201
|
wallets: {
|
|
182
202
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.cjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletKeyringObject;
|
|
@@ -218,12 +238,20 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
218
238
|
methods: string[];
|
|
219
239
|
}>;
|
|
220
240
|
selectedAccount: string;
|
|
221
|
-
}) => Record<string,
|
|
241
|
+
}) => Record<string, {
|
|
242
|
+
accountGroupId: AccountGroupId;
|
|
243
|
+
type: InternalAccount['type'];
|
|
244
|
+
accountId: string;
|
|
245
|
+
}>) & {
|
|
222
246
|
clearCache: () => void;
|
|
223
247
|
resultsCount: () => number;
|
|
224
248
|
resetResultsCount: () => void;
|
|
225
249
|
};
|
|
226
|
-
lastResult: () => Record<string,
|
|
250
|
+
lastResult: () => Record<string, {
|
|
251
|
+
accountGroupId: AccountGroupId;
|
|
252
|
+
type: InternalAccount['type'];
|
|
253
|
+
accountId: string;
|
|
254
|
+
}>;
|
|
227
255
|
dependencies: [(state: AssetListState) => {
|
|
228
256
|
wallets: {
|
|
229
257
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.cjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletKeyringObject;
|
|
@@ -298,7 +326,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
298
326
|
resultsCount: () => number;
|
|
299
327
|
resetResultsCount: () => void;
|
|
300
328
|
} & {
|
|
301
|
-
resultFunc: (resultFuncArgs_0: Record<string,
|
|
329
|
+
resultFunc: (resultFuncArgs_0: Record<string, {
|
|
330
|
+
accountGroupId: AccountGroupId;
|
|
331
|
+
type: InternalAccount['type'];
|
|
332
|
+
accountId: string;
|
|
333
|
+
}>, resultFuncArgs_1: {
|
|
302
334
|
[account: string]: `${string}:${string}/${string}:${string}`[];
|
|
303
335
|
}, resultFuncArgs_2: {
|
|
304
336
|
[asset: `${string}:${string}/${string}:${string}`]: {
|
|
@@ -322,7 +354,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
322
354
|
}, resultFuncArgs_4: Record<`${string}:${string}/${string}:${string}`, import("@metamask/snaps-sdk").AssetConversion & {
|
|
323
355
|
marketData?: import("@metamask/snaps-sdk").FungibleAssetMarketData | undefined;
|
|
324
356
|
}>, resultFuncArgs_5: string) => AssetsByAccountGroup;
|
|
325
|
-
memoizedResultFunc: ((resultFuncArgs_0: Record<string,
|
|
357
|
+
memoizedResultFunc: ((resultFuncArgs_0: Record<string, {
|
|
358
|
+
accountGroupId: AccountGroupId;
|
|
359
|
+
type: InternalAccount['type'];
|
|
360
|
+
accountId: string;
|
|
361
|
+
}>, resultFuncArgs_1: {
|
|
326
362
|
[account: string]: `${string}:${string}/${string}:${string}`[];
|
|
327
363
|
}, resultFuncArgs_2: {
|
|
328
364
|
[asset: `${string}:${string}/${string}:${string}`]: {
|
|
@@ -351,7 +387,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
351
387
|
resetResultsCount: () => void;
|
|
352
388
|
};
|
|
353
389
|
lastResult: () => AssetsByAccountGroup;
|
|
354
|
-
dependencies: [((state: AssetListState) => Record<string,
|
|
390
|
+
dependencies: [((state: AssetListState) => Record<string, {
|
|
391
|
+
accountGroupId: AccountGroupId;
|
|
392
|
+
type: InternalAccount['type'];
|
|
393
|
+
accountId: string;
|
|
394
|
+
}>) & {
|
|
355
395
|
clearCache: () => void;
|
|
356
396
|
resultsCount: () => number;
|
|
357
397
|
resetResultsCount: () => void;
|
|
@@ -397,7 +437,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
397
437
|
methods: string[];
|
|
398
438
|
}>;
|
|
399
439
|
selectedAccount: string;
|
|
400
|
-
}) => Record<string,
|
|
440
|
+
}) => Record<string, {
|
|
441
|
+
accountGroupId: AccountGroupId;
|
|
442
|
+
type: InternalAccount['type'];
|
|
443
|
+
accountId: string;
|
|
444
|
+
}>;
|
|
401
445
|
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
402
446
|
wallets: {
|
|
403
447
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.cjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletKeyringObject;
|
|
@@ -439,12 +483,20 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
439
483
|
methods: string[];
|
|
440
484
|
}>;
|
|
441
485
|
selectedAccount: string;
|
|
442
|
-
}) => Record<string,
|
|
486
|
+
}) => Record<string, {
|
|
487
|
+
accountGroupId: AccountGroupId;
|
|
488
|
+
type: InternalAccount['type'];
|
|
489
|
+
accountId: string;
|
|
490
|
+
}>) & {
|
|
443
491
|
clearCache: () => void;
|
|
444
492
|
resultsCount: () => number;
|
|
445
493
|
resetResultsCount: () => void;
|
|
446
494
|
};
|
|
447
|
-
lastResult: () => Record<string,
|
|
495
|
+
lastResult: () => Record<string, {
|
|
496
|
+
accountGroupId: AccountGroupId;
|
|
497
|
+
type: InternalAccount['type'];
|
|
498
|
+
accountId: string;
|
|
499
|
+
}>;
|
|
448
500
|
dependencies: [(state: AssetListState) => {
|
|
449
501
|
wallets: {
|
|
450
502
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.cjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletKeyringObject;
|
|
@@ -530,14 +582,22 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
530
582
|
resultsCount: () => number;
|
|
531
583
|
resetResultsCount: () => void;
|
|
532
584
|
} & {
|
|
533
|
-
resultFunc: (resultFuncArgs_0: Record<string,
|
|
585
|
+
resultFunc: (resultFuncArgs_0: Record<string, {
|
|
586
|
+
accountGroupId: AccountGroupId;
|
|
587
|
+
type: InternalAccount['type'];
|
|
588
|
+
accountId: string;
|
|
589
|
+
}>, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, {
|
|
534
590
|
balance: Hex | null;
|
|
535
591
|
}>>, resultFuncArgs_2: Record<`0x${string}`, Record<`0x${string}`, import("../TokenRatesController.cjs").MarketDataDetails>>, resultFuncArgs_3: Record<string, {
|
|
536
592
|
conversionDate: number | null;
|
|
537
593
|
conversionRate: number | null;
|
|
538
594
|
usdConversionRate: number | null;
|
|
539
595
|
}>, resultFuncArgs_4: string, resultFuncArgs_5: Record<`0x${string}`, import("@metamask/network-controller").NetworkConfiguration>) => AssetsByAccountGroup;
|
|
540
|
-
memoizedResultFunc: ((resultFuncArgs_0: Record<string,
|
|
596
|
+
memoizedResultFunc: ((resultFuncArgs_0: Record<string, {
|
|
597
|
+
accountGroupId: AccountGroupId;
|
|
598
|
+
type: InternalAccount['type'];
|
|
599
|
+
accountId: string;
|
|
600
|
+
}>, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, {
|
|
541
601
|
balance: Hex | null;
|
|
542
602
|
}>>, resultFuncArgs_2: Record<`0x${string}`, Record<`0x${string}`, import("../TokenRatesController.cjs").MarketDataDetails>>, resultFuncArgs_3: Record<string, {
|
|
543
603
|
conversionDate: number | null;
|
|
@@ -549,7 +609,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
549
609
|
resetResultsCount: () => void;
|
|
550
610
|
};
|
|
551
611
|
lastResult: () => AssetsByAccountGroup;
|
|
552
|
-
dependencies: [((state: AssetListState) => Record<string,
|
|
612
|
+
dependencies: [((state: AssetListState) => Record<string, {
|
|
613
|
+
accountGroupId: AccountGroupId;
|
|
614
|
+
type: InternalAccount['type'];
|
|
615
|
+
accountId: string;
|
|
616
|
+
}>) & {
|
|
553
617
|
clearCache: () => void;
|
|
554
618
|
resultsCount: () => number;
|
|
555
619
|
resetResultsCount: () => void;
|
|
@@ -595,7 +659,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
595
659
|
methods: string[];
|
|
596
660
|
}>;
|
|
597
661
|
selectedAccount: string;
|
|
598
|
-
}) => Record<string,
|
|
662
|
+
}) => Record<string, {
|
|
663
|
+
accountGroupId: AccountGroupId;
|
|
664
|
+
type: InternalAccount['type'];
|
|
665
|
+
accountId: string;
|
|
666
|
+
}>;
|
|
599
667
|
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
600
668
|
wallets: {
|
|
601
669
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.cjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletKeyringObject;
|
|
@@ -637,12 +705,20 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
637
705
|
methods: string[];
|
|
638
706
|
}>;
|
|
639
707
|
selectedAccount: string;
|
|
640
|
-
}) => Record<string,
|
|
708
|
+
}) => Record<string, {
|
|
709
|
+
accountGroupId: AccountGroupId;
|
|
710
|
+
type: InternalAccount['type'];
|
|
711
|
+
accountId: string;
|
|
712
|
+
}>) & {
|
|
641
713
|
clearCache: () => void;
|
|
642
714
|
resultsCount: () => number;
|
|
643
715
|
resetResultsCount: () => void;
|
|
644
716
|
};
|
|
645
|
-
lastResult: () => Record<string,
|
|
717
|
+
lastResult: () => Record<string, {
|
|
718
|
+
accountGroupId: AccountGroupId;
|
|
719
|
+
type: InternalAccount['type'];
|
|
720
|
+
accountId: string;
|
|
721
|
+
}>;
|
|
646
722
|
dependencies: [(state: AssetListState) => {
|
|
647
723
|
wallets: {
|
|
648
724
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.cjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.cjs").AccountWalletKeyringObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-selectors.d.cts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,EAAmC,KAAK,GAAG,EAAE,wBAAwB;AAI5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,gDAAsC;AACrF,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AAEzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,KAAK,oBAAoB,GAAG;IAC1B,CAAC,cAAc,EAAE,cAAc,GAAG,kBAAkB,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;CAC5B,CAAC;AAQF,MAAM,MAAM,KAAK,GAAG,CAChB;IACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"token-selectors.d.cts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AccountGroupId } from "@metamask/account-api";
|
|
2
2
|
import type { AccountTreeControllerState } from "@metamask/account-tree-controller";
|
|
3
3
|
import type { AccountsControllerState } from "@metamask/accounts-controller";
|
|
4
|
+
import type { InternalAccount } from "@metamask/keyring-internal-api";
|
|
4
5
|
import type { NetworkState } from "@metamask/network-controller";
|
|
5
6
|
import { type Hex } from "@metamask/utils";
|
|
6
7
|
import type { CurrencyRateState } from "../CurrencyRateController.mjs";
|
|
@@ -16,16 +17,19 @@ type AssetsByAccountGroup = {
|
|
|
16
17
|
export type AccountGroupAssets = {
|
|
17
18
|
[network: string]: Asset[];
|
|
18
19
|
};
|
|
20
|
+
type EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;
|
|
21
|
+
type MultichainAccountType = Exclude<InternalAccount['type'], `eip155:${string}`>;
|
|
19
22
|
export type Asset = ({
|
|
20
|
-
type:
|
|
23
|
+
type: EvmAccountType;
|
|
21
24
|
assetId: Hex;
|
|
22
25
|
address: Hex;
|
|
23
26
|
chainId: Hex;
|
|
24
27
|
} | {
|
|
25
|
-
type:
|
|
28
|
+
type: MultichainAccountType;
|
|
26
29
|
assetId: `${string}:${string}/${string}:${string}`;
|
|
27
30
|
chainId: `${string}:${string}`;
|
|
28
31
|
}) & {
|
|
32
|
+
accountId: string;
|
|
29
33
|
image: string;
|
|
30
34
|
name: string;
|
|
31
35
|
symbol: string;
|
|
@@ -99,7 +103,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
99
103
|
resultsCount: () => number;
|
|
100
104
|
resetResultsCount: () => void;
|
|
101
105
|
} & {
|
|
102
|
-
resultFunc: (resultFuncArgs_0: Record<string,
|
|
106
|
+
resultFunc: (resultFuncArgs_0: Record<string, {
|
|
107
|
+
accountGroupId: AccountGroupId;
|
|
108
|
+
type: InternalAccount['type'];
|
|
109
|
+
accountId: string;
|
|
110
|
+
}>, resultFuncArgs_1: {
|
|
103
111
|
[chainId: `0x${string}`]: {
|
|
104
112
|
[key: string]: Token[];
|
|
105
113
|
};
|
|
@@ -112,7 +120,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
112
120
|
conversionRate: number | null;
|
|
113
121
|
usdConversionRate: number | null;
|
|
114
122
|
}>, resultFuncArgs_6: string) => AssetsByAccountGroup;
|
|
115
|
-
memoizedResultFunc: ((resultFuncArgs_0: Record<string,
|
|
123
|
+
memoizedResultFunc: ((resultFuncArgs_0: Record<string, {
|
|
124
|
+
accountGroupId: AccountGroupId;
|
|
125
|
+
type: InternalAccount['type'];
|
|
126
|
+
accountId: string;
|
|
127
|
+
}>, resultFuncArgs_1: {
|
|
116
128
|
[chainId: `0x${string}`]: {
|
|
117
129
|
[key: string]: Token[];
|
|
118
130
|
};
|
|
@@ -130,7 +142,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
130
142
|
resetResultsCount: () => void;
|
|
131
143
|
};
|
|
132
144
|
lastResult: () => AssetsByAccountGroup;
|
|
133
|
-
dependencies: [((state: AssetListState) => Record<string,
|
|
145
|
+
dependencies: [((state: AssetListState) => Record<string, {
|
|
146
|
+
accountGroupId: AccountGroupId;
|
|
147
|
+
type: InternalAccount['type'];
|
|
148
|
+
accountId: string;
|
|
149
|
+
}>) & {
|
|
134
150
|
clearCache: () => void;
|
|
135
151
|
resultsCount: () => number;
|
|
136
152
|
resetResultsCount: () => void;
|
|
@@ -176,7 +192,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
176
192
|
methods: string[];
|
|
177
193
|
}>;
|
|
178
194
|
selectedAccount: string;
|
|
179
|
-
}) => Record<string,
|
|
195
|
+
}) => Record<string, {
|
|
196
|
+
accountGroupId: AccountGroupId;
|
|
197
|
+
type: InternalAccount['type'];
|
|
198
|
+
accountId: string;
|
|
199
|
+
}>;
|
|
180
200
|
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
181
201
|
wallets: {
|
|
182
202
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.mjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletKeyringObject;
|
|
@@ -218,12 +238,20 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
218
238
|
methods: string[];
|
|
219
239
|
}>;
|
|
220
240
|
selectedAccount: string;
|
|
221
|
-
}) => Record<string,
|
|
241
|
+
}) => Record<string, {
|
|
242
|
+
accountGroupId: AccountGroupId;
|
|
243
|
+
type: InternalAccount['type'];
|
|
244
|
+
accountId: string;
|
|
245
|
+
}>) & {
|
|
222
246
|
clearCache: () => void;
|
|
223
247
|
resultsCount: () => number;
|
|
224
248
|
resetResultsCount: () => void;
|
|
225
249
|
};
|
|
226
|
-
lastResult: () => Record<string,
|
|
250
|
+
lastResult: () => Record<string, {
|
|
251
|
+
accountGroupId: AccountGroupId;
|
|
252
|
+
type: InternalAccount['type'];
|
|
253
|
+
accountId: string;
|
|
254
|
+
}>;
|
|
227
255
|
dependencies: [(state: AssetListState) => {
|
|
228
256
|
wallets: {
|
|
229
257
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.mjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletKeyringObject;
|
|
@@ -298,7 +326,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
298
326
|
resultsCount: () => number;
|
|
299
327
|
resetResultsCount: () => void;
|
|
300
328
|
} & {
|
|
301
|
-
resultFunc: (resultFuncArgs_0: Record<string,
|
|
329
|
+
resultFunc: (resultFuncArgs_0: Record<string, {
|
|
330
|
+
accountGroupId: AccountGroupId;
|
|
331
|
+
type: InternalAccount['type'];
|
|
332
|
+
accountId: string;
|
|
333
|
+
}>, resultFuncArgs_1: {
|
|
302
334
|
[account: string]: `${string}:${string}/${string}:${string}`[];
|
|
303
335
|
}, resultFuncArgs_2: {
|
|
304
336
|
[asset: `${string}:${string}/${string}:${string}`]: {
|
|
@@ -322,7 +354,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
322
354
|
}, resultFuncArgs_4: Record<`${string}:${string}/${string}:${string}`, import("@metamask/snaps-sdk").AssetConversion & {
|
|
323
355
|
marketData?: import("@metamask/snaps-sdk").FungibleAssetMarketData | undefined;
|
|
324
356
|
}>, resultFuncArgs_5: string) => AssetsByAccountGroup;
|
|
325
|
-
memoizedResultFunc: ((resultFuncArgs_0: Record<string,
|
|
357
|
+
memoizedResultFunc: ((resultFuncArgs_0: Record<string, {
|
|
358
|
+
accountGroupId: AccountGroupId;
|
|
359
|
+
type: InternalAccount['type'];
|
|
360
|
+
accountId: string;
|
|
361
|
+
}>, resultFuncArgs_1: {
|
|
326
362
|
[account: string]: `${string}:${string}/${string}:${string}`[];
|
|
327
363
|
}, resultFuncArgs_2: {
|
|
328
364
|
[asset: `${string}:${string}/${string}:${string}`]: {
|
|
@@ -351,7 +387,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
351
387
|
resetResultsCount: () => void;
|
|
352
388
|
};
|
|
353
389
|
lastResult: () => AssetsByAccountGroup;
|
|
354
|
-
dependencies: [((state: AssetListState) => Record<string,
|
|
390
|
+
dependencies: [((state: AssetListState) => Record<string, {
|
|
391
|
+
accountGroupId: AccountGroupId;
|
|
392
|
+
type: InternalAccount['type'];
|
|
393
|
+
accountId: string;
|
|
394
|
+
}>) & {
|
|
355
395
|
clearCache: () => void;
|
|
356
396
|
resultsCount: () => number;
|
|
357
397
|
resetResultsCount: () => void;
|
|
@@ -397,7 +437,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
397
437
|
methods: string[];
|
|
398
438
|
}>;
|
|
399
439
|
selectedAccount: string;
|
|
400
|
-
}) => Record<string,
|
|
440
|
+
}) => Record<string, {
|
|
441
|
+
accountGroupId: AccountGroupId;
|
|
442
|
+
type: InternalAccount['type'];
|
|
443
|
+
accountId: string;
|
|
444
|
+
}>;
|
|
401
445
|
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
402
446
|
wallets: {
|
|
403
447
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.mjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletKeyringObject;
|
|
@@ -439,12 +483,20 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
439
483
|
methods: string[];
|
|
440
484
|
}>;
|
|
441
485
|
selectedAccount: string;
|
|
442
|
-
}) => Record<string,
|
|
486
|
+
}) => Record<string, {
|
|
487
|
+
accountGroupId: AccountGroupId;
|
|
488
|
+
type: InternalAccount['type'];
|
|
489
|
+
accountId: string;
|
|
490
|
+
}>) & {
|
|
443
491
|
clearCache: () => void;
|
|
444
492
|
resultsCount: () => number;
|
|
445
493
|
resetResultsCount: () => void;
|
|
446
494
|
};
|
|
447
|
-
lastResult: () => Record<string,
|
|
495
|
+
lastResult: () => Record<string, {
|
|
496
|
+
accountGroupId: AccountGroupId;
|
|
497
|
+
type: InternalAccount['type'];
|
|
498
|
+
accountId: string;
|
|
499
|
+
}>;
|
|
448
500
|
dependencies: [(state: AssetListState) => {
|
|
449
501
|
wallets: {
|
|
450
502
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.mjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletKeyringObject;
|
|
@@ -530,14 +582,22 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
530
582
|
resultsCount: () => number;
|
|
531
583
|
resetResultsCount: () => void;
|
|
532
584
|
} & {
|
|
533
|
-
resultFunc: (resultFuncArgs_0: Record<string,
|
|
585
|
+
resultFunc: (resultFuncArgs_0: Record<string, {
|
|
586
|
+
accountGroupId: AccountGroupId;
|
|
587
|
+
type: InternalAccount['type'];
|
|
588
|
+
accountId: string;
|
|
589
|
+
}>, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, {
|
|
534
590
|
balance: Hex | null;
|
|
535
591
|
}>>, resultFuncArgs_2: Record<`0x${string}`, Record<`0x${string}`, import("../TokenRatesController.mjs").MarketDataDetails>>, resultFuncArgs_3: Record<string, {
|
|
536
592
|
conversionDate: number | null;
|
|
537
593
|
conversionRate: number | null;
|
|
538
594
|
usdConversionRate: number | null;
|
|
539
595
|
}>, resultFuncArgs_4: string, resultFuncArgs_5: Record<`0x${string}`, import("@metamask/network-controller").NetworkConfiguration>) => AssetsByAccountGroup;
|
|
540
|
-
memoizedResultFunc: ((resultFuncArgs_0: Record<string,
|
|
596
|
+
memoizedResultFunc: ((resultFuncArgs_0: Record<string, {
|
|
597
|
+
accountGroupId: AccountGroupId;
|
|
598
|
+
type: InternalAccount['type'];
|
|
599
|
+
accountId: string;
|
|
600
|
+
}>, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, {
|
|
541
601
|
balance: Hex | null;
|
|
542
602
|
}>>, resultFuncArgs_2: Record<`0x${string}`, Record<`0x${string}`, import("../TokenRatesController.mjs").MarketDataDetails>>, resultFuncArgs_3: Record<string, {
|
|
543
603
|
conversionDate: number | null;
|
|
@@ -549,7 +609,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
549
609
|
resetResultsCount: () => void;
|
|
550
610
|
};
|
|
551
611
|
lastResult: () => AssetsByAccountGroup;
|
|
552
|
-
dependencies: [((state: AssetListState) => Record<string,
|
|
612
|
+
dependencies: [((state: AssetListState) => Record<string, {
|
|
613
|
+
accountGroupId: AccountGroupId;
|
|
614
|
+
type: InternalAccount['type'];
|
|
615
|
+
accountId: string;
|
|
616
|
+
}>) & {
|
|
553
617
|
clearCache: () => void;
|
|
554
618
|
resultsCount: () => number;
|
|
555
619
|
resetResultsCount: () => void;
|
|
@@ -595,7 +659,11 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
595
659
|
methods: string[];
|
|
596
660
|
}>;
|
|
597
661
|
selectedAccount: string;
|
|
598
|
-
}) => Record<string,
|
|
662
|
+
}) => Record<string, {
|
|
663
|
+
accountGroupId: AccountGroupId;
|
|
664
|
+
type: InternalAccount['type'];
|
|
665
|
+
accountId: string;
|
|
666
|
+
}>;
|
|
599
667
|
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
600
668
|
wallets: {
|
|
601
669
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.mjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletKeyringObject;
|
|
@@ -637,12 +705,20 @@ export declare const selectAssetsBySelectedAccountGroup: ((state: AssetListState
|
|
|
637
705
|
methods: string[];
|
|
638
706
|
}>;
|
|
639
707
|
selectedAccount: string;
|
|
640
|
-
}) => Record<string,
|
|
708
|
+
}) => Record<string, {
|
|
709
|
+
accountGroupId: AccountGroupId;
|
|
710
|
+
type: InternalAccount['type'];
|
|
711
|
+
accountId: string;
|
|
712
|
+
}>) & {
|
|
641
713
|
clearCache: () => void;
|
|
642
714
|
resultsCount: () => number;
|
|
643
715
|
resetResultsCount: () => void;
|
|
644
716
|
};
|
|
645
|
-
lastResult: () => Record<string,
|
|
717
|
+
lastResult: () => Record<string, {
|
|
718
|
+
accountGroupId: AccountGroupId;
|
|
719
|
+
type: InternalAccount['type'];
|
|
720
|
+
accountId: string;
|
|
721
|
+
}>;
|
|
646
722
|
dependencies: [(state: AssetListState) => {
|
|
647
723
|
wallets: {
|
|
648
724
|
[walletId: `entropy:${string}`]: import("../../../account-tree-controller/src/wallet.mjs").AccountWalletEntropyObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletSnapObject | import("../../../account-tree-controller/src/wallet.mjs").AccountWalletKeyringObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-selectors.d.mts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,EAAmC,KAAK,GAAG,EAAE,wBAAwB;AAI5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,gDAAsC;AACrF,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AAEzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,KAAK,oBAAoB,GAAG;IAC1B,CAAC,cAAc,EAAE,cAAc,GAAG,kBAAkB,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;CAC5B,CAAC;AAQF,MAAM,MAAM,KAAK,GAAG,CAChB;IACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"token-selectors.d.mts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ const selectAccountsToGroupIdMap = createAssetListSelector([(state) => state.acc
|
|
|
19
19
|
// TODO: We would not need internalAccounts if evmTokens state had the accountId
|
|
20
20
|
internalAccount.type.startsWith('eip155')
|
|
21
21
|
? internalAccount.address
|
|
22
|
-
: accountId] = accountGroupId;
|
|
22
|
+
: accountId] = { accountGroupId, type: internalAccount.type, accountId };
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -38,7 +38,11 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector([
|
|
|
38
38
|
const groupAssets = {};
|
|
39
39
|
for (const [chainId, chainAccounts] of Object.entries(accountsByChainId)) {
|
|
40
40
|
for (const [accountAddress, accountBalance] of Object.entries(chainAccounts)) {
|
|
41
|
-
const
|
|
41
|
+
const account = accountsMap[accountAddress.toLowerCase()];
|
|
42
|
+
if (!account) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const { accountGroupId, type, accountId } = account;
|
|
42
46
|
groupAssets[accountGroupId] ?? (groupAssets[accountGroupId] = {});
|
|
43
47
|
(_a = groupAssets[accountGroupId])[chainId] ?? (_a[chainId] = []);
|
|
44
48
|
const groupChainAssets = groupAssets[accountGroupId][chainId];
|
|
@@ -54,13 +58,14 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector([
|
|
|
54
58
|
};
|
|
55
59
|
const fiatData = getFiatBalanceForEvmToken(rawBalance, nativeToken.decimals, marketData, currencyRates, chainId, nativeToken.address);
|
|
56
60
|
groupChainAssets.push({
|
|
57
|
-
type:
|
|
61
|
+
type: type,
|
|
58
62
|
assetId: nativeToken.address,
|
|
59
63
|
isNative: true,
|
|
60
64
|
address: nativeToken.address,
|
|
61
65
|
image: nativeToken.image,
|
|
62
66
|
name: nativeToken.name,
|
|
63
67
|
symbol: nativeToken.symbol,
|
|
68
|
+
accountId,
|
|
64
69
|
decimals: nativeToken.decimals,
|
|
65
70
|
balance: stringifyBalanceWithDecimals(hexToBigInt(rawBalance), nativeToken.decimals),
|
|
66
71
|
fiat: fiatData
|
|
@@ -91,7 +96,11 @@ const selectAllEvmAssets = createAssetListSelector([
|
|
|
91
96
|
for (const [accountAddress, addressTokens] of Object.entries(chainTokens)) {
|
|
92
97
|
for (const token of addressTokens) {
|
|
93
98
|
const tokenAddress = token.address;
|
|
94
|
-
const
|
|
99
|
+
const account = accountsMap[accountAddress];
|
|
100
|
+
if (!account) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const { accountGroupId, type, accountId } = account;
|
|
95
104
|
if (ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)) {
|
|
96
105
|
continue;
|
|
97
106
|
}
|
|
@@ -104,13 +113,14 @@ const selectAllEvmAssets = createAssetListSelector([
|
|
|
104
113
|
const groupChainAssets = groupAssets[accountGroupId][chainId];
|
|
105
114
|
const fiatData = getFiatBalanceForEvmToken(rawBalance, token.decimals, marketData, currencyRates, chainId, tokenAddress);
|
|
106
115
|
groupChainAssets.push({
|
|
107
|
-
type:
|
|
116
|
+
type: type,
|
|
108
117
|
assetId: tokenAddress,
|
|
109
118
|
isNative: false,
|
|
110
119
|
address: tokenAddress,
|
|
111
120
|
image: token.image ?? '',
|
|
112
121
|
name: token.name ?? token.symbol,
|
|
113
122
|
symbol: token.symbol,
|
|
123
|
+
accountId,
|
|
114
124
|
decimals: token.decimals,
|
|
115
125
|
balance: stringifyBalanceWithDecimals(hexToBigInt(rawBalance), token.decimals),
|
|
116
126
|
fiat: fiatData
|
|
@@ -149,11 +159,12 @@ const selectAllMultichainAssets = createAssetListSelector([
|
|
|
149
159
|
}
|
|
150
160
|
const { chainId } = caipAsset;
|
|
151
161
|
const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;
|
|
152
|
-
const
|
|
162
|
+
const account = accountsMap[accountId];
|
|
153
163
|
const assetMetadata = multichainAssetsMetadata[assetId];
|
|
154
|
-
if (!
|
|
164
|
+
if (!account || !assetMetadata) {
|
|
155
165
|
continue;
|
|
156
166
|
}
|
|
167
|
+
const { accountGroupId, type } = account;
|
|
157
168
|
groupAssets[accountGroupId] ?? (groupAssets[accountGroupId] = {});
|
|
158
169
|
(_a = groupAssets[accountGroupId])[chainId] ?? (_a[chainId] = []);
|
|
159
170
|
const groupChainAssets = groupAssets[accountGroupId][chainId];
|
|
@@ -164,12 +175,13 @@ const selectAllMultichainAssets = createAssetListSelector([
|
|
|
164
175
|
const fiatData = getFiatBalanceForMultichainAsset(balance, multichainConversionRates, assetId);
|
|
165
176
|
// TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional
|
|
166
177
|
groupChainAssets.push({
|
|
167
|
-
type:
|
|
178
|
+
type: type,
|
|
168
179
|
assetId,
|
|
169
180
|
isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),
|
|
170
181
|
image: assetMetadata.iconUrl,
|
|
171
182
|
name: assetMetadata.name ?? assetMetadata.symbol ?? asset,
|
|
172
183
|
symbol: assetMetadata.symbol ?? asset,
|
|
184
|
+
accountId,
|
|
173
185
|
decimals: assetMetadata.units.find((unit) => unit.name === assetMetadata.name &&
|
|
174
186
|
unit.symbol === assetMetadata.symbol)?.decimals ?? 0,
|
|
175
187
|
balance: balance.amount,
|
|
@@ -215,7 +227,10 @@ function mergeAssets(existingAssets, newAssets) {
|
|
|
215
227
|
for (const [accountGroupId, accountAssets] of Object.entries(newAssets)) {
|
|
216
228
|
const existingAccountGroupAssets = existingAssets[accountGroupId];
|
|
217
229
|
if (!existingAccountGroupAssets) {
|
|
218
|
-
existingAssets[accountGroupId] =
|
|
230
|
+
existingAssets[accountGroupId] = {};
|
|
231
|
+
for (const [network, chainAssets] of Object.entries(accountAssets)) {
|
|
232
|
+
existingAssets[accountGroupId][network] = [...chainAssets];
|
|
233
|
+
}
|
|
219
234
|
}
|
|
220
235
|
else {
|
|
221
236
|
for (const [network, chainAssets] of Object.entries(accountAssets)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-selectors.mjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport { stringifyBalanceWithDecimals } from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\ntype AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\n// If this gets out of hand with other chains, we should probably have a permanent object that defines them\nconst MULTICHAIN_NATIVE_ASSET_IDS = [\n `bip122:000000000019d6689c085ae165831e93/slip44:0`,\n `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,\n];\n\nexport type Asset = (\n | {\n type: 'evm';\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n type: 'multichain';\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<string, AccountGroupId> = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = accountGroupId;\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const accountGroupId = accountsMap[accountAddress];\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n type: 'evm',\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n decimals: nativeToken.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const accountGroupId = accountsMap[accountAddress];\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n type: 'evm',\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n decimals: token.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const accountGroupId = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!accountGroupId || !assetMetadata) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n if (!balance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n type: 'multichain',\n assetId,\n isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n decimals:\n assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals ?? 0,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = accountAssets;\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"token-selectors.mjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport { stringifyBalanceWithDecimals } from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\ntype AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\n// If this gets out of hand with other chains, we should probably have a permanent object that defines them\nconst MULTICHAIN_NATIVE_ASSET_IDS = [\n `bip122:000000000019d6689c085ae165831e93/slip44:0`,\n `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,\n];\n\ntype EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;\ntype MultichainAccountType = Exclude<\n InternalAccount['type'],\n `eip155:${string}`\n>;\n\nexport type Asset = (\n | {\n type: EvmAccountType;\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n type: MultichainAccountType;\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n accountId: string;\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<\n string,\n {\n accountGroupId: AccountGroupId;\n type: InternalAccount['type'];\n accountId: string;\n }\n > = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = { accountGroupId, type: internalAccount.type, accountId };\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const account = accountsMap[accountAddress.toLowerCase()];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n type: type as EvmAccountType,\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n accountId,\n decimals: nativeToken.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const account = accountsMap[accountAddress];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n type: type as EvmAccountType,\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n accountId,\n decimals: token.decimals,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const account = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!account || !assetMetadata) {\n continue;\n }\n\n const { accountGroupId, type } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n if (!balance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n type: type as MultichainAccountType,\n assetId,\n isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n accountId,\n decimals:\n assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals ?? 0,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = {};\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAssets[accountGroupId][network] = [...chainAssets];\n }\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/assets-controllers",
|
|
3
|
-
"version": "74.0.0-preview-
|
|
3
|
+
"version": "74.0.0-preview-ddceb3a8",
|
|
4
4
|
"description": "Controllers which manage interactions involving ERC-20, ERC-721, and ERC-1155 tokens (including NFTs)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|