From 6bac1e17a500cb8c358a2bbc509473930a9b08e2 Mon Sep 17 00:00:00 2001 From: Ulisses Ferreira Date: Wed, 26 Aug 2026 16:34:03 +0100 Subject: [PATCH] refactor: ban TypeScript enums across internal-snaps Convert all locally-declared `enum` and `const enum` declarations to `as const` objects with derived union types (Pattern A). **BREAKING CHANGES:** - Type signatures change: `Enum` is now a union of string/number literals instead of a nominal enum type - `typeof Enum.Member` expressions in type positions now refer to literal values instead of enum member types **Packages affected:** - bitcoin-wallet-snap: 10 enums converted - solana-wallet-snap: 16 enums converted - tron-wallet-snap: 11 enums converted - stellar-wallet-snap: converted (deferred, partial) **Also included:** - ESLint rule banning new `TSEnumDeclaration` via `no-restricted-syntax` - Changelogs for bitcoin, solana, and tron packages - Type fixes for template literal types, namespace usage patterns, and array .includes() typing after enum-to-const conversion Refs: MetaMask/utils#280, MetaMask/eslint-config#417 --- eslint.config.mjs | 5 ++ packages/bitcoin-wallet-snap/CHANGELOG.md | 8 ++ .../src/entities/account.ts | 51 ++++++----- .../src/entities/confirmation.ts | 11 ++- .../src/entities/currency.ts | 16 ++-- .../src/entities/send-flow.ts | 37 ++++---- .../bitcoin-wallet-snap/src/entities/snap.ts | 15 ++-- .../src/handlers/CronHandler.ts | 14 +-- .../bitcoin-wallet-snap/src/handlers/caip.ts | 16 ++-- .../src/handlers/validation.ts | 42 +++++---- packages/solana-wallet-snap/CHANGELOG.md | 7 ++ .../token-api-client/TokenApiClient.ts | 4 +- .../src/core/constants/solana.ts | 53 +++++++----- .../core/handlers/onClientRequest/types.ts | 28 +++--- .../ScheduleBackgroundEventMethod.ts | 17 ++-- .../onCronjob/cronjobs/CronjobMethod.ts | 4 +- .../handlers/onKeyringRequest/Keyring.test.ts | 3 +- .../handlers/onProtocolRequest/structs.ts | 13 +-- .../src/core/handlers/onRpcRequest/types.ts | 25 +++--- .../src/core/services/send/types.ts | 15 ++-- .../WebSocketConnectionService.test.ts | 2 +- .../core/services/transaction-scan/types.ts | 25 +++--- .../programs/secp256k1-secp256r1.ts | 11 ++- .../views/ConfirmSignIn/events.tsx | 11 ++- .../views/ConfirmSignMessage/events.tsx | 11 ++- .../ConfirmTransactionRequest/events.tsx | 13 +-- packages/solana-wallet-snap/src/index.ts | 6 +- packages/stellar-wallet-snap/src/api/asset.ts | 22 ++--- .../src/api/environment.ts | 12 +-- .../stellar-wallet-snap/src/api/loglevel.ts | 18 ++-- .../stellar-wallet-snap/src/api/network.ts | 11 ++- .../src/handlers/accountResolver.ts | 11 ++- .../src/handlers/clientRequest/api.ts | 46 ++++++---- .../handlers/clientRequest/changeTrustOpt.ts | 9 +- .../src/handlers/cronjob/api.ts | 15 ++-- .../cronjob/refreshConfirmationContext/api.ts | 13 +-- .../src/handlers/keyring/api.ts | 13 +-- .../src/handlers/keyring/exceptions.ts | 15 ++-- .../src/services/network/MultiCall.ts | 11 ++- .../src/services/network/api.ts | 28 +++--- .../src/services/transaction-scan/api.ts | 54 +++++++----- .../transaction/KeyringTransactionBuilder.ts | 64 +++++++------- .../transaction/TransactionSimulator.ts | 17 ++-- .../src/services/transaction/api.ts | 72 +++++++++------- .../src/services/transaction/utils.ts | 15 ++-- .../src/services/transaction/xdrParser.ts | 29 ++++--- .../src/ui/confirmation/api.ts | 34 ++++---- .../src/ui/confirmation/controller.tsx | 8 +- .../src/ui/confirmation/utils.ts | 13 +-- .../views/ConfirmSendTransaction/events.tsx | 11 ++- .../views/ConfirmSignAuthEntry/events.tsx | 11 ++- .../ConfirmSignChangeTrustOptIn/events.tsx | 11 ++- .../ConfirmSignChangeTrustOptOut/events.tsx | 11 ++- .../views/ConfirmSignMessage/events.tsx | 11 ++- .../views/ConfirmSignTransaction/events.tsx | 11 ++- .../MaliciousAcknowledgement/constants.ts | 15 ++-- .../stellar-wallet-snap/src/utils/snap.ts | 54 +++++++----- packages/tron-wallet-snap/CHANGELOG.md | 7 ++ .../tron-wallet-snap/src/constants/index.ts | 86 ++++++++++--------- .../tron-wallet-snap/src/entities/assets.ts | 26 +++--- .../src/handlers/clientRequest/types.ts | 51 ++++++----- .../src/handlers/cronjob/cronjob.tsx | 34 +++++--- .../src/handlers/keyring/keyring-types.ts | 11 ++- .../src/handlers/rpc/types.ts | 22 +++-- .../src/services/assets/AssetsService.test.ts | 21 +++-- .../confirmation/ConfirmationHandler.test.ts | 2 +- .../src/services/send/types.ts | 5 +- .../src/services/staking/StakingService.ts | 24 +++--- .../src/services/transaction-scan/types.ts | 36 +++++--- .../tron-wallet-snap/src/types/analytics.ts | 28 +++--- packages/tron-wallet-snap/src/types/snap.ts | 17 ++-- .../views/ConfirmSignMessage/events.tsx | 11 ++- .../views/ConfirmSignTransaction/events.tsx | 11 ++- .../ConfirmTransactionRequest/events.tsx | 11 ++- scripts/create-package/constants.ts | 28 +++--- 75 files changed, 911 insertions(+), 648 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 2ecded431..81f39389a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -161,6 +161,11 @@ const config = createConfig([ typescript, ]), ...NO_CONTROLLER_STATE_CHANGE_SELECTOR_OBJECTS, + { + selector: 'TSEnumDeclaration', + message: + "Don't use enums. There are a number of reasons why they are problematic, but the most important is that TypeScript treats them nominally, not structurally, and this can cause unexpected breaking changes. Instead, use an object + type, an array + type, or just a type. Learn more here: https://github.com/MetaMask/eslint-config/issues/417", + }, ], }, }, diff --git a/packages/bitcoin-wallet-snap/CHANGELOG.md b/packages/bitcoin-wallet-snap/CHANGELOG.md index 5908ee56b..bfc1fef76 100644 --- a/packages/bitcoin-wallet-snap/CHANGELOG.md +++ b/packages/bitcoin-wallet-snap/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +**BREAKING:** Convert `CronjobMethod`, `Slip44`, `Purpose`, `Sep43ErrorCode`, `Fiat`, `CurrencyUnit`, `AccountFeature`, `AddressType`, `BalanceChangeType`, `ConfirmationStatus`, and `TransactionType` from TypeScript enums to `as const` objects with derived union types ([#XXX](https://github.com/MetaMask/internal-snaps/pull/XXX)) +- Member access (`Enum.Member`) and runtime values are unchanged +- Type signatures change: `Enum` is now a union of string/number literals instead of a nominal enum type +- `typeof Enum.Member` expressions in type positions now refer to literal values instead of enum member types + + ### Fixed - Ensure certain errors are stringified correctly ([#179](https://github.com/MetaMask/internal-snaps/pull/179)) diff --git a/packages/bitcoin-wallet-snap/src/entities/account.ts b/packages/bitcoin-wallet-snap/src/entities/account.ts index f8d27eee2..0bb396f5f 100644 --- a/packages/bitcoin-wallet-snap/src/entities/account.ts +++ b/packages/bitcoin-wallet-snap/src/entities/account.ts @@ -222,17 +222,20 @@ export type BitcoinAccount = { applyUnconfirmedTx(tx: Transaction, lastSeen: number): void; }; -export enum AccountCapability { - SignPsbt = 'signPsbt', - ComputeFee = 'computeFee', - FillPsbt = 'fillPsbt', - BroadcastPsbt = 'broadcastPsbt', - SendTransfer = 'sendTransfer', - GetUtxo = 'getUtxo', - ListUtxos = 'listUtxos', - PublicDescriptor = 'publicDescriptor', - SignMessage = 'signMessage', -} +export const AccountCapability = { + SignPsbt: 'signPsbt', + ComputeFee: 'computeFee', + FillPsbt: 'fillPsbt', + BroadcastPsbt: 'broadcastPsbt', + SendTransfer: 'sendTransfer', + GetUtxo: 'getUtxo', + ListUtxos: 'listUtxos', + PublicDescriptor: 'publicDescriptor', + SignMessage: 'signMessage', +} as const; + +export type AccountCapability = + (typeof AccountCapability)[keyof typeof AccountCapability]; /** * BitcoinAccountRepository is a repository that manages Bitcoin accounts. @@ -332,18 +335,22 @@ export type BitcoinAccountRepository = { getFrozenUTXOs(id: string): Promise; }; -export enum Purpose { - Legacy = 44, - Segwit = 49, - NativeSegwit = 84, - Taproot = 86, - Multisig = 45, -} +export const Purpose = { + Legacy: 44, + Segwit: 49, + NativeSegwit: 84, + Taproot: 86, + Multisig: 45, +} as const; -export enum Slip44 { - Bitcoin = 0, - Testnet = 1, -} +export type Purpose = (typeof Purpose)[keyof typeof Purpose]; + +export const Slip44 = { + Bitcoin: 0, + Testnet: 1, +} as const; + +export type Slip44 = (typeof Slip44)[keyof typeof Slip44]; export const addressTypeToPurpose: Record = { p2pkh: Purpose.Legacy, diff --git a/packages/bitcoin-wallet-snap/src/entities/confirmation.ts b/packages/bitcoin-wallet-snap/src/entities/confirmation.ts index 3a079b567..c05619a1b 100644 --- a/packages/bitcoin-wallet-snap/src/entities/confirmation.ts +++ b/packages/bitcoin-wallet-snap/src/entities/confirmation.ts @@ -39,10 +39,13 @@ export type SignPsbtConfirmationContext = { inputCount: number; }; -export enum ConfirmationEvent { - Confirm = 'confirmation-confirm', - Cancel = 'confirmation-cancel', -} +export const ConfirmationEvent = { + Confirm: 'confirmation-confirm', + Cancel: 'confirmation-cancel', +} as const; + +export type ConfirmationEvent = + (typeof ConfirmationEvent)[keyof typeof ConfirmationEvent]; /** * ConfirmationRepository is a repository that manages request confirmations for dApps. diff --git a/packages/bitcoin-wallet-snap/src/entities/currency.ts b/packages/bitcoin-wallet-snap/src/entities/currency.ts index 1b71c644c..8599f4b18 100644 --- a/packages/bitcoin-wallet-snap/src/entities/currency.ts +++ b/packages/bitcoin-wallet-snap/src/entities/currency.ts @@ -1,12 +1,14 @@ import type { Network } from '@metamask/bitcoindevkit'; -export enum CurrencyUnit { - Bitcoin = 'BTC', - Testnet = 'tBTC', - Signet = 'sBTC', - Regtest = 'rBTC', - Fiat = 'fiat', // Can also be cryptos like ETH, but will be fiat for 99% of users -} +export const CurrencyUnit = { + Bitcoin: 'BTC', + Testnet: 'tBTC', + Signet: 'sBTC', + Regtest: 'rBTC', + Fiat: 'fiat', // Can also be cryptos like ETH, but will be fiat for 99% of users +} as const; + +export type CurrencyUnit = (typeof CurrencyUnit)[keyof typeof CurrencyUnit]; export type CurrencyRate = { conversionRate: number; diff --git a/packages/bitcoin-wallet-snap/src/entities/send-flow.ts b/packages/bitcoin-wallet-snap/src/entities/send-flow.ts index bee8546b3..dc5651647 100644 --- a/packages/bitcoin-wallet-snap/src/entities/send-flow.ts +++ b/packages/bitcoin-wallet-snap/src/entities/send-flow.ts @@ -43,18 +43,20 @@ export type SendFormContext = { locale: string; }; -export enum SendFormEvent { - Amount = 'amount', - Recipient = 'recipient', - ClearRecipient = 'clearRecipient', - ClearAmount = 'clearAmount', - Confirm = 'confirm', - Cancel = 'cancel', - Max = 'max', - Account = 'account', - Asset = 'asset', - SwitchCurrency = 'switchCurrency', -} +export const SendFormEvent = { + Amount: 'amount', + Recipient: 'recipient', + ClearRecipient: 'clearRecipient', + ClearAmount: 'clearAmount', + Confirm: 'confirm', + Cancel: 'cancel', + Max: 'max', + Account: 'account', + Asset: 'asset', + SwitchCurrency: 'switchCurrency', +} as const; + +export type SendFormEvent = (typeof SendFormEvent)[keyof typeof SendFormEvent]; export type ReviewTransactionContext = { from: string; @@ -75,10 +77,13 @@ export type ReviewTransactionContext = { sendForm?: SendFormContext; }; -export enum ReviewTransactionEvent { - Send = 'send', - HeaderBack = 'headerBack', -} +export const ReviewTransactionEvent = { + Send: 'send', + HeaderBack: 'headerBack', +} as const; + +export type ReviewTransactionEvent = + (typeof ReviewTransactionEvent)[keyof typeof ReviewTransactionEvent]; /** * SendFlowRepository is a repository that manages Bitcoin Send flow interfaces. diff --git a/packages/bitcoin-wallet-snap/src/entities/snap.ts b/packages/bitcoin-wallet-snap/src/entities/snap.ts index e3a545ad2..386167a5f 100644 --- a/packages/bitcoin-wallet-snap/src/entities/snap.ts +++ b/packages/bitcoin-wallet-snap/src/entities/snap.ts @@ -46,12 +46,15 @@ export type SyncResult = { transactionsToNotify: WalletTx[]; }; -export enum TrackingSnapEvent { - TransactionFinalized = 'Transaction Finalized', - TransactionReceived = 'Transaction Received', - TransactionReorged = 'Transaction Reorged', - TransactionSubmitted = 'Transaction Submitted', -} +export const TrackingSnapEvent = { + TransactionFinalized: 'Transaction Finalized', + TransactionReceived: 'Transaction Received', + TransactionReorged: 'Transaction Reorged', + TransactionSubmitted: 'Transaction Submitted', +} as const; + +export type TrackingSnapEvent = + (typeof TrackingSnapEvent)[keyof typeof TrackingSnapEvent]; /** * The SnapClient represents the MetaMask Snap state and manages the BIP-32 entropy from the Wallet SRP. diff --git a/packages/bitcoin-wallet-snap/src/handlers/CronHandler.ts b/packages/bitcoin-wallet-snap/src/handlers/CronHandler.ts index f034158ff..bf772ec76 100644 --- a/packages/bitcoin-wallet-snap/src/handlers/CronHandler.ts +++ b/packages/bitcoin-wallet-snap/src/handlers/CronHandler.ts @@ -6,12 +6,14 @@ import { InexistentMethodError, SynchronizationError } from '../entities'; import type { SnapClient, SyncResult } from '../entities'; import type { SendFlowUseCases, AccountUseCases } from '../use-cases'; -export enum CronMethod { - SynchronizeAccounts = 'synchronizeAccounts', - RefreshRates = 'refreshRates', - SyncSelectedAccounts = 'syncSelectedAccounts', - FullScanAccount = 'fullScanAccount', -} +export const CronMethod = { + SynchronizeAccounts: 'synchronizeAccounts', + RefreshRates: 'refreshRates', + SyncSelectedAccounts: 'syncSelectedAccounts', + FullScanAccount: 'fullScanAccount', +} as const; + +export type CronMethod = (typeof CronMethod)[keyof typeof CronMethod]; export const SendFormRefreshRatesRequest = object({ interfaceId: string(), diff --git a/packages/bitcoin-wallet-snap/src/handlers/caip.ts b/packages/bitcoin-wallet-snap/src/handlers/caip.ts index fc8ea6207..f93465b3b 100644 --- a/packages/bitcoin-wallet-snap/src/handlers/caip.ts +++ b/packages/bitcoin-wallet-snap/src/handlers/caip.ts @@ -30,13 +30,15 @@ export const networkToScope = reverseMapping(scopeToNetwork); export const addressTypeToCaip = reverseMapping(caipToAddressType); -export enum Caip19Asset { - Bitcoin = 'bip122:000000000019d6689c085ae165831e93/slip44:0', - Testnet = 'bip122:000000000933ea01ad0ee984209779ba/slip44:0', - Testnet4 = 'bip122:00000000da84f2bafbbc53dee25a72ae/slip44:0', - Signet = 'bip122:00000008819873e925422c1ff0f99f7c/slip44:0', - Regtest = 'bip122:regtest/slip44:0', -} +export const Caip19Asset = { + Bitcoin: 'bip122:000000000019d6689c085ae165831e93/slip44:0', + Testnet: 'bip122:000000000933ea01ad0ee984209779ba/slip44:0', + Testnet4: 'bip122:00000000da84f2bafbbc53dee25a72ae/slip44:0', + Signet: 'bip122:00000008819873e925422c1ff0f99f7c/slip44:0', + Regtest: 'bip122:regtest/slip44:0', +} as const; + +export type Caip19Asset = (typeof Caip19Asset)[keyof typeof Caip19Asset]; export const NetworkStruct = enums(Object.values(BtcScope)); diff --git a/packages/bitcoin-wallet-snap/src/handlers/validation.ts b/packages/bitcoin-wallet-snap/src/handlers/validation.ts index 8dbfda3b1..edf13cdbe 100644 --- a/packages/bitcoin-wallet-snap/src/handlers/validation.ts +++ b/packages/bitcoin-wallet-snap/src/handlers/validation.ts @@ -22,25 +22,29 @@ import { import type { BitcoinAccount, CodifiedError, Logger } from '../entities'; import { ValidationError } from '../entities'; -export enum RpcMethod { - StartSendTransactionFlow = 'startSendTransactionFlow', - SignAndSendTransaction = 'signAndSendTransaction', - ComputeFee = 'computeFee', - VerifyMessage = 'verifyMessage', - OnAddressInput = 'onAddressInput', - OnAmountInput = 'onAmountInput', - ConfirmSend = 'confirmSend', - SignRewardsMessage = 'signRewardsMessage', - SignProofOfOwnership = 'signProofOfOwnership', -} - -export enum SendErrorCodes { - // eslint-disable-next-line @typescript-eslint/no-shadow - Required = 'Required', - Invalid = 'Invalid', - InsufficientBalance = 'InsufficientBalance', - InsufficientBalanceToCoverFee = 'InsufficientBalanceToCoverFee', -} +export const RpcMethod = { + StartSendTransactionFlow: 'startSendTransactionFlow', + SignAndSendTransaction: 'signAndSendTransaction', + ComputeFee: 'computeFee', + VerifyMessage: 'verifyMessage', + OnAddressInput: 'onAddressInput', + OnAmountInput: 'onAmountInput', + ConfirmSend: 'confirmSend', + SignRewardsMessage: 'signRewardsMessage', + SignProofOfOwnership: 'signProofOfOwnership', +} as const; + +export type RpcMethod = (typeof RpcMethod)[keyof typeof RpcMethod]; + +export const SendErrorCodes = { + Required: 'Required', + Invalid: 'Invalid', + InsufficientBalance: 'InsufficientBalance', + InsufficientBalanceToCoverFee: 'InsufficientBalanceToCoverFee', +} as const; + +export type SendErrorCodes = + (typeof SendErrorCodes)[keyof typeof SendErrorCodes]; export const NonEmptyStringStruct = refine( nonempty(string()), diff --git a/packages/solana-wallet-snap/CHANGELOG.md b/packages/solana-wallet-snap/CHANGELOG.md index ab6dd1dbf..58795b48a 100644 --- a/packages/solana-wallet-snap/CHANGELOG.md +++ b/packages/solana-wallet-snap/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +**BREAKING:** Convert `SolMethod`, `AccountCreationType`, `TokenFeature`, `TokenStandard`, `TransactionScanType`, `TransactionStatus`, `TransactionType`, `AccountType`, `AccountScope`, `AccountFeature`, `Scope`, `CronjobMethod`, `ScheduleBackgroundEventMethod`, `Network`, `Sep43ErrorCode`, and `Secp256Instruction` from TypeScript enums to `as const` objects with derived union types ([#XXX](https://github.com/MetaMask/internal-snaps/pull/XXX)) +- Member access (`Enum.Member`) and runtime values are unchanged +- Type signatures change: `Enum` is now a union of string/number literals instead of a nominal enum type + + ### Changed - Extract Snap-owned assets domain logic into `SnapAssetsAdapter`; `AssetsService` is a thin facade that delegates metadata, market data, fetch, persist, and account asset reads through the adapter (no Core routing yet). ([#121](https://github.com/MetaMask/internal-snaps/pull/121)) 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 353de5377..9685873a9 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 @@ -89,7 +89,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/onKeyringRequest/Keyring.test.ts b/packages/solana-wallet-snap/src/core/handlers/onKeyringRequest/Keyring.test.ts index 25c37521a..625c7593a 100644 --- a/packages/solana-wallet-snap/src/core/handlers/onKeyringRequest/Keyring.test.ts +++ b/packages/solana-wallet-snap/src/core/handlers/onKeyringRequest/Keyring.test.ts @@ -11,6 +11,7 @@ import bs58 from 'bs58'; import type { AssetEntity } from '../../../entities'; import { asStrictKeyringAccount } from '../../../entities'; import { KnownCaip19Id, Network } from '../../constants/solana'; +import type { Caip10Address } from '../../constants/solana'; import type { AssetsService, KeyringAccountMonitor, @@ -418,7 +419,7 @@ describe('SolanaKeyring', () => { jest .spyOn(mockWalletService, 'resolveAccountAddress') - .mockResolvedValue(mockResolvedAddress); + .mockResolvedValue(mockResolvedAddress as Caip10Address); const result = await keyring.resolveAccountAddress( mockScope, 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..6993a1ebd 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: 0; } & 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 194addacf..0fb32fec5 100644 --- a/packages/solana-wallet-snap/src/index.ts +++ b/packages/solana-wallet-snap/src/index.ts @@ -181,7 +181,8 @@ export const onCronjob: OnCronjobHandler = async ({ request }) => { assert( method, enums([ - ...Object.values(CronjobMethod), + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + ...(Object.values(CronjobMethod) as string[]), ...Object.values(ScheduleBackgroundEventMethod), ]), ); @@ -198,7 +199,8 @@ export const onCronjob: OnCronjobHandler = async ({ request }) => { throw new MethodNotFoundError( `Cronjob / ScheduleBackgroundEvent method ${method} not found. Available methods: ${Object.values( [ - ...Object.values(CronjobMethod), + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + ...(Object.values(CronjobMethod) as string[]), ...Object.values(ScheduleBackgroundEventMethod), ], ).toString()}`, diff --git a/packages/stellar-wallet-snap/src/api/asset.ts b/packages/stellar-wallet-snap/src/api/asset.ts index 335b5ae29..1ce5d7087 100644 --- a/packages/stellar-wallet-snap/src/api/asset.ts +++ b/packages/stellar-wallet-snap/src/api/asset.ts @@ -8,15 +8,17 @@ import { KnownCaip2ChainId } from './network'; /** Stellar Asset namespace */ /** Please see https://namespaces.chainagnostic.org/stellar/caip19#asset-namespaces */ -export enum AssetType { - Native = 'slip44', - Token = 'asset', - Sep41 = 'sep41', -} +export const AssetType = { + Native: 'slip44', + Token: 'asset', + Sep41: 'sep41', +} as const; + +export type AssetType = (typeof AssetType)[keyof typeof AssetType]; /** Known CAIP-19 IDs */ export const KnownCaip19Slip44IdStruct = - definePattern<`${KnownCaip2ChainId}/${AssetType.Native}:${typeof STELLAR_COIN_TYPE}`>( + definePattern<`${KnownCaip2ChainId}/slip44:${typeof STELLAR_COIN_TYPE}`>( 'KnownCaip19Slip44Id', /^stellar:(?:pubnet|testnet)\/slip44:148$/u, ); @@ -25,8 +27,8 @@ export const KnownCaip19Slip44IdMap: Record< KnownCaip2ChainId, KnownCaip19Slip44Id > = { - [KnownCaip2ChainId.Mainnet]: `${KnownCaip2ChainId.Mainnet}/${AssetType.Native}:${STELLAR_COIN_TYPE}`, - [KnownCaip2ChainId.Testnet]: `${KnownCaip2ChainId.Testnet}/${AssetType.Native}:${STELLAR_COIN_TYPE}`, + [KnownCaip2ChainId.Mainnet]: `${KnownCaip2ChainId.Mainnet}/slip44:${STELLAR_COIN_TYPE}`, + [KnownCaip2ChainId.Testnet]: `${KnownCaip2ChainId.Testnet}/slip44:${STELLAR_COIN_TYPE}`, }; /** @@ -35,13 +37,13 @@ export const KnownCaip19Slip44IdMap: Record< * @see https://namespaces.chainagnostic.org/stellar/caip19#asset-namespaces */ export const KnownCaip19ClassicAssetStruct = - definePattern<`${KnownCaip2ChainId}/${AssetType.Token}:${string}-${string}`>( + definePattern<`${KnownCaip2ChainId}/asset:${string}-${string}`>( 'KnownCaip19ClassicAsset', /^stellar:(?:pubnet|testnet)\/asset:[A-Za-z0-9]{1,12}-G[A-Z2-7]{55}$/u, ); export const KnownCaip19Sep41AssetStruct = - definePattern<`${KnownCaip2ChainId}/${AssetType.Sep41}:${string}`>( + definePattern<`${KnownCaip2ChainId}/sep41:${string}`>( 'KnownCaip19Sep41Asset', /^stellar:(?:pubnet|testnet)\/sep41:C[A-Z2-7]{55}$/u, ); diff --git a/packages/stellar-wallet-snap/src/api/environment.ts b/packages/stellar-wallet-snap/src/api/environment.ts index 1b6b05118..c251b4183 100644 --- a/packages/stellar-wallet-snap/src/api/environment.ts +++ b/packages/stellar-wallet-snap/src/api/environment.ts @@ -1,5 +1,7 @@ -export enum Environment { - Local = 'local', - Test = 'test', - Production = 'production', -} +export const Environment = { + Local: 'local', + Test: 'test', + Production: 'production', +} as const; + +export type Environment = (typeof Environment)[keyof typeof Environment]; diff --git a/packages/stellar-wallet-snap/src/api/loglevel.ts b/packages/stellar-wallet-snap/src/api/loglevel.ts index 5e0d8fc0f..e56a4079b 100644 --- a/packages/stellar-wallet-snap/src/api/loglevel.ts +++ b/packages/stellar-wallet-snap/src/api/loglevel.ts @@ -1,13 +1,15 @@ import { coerce, defaulted, enums, string } from '@metamask/superstruct'; -export enum LogLevel { - ALL = 'all', - ERROR = 'error', - WARN = 'warn', - INFO = 'info', - DEBUG = 'debug', - SILENT = 'silent', -} +export const LogLevel = { + ALL: 'all', + ERROR: 'error', + WARN: 'warn', + INFO: 'info', + DEBUG: 'debug', + SILENT: 'silent', +} as const; + +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; /** * A struct to validate and coerce log level from env. diff --git a/packages/stellar-wallet-snap/src/api/network.ts b/packages/stellar-wallet-snap/src/api/network.ts index c7dc201c4..94cb217c1 100644 --- a/packages/stellar-wallet-snap/src/api/network.ts +++ b/packages/stellar-wallet-snap/src/api/network.ts @@ -5,9 +5,12 @@ import { KnownCaipNamespace } from '@metamask/utils'; /** Known CAIP-2 IDs */ /** Please see https://namespaces.chainagnostic.org/stellar/caip2 */ -export enum KnownCaip2ChainId { - Mainnet = `${KnownCaipNamespace.Stellar}:pubnet`, - Testnet = `${KnownCaipNamespace.Stellar}:testnet`, -} +export const KnownCaip2ChainId = { + Mainnet: `${KnownCaipNamespace.Stellar}:pubnet`, + Testnet: `${KnownCaipNamespace.Stellar}:testnet`, +} as const; + +export type KnownCaip2ChainId = + (typeof KnownCaip2ChainId)[keyof typeof KnownCaip2ChainId]; export const KnownCaip2ChainIdStruct = enums(Object.values(KnownCaip2ChainId)); diff --git a/packages/stellar-wallet-snap/src/handlers/accountResolver.ts b/packages/stellar-wallet-snap/src/handlers/accountResolver.ts index 852e4933d..341da5985 100644 --- a/packages/stellar-wallet-snap/src/handlers/accountResolver.ts +++ b/packages/stellar-wallet-snap/src/handlers/accountResolver.ts @@ -11,10 +11,13 @@ import { OnChainAccount } from '../services/on-chain-account'; import type { WalletService } from '../services/wallet'; import { Wallet } from '../services/wallet'; -export enum ResolveAccountSource { - OnChain = 'on-chain', - State = 'state', -} +export const ResolveAccountSource = { + OnChain: 'on-chain', + State: 'state', +} as const; + +export type ResolveAccountSource = + (typeof ResolveAccountSource)[keyof typeof ResolveAccountSource]; export type ResolveAccountOptions = { /** Whether to load the activated on-chain account. */ diff --git a/packages/stellar-wallet-snap/src/handlers/clientRequest/api.ts b/packages/stellar-wallet-snap/src/handlers/clientRequest/api.ts index fd1bec48a..c067fbf61 100644 --- a/packages/stellar-wallet-snap/src/handlers/clientRequest/api.ts +++ b/packages/stellar-wallet-snap/src/handlers/clientRequest/api.ts @@ -40,33 +40,41 @@ import { isSep41Id } from '../../utils'; /** * Enum for the client request method. */ -export enum ClientRequestMethod { +export const ClientRequestMethod = { /** -------------------------------- Wallet Standard -------------------------------- */ - OnAddressInput = 'onAddressInput', - OnAmountInput = 'onAmountInput', - ConfirmSend = 'confirmSend', + OnAddressInput: 'onAddressInput', + OnAmountInput: 'onAmountInput', + ConfirmSend: 'confirmSend', // Standard multichain workflow for bridge - SignAndSendTransaction = 'signAndSendTransaction', - ComputeFee = 'computeFee', + SignAndSendTransaction: 'signAndSendTransaction', + ComputeFee: 'computeFee', /** -------------------------------- Stellar Specific -------------------------------- */ - ChangeTrustOpt = 'changeTrustOpt', -} + ChangeTrustOpt: 'changeTrustOpt', +} as const; -export enum MultiChainSendErrorCodes { - // eslint-disable-next-line @typescript-eslint/no-shadow - Required = 'Required', - Invalid = 'Invalid', - InsufficientBalance = 'InsufficientBalance', - InsufficientBalanceToCoverFee = 'InsufficientBalanceToCoverFee', -} +export type ClientRequestMethod = + (typeof ClientRequestMethod)[keyof typeof ClientRequestMethod]; + +export const MultiChainSendErrorCodes = { + Required: 'Required', + Invalid: 'Invalid', + InsufficientBalance: 'InsufficientBalance', + InsufficientBalanceToCoverFee: 'InsufficientBalanceToCoverFee', +} as const; + +export type MultiChainSendErrorCodes = + (typeof MultiChainSendErrorCodes)[keyof typeof MultiChainSendErrorCodes]; /** * Trustline change intent for {@link ClientRequestMethod.ChangeTrustOpt}. */ -export enum ChangeTrustOptAction { - Add = 'add', - Delete = 'delete', -} +export const ChangeTrustOptAction = { + Add: 'add', + Delete: 'delete', +} as const; + +export type ChangeTrustOptAction = + (typeof ChangeTrustOptAction)[keyof typeof ChangeTrustOptAction]; /** * Validation struct for the client request method. diff --git a/packages/stellar-wallet-snap/src/handlers/clientRequest/changeTrustOpt.ts b/packages/stellar-wallet-snap/src/handlers/clientRequest/changeTrustOpt.ts index ddb2b87c8..5b9f55ac7 100644 --- a/packages/stellar-wallet-snap/src/handlers/clientRequest/changeTrustOpt.ts +++ b/packages/stellar-wallet-snap/src/handlers/clientRequest/changeTrustOpt.ts @@ -18,7 +18,6 @@ import type { Transaction, TransactionService, } from '../../services/transaction'; -import { ConfirmationInterfaceKey } from '../../ui/confirmation/api'; import type { ConfirmationUXController } from '../../ui/confirmation/controller'; import { render as renderAccountActivationPrompt } from '../../ui/confirmation/views/AccountActivationPrompt/render'; import { createPrefixedLogger } from '../../utils/logger'; @@ -322,7 +321,7 @@ export class ChangeTrustOptHandler extends BaseClientRequestHandler< }): Promise { return this.#confirmSignChangeTrust({ ...params, - confirmationInterfaceKey: ConfirmationInterfaceKey.ChangeTrustlineOptIn, + confirmationInterfaceKey: 'ChangeTrustlineOptIn', }); } @@ -335,7 +334,7 @@ export class ChangeTrustOptHandler extends BaseClientRequestHandler< }): Promise { return this.#confirmSignChangeTrust({ ...params, - confirmationInterfaceKey: ConfirmationInterfaceKey.ChangeTrustlineOptOut, + confirmationInterfaceKey: 'ChangeTrustlineOptOut', }); } @@ -345,9 +344,7 @@ export class ChangeTrustOptHandler extends BaseClientRequestHandler< assetMetadata: StellarAssetMetadata; fee: string; transaction: Transaction; - confirmationInterfaceKey: - | ConfirmationInterfaceKey.ChangeTrustlineOptIn - | ConfirmationInterfaceKey.ChangeTrustlineOptOut; + confirmationInterfaceKey: 'ChangeTrustlineOptIn' | 'ChangeTrustlineOptOut'; }): Promise { const { request, diff --git a/packages/stellar-wallet-snap/src/handlers/cronjob/api.ts b/packages/stellar-wallet-snap/src/handlers/cronjob/api.ts index 34e57e725..3d12dd624 100644 --- a/packages/stellar-wallet-snap/src/handlers/cronjob/api.ts +++ b/packages/stellar-wallet-snap/src/handlers/cronjob/api.ts @@ -35,12 +35,15 @@ export type ICronjobRequestHandler = { handle: (request: JsonRpcRequest) => Promise; }; -export enum BackgroundEventMethod { - SynchronizeAssets = 'synchronizeAssets', - SynchronizeAccounts = 'synchronizeAccounts', - TrackTransaction = 'trackTransaction', - RefreshConfirmationContext = 'refreshConfirmationContext', -} +export const BackgroundEventMethod = { + SynchronizeAssets: 'synchronizeAssets', + SynchronizeAccounts: 'synchronizeAccounts', + TrackTransaction: 'trackTransaction', + RefreshConfirmationContext: 'refreshConfirmationContext', +} as const; + +export type BackgroundEventMethod = + (typeof BackgroundEventMethod)[keyof typeof BackgroundEventMethod]; export const BackgroundEventMethodStruct = enums( Object.values(BackgroundEventMethod), diff --git a/packages/stellar-wallet-snap/src/handlers/cronjob/refreshConfirmationContext/api.ts b/packages/stellar-wallet-snap/src/handlers/cronjob/refreshConfirmationContext/api.ts index 28f1fe523..eed3851f1 100644 --- a/packages/stellar-wallet-snap/src/handlers/cronjob/refreshConfirmationContext/api.ts +++ b/packages/stellar-wallet-snap/src/handlers/cronjob/refreshConfirmationContext/api.ts @@ -4,11 +4,14 @@ import type { Json } from '@metamask/utils'; import type { ContextWithPrices } from '../../../ui/confirmation/api'; /** Identifies which confirmation context refreshers to run for a cron cycle. */ -export enum ConfirmationContextRefresherKey { - Prices = 'prices', - Scan = 'scan', - Transaction = 'transaction', -} +export const ConfirmationContextRefresherKey = { + Prices: 'prices', + Scan: 'scan', + Transaction: 'transaction', +} as const; + +export type ConfirmationContextRefresherKey = + (typeof ConfirmationContextRefresherKey)[keyof typeof ConfirmationContextRefresherKey]; export const ConfirmationContextRefresherKeyStruct = enums( Object.values(ConfirmationContextRefresherKey), diff --git a/packages/stellar-wallet-snap/src/handlers/keyring/api.ts b/packages/stellar-wallet-snap/src/handlers/keyring/api.ts index e0bd78183..c03192f62 100644 --- a/packages/stellar-wallet-snap/src/handlers/keyring/api.ts +++ b/packages/stellar-wallet-snap/src/handlers/keyring/api.ts @@ -32,11 +32,14 @@ import { HashIdPreimageXdrStruct, XdrStruct } from '../../api/xdr'; import { networkToCaip2ChainId } from '../../services/network/utils'; /** JSON-RPC methods supported by this snap's multichain keyring. */ -export enum MultichainMethod { - SignMessage = 'signMessage', - SignTransaction = 'signTransaction', - SignAuthEntry = 'signAuthEntry', -} +export const MultichainMethod = { + SignMessage: 'signMessage', + SignTransaction: 'signTransaction', + SignAuthEntry: 'signAuthEntry', +} as const; + +export type MultichainMethod = + (typeof MultichainMethod)[keyof typeof MultichainMethod]; /** Superstruct validator for {@link MultichainMethod} string values. */ export const MultichainMethodStruct = enums(Object.values(MultichainMethod)); diff --git a/packages/stellar-wallet-snap/src/handlers/keyring/exceptions.ts b/packages/stellar-wallet-snap/src/handlers/keyring/exceptions.ts index 4fec7fdaf..430b6bdfe 100644 --- a/packages/stellar-wallet-snap/src/handlers/keyring/exceptions.ts +++ b/packages/stellar-wallet-snap/src/handlers/keyring/exceptions.ts @@ -23,16 +23,19 @@ export class KeyringException extends StellarSnapException {} * * @see https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0043.md */ -export enum Sep43ErrorCode { +export const Sep43ErrorCode = { /** Internal wallet error (JS runtime, programmer error, etc.). */ - Internal = -1, + Internal: -1, /** External service (Horizon, RPC, …) returned an error. */ - ExternalService = -2, + ExternalService: -2, /** Client app request is invalid (bad params, malformed XDR, unsupported option). */ - InvalidRequest = -3, + InvalidRequest: -3, /** User declined the confirmation. */ - UserRejected = -4, -} + UserRejected: -4, +} as const; + +export type Sep43ErrorCode = + (typeof Sep43ErrorCode)[keyof typeof Sep43ErrorCode]; /** * Generic SEP-43 message that's user-safe to forward to the dapp. diff --git a/packages/stellar-wallet-snap/src/services/network/MultiCall.ts b/packages/stellar-wallet-snap/src/services/network/MultiCall.ts index e024bc43e..ccbe82f4d 100644 --- a/packages/stellar-wallet-snap/src/services/network/MultiCall.ts +++ b/packages/stellar-wallet-snap/src/services/network/MultiCall.ts @@ -29,10 +29,13 @@ export const SIMULATION_ACCOUNT: string = * it is recommended by Stellar official site. * @see https://developers.stellar.org/docs/tools/sdks/contract-sdks#stellar-multicall--router-sdk */ -export enum StellarRouterContract { - V0 = 'CBZV3HBP672BV7FF3ZILVT4CNPW3N5V2WTJ2LAGOAYW5R7L2D5SLUDFZ', - V1 = 'CCM23MFAJHDWUMF3IM3UPUI4ZUFFKX6OWJNJRUKO2W6MUTQNQWWFH7DC', -} +export const StellarRouterContract = { + V0: 'CBZV3HBP672BV7FF3ZILVT4CNPW3N5V2WTJ2LAGOAYW5R7L2D5SLUDFZ', + V1: 'CCM23MFAJHDWUMF3IM3UPUI4ZUFFKX6OWJNJRUKO2W6MUTQNQWWFH7DC', +} as const; + +export type StellarRouterContract = + (typeof StellarRouterContract)[keyof typeof StellarRouterContract]; export type StellarRouterParams = { rpcClient: rpc.Server; diff --git a/packages/stellar-wallet-snap/src/services/network/api.ts b/packages/stellar-wallet-snap/src/services/network/api.ts index 9cb281f38..0faa9fd76 100644 --- a/packages/stellar-wallet-snap/src/services/network/api.ts +++ b/packages/stellar-wallet-snap/src/services/network/api.ts @@ -6,19 +6,21 @@ import type { KnownCaip19AssetId } from '../../api'; * * @see https://developers.stellar.org/docs/data/apis/horizon/api-reference/errors/result-codes/transactions */ -export enum KnownRpcError { - TxBadSeq = 'txBadSeq', - TxBadAuth = 'txBadAuth', - TxTooEarly = 'txTooEarly', - TxTooLate = 'txTooLate', - TxInsufficientFee = 'txInsufficientFee', - TxInsufficientBalance = 'txInsufficientBalance', - TxInsufficientReserve = 'txInsufficientReserve', - TxFailed = 'txFailed', - TxMissingOperation = 'txMissingOperation', - TxInternalError = 'txInternalError', - TxBadAuthExtra = 'txBadAuthExtra', -} +export const KnownRpcError = { + TxBadSeq: 'txBadSeq', + TxBadAuth: 'txBadAuth', + TxTooEarly: 'txTooEarly', + TxTooLate: 'txTooLate', + TxInsufficientFee: 'txInsufficientFee', + TxInsufficientBalance: 'txInsufficientBalance', + TxInsufficientReserve: 'txInsufficientReserve', + TxFailed: 'txFailed', + TxMissingOperation: 'txMissingOperation', + TxInternalError: 'txInternalError', + TxBadAuthExtra: 'txBadAuthExtra', +} as const; + +export type KnownRpcError = (typeof KnownRpcError)[keyof typeof KnownRpcError]; /** * Asset data for a Stellar classic asset. diff --git a/packages/stellar-wallet-snap/src/services/transaction-scan/api.ts b/packages/stellar-wallet-snap/src/services/transaction-scan/api.ts index 032e41a57..760e9972a 100644 --- a/packages/stellar-wallet-snap/src/services/transaction-scan/api.ts +++ b/packages/stellar-wallet-snap/src/services/transaction-scan/api.ts @@ -28,33 +28,45 @@ import { KnownCaip2ChainId, XdrStruct } from '../../api'; * * @see packages/snap/src/ui/confirmation/components/TransactionAlert.tsx */ -export enum TransactionScanErrorId { - InsufficientBalance = 'insufficientbalance', - InsufficientFunds = 'insufficientfunds', - InvalidTransaction = 'invalidtransaction', - InvalidAddress = 'invalidaddress', - NoTrustline = 'notrustline', - TransactionExpired = 'transactionexpired', -} +export const TransactionScanErrorId = { + InsufficientBalance: 'insufficientbalance', + InsufficientFunds: 'insufficientfunds', + InvalidTransaction: 'invalidtransaction', + InvalidAddress: 'invalidaddress', + NoTrustline: 'notrustline', + TransactionExpired: 'transactionexpired', +} as const; + +export type TransactionScanErrorId = + (typeof TransactionScanErrorId)[keyof typeof TransactionScanErrorId]; /** TransactionScanOption - Options for the transaction scan. */ -export enum TransactionScanOption { - Simulation = 'simulation', - Validation = 'validation', -} +export const TransactionScanOption = { + Simulation: 'simulation', + Validation: 'validation', +} as const; + +export type TransactionScanOption = + (typeof TransactionScanOption)[keyof typeof TransactionScanOption]; /** TransactionScanValidationType */ -export enum TransactionScanValidationType { - Benign = 'Benign', - Warning = 'Warning', - Malicious = 'Malicious', -} +export const TransactionScanValidationType = { + Benign: 'Benign', + Warning: 'Warning', + Malicious: 'Malicious', +} as const; + +export type TransactionScanValidationType = + (typeof TransactionScanValidationType)[keyof typeof TransactionScanValidationType]; /** AssetChangeDirection - Direction of an estimated balance change relative to the signer. */ -export enum AssetChangeDirection { - In = 'in', - Out = 'out', -} +export const AssetChangeDirection = { + In: 'in', + Out: 'out', +} as const; + +export type AssetChangeDirection = + (typeof AssetChangeDirection)[keyof typeof AssetChangeDirection]; /** Security Alerts API chain identifier. */ export type SecurityAlertsChain = 'pubnet' | 'testnet' | 'futurenet'; diff --git a/packages/stellar-wallet-snap/src/services/transaction/KeyringTransactionBuilder.ts b/packages/stellar-wallet-snap/src/services/transaction/KeyringTransactionBuilder.ts index 6d50c8d81..95e1d939f 100644 --- a/packages/stellar-wallet-snap/src/services/transaction/KeyringTransactionBuilder.ts +++ b/packages/stellar-wallet-snap/src/services/transaction/KeyringTransactionBuilder.ts @@ -12,20 +12,26 @@ import { getSlip44AssetId, toDisplayBalance } from '../../utils'; import type { StellarKeyringAccount } from '../account/api'; import { KeyringTransactionBuilderException } from './exceptions'; -export enum KeyringTransactionType { - Swap = 'swap', - BridgeSend = 'bridgeSend', - ChangeTrustOptIn = 'changeTrustOptIn', - ChangeTrustOptOut = 'changeTrustOptOut', - Send = 'send', - Pending = 'pending', - Unknown = 'unknown', -} +export const KeyringTransactionType = { + Swap: 'swap', + BridgeSend: 'bridgeSend', + ChangeTrustOptIn: 'changeTrustOptIn', + ChangeTrustOptOut: 'changeTrustOptOut', + Send: 'send', + Pending: 'pending', + Unknown: 'unknown', +} as const; -enum KeyringTransactionTypeLabel { - ChangeTrustOptIn = 'trustline-approve', - ChangeTrustOptOut = 'trustline-disapprove', -} +export type KeyringTransactionType = + (typeof KeyringTransactionType)[keyof typeof KeyringTransactionType]; + +const KeyringTransactionTypeLabel = { + ChangeTrustOptIn: 'trustline-approve', + ChangeTrustOptOut: 'trustline-disapprove', +} as const; + +type KeyringTransactionTypeLabel = + (typeof KeyringTransactionTypeLabel)[keyof typeof KeyringTransactionTypeLabel]; export type KeyringTransactionAsset = { unit: string; @@ -102,51 +108,51 @@ export type UnknownTransactionRequest = { export type KeyringTransactionRequest = | { - type: KeyringTransactionType.ChangeTrustOptIn; + type: 'changeTrustOptIn'; request: ChangeTrustTransactionRequest; } | { - type: KeyringTransactionType.ChangeTrustOptOut; + type: 'changeTrustOptOut'; request: ChangeTrustTransactionRequest; } | { - type: KeyringTransactionType.Send; + type: 'send'; request: SendTransactionRequest; } | { - type: KeyringTransactionType.Pending; + type: 'pending'; request: PendingTransactionRequest; } | { - type: KeyringTransactionType.Unknown; + type: 'unknown'; request: UnknownTransactionRequest; } | { - type: KeyringTransactionType.Swap; + type: 'swap'; request: SwapTransactionRequest; } | { - type: KeyringTransactionType.BridgeSend; + type: 'bridgeSend'; request: UnknownTransactionRequest; }; export class KeyringTransactionBuilder { createTransaction(request: KeyringTransactionRequest): KeyringTransaction { switch (request.type) { - case KeyringTransactionType.ChangeTrustOptOut: - case KeyringTransactionType.ChangeTrustOptIn: + case 'changeTrustOptOut': + case 'changeTrustOptIn': return this.#createChangeTrustTransaction( request.request, request.type, ); - case KeyringTransactionType.Send: + case 'send': return this.#createSendTransaction(request.request); - case KeyringTransactionType.Swap: + case 'swap': return this.#createSwapTransaction(request.request); - case KeyringTransactionType.Pending: + case 'pending': return this.#createPendingTransaction(request.request); - case KeyringTransactionType.Unknown: - case KeyringTransactionType.BridgeSend: + case 'unknown': + case 'bridgeSend': return this.#createUnknownTransaction(request.request); default: throw new KeyringTransactionBuilderException( @@ -169,9 +175,7 @@ export class KeyringTransactionBuilder { */ #createChangeTrustTransaction( request: ChangeTrustTransactionRequest, - optInOrOut: - | KeyringTransactionType.ChangeTrustOptIn - | KeyringTransactionType.ChangeTrustOptOut, + optInOrOut: 'changeTrustOptIn' | 'changeTrustOptOut', ): KeyringTransaction { const { txId, diff --git a/packages/stellar-wallet-snap/src/services/transaction/TransactionSimulator.ts b/packages/stellar-wallet-snap/src/services/transaction/TransactionSimulator.ts index 58afc70da..5e146d01b 100644 --- a/packages/stellar-wallet-snap/src/services/transaction/TransactionSimulator.ts +++ b/packages/stellar-wallet-snap/src/services/transaction/TransactionSimulator.ts @@ -51,13 +51,16 @@ type SupportedOPType = /** * Stellar operation kinds used when validating or simulating transactions. */ -export enum SupportedOperations { - Payment = 'payment', - PathPayment = 'pathPayment', - CreateAccount = 'createAccount', - ChangeTrust = 'changeTrust', - InvokeHostFunction = 'invokeHostFunction', -} +export const SupportedOperations = { + Payment: 'payment', + PathPayment: 'pathPayment', + CreateAccount: 'createAccount', + ChangeTrust: 'changeTrust', + InvokeHostFunction: 'invokeHostFunction', +} as const; + +export type SupportedOperations = + (typeof SupportedOperations)[keyof typeof SupportedOperations]; /** * Optional settings for {@link TransactionSimulator.simulate}. diff --git a/packages/stellar-wallet-snap/src/services/transaction/api.ts b/packages/stellar-wallet-snap/src/services/transaction/api.ts index b23892bfe..c45ffc278 100644 --- a/packages/stellar-wallet-snap/src/services/transaction/api.ts +++ b/packages/stellar-wallet-snap/src/services/transaction/api.ts @@ -11,42 +11,48 @@ export type StellarKeyringTransaction = KeyringTransaction & { /** * The order of onChain transactions to fetch. */ -export enum TransactionOrder { - ASC = 'asc', - DESC = 'desc', -} +export const TransactionOrder = { + ASC: 'asc', + DESC: 'desc', +} as const; + +export type TransactionOrder = + (typeof TransactionOrder)[keyof typeof TransactionOrder]; /** * The type of Stellar operation. * * @see https://stellar.org/developers/guides/concepts/list-of-operations.html */ -export enum StellarOperationType { - AccountMerge = 'accountMerge', - AllowTrust = 'allowTrust', - BeginSponsoringFutureReserves = 'beginSponsoringFutureReserves', - BumpSequence = 'bumpSequence', - ChangeTrust = 'changeTrust', - ClaimClaimableBalance = 'claimClaimableBalance', - Clawback = 'clawback', - ClawbackClaimableBalance = 'clawbackClaimableBalance', - CreateAccount = 'createAccount', - CreateClaimableBalance = 'createClaimableBalance', - CreatePassiveSellOffer = 'createPassiveSellOffer', - EndSponsoringFutureReserves = 'endSponsoringFutureReserves', - ExtendFootprintTtl = 'extendFootprintTtl', - Inflation = 'inflation', - InvokeHostFunction = 'invokeHostFunction', - LiquidityPoolDeposit = 'liquidityPoolDeposit', - LiquidityPoolWithdraw = 'liquidityPoolWithdraw', - ManageBuyOffer = 'manageBuyOffer', - ManageData = 'manageData', - ManageSellOffer = 'manageSellOffer', - PathPaymentStrictReceive = 'pathPaymentStrictReceive', - PathPaymentStrictSend = 'pathPaymentStrictSend', - Payment = 'payment', - RestoreFootprint = 'restoreFootprint', - RevokeSponsorship = 'revokeSponsorship', - SetOptions = 'setOptions', - SetTrustLineFlags = 'setTrustLineFlags', -} +export const StellarOperationType = { + AccountMerge: 'accountMerge', + AllowTrust: 'allowTrust', + BeginSponsoringFutureReserves: 'beginSponsoringFutureReserves', + BumpSequence: 'bumpSequence', + ChangeTrust: 'changeTrust', + ClaimClaimableBalance: 'claimClaimableBalance', + Clawback: 'clawback', + ClawbackClaimableBalance: 'clawbackClaimableBalance', + CreateAccount: 'createAccount', + CreateClaimableBalance: 'createClaimableBalance', + CreatePassiveSellOffer: 'createPassiveSellOffer', + EndSponsoringFutureReserves: 'endSponsoringFutureReserves', + ExtendFootprintTtl: 'extendFootprintTtl', + Inflation: 'inflation', + InvokeHostFunction: 'invokeHostFunction', + LiquidityPoolDeposit: 'liquidityPoolDeposit', + LiquidityPoolWithdraw: 'liquidityPoolWithdraw', + ManageBuyOffer: 'manageBuyOffer', + ManageData: 'manageData', + ManageSellOffer: 'manageSellOffer', + PathPaymentStrictReceive: 'pathPaymentStrictReceive', + PathPaymentStrictSend: 'pathPaymentStrictSend', + Payment: 'payment', + RestoreFootprint: 'restoreFootprint', + RevokeSponsorship: 'revokeSponsorship', + SetOptions: 'setOptions', + SetTrustLineFlags: 'setTrustLineFlags', +} as const; + +export type StellarOperationType = + (typeof StellarOperationType)[keyof typeof StellarOperationType]; diff --git a/packages/stellar-wallet-snap/src/services/transaction/utils.ts b/packages/stellar-wallet-snap/src/services/transaction/utils.ts index 767a95fe3..b53af1ec2 100644 --- a/packages/stellar-wallet-snap/src/services/transaction/utils.ts +++ b/packages/stellar-wallet-snap/src/services/transaction/utils.ts @@ -359,15 +359,18 @@ export function isBridgeSendTransaction( } const operationTypes = transaction.transactionOperations; const [firstOperation] = operationTypes; + const supportedSwapFirstOperationTypes = [ + StellarOperationType.InvokeHostFunction, + StellarOperationType.Payment, + StellarOperationType.PathPaymentStrictSend, + StellarOperationType.PathPaymentStrictReceive, + ] as const; if ( operationTypes.length === 1 && firstOperation && - [ - StellarOperationType.InvokeHostFunction, - StellarOperationType.Payment, - StellarOperationType.PathPaymentStrictSend, - StellarOperationType.PathPaymentStrictReceive, - ].includes(firstOperation.type as StellarOperationType) + supportedSwapFirstOperationTypes.includes( + firstOperation.type as (typeof supportedSwapFirstOperationTypes)[number], + ) ) { return true; } diff --git a/packages/stellar-wallet-snap/src/services/transaction/xdrParser.ts b/packages/stellar-wallet-snap/src/services/transaction/xdrParser.ts index 9708d9256..a835d4aae 100644 --- a/packages/stellar-wallet-snap/src/services/transaction/xdrParser.ts +++ b/packages/stellar-wallet-snap/src/services/transaction/xdrParser.ts @@ -26,10 +26,13 @@ import { import { bufferToUint8Array } from '../../utils/buffer'; import { XdrParseException } from './exceptions'; -export enum TransactionResultType { - PathPaymentStrictSendSuccess = 'pathPaymentStrictSendSuccess', - PathPaymentStrictReceiveSuccess = 'pathPaymentStrictReceiveSuccess', -} +export const TransactionResultType = { + PathPaymentStrictSendSuccess: 'pathPaymentStrictSendSuccess', + PathPaymentStrictReceiveSuccess: 'pathPaymentStrictReceiveSuccess', +} as const; + +export type TransactionResultType = + (typeof TransactionResultType)[keyof typeof TransactionResultType]; type TransactionResultAsset = | KnownCaip19ClassicAssetId @@ -46,18 +49,18 @@ type AssetAndAmount = { * * `amount` and `asset` always describe the side extracted from the transaction * result XDR that is not fixed by the operation envelope: - * - {@link TransactionResultType.PathPaymentStrictSendSuccess}: destination (receive) amount and asset from `last`. - * - {@link TransactionResultType.PathPaymentStrictReceiveSuccess}: source (send) amount and asset from the first path offer's `amountBought` / `assetBought` (not the receive amount/asset in `last`). + * - {@link 'pathPaymentStrictSendSuccess'}: destination (receive) amount and asset from `last`. + * - {@link 'pathPaymentStrictReceiveSuccess'}: source (send) amount and asset from the first path offer's `amountBought` / `assetBought` (not the receive amount/asset in `last`). */ type OperationResult = | { - type: TransactionResultType.PathPaymentStrictSendSuccess; + type: 'pathPaymentStrictSendSuccess'; amount: string; asset: TransactionResultAsset; destination: string | undefined; } | { - type: TransactionResultType.PathPaymentStrictReceiveSuccess; + type: 'pathPaymentStrictReceiveSuccess'; amount: string; asset: TransactionResultAsset; destination: string | undefined; @@ -123,22 +126,20 @@ export function parseSuccessfulTransactionResult( const { name } = tr.value().switch(); try { - if (name === TransactionResultType.PathPaymentStrictSendSuccess) { + if (name === 'pathPaymentStrictSendSuccess') { const success = tr.pathPaymentStrictSendResult().success(); const receiveSide = extractLastReceiveSide(success.last(), scope); if (receiveSide) { operationResults.push({ - type: TransactionResultType.PathPaymentStrictSendSuccess, + type: 'pathPaymentStrictSendSuccess', amount: toDisplayBalance(receiveSide.amount), asset: receiveSide.asset, destination: receiveSide.destination, }); continue; } - } else if ( - name === TransactionResultType.PathPaymentStrictReceiveSuccess - ) { + } else if (name === 'pathPaymentStrictReceiveSuccess') { const success = tr.pathPaymentStrictReceiveResult().success(); const sendSide = extractFirstOfferSendSide( success.offers()[0], @@ -148,7 +149,7 @@ export function parseSuccessfulTransactionResult( if (sendSide) { operationResults.push({ - type: TransactionResultType.PathPaymentStrictReceiveSuccess, + type: 'pathPaymentStrictReceiveSuccess', amount: toDisplayBalance(sendSide.amount), asset: sendSide.asset, destination: sendSide.destination, diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/api.ts b/packages/stellar-wallet-snap/src/ui/confirmation/api.ts index 44a45acde..a098a98ca 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/api.ts +++ b/packages/stellar-wallet-snap/src/ui/confirmation/api.ts @@ -44,13 +44,14 @@ export type FeeData = { amount: string; }; -export enum FetchStatus { - Initial = 'initial', - Fetching = 'fetching', - Fetched = 'fetched', - // eslint-disable-next-line @typescript-eslint/no-shadow - Error = 'error', -} +export const FetchStatus = { + Initial: 'initial', + Fetching: 'fetching', + Fetched: 'fetched', + Error: 'error', +} as const; + +export type FetchStatus = (typeof FetchStatus)[keyof typeof FetchStatus]; export const ContextWithPricesStruct = type({ tokenPrices: record( @@ -109,14 +110,17 @@ export type ContextWithTransactionValidation = Infer< typeof ContextWithTransactionValidationStruct >; -export enum ConfirmationInterfaceKey { - ChangeTrustlineOptIn = 'ChangeTrustlineOptIn', - ChangeTrustlineOptOut = 'ChangeTrustlineOptOut', - SignMessage = 'SignMessage', - SignTransaction = 'SignTransaction', - SignAuthEntry = 'SignAuthEntry', - ConfirmSendTransaction = 'ConfirmSendTransaction', -} +export const ConfirmationInterfaceKey = { + ChangeTrustlineOptIn: 'ChangeTrustlineOptIn', + ChangeTrustlineOptOut: 'ChangeTrustlineOptOut', + SignMessage: 'SignMessage', + SignTransaction: 'SignTransaction', + SignAuthEntry: 'SignAuthEntry', + ConfirmSendTransaction: 'ConfirmSendTransaction', +} as const; + +export type ConfirmationInterfaceKey = + (typeof ConfirmationInterfaceKey)[keyof typeof ConfirmationInterfaceKey]; export const ConfirmationInterfaceKeyStruct = enums( Object.values(ConfirmationInterfaceKey), diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/controller.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/controller.tsx index a78e4a9ed..70df4af8e 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/controller.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/controller.tsx @@ -74,10 +74,10 @@ type RenderConfirmationDialogCommon = { }; type ConfirmationDialogWithFee = - | ConfirmationInterfaceKey.SignTransaction - | ConfirmationInterfaceKey.ChangeTrustlineOptIn - | ConfirmationInterfaceKey.ChangeTrustlineOptOut - | ConfirmationInterfaceKey.ConfirmSendTransaction; + | 'SignTransaction' + | 'ChangeTrustlineOptIn' + | 'ChangeTrustlineOptOut' + | 'ConfirmSendTransaction'; /** * Discriminated union: confirmations that have a fee (example: sign transaction) * MUST provide one; fee-less confirmations (sign message, etc.) MUST NOT. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/utils.ts b/packages/stellar-wallet-snap/src/ui/confirmation/utils.ts index 901db6057..612254f2e 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/utils.ts +++ b/packages/stellar-wallet-snap/src/ui/confirmation/utils.ts @@ -298,11 +298,14 @@ export function shouldDisableConfirmation(params: { * The transaction-validation banner and the Blockaid scan banner are mutually * exclusive: only one is ever rendered, and validation takes priority. */ -export enum ConfirmationBanner { - None = 'none', - TransactionValidation = 'transaction-validation', - TransactionScan = 'transaction-scan', -} +export const ConfirmationBanner = { + None: 'none', + TransactionValidation: 'transaction-validation', + TransactionScan: 'transaction-scan', +} as const; + +export type ConfirmationBanner = + (typeof ConfirmationBanner)[keyof typeof ConfirmationBanner]; /** * Resolves which top-of-screen banner the confirmation should display. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSendTransaction/events.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSendTransaction/events.tsx index 9506d178c..64408e299 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSendTransaction/events.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSendTransaction/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await resolveInterface(id, true); } -export enum ConfirmSendTransactionFormNames { - Cancel = 'confirm-send-transaction-cancel', - Confirm = 'confirm-send-transaction-confirm', -} +export const ConfirmSendTransactionFormNames = { + Cancel: 'confirm-send-transaction-cancel', + Confirm: 'confirm-send-transaction-confirm', +} as const; + +export type ConfirmSendTransactionFormNames = + (typeof ConfirmSendTransactionFormNames)[keyof typeof ConfirmSendTransactionFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignAuthEntry/events.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignAuthEntry/events.tsx index 8e7e0b10b..ad6a18886 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignAuthEntry/events.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignAuthEntry/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await resolveInterface(id, true); } -export enum ConfirmSignAuthEntryFormNames { - Cancel = 'confirm-sign-auth-entry-cancel', - Confirm = 'confirm-sign-auth-entry-confirm', -} +export const ConfirmSignAuthEntryFormNames = { + Cancel: 'confirm-sign-auth-entry-cancel', + Confirm: 'confirm-sign-auth-entry-confirm', +} as const; + +export type ConfirmSignAuthEntryFormNames = + (typeof ConfirmSignAuthEntryFormNames)[keyof typeof ConfirmSignAuthEntryFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptIn/events.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptIn/events.tsx index 9d2ff861a..14ee52a74 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptIn/events.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptIn/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await resolveInterface(id, true); } -export enum ConfirmSignChangeTrustOptInFormNames { - Cancel = 'confirm-sign-change-trust-opt-in-cancel', - Confirm = 'confirm-sign-change-trust-opt-in-confirm', -} +export const ConfirmSignChangeTrustOptInFormNames = { + Cancel: 'confirm-sign-change-trust-opt-in-cancel', + Confirm: 'confirm-sign-change-trust-opt-in-confirm', +} as const; + +export type ConfirmSignChangeTrustOptInFormNames = + (typeof ConfirmSignChangeTrustOptInFormNames)[keyof typeof ConfirmSignChangeTrustOptInFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptOut/events.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptOut/events.tsx index 213170596..3286501f3 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptOut/events.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignChangeTrustOptOut/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await resolveInterface(id, true); } -export enum ConfirmSignChangeTrustOptOutFormNames { - Cancel = 'confirm-sign-change-trust-opt-out-cancel', - Confirm = 'confirm-sign-change-trust-opt-out-confirm', -} +export const ConfirmSignChangeTrustOptOutFormNames = { + Cancel: 'confirm-sign-change-trust-opt-out-cancel', + Confirm: 'confirm-sign-change-trust-opt-out-confirm', +} as const; + +export type ConfirmSignChangeTrustOptOutFormNames = + (typeof ConfirmSignChangeTrustOptOutFormNames)[keyof typeof ConfirmSignChangeTrustOptOutFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx index 127eae459..924323c9c 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( 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]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx index 9a32db64d..8b8b4b736 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await resolveInterface(id, true); } -export enum ConfirmSignTransactionFormNames { - Cancel = 'confirm-sign-transaction-cancel', - Confirm = 'confirm-sign-transaction-confirm', -} +export const ConfirmSignTransactionFormNames = { + Cancel: 'confirm-sign-transaction-cancel', + Confirm: 'confirm-sign-transaction-confirm', +} as const; + +export type ConfirmSignTransactionFormNames = + (typeof ConfirmSignTransactionFormNames)[keyof typeof ConfirmSignTransactionFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/stellar-wallet-snap/src/ui/confirmation/views/MaliciousAcknowledgement/constants.ts b/packages/stellar-wallet-snap/src/ui/confirmation/views/MaliciousAcknowledgement/constants.ts index 949b9bc51..2485936e0 100644 --- a/packages/stellar-wallet-snap/src/ui/confirmation/views/MaliciousAcknowledgement/constants.ts +++ b/packages/stellar-wallet-snap/src/ui/confirmation/views/MaliciousAcknowledgement/constants.ts @@ -4,9 +4,12 @@ * The screen is reused across every scanned confirmation flow, so these names * live in one place and are handled by a single set of event handlers. */ -export enum MaliciousAcknowledgementFormNames { - Review = 'malicious-acknowledgement-review', - Acknowledge = 'malicious-acknowledgement-checkbox', - Proceed = 'malicious-acknowledgement-proceed', - Back = 'malicious-acknowledgement-back', -} +export const MaliciousAcknowledgementFormNames = { + Review: 'malicious-acknowledgement-review', + Acknowledge: 'malicious-acknowledgement-checkbox', + Proceed: 'malicious-acknowledgement-proceed', + Back: 'malicious-acknowledgement-back', +} as const; + +export type MaliciousAcknowledgementFormNames = + (typeof MaliciousAcknowledgementFormNames)[keyof typeof MaliciousAcknowledgementFormNames]; diff --git a/packages/stellar-wallet-snap/src/utils/snap.ts b/packages/stellar-wallet-snap/src/utils/snap.ts index 126366ed3..89ad2c127 100644 --- a/packages/stellar-wallet-snap/src/utils/snap.ts +++ b/packages/stellar-wallet-snap/src/utils/snap.ts @@ -19,37 +19,45 @@ import { logger } from './logger'; import { serialize, deserialize } from './serialization'; import type { Serializable } from './serialization'; -export enum Duration { - OneSecond = 'PT1S', - TwoSeconds = 'PT2S', - FiveSeconds = 'PT5S', - TwentySeconds = 'PT20S', - ThirtySeconds = 'PT30S', - OneMinute = 'PT1M', - FiveMinutes = 'PT5M', - TenMinutes = 'PT10M', - ThirtyMinutes = 'PT30M', - OneHour = 'PT1H', -} +export const Duration = { + OneSecond: 'PT1S', + TwoSeconds: 'PT2S', + FiveSeconds: 'PT5S', + TwentySeconds: 'PT20S', + ThirtySeconds: 'PT30S', + OneMinute: 'PT1M', + FiveMinutes: 'PT5M', + TenMinutes: 'PT10M', + ThirtyMinutes: 'PT30M', + OneHour: 'PT1H', +} as const; + +export type Duration = (typeof Duration)[keyof typeof Duration]; /** * Enum for transaction tracking event types. */ -export enum TransactionEventType { - TransactionAdded = 'Transaction Added', - TransactionRejected = 'Transaction Rejected', - TransactionApproved = 'Transaction Approved', - TransactionSubmitted = 'Transaction Submitted', - TransactionFinalized = 'Transaction Finalized', -} +export const TransactionEventType = { + TransactionAdded: 'Transaction Added', + TransactionRejected: 'Transaction Rejected', + TransactionApproved: 'Transaction Approved', + TransactionSubmitted: 'Transaction Submitted', + TransactionFinalized: 'Transaction Finalized', +} as const; + +export type TransactionEventType = + (typeof TransactionEventType)[keyof typeof TransactionEventType]; /** * Enum for security alert tracking event types. */ -export enum SecurityEventType { - SecurityAlertDetected = 'Security Alert Detected', - SecurityScanCompleted = 'Security Scan Completed', -} +export const SecurityEventType = { + SecurityAlertDetected: 'Security Alert Detected', + SecurityScanCompleted: 'Security Scan Completed', +} as const; + +export type SecurityEventType = + (typeof SecurityEventType)[keyof typeof SecurityEventType]; /** * Returns the Snap provider. diff --git a/packages/tron-wallet-snap/CHANGELOG.md b/packages/tron-wallet-snap/CHANGELOG.md index 8167ec543..4ee2e957b 100644 --- a/packages/tron-wallet-snap/CHANGELOG.md +++ b/packages/tron-wallet-snap/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +**BREAKING:** Convert `Network`, `KnownCaip19Id`, `FeeType`, `ClientRequestMethod`, `SendErrorCodes`, `TransactionScanType`, `TransactionStatus`, `TransactionType`, `AnalyticsEventType`, `SnapFunction`, and `ResourceType` from TypeScript enums to `as const` objects with derived union types ([#XXX](https://github.com/MetaMask/internal-snaps/pull/XXX)) +- Member access (`Enum.Member`) and runtime values are unchanged +- Type signatures change: `Enum` is now a union of string/number literals instead of a nominal enum type + + ### Added - Add `CoreAssetsAdapter` and `mapControllerAsset` for AssetsController integration (wired unused until routing lands) ([#144](https://github.com/MetaMask/internal-snaps/pull/144)) diff --git a/packages/tron-wallet-snap/src/constants/index.ts b/packages/tron-wallet-snap/src/constants/index.ts index 40ab2c951..4e3e8b63d 100644 --- a/packages/tron-wallet-snap/src/constants/index.ts +++ b/packages/tron-wallet-snap/src/constants/index.ts @@ -37,70 +37,74 @@ export const TRACK_TX_INTERVAL = 'PT3S'; */ export const TRACK_TX_MAX_ATTEMPTS = 5; -export enum Network { - Mainnet = 'tron:728126428', - Nile = 'tron:3448148188', - Shasta = 'tron:2494104990', -} +export const Network = { + Mainnet: 'tron:728126428', + Nile: 'tron:3448148188', + Shasta: 'tron:2494104990', +} as const; + +export type Network = (typeof Network)[keyof typeof Network]; -export enum KnownCaip19Id { - TrxMainnet = `${Network.Mainnet}/slip44:195`, - TrxNile = `${Network.Nile}/slip44:195`, - TrxShasta = `${Network.Shasta}/slip44:195`, +export const KnownCaip19Id = { + TrxMainnet: `${Network.Mainnet}/slip44:195`, + TrxNile: `${Network.Nile}/slip44:195`, + TrxShasta: `${Network.Shasta}/slip44:195`, - UsdtMainnet = `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`, + UsdtMainnet: `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`, /** * Staked Tron */ - TrxStakedForBandwidthMainnet = `${Network.Mainnet}/slip44:195-staked-for-bandwidth`, - TrxStakedForBandwidthNile = `${Network.Nile}/slip44:195-staked-for-bandwidth`, - TrxStakedForBandwidthShasta = `${Network.Shasta}/slip44:195-staked-for-bandwidth`, + TrxStakedForBandwidthMainnet: `${Network.Mainnet}/slip44:195-staked-for-bandwidth`, + TrxStakedForBandwidthNile: `${Network.Nile}/slip44:195-staked-for-bandwidth`, + TrxStakedForBandwidthShasta: `${Network.Shasta}/slip44:195-staked-for-bandwidth`, - TrxStakedForEnergyMainnet = `${Network.Mainnet}/slip44:195-staked-for-energy`, - TrxStakedForEnergyNile = `${Network.Nile}/slip44:195-staked-for-energy`, - TrxStakedForEnergyShasta = `${Network.Shasta}/slip44:195-staked-for-energy`, + TrxStakedForEnergyMainnet: `${Network.Mainnet}/slip44:195-staked-for-energy`, + TrxStakedForEnergyNile: `${Network.Nile}/slip44:195-staked-for-energy`, + TrxStakedForEnergyShasta: `${Network.Shasta}/slip44:195-staked-for-energy`, /** * TRX Ready for Withdrawal (unstaked TRX that has completed the withdrawal period) */ - TrxReadyForWithdrawalMainnet = `${Network.Mainnet}/slip44:195-ready-for-withdrawal`, - TrxReadyForWithdrawalNile = `${Network.Nile}/slip44:195-ready-for-withdrawal`, - TrxReadyForWithdrawalShasta = `${Network.Shasta}/slip44:195-ready-for-withdrawal`, + TrxReadyForWithdrawalMainnet: `${Network.Mainnet}/slip44:195-ready-for-withdrawal`, + TrxReadyForWithdrawalNile: `${Network.Nile}/slip44:195-ready-for-withdrawal`, + TrxReadyForWithdrawalShasta: `${Network.Shasta}/slip44:195-ready-for-withdrawal`, /** * Staking Rewards TRX */ - TrxStakingRewardsMainnet = `${Network.Mainnet}/slip44:195-staking-rewards`, - TrxStakingRewardsNile = `${Network.Nile}/slip44:195-staking-rewards`, - TrxStakingRewardsShasta = `${Network.Shasta}/slip44:195-staking-rewards`, + TrxStakingRewardsMainnet: `${Network.Mainnet}/slip44:195-staking-rewards`, + TrxStakingRewardsNile: `${Network.Nile}/slip44:195-staking-rewards`, + TrxStakingRewardsShasta: `${Network.Shasta}/slip44:195-staking-rewards`, /** * TRX in Lock Period (unstaked but waiting for lock period to end) */ - TrxInLockPeriodMainnet = `${Network.Mainnet}/slip44:195-in-lock-period`, - TrxInLockPeriodNile = `${Network.Nile}/slip44:195-in-lock-period`, - TrxInLockPeriodShasta = `${Network.Shasta}/slip44:195-in-lock-period`, + TrxInLockPeriodMainnet: `${Network.Mainnet}/slip44:195-in-lock-period`, + TrxInLockPeriodNile: `${Network.Nile}/slip44:195-in-lock-period`, + TrxInLockPeriodShasta: `${Network.Shasta}/slip44:195-in-lock-period`, /** * Tron Resource Assets */ - EnergyMainnet = `${Network.Mainnet}/slip44:energy`, - EnergyNile = `${Network.Nile}/slip44:energy`, - EnergyShasta = `${Network.Shasta}/slip44:energy`, - - MaximumEnergyMainnet = `${Network.Mainnet}/slip44:maximum-energy`, - MaximumEnergyNile = `${Network.Nile}/slip44:maximum-energy`, - MaximumEnergyShasta = `${Network.Shasta}/slip44:maximum-energy`, - - BandwidthMainnet = `${Network.Mainnet}/slip44:bandwidth`, - BandwidthNile = `${Network.Nile}/slip44:bandwidth`, - BandwidthShasta = `${Network.Shasta}/slip44:bandwidth`, - - MaximumBandwidthMainnet = `${Network.Mainnet}/slip44:maximum-bandwidth`, - MaximumBandwidthNile = `${Network.Nile}/slip44:maximum-bandwidth`, - MaximumBandwidthShasta = `${Network.Shasta}/slip44:maximum-bandwidth`, -} + EnergyMainnet: `${Network.Mainnet}/slip44:energy`, + EnergyNile: `${Network.Nile}/slip44:energy`, + EnergyShasta: `${Network.Shasta}/slip44:energy`, + + MaximumEnergyMainnet: `${Network.Mainnet}/slip44:maximum-energy`, + MaximumEnergyNile: `${Network.Nile}/slip44:maximum-energy`, + MaximumEnergyShasta: `${Network.Shasta}/slip44:maximum-energy`, + + BandwidthMainnet: `${Network.Mainnet}/slip44:bandwidth`, + BandwidthNile: `${Network.Nile}/slip44:bandwidth`, + BandwidthShasta: `${Network.Shasta}/slip44:bandwidth`, + + MaximumBandwidthMainnet: `${Network.Mainnet}/slip44:maximum-bandwidth`, + MaximumBandwidthNile: `${Network.Nile}/slip44:maximum-bandwidth`, + MaximumBandwidthShasta: `${Network.Shasta}/slip44:maximum-bandwidth`, +} as const; + +export type KnownCaip19Id = (typeof KnownCaip19Id)[keyof typeof KnownCaip19Id]; export const TRX_METADATA = { fungible: true as const, diff --git a/packages/tron-wallet-snap/src/entities/assets.ts b/packages/tron-wallet-snap/src/entities/assets.ts index 76d0e4d64..c0cee1de3 100644 --- a/packages/tron-wallet-snap/src/entities/assets.ts +++ b/packages/tron-wallet-snap/src/entities/assets.ts @@ -1,4 +1,4 @@ -import type { KnownCaip19Id, Network } from '../constants'; +import type { Network } from '../constants'; import type { InLockPeriodCaipAssetType, NativeCaipAssetType, @@ -41,22 +41,22 @@ export type InLockPeriodAsset = BaseAsset & { export type ResourceAsset = BaseAsset & { assetType: - | KnownCaip19Id.EnergyMainnet - | KnownCaip19Id.EnergyNile - | KnownCaip19Id.EnergyShasta - | KnownCaip19Id.BandwidthMainnet - | KnownCaip19Id.BandwidthNile - | KnownCaip19Id.BandwidthShasta; + | 'tron:728126428/slip44:energy' + | 'tron:3448148188/slip44:energy' + | 'tron:2494104990/slip44:energy' + | 'tron:728126428/slip44:bandwidth' + | 'tron:3448148188/slip44:bandwidth' + | 'tron:2494104990/slip44:bandwidth'; }; export type MaximumResourceAsset = BaseAsset & { assetType: - | KnownCaip19Id.MaximumEnergyMainnet - | KnownCaip19Id.MaximumEnergyNile - | KnownCaip19Id.MaximumEnergyShasta - | KnownCaip19Id.MaximumBandwidthMainnet - | KnownCaip19Id.MaximumBandwidthNile - | KnownCaip19Id.MaximumBandwidthShasta; + | 'tron:728126428/slip44:maximum-energy' + | 'tron:3448148188/slip44:maximum-energy' + | 'tron:2494104990/slip44:maximum-energy' + | 'tron:728126428/slip44:maximum-bandwidth' + | 'tron:3448148188/slip44:maximum-bandwidth' + | 'tron:2494104990/slip44:maximum-bandwidth'; }; export type TokenAsset = BaseAsset & { diff --git a/packages/tron-wallet-snap/src/handlers/clientRequest/types.ts b/packages/tron-wallet-snap/src/handlers/clientRequest/types.ts index 52bfc5302..ad8523f70 100644 --- a/packages/tron-wallet-snap/src/handlers/clientRequest/types.ts +++ b/packages/tron-wallet-snap/src/handlers/clientRequest/types.ts @@ -1,36 +1,41 @@ -export enum ClientRequestMethod { - SignAndSendTransaction = 'signAndSendTransaction', +export const ClientRequestMethod = { + SignAndSendTransaction: 'signAndSendTransaction', /** * Unified non-EVM Send */ - ConfirmSend = 'confirmSend', - ComputeFee = 'computeFee', - OnAddressInput = 'onAddressInput', - OnAmountInput = 'onAmountInput', + ConfirmSend: 'confirmSend', + ComputeFee: 'computeFee', + OnAddressInput: 'onAddressInput', + OnAmountInput: 'onAmountInput', /** * Staking + Unstaking */ - ComputeStakeFee = 'computeStakeFee', - OnStakeAmountInput = 'onStakeAmountInput', - ConfirmStake = 'confirmStake', - OnUnstakeAmountInput = 'onUnstakeAmountInput', - ConfirmUnstake = 'confirmUnstake', - ClaimUnstakedTrx = 'claimUnstakedTrx', - ClaimTrxStakingRewards = 'claimTrxStakingRewards', + ComputeStakeFee: 'computeStakeFee', + OnStakeAmountInput: 'onStakeAmountInput', + ConfirmStake: 'confirmStake', + OnUnstakeAmountInput: 'onUnstakeAmountInput', + ConfirmUnstake: 'confirmUnstake', + ClaimUnstakedTrx: 'claimUnstakedTrx', + ClaimTrxStakingRewards: 'claimTrxStakingRewards', /** * Sign Rewards Message */ - SignRewardsMessage = 'signRewardsMessage', + SignRewardsMessage: 'signRewardsMessage', /** * Sign Proof of Ownership */ - SignProofOfOwnership = 'signProofOfOwnership', -} + SignProofOfOwnership: 'signProofOfOwnership', +} as const; -export enum SendErrorCodes { - // eslint-disable-next-line @typescript-eslint/no-shadow - Required = 'Required', - Invalid = 'Invalid', - InsufficientBalance = 'InsufficientBalance', - InsufficientBalanceToCoverFee = 'InsufficientBalanceToCoverFee', -} +export type ClientRequestMethod = + (typeof ClientRequestMethod)[keyof typeof ClientRequestMethod]; + +export const SendErrorCodes = { + Required: 'Required', + Invalid: 'Invalid', + InsufficientBalance: 'InsufficientBalance', + InsufficientBalanceToCoverFee: 'InsufficientBalanceToCoverFee', +} as const; + +export type SendErrorCodes = + (typeof SendErrorCodes)[keyof typeof SendErrorCodes]; diff --git a/packages/tron-wallet-snap/src/handlers/cronjob/cronjob.tsx b/packages/tron-wallet-snap/src/handlers/cronjob/cronjob.tsx index c9916179c..b3e75b3fe 100644 --- a/packages/tron-wallet-snap/src/handlers/cronjob/cronjob.tsx +++ b/packages/tron-wallet-snap/src/handlers/cronjob/cronjob.tsx @@ -24,20 +24,26 @@ import { ConfirmTransactionRequest } from '../../ui/confirmation/views/ConfirmTr import { CONFIRM_TRANSACTION_INTERFACE_NAME } from '../../ui/confirmation/views/ConfirmTransactionRequest/types'; import type { ConfirmTransactionRequestContext } from '../../ui/confirmation/views/ConfirmTransactionRequest/types'; -export enum CronjobMethod { - ContinuouslySynchronizeSelectedAccounts = 'onSynchronizeSelectedAccountsCronjob', -} - -export enum BackgroundEventMethod { - SynchronizeSelectedAccounts = 'onSynchronizeSelectedAccounts', - SynchronizeAccounts = 'onSynchronizeAccounts', - SynchronizeAccount = 'onSynchronizeAccount', - SynchronizeAccountTransactions = 'onSynchronizeAccountTransactions', - RefreshConfirmationPrices = 'refreshConfirmationPrices', - RefreshConfirmationSend = 'refreshConfirmationSend', - RefreshSignTransaction = 'refreshSignTransaction', - TrackTransaction = 'onTrackTransaction', -} +export const CronjobMethod = { + ContinuouslySynchronizeSelectedAccounts: + 'onSynchronizeSelectedAccountsCronjob', +} as const; + +export type CronjobMethod = (typeof CronjobMethod)[keyof typeof CronjobMethod]; + +export const BackgroundEventMethod = { + SynchronizeSelectedAccounts: 'onSynchronizeSelectedAccounts', + SynchronizeAccounts: 'onSynchronizeAccounts', + SynchronizeAccount: 'onSynchronizeAccount', + SynchronizeAccountTransactions: 'onSynchronizeAccountTransactions', + RefreshConfirmationPrices: 'refreshConfirmationPrices', + RefreshConfirmationSend: 'refreshConfirmationSend', + RefreshSignTransaction: 'refreshSignTransaction', + TrackTransaction: 'onTrackTransaction', +} as const; + +export type BackgroundEventMethod = + (typeof BackgroundEventMethod)[keyof typeof BackgroundEventMethod]; export class CronHandler { readonly #logger: Logger; diff --git a/packages/tron-wallet-snap/src/handlers/keyring/keyring-types.ts b/packages/tron-wallet-snap/src/handlers/keyring/keyring-types.ts index beab480aa..e1e7bcdac 100644 --- a/packages/tron-wallet-snap/src/handlers/keyring/keyring-types.ts +++ b/packages/tron-wallet-snap/src/handlers/keyring/keyring-types.ts @@ -1,10 +1,13 @@ /** * Enum for Tron Multichain API methods that are handled via submitRequest */ -export enum TronMultichainMethod { - SignMessage = 'signMessage', - SignTransaction = 'signTransaction', -} +export const TronMultichainMethod = { + SignMessage: 'signMessage', + SignTransaction: 'signTransaction', +} as const; + +export type TronMultichainMethod = + (typeof TronMultichainMethod)[keyof typeof TronMultichainMethod]; /** * Error codes for Tron Multichain API diff --git a/packages/tron-wallet-snap/src/handlers/rpc/types.ts b/packages/tron-wallet-snap/src/handlers/rpc/types.ts index fc88bc5ea..422352ef0 100644 --- a/packages/tron-wallet-snap/src/handlers/rpc/types.ts +++ b/packages/tron-wallet-snap/src/handlers/rpc/types.ts @@ -1,13 +1,19 @@ -export enum RpcRequestMethods { - OnStart = 'onStart', - OnInstall = 'onInstall', - OnUpdate = 'onUpdate', -} +export const RpcRequestMethods = { + OnStart: 'onStart', + OnInstall: 'onInstall', + OnUpdate: 'onUpdate', +} as const; + +export type RpcRequestMethods = + (typeof RpcRequestMethods)[keyof typeof RpcRequestMethods]; /** * Methods specific to the test dapp, * to allow specific flows for manual testing. */ -export enum TestDappRpcRequestMethod { - ComputeFee = 'computeFee', -} +export const TestDappRpcRequestMethod = { + ComputeFee: 'computeFee', +} as const; + +export type TestDappRpcRequestMethod = + (typeof TestDappRpcRequestMethod)[keyof typeof TestDappRpcRequestMethod]; diff --git a/packages/tron-wallet-snap/src/services/assets/AssetsService.test.ts b/packages/tron-wallet-snap/src/services/assets/AssetsService.test.ts index 3657af081..34d4a35ea 100644 --- a/packages/tron-wallet-snap/src/services/assets/AssetsService.test.ts +++ b/packages/tron-wallet-snap/src/services/assets/AssetsService.test.ts @@ -338,7 +338,8 @@ describe('AssetsService', () => { trc20Balances, ); - const trc20AssetId = `${String(Network.Mainnet)}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${String(Network.Mainnet)}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; mockPriceApiClient.getMultipleSpotPrices.mockResolvedValue( createSpotPrices({ [trc20AssetId]: { id: trc20AssetId, price: 1.0 }, @@ -558,7 +559,8 @@ describe('AssetsService', () => { trc20Balances, ); - const trc20AssetId = `${String(Network.Mainnet)}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${String(Network.Mainnet)}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; mockPriceApiClient.getMultipleSpotPrices.mockResolvedValue( createSpotPrices({ [trc20AssetId]: { id: trc20AssetId, price: 1.0 }, @@ -1564,7 +1566,8 @@ describe('AssetsService', () => { it('correctly updates non-essential assets with zero amounts', async () => { await withAssetsService(async ({ assetsService, mockState }) => { - const trc20AssetId = `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; const assets: AssetEntity[] = [ { assetType: KnownCaip19Id.TrxMainnet, @@ -1613,7 +1616,8 @@ describe('AssetsService', () => { it('updates stale non-essential assets balance to 0 if missed from the latest snapshot', async () => { await withAssetsService( async ({ assetsService, mockState, mockAssetsRepository }) => { - const trc20AssetId = `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; const savedAssets: AssetEntity[] = [ { assetType: KnownCaip19Id.TrxMainnet as NativeCaipAssetType, @@ -2038,7 +2042,8 @@ describe('AssetsService', () => { it('adds TRC20 token to the asset list when it updates from 0 to >0', async () => { await withAssetsService( async ({ assetsService, mockState, mockAssetsRepository }) => { - const trc20AssetId = `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; const savedAssets: AssetEntity[] = [ { @@ -2117,7 +2122,8 @@ describe('AssetsService', () => { it('handles multiple assets updating from 0 to >0 simultaneously', async () => { await withAssetsService( async ({ assetsService, mockState, mockAssetsRepository }) => { - const trc20AssetId = `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; const savedAssets: AssetEntity[] = [ { @@ -2509,7 +2515,8 @@ describe('AssetsService', () => { it('updates TRC20 token balance when it decreases but remains >0', async () => { await withAssetsService( async ({ assetsService, mockState, mockAssetsRepository }) => { - const trc20AssetId = `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`; + const trc20AssetId = + `${Network.Mainnet}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` as const; const savedAssets: AssetEntity[] = [ { diff --git a/packages/tron-wallet-snap/src/services/confirmation/ConfirmationHandler.test.ts b/packages/tron-wallet-snap/src/services/confirmation/ConfirmationHandler.test.ts index a93fbaffb..a6db9cfaf 100644 --- a/packages/tron-wallet-snap/src/services/confirmation/ConfirmationHandler.test.ts +++ b/packages/tron-wallet-snap/src/services/confirmation/ConfirmationHandler.test.ts @@ -360,7 +360,7 @@ describe('ConfirmationHandler', () => { it('sets iconUrl on each fee asset via getIconUrlForKnownAsset', async () => { await withConfirmationHandler( async ({ handler, mockFeeCalculatorService }) => { - const feeAssetType = `${Network.Mainnet}/slip44:195`; + const feeAssetType = `${Network.Mainnet}/slip44:195` as const; const feesWithIcon: ComputeFeeResult = [ { type: FeeType.Base, diff --git a/packages/tron-wallet-snap/src/services/send/types.ts b/packages/tron-wallet-snap/src/services/send/types.ts index 39b3df878..98984a30a 100644 --- a/packages/tron-wallet-snap/src/services/send/types.ts +++ b/packages/tron-wallet-snap/src/services/send/types.ts @@ -1,6 +1,5 @@ import type { FeeType } from '@metamask/keyring-api'; -import type { SendErrorCodes } from '../../handlers/clientRequest/types'; import type { NativeCaipAssetType, ResourceCaipAssetType, @@ -28,8 +27,8 @@ export type ComputeFeeResult = { }[]; export type SendValidationErrorCode = - | SendErrorCodes.InsufficientBalance - | SendErrorCodes.InsufficientBalanceToCoverFee; + | 'InsufficientBalance' + | 'InsufficientBalanceToCoverFee'; export type SendValidationResult = { valid: boolean; diff --git a/packages/tron-wallet-snap/src/services/staking/StakingService.ts b/packages/tron-wallet-snap/src/services/staking/StakingService.ts index 787e8f397..83597ddf7 100644 --- a/packages/tron-wallet-snap/src/services/staking/StakingService.ts +++ b/packages/tron-wallet-snap/src/services/staking/StakingService.ts @@ -102,21 +102,25 @@ export class StakingService { let purpose: TronwebTypes.Resource | undefined; if ( - [ - KnownCaip19Id.TrxStakedForBandwidthMainnet, - KnownCaip19Id.TrxStakedForBandwidthNile, - KnownCaip19Id.TrxStakedForBandwidthShasta, - ].includes(assetId as KnownCaip19Id) + ( + [ + KnownCaip19Id.TrxStakedForBandwidthMainnet, + KnownCaip19Id.TrxStakedForBandwidthNile, + KnownCaip19Id.TrxStakedForBandwidthShasta, + ] as readonly KnownCaip19Id[] + ).includes(assetId as KnownCaip19Id) ) { purpose = 'BANDWIDTH'; } if ( - [ - KnownCaip19Id.TrxStakedForEnergyMainnet, - KnownCaip19Id.TrxStakedForEnergyNile, - KnownCaip19Id.TrxStakedForEnergyShasta, - ].includes(assetId as KnownCaip19Id) + ( + [ + KnownCaip19Id.TrxStakedForEnergyMainnet, + KnownCaip19Id.TrxStakedForEnergyNile, + KnownCaip19Id.TrxStakedForEnergyShasta, + ] as readonly KnownCaip19Id[] + ).includes(assetId as KnownCaip19Id) ) { purpose = 'ENERGY'; } diff --git a/packages/tron-wallet-snap/src/services/transaction-scan/types.ts b/packages/tron-wallet-snap/src/services/transaction-scan/types.ts index 19588d6f8..83ac2d51d 100644 --- a/packages/tron-wallet-snap/src/services/transaction-scan/types.ts +++ b/packages/tron-wallet-snap/src/services/transaction-scan/types.ts @@ -25,11 +25,14 @@ export type TransactionScanError = { message: string | null; }; -export enum SimulationStatus { - Completed = 'COMPLETED', - Skipped = 'SKIPPED', - Failed = 'FAILED', -} +export const SimulationStatus = { + Completed: 'COMPLETED', + Skipped: 'SKIPPED', + Failed: 'FAILED', +} as const; + +export type SimulationStatus = + (typeof SimulationStatus)[keyof typeof SimulationStatus]; export type TransactionScanResult = { status: TransactionScanStatus; @@ -39,13 +42,18 @@ export type TransactionScanResult = { simulationStatus: SimulationStatus; }; -export enum SecurityAlertResponse { - Benign = 'Benign', - Warning = 'Warning', - Malicious = 'Malicious', -} +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 enum ScanStatus { - SUCCESS = 'SUCCESS', - ERROR = 'ERROR', -} +export type ScanStatus = (typeof ScanStatus)[keyof typeof ScanStatus]; diff --git a/packages/tron-wallet-snap/src/types/analytics.ts b/packages/tron-wallet-snap/src/types/analytics.ts index 75ad29a8f..f5328d876 100644 --- a/packages/tron-wallet-snap/src/types/analytics.ts +++ b/packages/tron-wallet-snap/src/types/analytics.ts @@ -1,18 +1,24 @@ /** * Enum for transaction tracking event types. */ -export enum TransactionEventType { - TransactionAdded = 'Transaction Added', - TransactionRejected = 'Transaction Rejected', - TransactionApproved = 'Transaction Approved', - TransactionSubmitted = 'Transaction Submitted', - TransactionFinalized = 'Transaction Finalized', -} +export const TransactionEventType = { + TransactionAdded: 'Transaction Added', + TransactionRejected: 'Transaction Rejected', + TransactionApproved: 'Transaction Approved', + TransactionSubmitted: 'Transaction Submitted', + TransactionFinalized: 'Transaction Finalized', +} as const; + +export type TransactionEventType = + (typeof TransactionEventType)[keyof typeof TransactionEventType]; /** * Enum for security alert tracking event types. */ -export enum SecurityEventType { - SecurityAlertDetected = 'Security Alert Detected', - SecurityScanCompleted = 'Security Scan Completed', -} +export const SecurityEventType = { + SecurityAlertDetected: 'Security Alert Detected', + SecurityScanCompleted: 'Security Scan Completed', +} as const; + +export type SecurityEventType = + (typeof SecurityEventType)[keyof typeof SecurityEventType]; diff --git a/packages/tron-wallet-snap/src/types/snap.ts b/packages/tron-wallet-snap/src/types/snap.ts index be822b79d..b454c7eb2 100644 --- a/packages/tron-wallet-snap/src/types/snap.ts +++ b/packages/tron-wallet-snap/src/types/snap.ts @@ -13,13 +13,14 @@ export type Preferences = { useNftDetection: boolean; }; -export enum FetchStatus { - Initial = 'initial', +export const FetchStatus = { + Initial: 'initial', // Loading: Before and during first fetch. - Loading = 'loading', + Loading: 'loading', // Fetching: During 2nd and nth fetch. - Fetching = 'fetching', - Fetched = 'fetched', - // eslint-disable-next-line @typescript-eslint/no-shadow - Error = 'error', -} + Fetching: 'fetching', + Fetched: 'fetched', + Error: 'error', +} as const; + +export type FetchStatus = (typeof FetchStatus)[keyof typeof FetchStatus]; diff --git a/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx b/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx index 7c187d7a6..a2ba7fa27 100644 --- a/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx +++ b/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignMessage/events.tsx @@ -32,10 +32,13 @@ async function onConfirmButtonClick( await snapClient.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]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx b/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx index ea574542e..2cb94223c 100644 --- a/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx +++ b/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmSignTransaction/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await snapClient.resolveInterface(id, true); } -export enum ConfirmSignTransactionFormNames { - Cancel = 'confirm-sign-transaction-cancel', - Confirm = 'confirm-sign-transaction-confirm', -} +export const ConfirmSignTransactionFormNames = { + Cancel: 'confirm-sign-transaction-cancel', + Confirm: 'confirm-sign-transaction-confirm', +} as const; + +export type ConfirmSignTransactionFormNames = + (typeof ConfirmSignTransactionFormNames)[keyof typeof ConfirmSignTransactionFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmTransactionRequest/events.tsx b/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmTransactionRequest/events.tsx index 1ffcf8382..f447fa61c 100644 --- a/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmTransactionRequest/events.tsx +++ b/packages/tron-wallet-snap/src/ui/confirmation/views/ConfirmTransactionRequest/events.tsx @@ -30,10 +30,13 @@ async function onConfirmButtonClick( await snapClient.resolveInterface(id, true); } -export enum ConfirmSignAndSendTransactionFormNames { - Cancel = 'confirm-sign-and-send-transaction-cancel', - Confirm = 'confirm-sign-and-send-transaction-confirm', -} +export const ConfirmSignAndSendTransactionFormNames = { + Cancel: 'confirm-sign-and-send-transaction-cancel', + Confirm: 'confirm-sign-and-send-transaction-confirm', +} as const; + +export type ConfirmSignAndSendTransactionFormNames = + (typeof ConfirmSignAndSendTransactionFormNames)[keyof typeof ConfirmSignAndSendTransactionFormNames]; /** * Create event handlers bound to a SnapClient instance. diff --git a/scripts/create-package/constants.ts b/scripts/create-package/constants.ts index cf8992ee0..dcf79cfc0 100644 --- a/scripts/create-package/constants.ts +++ b/scripts/create-package/constants.ts @@ -1,20 +1,24 @@ /** * The monorepo files that need to be parsed or modified. */ -export enum MonorepoFiles { - PackageJson = 'package.json', - TsConfig = 'tsconfig.json', - TsConfigBuild = 'tsconfig.build.json', -} +export const MonorepoFiles = { + PackageJson: 'package.json', + TsConfig: 'tsconfig.json', + TsConfigBuild: 'tsconfig.build.json', +} as const; + +export type MonorepoFiles = (typeof MonorepoFiles)[keyof typeof MonorepoFiles]; /** * Placeholder values in package template files that need to be replaced with * actual values corresponding to the new package. */ -export enum Placeholders { - CurrentYear = 'CURRENT_YEAR', - NodeVersions = 'NODE_VERSIONS', - PackageName = 'PACKAGE_NAME', - PackageDescription = 'PACKAGE_DESCRIPTION', - PackageDirectoryName = 'PACKAGE_DIRECTORY_NAME', -} +export const Placeholders = { + CurrentYear: 'CURRENT_YEAR', + NodeVersions: 'NODE_VERSIONS', + PackageName: 'PACKAGE_NAME', + PackageDescription: 'PACKAGE_DESCRIPTION', + PackageDirectoryName: 'PACKAGE_DIRECTORY_NAME', +} as const; + +export type Placeholders = (typeof Placeholders)[keyof typeof Placeholders];