diff --git a/eslint-suppressions.json b/eslint-suppressions.json index f605383ed..01e77944e 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -492,11 +492,6 @@ "count": 2 } }, - "packages/solana-wallet-snap/src/core/services/send/types.ts": { - "@typescript-eslint/no-shadow": { - "count": 1 - } - }, "packages/solana-wallet-snap/src/core/services/signer/Signer.ts": { "@typescript-eslint/explicit-function-return-type": { "count": 1 diff --git a/packages/solana-wallet-snap/snap.manifest.json b/packages/solana-wallet-snap/snap.manifest.json index 87607ea91..6d9added4 100644 --- a/packages/solana-wallet-snap/snap.manifest.json +++ b/packages/solana-wallet-snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/internal-snaps.git" }, "source": { - "shasum": "5FfpznC3zSm/PzcS3bNGu1a/heN2o1uLIfoc/y3xpMc=", + "shasum": "Q2MJMblB+y+GZbCWcaoI0QUB2pNN1JfiWP/y05hBg7g=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/solana-wallet-snap/src/core/clients/token-api-client/TokenApiClient.ts b/packages/solana-wallet-snap/src/core/clients/token-api-client/TokenApiClient.ts index cd0544f58..8a2706dff 100644 --- a/packages/solana-wallet-snap/src/core/clients/token-api-client/TokenApiClient.ts +++ b/packages/solana-wallet-snap/src/core/clients/token-api-client/TokenApiClient.ts @@ -88,7 +88,9 @@ export class TokenApiClient { // The Token API only supports the networks in TokenApiClient.supportedNetworks const supportedAssetTypes = assetTypes.filter((assetType) => { const { chainId } = parseCaipAssetType(assetType); - return TokenApiClient.supportedNetworks.includes(chainId as Network); + return TokenApiClient.supportedNetworks.includes( + chainId as (typeof TokenApiClient.supportedNetworks)[number], + ); }); if (supportedAssetTypes.length !== assetTypes.length) { diff --git a/packages/solana-wallet-snap/src/core/constants/solana.ts b/packages/solana-wallet-snap/src/core/constants/solana.ts index 6f542d64d..fa25dc564 100644 --- a/packages/solana-wallet-snap/src/core/constants/solana.ts +++ b/packages/solana-wallet-snap/src/core/constants/solana.ts @@ -14,26 +14,30 @@ export const METAMASK_ORIGIN_URL = 'https://metamask.io'; * * @see https://namespaces.chainagnostic.org/solana/caip2 */ -export enum Network { - Mainnet = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - Devnet = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', - Testnet = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', - Localnet = 'solana:123456789abcdef', -} - -export enum KnownCaip19Id { - SolMainnet = `${Network.Mainnet}/slip44:501`, - SolDevnet = `${Network.Devnet}/slip44:501`, - SolTestnet = `${Network.Testnet}/slip44:501`, - SolLocalnet = `${Network.Localnet}/slip44:501`, - UsdcMainnet = `${Network.Mainnet}/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`, - UsdcDevnet = `${Network.Devnet}/token:4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU`, - UsdcLocalnet = `${Network.Localnet}/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`, - EurcMainnet = `${Network.Mainnet}/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr`, - EurcDevnet = `${Network.Devnet}/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr`, - EurcLocalnet = `${Network.Localnet}/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr`, - Ai16zMainnet = `${Network.Mainnet}/token:HeLp6NuQkmYB4pYWo2zYs22mESHXPQYzXbB8n4V98jwC`, -} +export const Network = { + Mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + Devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', + Testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', + Localnet: 'solana:123456789abcdef', +} as const; + +export type Network = (typeof Network)[keyof typeof Network]; + +export const KnownCaip19Id = { + SolMainnet: `${Network.Mainnet}/slip44:501`, + SolDevnet: `${Network.Devnet}/slip44:501`, + SolTestnet: `${Network.Testnet}/slip44:501`, + SolLocalnet: `${Network.Localnet}/slip44:501`, + UsdcMainnet: `${Network.Mainnet}/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`, + UsdcDevnet: `${Network.Devnet}/token:4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU`, + UsdcLocalnet: `${Network.Localnet}/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`, + EurcMainnet: `${Network.Mainnet}/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr`, + EurcDevnet: `${Network.Devnet}/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr`, + EurcLocalnet: `${Network.Localnet}/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr`, + Ai16zMainnet: `${Network.Mainnet}/token:HeLp6NuQkmYB4pYWo2zYs22mESHXPQYzXbB8n4V98jwC`, +} as const; + +export type KnownCaip19Id = (typeof KnownCaip19Id)[keyof typeof KnownCaip19Id]; export type NativeCaipAssetType = `${Network}/slip44:501`; export type TokenCaipAssetType = `${Network}/token:${string}`; @@ -92,9 +96,12 @@ export const NETWORK_TO_EXPLORER_CLUSTER = { [Network.Localnet]: 'local', }; -export enum SolanaCaip19Tokens { - SOL = 'slip44:501', -} +export const SolanaCaip19Tokens = { + SOL: 'slip44:501', +} as const; + +export type SolanaCaip19Tokens = + (typeof SolanaCaip19Tokens)[keyof typeof SolanaCaip19Tokens]; export type TokenInfo = { symbol: string; diff --git a/packages/solana-wallet-snap/src/core/handlers/onClientRequest/types.ts b/packages/solana-wallet-snap/src/core/handlers/onClientRequest/types.ts index 2f220b2bb..ede29019a 100644 --- a/packages/solana-wallet-snap/src/core/handlers/onClientRequest/types.ts +++ b/packages/solana-wallet-snap/src/core/handlers/onClientRequest/types.ts @@ -1,12 +1,16 @@ -export enum ClientRequestMethod { - SignAndSendTransactionWithoutConfirmation = 'signAndSendTransactionWithoutConfirmation', - ConfirmSend = 'confirmSend', - SignAndSendTransaction = 'signAndSendTransaction', - ComputeFee = 'computeFee', - OnAddressInput = 'onAddressInput', - OnAmountInput = 'onAmountInput', - SignRewardsMessage = 'signRewardsMessage', - SignCardMessage = 'signCardMessage', - ApproveCardAmount = 'approveCardAmount', - SignProofOfOwnership = 'signProofOfOwnership', -} +export const ClientRequestMethod = { + SignAndSendTransactionWithoutConfirmation: + 'signAndSendTransactionWithoutConfirmation', + ConfirmSend: 'confirmSend', + SignAndSendTransaction: 'signAndSendTransaction', + ComputeFee: 'computeFee', + OnAddressInput: 'onAddressInput', + OnAmountInput: 'onAmountInput', + SignRewardsMessage: 'signRewardsMessage', + SignCardMessage: 'signCardMessage', + ApproveCardAmount: 'approveCardAmount', + SignProofOfOwnership: 'signProofOfOwnership', +} as const; + +export type ClientRequestMethod = + (typeof ClientRequestMethod)[keyof typeof ClientRequestMethod]; diff --git a/packages/solana-wallet-snap/src/core/handlers/onCronjob/backgroundEvents/ScheduleBackgroundEventMethod.ts b/packages/solana-wallet-snap/src/core/handlers/onCronjob/backgroundEvents/ScheduleBackgroundEventMethod.ts index 90d5cbf11..e79686f36 100644 --- a/packages/solana-wallet-snap/src/core/handlers/onCronjob/backgroundEvents/ScheduleBackgroundEventMethod.ts +++ b/packages/solana-wallet-snap/src/core/handlers/onCronjob/backgroundEvents/ScheduleBackgroundEventMethod.ts @@ -1,12 +1,15 @@ -export enum ScheduleBackgroundEventMethod { +export const ScheduleBackgroundEventMethod = { /** Triggered when a transaction is shown in confirmation UI */ - OnTransactionAdded = 'onTransactionAdded', + OnTransactionAdded: 'onTransactionAdded', /** Triggered when the user confirms a transaction in the confirmation UI */ - OnTransactionApproved = 'onTransactionApproved', + OnTransactionApproved: 'onTransactionApproved', /** Triggered when a transaction is rejected */ - OnTransactionRejected = 'onTransactionRejected', + OnTransactionRejected: 'onTransactionRejected', /** Use it to schedule a background event to refresh the confirmation estimation */ - RefreshConfirmationEstimation = 'refreshConfirmationEstimation', + RefreshConfirmationEstimation: 'refreshConfirmationEstimation', /** Use it to schedule a background event to close WebSocket connections */ - CloseWebSocketConnections = 'closeWebSocketConnections', -} + CloseWebSocketConnections: 'closeWebSocketConnections', +} as const; + +export type ScheduleBackgroundEventMethod = + (typeof ScheduleBackgroundEventMethod)[keyof typeof ScheduleBackgroundEventMethod]; diff --git a/packages/solana-wallet-snap/src/core/handlers/onCronjob/cronjobs/CronjobMethod.ts b/packages/solana-wallet-snap/src/core/handlers/onCronjob/cronjobs/CronjobMethod.ts index ccaa21221..512b387b4 100644 --- a/packages/solana-wallet-snap/src/core/handlers/onCronjob/cronjobs/CronjobMethod.ts +++ b/packages/solana-wallet-snap/src/core/handlers/onCronjob/cronjobs/CronjobMethod.ts @@ -1 +1,3 @@ -export enum CronjobMethod {} +export const CronjobMethod = {} as const; + +export type CronjobMethod = (typeof CronjobMethod)[keyof typeof CronjobMethod]; diff --git a/packages/solana-wallet-snap/src/core/handlers/onProtocolRequest/structs.ts b/packages/solana-wallet-snap/src/core/handlers/onProtocolRequest/structs.ts index 0d270ebf5..34bb814da 100644 --- a/packages/solana-wallet-snap/src/core/handlers/onProtocolRequest/structs.ts +++ b/packages/solana-wallet-snap/src/core/handlers/onProtocolRequest/structs.ts @@ -8,11 +8,14 @@ import { } from '@metamask/superstruct'; import { JsonRpcIdStruct, JsonRpcVersionStruct } from '@metamask/utils'; -export enum SolanaProtocolRequestMethod { - GetGenesisHash = 'getGenesisHash', - GetLatestBlockhash = 'getLatestBlockhash', - GetMinimumBalanceForRentExemption = 'getMinimumBalanceForRentExemption', -} +export const SolanaProtocolRequestMethod = { + GetGenesisHash: 'getGenesisHash', + GetLatestBlockhash: 'getLatestBlockhash', + GetMinimumBalanceForRentExemption: 'getMinimumBalanceForRentExemption', +} as const; + +export type SolanaProtocolRequestMethod = + (typeof SolanaProtocolRequestMethod)[keyof typeof SolanaProtocolRequestMethod]; export const SolanaGetGenesisHashRequestStruct = object({ jsonrpc: JsonRpcVersionStruct, diff --git a/packages/solana-wallet-snap/src/core/handlers/onRpcRequest/types.ts b/packages/solana-wallet-snap/src/core/handlers/onRpcRequest/types.ts index 1de6b0541..812ab02a2 100644 --- a/packages/solana-wallet-snap/src/core/handlers/onRpcRequest/types.ts +++ b/packages/solana-wallet-snap/src/core/handlers/onRpcRequest/types.ts @@ -2,14 +2,17 @@ * Methods specific to the test dapp, * to allow specific flows for manual testing. */ -export enum TestDappRpcRequestMethod { - ListWebSockets = 'listWebSockets', - ListSubscriptions = 'listSubscriptions', - TestOnStart = 'testOnStart', - TestOnInstall = 'testOnInstall', - TestOnUpdate = 'testOnUpdate', - SynchronizeAccounts = 'synchronizeAccounts', - SetAccountSelected = 'setAccountSelected', - ConfirmSend = 'confirmSend', - SignRewardsMessage = 'signRewardsMessage', -} +export const TestDappRpcRequestMethod = { + ListWebSockets: 'listWebSockets', + ListSubscriptions: 'listSubscriptions', + TestOnStart: 'testOnStart', + TestOnInstall: 'testOnInstall', + TestOnUpdate: 'testOnUpdate', + SynchronizeAccounts: 'synchronizeAccounts', + SetAccountSelected: 'setAccountSelected', + ConfirmSend: 'confirmSend', + SignRewardsMessage: 'signRewardsMessage', +} as const; + +export type TestDappRpcRequestMethod = + (typeof TestDappRpcRequestMethod)[keyof typeof TestDappRpcRequestMethod]; diff --git a/packages/solana-wallet-snap/src/core/services/send/types.ts b/packages/solana-wallet-snap/src/core/services/send/types.ts index c464b5a8c..5856fe79d 100644 --- a/packages/solana-wallet-snap/src/core/services/send/types.ts +++ b/packages/solana-wallet-snap/src/core/services/send/types.ts @@ -15,9 +15,12 @@ export type OnAmountInputRequest = Infer; export type ValidationResponse = Infer; -export enum SendErrorCodes { - Required = 'Required', - Invalid = 'Invalid', - InsufficientBalanceToCoverFee = 'InsufficientBalanceToCoverFee', - InsufficientBalance = 'InsufficientBalance', -} +export const SendErrorCodes = { + Required: 'Required', + Invalid: 'Invalid', + InsufficientBalanceToCoverFee: 'InsufficientBalanceToCoverFee', + InsufficientBalance: 'InsufficientBalance', +} as const; + +export type SendErrorCodes = + (typeof SendErrorCodes)[keyof typeof SendErrorCodes]; diff --git a/packages/solana-wallet-snap/src/core/services/subscriptions/WebSocketConnectionService.test.ts b/packages/solana-wallet-snap/src/core/services/subscriptions/WebSocketConnectionService.test.ts index 80e1a4c3b..af1846245 100644 --- a/packages/solana-wallet-snap/src/core/services/subscriptions/WebSocketConnectionService.test.ts +++ b/packages/solana-wallet-snap/src/core/services/subscriptions/WebSocketConnectionService.test.ts @@ -23,7 +23,7 @@ const mockConnectionId = 'mock-connection-id'; const createMockWebSocketConnection = ( id = mockConnectionId, url = mockWebSocketUrl, - network = Network.Mainnet, + network: Network = Network.Mainnet, ): WebSocketConnection => ({ id, url, diff --git a/packages/solana-wallet-snap/src/core/services/transaction-scan/types.ts b/packages/solana-wallet-snap/src/core/services/transaction-scan/types.ts index 1c0f15be8..199b34d07 100644 --- a/packages/solana-wallet-snap/src/core/services/transaction-scan/types.ts +++ b/packages/solana-wallet-snap/src/core/services/transaction-scan/types.ts @@ -36,13 +36,18 @@ export type TransactionScanResult = { error: TransactionScanError | null; }; -export enum SecurityAlertResponse { - Benign = 'Benign', - Warning = 'Warning', - Malicious = 'Malicious', -} - -export enum ScanStatus { - SUCCESS = 'SUCCESS', - ERROR = 'ERROR', -} +export const SecurityAlertResponse = { + Benign: 'Benign', + Warning: 'Warning', + Malicious: 'Malicious', +} as const; + +export type SecurityAlertResponse = + (typeof SecurityAlertResponse)[keyof typeof SecurityAlertResponse]; + +export const ScanStatus = { + SUCCESS: 'SUCCESS', + ERROR: 'ERROR', +} as const; + +export type ScanStatus = (typeof ScanStatus)[keyof typeof ScanStatus]; diff --git a/packages/solana-wallet-snap/src/entities/instructions/programs/secp256k1-secp256r1.ts b/packages/solana-wallet-snap/src/entities/instructions/programs/secp256k1-secp256r1.ts index 5bb493ccb..adba7b20f 100644 --- a/packages/solana-wallet-snap/src/entities/instructions/programs/secp256k1-secp256r1.ts +++ b/packages/solana-wallet-snap/src/entities/instructions/programs/secp256k1-secp256r1.ts @@ -32,9 +32,12 @@ export const SECP256R1_PROGRAM_ADDRESS = address( 'Secp256r1SigVerify1111111111111111111111111', ); -export enum Secp256Instruction { - Verify = 0, -} +export const Secp256Instruction = { + Verify: 0, +} as const; + +export type Secp256Instruction = + (typeof Secp256Instruction)[keyof typeof Secp256Instruction]; export const identifySecp256Instruction = ( _instruction: @@ -67,7 +70,7 @@ type ParsedVerifySecp256Instruction = { }; export type ParsedSecp256Instruction = { - instructionType: Secp256Instruction.Verify; + instructionType: typeof Secp256Instruction.Verify; } & ParsedVerifySecp256Instruction; export const parseVerifySecp256Instruction = (instruction: IInstruction) => { diff --git a/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignIn/events.tsx b/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignIn/events.tsx index 6da3d6b26..0e3ebf066 100644 --- a/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignIn/events.tsx +++ b/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignIn/events.tsx @@ -20,10 +20,13 @@ async function onConfirmButtonClick({ id }: { id: string }) { await resolveInterface(id, true); } -export enum ConfirmSignInFormNames { - Cancel = 'confirm-sign-in-cancel', - Confirm = 'confirm-sign-in-confirm', -} +export const ConfirmSignInFormNames = { + Cancel: 'confirm-sign-in-cancel', + Confirm: 'confirm-sign-in-confirm', +} as const; + +export type ConfirmSignInFormNames = + (typeof ConfirmSignInFormNames)[keyof typeof ConfirmSignInFormNames]; export const eventHandlers = { [ConfirmSignInFormNames.Cancel]: onCancelButtonClick, diff --git a/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignMessage/events.tsx b/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignMessage/events.tsx index 80825329a..be5b7ad6e 100644 --- a/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignMessage/events.tsx +++ b/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmSignMessage/events.tsx @@ -20,10 +20,13 @@ async function onConfirmButtonClick({ id }: { id: string }) { await resolveInterface(id, true); } -export enum ConfirmSignMessageFormNames { - Cancel = 'confirm-sign-message-cancel', - Confirm = 'confirm-sign-message-confirm', -} +export const ConfirmSignMessageFormNames = { + Cancel: 'confirm-sign-message-cancel', + Confirm: 'confirm-sign-message-confirm', +} as const; + +export type ConfirmSignMessageFormNames = + (typeof ConfirmSignMessageFormNames)[keyof typeof ConfirmSignMessageFormNames]; export const eventHandlers = { [ConfirmSignMessageFormNames.Cancel]: onCancelButtonClick, diff --git a/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmTransactionRequest/events.tsx b/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmTransactionRequest/events.tsx index 2fae2d110..077b424d7 100644 --- a/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmTransactionRequest/events.tsx +++ b/packages/solana-wallet-snap/src/features/confirmation/views/ConfirmTransactionRequest/events.tsx @@ -62,11 +62,14 @@ async function onConfirmButtonClick({ id }: { id: string }) { ); } -export enum ConfirmSignAndSendTransactionFormNames { - ShowAdvanced = 'confirm-sign-and-send-transaction-show-advanced', - Cancel = 'confirm-sign-and-send-transaction-cancel', - Confirm = 'confirm-sign-and-send-transaction-confirm', -} +export const ConfirmSignAndSendTransactionFormNames = { + ShowAdvanced: 'confirm-sign-and-send-transaction-show-advanced', + Cancel: 'confirm-sign-and-send-transaction-cancel', + Confirm: 'confirm-sign-and-send-transaction-confirm', +} as const; + +export type ConfirmSignAndSendTransactionFormNames = + (typeof ConfirmSignAndSendTransactionFormNames)[keyof typeof ConfirmSignAndSendTransactionFormNames]; export const eventHandlers = { [ConfirmSignAndSendTransactionFormNames.ShowAdvanced]: diff --git a/packages/solana-wallet-snap/src/index.ts b/packages/solana-wallet-snap/src/index.ts index c498accb7..1b0772b6a 100644 --- a/packages/solana-wallet-snap/src/index.ts +++ b/packages/solana-wallet-snap/src/index.ts @@ -197,12 +197,10 @@ export const onCronjob: OnCronjobHandler = async ({ request }) => { if (!handler) { throw new MethodNotFoundError( - `Cronjob / ScheduleBackgroundEvent method ${method} not found. Available methods: ${Object.values( - [ - ...Object.values(CronjobMethod), - ...Object.values(ScheduleBackgroundEventMethod), - ], - ).toString()}`, + `Cronjob / ScheduleBackgroundEvent method ${String(method)} not found. Available methods: ${[ + ...Object.values(CronjobMethod), + ...Object.values(ScheduleBackgroundEventMethod), + ].join(',')}`, ) as unknown as Error; } return handler({ request });