Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: integrate spl tokens #30386

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/scripts/controller-init/controller-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export type Controller =
| MultiChainAssetsRatesController
| MultichainBalancesController
| MultichainTransactionsController
| MultiChainAssetsRatesController
| NetworkController
| OnboardingController
| PermissionController<
Expand Down Expand Up @@ -78,6 +79,7 @@ export type ControllerFlatState = AccountsController['state'] &
MultiChainAssetsRatesController['state'] &
MultichainBalancesController['state'] &
MultichainTransactionsController['state'] &
MultiChainAssetsRatesController['state'] &
NetworkController['state'] &
OnboardingController['state'] &
PermissionController<
Expand Down
3 changes: 3 additions & 0 deletions app/scripts/controller-init/messengers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ export const CONTROLLER_MESSENGERS = {
getMessenger: getMultichainTransactionsControllerMessenger,
getInitMessenger: noop,
},
MultiChainAssetsRatesController: {
getMessenger: getMultiChainAssetsRatesControllerMessenger,
},
RateLimitController: {
getMessenger: getRateLimitControllerMessenger,
getInitMessenger: getRateLimitControllerInitMessenger,
Expand Down
2 changes: 2 additions & 0 deletions app/scripts/controller-init/messengers/multichain/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
export { getMultichainAssetsControllerMessenger } from './multichain-assets-controller-messenger';
export { getMultiChainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';

Check failure on line 2 in app/scripts/controller-init/messengers/multichain/index.ts

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

Multiple exports of name 'getMultiChainAssetsRatesControllerMessenger'
export { getMultichainBalancesControllerMessenger } from './multichain-balances-controller-messenger';
export { getMultichainTransactionsControllerMessenger } from './multichain-transactions-controller-messenger';
export { getMultiChainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';

Check failure on line 5 in app/scripts/controller-init/messengers/multichain/index.ts

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

Multiple exports of name 'getMultiChainAssetsRatesControllerMessenger'

export type { MultichainAssetsControllerMessenger } from './multichain-assets-controller-messenger';
export type { MultiChainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';

Check failure on line 8 in app/scripts/controller-init/messengers/multichain/index.ts

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

Multiple exports of name 'MultiChainAssetsRatesControllerMessenger'
export type { MultichainBalancesControllerMessenger } from './multichain-balances-controller-messenger';
export type { MultichainTransactionsControllerMessenger } from './multichain-transactions-controller-messenger';
export type { MultiChainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';

Check failure on line 11 in app/scripts/controller-init/messengers/multichain/index.ts

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

Multiple exports of name 'MultiChainAssetsRatesControllerMessenger'
1 change: 1 addition & 0 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -2058,6 +2058,7 @@
MultiChainAssetsRatesController: MultiChainAssetsRatesControllerInit,
MultichainBalancesController: MultichainBalancesControllerInit,
MultichainTransactionsController: MultichainTransactionsControllerInit,
MultiChainAssetsRatesController: MultiChainAssetsRatesControllerInit,

Check failure on line 2061 in app/scripts/metamask-controller.js

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

Duplicate key 'MultiChainAssetsRatesController'
///: END:ONLY_INCLUDE_IF
};

Expand Down
87 changes: 0 additions & 87 deletions app/scripts/migrations/144.test.ts

This file was deleted.

71 changes: 0 additions & 71 deletions app/scripts/migrations/144.ts

This file was deleted.

1 change: 0 additions & 1 deletion app/scripts/migrations/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ const migrations = [
require('./141'),
require('./142'),
require('./143'),
require('./144'),
];

export default migrations;
5 changes: 5 additions & 0 deletions shared/constants/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
RpcEndpointType,
} from '@metamask/network-controller';
import { capitalize, pick } from 'lodash';
import { MultichainNetworks } from './multichain/networks';
/**
* A type representing built-in network types, used as an identifier.
*/
Expand Down Expand Up @@ -176,6 +177,7 @@ export const CHAIN_IDS = {
INK: '0xdef1',
MODE_SEPOLIA: '0x397',
MODE: '0x868b',
SOLANA: MultichainNetworks.SOLANA,
} as const;

export const CHAINLIST_CHAIN_IDS_MAP = {
Expand Down Expand Up @@ -520,6 +522,7 @@ export const SONIC_MAINNET_IMAGE_URL = './images/sonic.svg';
export const SONEIUM_IMAGE_URL = './images/soneium.svg';
export const MODE_SEPOLIA_IMAGE_URL = './images/mode-sepolia.svg';
export const MODE_IMAGE_URL = './images/mode.svg';
export const SOLANA_IMAGE_URL = './images/solana-logo.svg';
export const UNICHAIN_IMAGE_URL = './images/unichain.svg';

export const INFURA_PROVIDER_TYPES = [
Expand Down Expand Up @@ -885,6 +888,7 @@ export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP = {
[CHAINLIST_CHAIN_IDS_MAP.SONEIUM_TESTNET]: SONEIUM_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.MODE_SEPOLIA]: MODE_SEPOLIA_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.MODE]: MODE_IMAGE_URL,
[CHAIN_IDS.SOLANA]: SOLANA_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.UNICHAIN]: UNICHAIN_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.UNICHAIN_SEPOLIA]: UNICHAIN_IMAGE_URL,
} as const;
Expand Down Expand Up @@ -932,6 +936,7 @@ export const CHAIN_ID_TOKEN_IMAGE_MAP = {
[CHAINLIST_CHAIN_IDS_MAP.SONIC_MAINNET]: SONIC_MAINNET_IMAGE_URL,
[CHAIN_IDS.MODE]: ETH_TOKEN_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.FUNKICHAIN]: ETH_TOKEN_IMAGE_URL,
[CHAIN_IDS.SOLANA]: SOLANA_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.UNICHAIN]: ETH_TOKEN_IMAGE_URL,
[CHAINLIST_CHAIN_IDS_MAP.UNICHAIN_SEPOLIA]: ETH_TOKEN_IMAGE_URL,
} as const;
Expand Down
46 changes: 0 additions & 46 deletions shared/constants/price-api-currencies.ts

This file was deleted.

3 changes: 2 additions & 1 deletion shared/lib/accounts/solana-wallet-snap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { SnapId } from '@metamask/snaps-sdk';
// the Snap is being pre-installed only for Flask build (for the moment).
import SolanaWalletSnap from '@metamask/solana-wallet-snap/dist/preinstalled-snap.json';

export const SOLANA_WALLET_SNAP_ID: SnapId = SolanaWalletSnap.snapId as SnapId;
export const SOLANA_WALLET_SNAP_ID: SnapId =
'local:http://localhost:8080' as SnapId;

export const SOLANA_WALLET_NAME: string =
SolanaWalletSnap.manifest.proposedName;
87 changes: 87 additions & 0 deletions ui/components/app/assets/hooks/useMultichainAssets.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import { useSelector } from 'react-redux';
import { Hex } from '@metamask/utils';
import { getMultichainBalances } from '../../../../selectors/multichain';
import {
getAccountAssets,
getAssetsMetadata,
} from '../../../../selectors/assets';
import { CHAIN_ID_TOKEN_IMAGE_MAP } from '../../../../../shared/constants/network';
import { getSelectedInternalAccount } from '../../../../selectors';
import {
TranslateFunction,
networkTitleOverrides,
} from '../util/networkTitleOverrides';
import { useI18nContext } from '../../../../hooks/useI18nContext';
import { getAssetsRates } from '../../../../selectors/multichain-assets-rates';
import { formatWithThreshold } from '../util/formatWithThreshold';
import { getIntlLocale } from '../../../../ducks/locale/locale';
import { getCurrentCurrency } from '../../../../ducks/metamask/metamask';

const useMultiChainAssets = () => {
const t = useI18nContext();
const locale = useSelector(getIntlLocale);
const currentCurrency = useSelector(getCurrentCurrency);
const account = useSelector(getSelectedInternalAccount);
const multichainBalances = useSelector(getMultichainBalances);
const accountAssets = useSelector(getAccountAssets);
const assetsMetadata = useSelector(getAssetsMetadata);
const assetRates = useSelector(getAssetsRates);

const assetIds = accountAssets[account.id] || [];
const balances = multichainBalances[account.id];

return assetIds.map((assetId) => {
const [chainId, assetDetails] = assetId.split('/');
const isToken = assetDetails.split(':')[0] === 'token';

const balance = balances[assetId] || { amount: '0', unit: '' };
const rate = assetRates[assetId]?.rate || '0';
const fiatBalance = parseFloat(rate) * parseFloat(balance.amount);

const fiatAmount = formatWithThreshold(fiatBalance, 0.01, locale, {
style: 'currency',
currency: currentCurrency.toUpperCase(),
});

const metadata = assetsMetadata[assetId] || {
name: balance.unit,
symbol: balance.unit || '',
fungible: true,
units: [{ name: assetId, symbol: balance.unit || '', decimals: 0 }],
};

let tokenImage = '';

if (isToken) {
tokenImage = metadata.iconUrl || '';
} else {
tokenImage =
CHAIN_ID_TOKEN_IMAGE_MAP[
chainId as keyof typeof CHAIN_ID_TOKEN_IMAGE_MAP
] || '';
}

const decimals = metadata.units[0]?.decimals || 0;

return {
title: isToken
? metadata.name
: networkTitleOverrides(t as TranslateFunction, {
title: balance.unit,
}),
address: assetId as Hex,
symbol: metadata.symbol,
image: tokenImage,
decimals,
chainId,
isNative: false,
primary: balance.amount,
secondary: fiatAmount, // secondary balance (usually in fiat)
string: '',
tokenFiatAmount: fiatBalance, // for now we are keeping this is to satisfy sort, this should be fiat amount
isStakeable: false,
};
});
};

export default useMultiChainAssets;
Loading
Loading