;
diff --git a/nym-browser-extension/src/pages/templates/Complete.tsx b/nym-browser-extension/src/pages/templates/Complete.tsx
deleted file mode 100644
index a774516d4c..0000000000
--- a/nym-browser-extension/src/pages/templates/Complete.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-import { Box } from '@mui/material';
-import { Button } from 'src/components/ui';
-import { CenteredLogoLayout } from 'src/layouts';
-
-export const SetupCompleteTemplate = ({
- title,
- description,
- onDone,
-}: {
- title: string;
- description: string;
- onDone: () => void;
-}) => (
-
-
-
- }
- />
-);
diff --git a/nym-browser-extension/src/pages/templates/CreatePassword.tsx b/nym-browser-extension/src/pages/templates/CreatePassword.tsx
deleted file mode 100644
index cb866d545b..0000000000
--- a/nym-browser-extension/src/pages/templates/CreatePassword.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import React from 'react';
-import { FormControlLabel, Checkbox, Stack, Typography, Box } from '@mui/material';
-import { TopLogoLayout } from 'src/layouts/TopLogo';
-import { PasswordInput } from '@nymproject/react/textfields/Password';
-import { PasswordStrength } from '@nymproject/react/password-strength/PasswordStrength';
-import { Button } from 'src/components/ui';
-
-type TCreatePassword = {
- canProceed: boolean;
- password: string;
- confirmPassword: string;
- hasReadTerms: boolean;
- setHasReadTerms: (hasReadTerms: boolean) => void;
- setIsSafePassword: (isSafe: boolean) => void;
- setConfirmPassword: (password: string) => void;
- onNext: () => void;
- setPassword: (password: string) => void;
-};
-
-export const CreatePasswordTemplate = ({
- canProceed,
- onNext,
- password,
- setPassword,
- confirmPassword,
- setIsSafePassword,
- setConfirmPassword,
- setHasReadTerms,
- hasReadTerms,
-}: TCreatePassword) => (
-
- Next
-
- }
- >
-
- setPassword(_password)}
- label="Password"
- />
-
- setIsSafePassword(isSafe)} />
-
-
-
- setConfirmPassword(_password)}
- label="Confirm password"
- />
-
-
- I have read and agree with the Terms of use}
- control={ setHasReadTerms(checked)} />}
- />
-
-);
diff --git a/nym-browser-extension/src/pages/templates/ImportAccount.tsx b/nym-browser-extension/src/pages/templates/ImportAccount.tsx
deleted file mode 100644
index 03a560f7e3..0000000000
--- a/nym-browser-extension/src/pages/templates/ImportAccount.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import React from 'react';
-import { TextField } from '@mui/material';
-import { Button } from 'src/components';
-import { TopLogoLayout } from 'src/layouts';
-
-export const ImportAccountTemplate = ({
- userMnemonic,
- onChangeUserMnemonic,
- onNext,
-}: {
- userMnemonic: string;
- onChangeUserMnemonic: (mnemonic: string) => void;
- onNext: () => void;
-}) => (
-
- Next
-
- }
- >
- onChangeUserMnemonic(e.target.value)}
- multiline
- autoFocus={false}
- fullWidth
- inputProps={{
- style: {
- height: '160px',
- },
- }}
- InputLabelProps={{ shrink: true }}
- sx={{
- 'input::-webkit-textfield-decoration-container': {
- alignItems: 'start',
- },
- }}
- />
-
-);
diff --git a/nym-browser-extension/src/pages/templates/SeedPhrase.tsx b/nym-browser-extension/src/pages/templates/SeedPhrase.tsx
deleted file mode 100644
index f8c47150a8..0000000000
--- a/nym-browser-extension/src/pages/templates/SeedPhrase.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import React, { useRef, useState } from 'react';
-import { Checkbox, FormControlLabel, Stack, TextField, Typography } from '@mui/material';
-import { TopLogoLayout } from 'src/layouts/TopLogo';
-import { Button } from 'src/components/ui';
-import { generateMnemonmic } from 'src/validator-client';
-
-export const SeedPhraseTemplate = ({ onNext }: { onNext: (seedPhrase: string) => void }) => {
- const [isConfirmed, setIsconfirmed] = useState(false);
-
- const seedPhrase = useRef(generateMnemonmic());
-
- return (
- onNext(seedPhrase.current)}
- >
- Next
-
- }
- >
-
-
- Below is your 24 word mnemonic, make sure to store it in a safe place for accessing your wallet in the future
-
-
-
-
- setIsconfirmed(checked)} />}
- />
-
-
- );
-};
diff --git a/nym-browser-extension/src/pages/templates/index.ts b/nym-browser-extension/src/pages/templates/index.ts
deleted file mode 100644
index b7c8c43756..0000000000
--- a/nym-browser-extension/src/pages/templates/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export * from './Complete';
-export * from './CreatePassword';
-export * from './ImportAccount';
-export * from './SeedPhrase';
diff --git a/nym-browser-extension/src/routes/index.tsx b/nym-browser-extension/src/routes/index.tsx
deleted file mode 100644
index a6cd93be4f..0000000000
--- a/nym-browser-extension/src/routes/index.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { BrowserRouter, MemoryRouter, Route, Routes } from 'react-router-dom';
-import { Home } from 'src/pages';
-import { ExtensionStorage } from '@nymproject/extension-storage';
-import { RegisterRoutes } from './register';
-import { UserRoutes } from './user';
-import { LoginRoutes } from './login';
-
-const Router = process.env.NODE_ENV === 'development' ? BrowserRouter : MemoryRouter;
-
-export const AppRoutes = () => {
- const [userHasAccount, setUserHasAccount] = useState(null);
-
- useEffect(() => {
- const checkUserHasAccount = async () => {
- const hasAccount = await ExtensionStorage.exists();
- setUserHasAccount(hasAccount);
- };
-
- checkUserHasAccount();
- }, []);
-
- if (userHasAccount === null) return null;
-
- return (
-
-
- : } />
- } />
- } />
- } />
-
-
- );
-};
diff --git a/nym-browser-extension/src/routes/login/index.tsx b/nym-browser-extension/src/routes/login/index.tsx
deleted file mode 100644
index c61c45c095..0000000000
--- a/nym-browser-extension/src/routes/login/index.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React, { useEffect } from 'react';
-import { Route, Routes, useNavigate } from 'react-router-dom';
-import { useAppContext } from 'src/context';
-import { ForgotPassword, Login } from 'src/pages/auth';
-
-export const LoginRoutes = () => {
- const { client } = useAppContext();
- const navigate = useNavigate();
-
- useEffect(() => {
- let route = '/login';
-
- if (client) {
- route = '/user/balance';
- }
-
- navigate(route);
- }, [client]);
-
- return (
-
- } />
- } />
-
- );
-};
diff --git a/nym-browser-extension/src/routes/register/index.tsx b/nym-browser-extension/src/routes/register/index.tsx
deleted file mode 100644
index 27210900e6..0000000000
--- a/nym-browser-extension/src/routes/register/index.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from 'react';
-import { Route, Routes, useNavigate } from 'react-router-dom';
-import { RegisterContextProvider } from 'src/context/register';
-import { ImportAccount, SeedPhrase, SetupComplete } from 'src/pages/register';
-import { CreatePasswordOnExistingAccount } from 'src/pages/register/CreatePasswordOnExistingAccount';
-import { CreatePasswordOnNewAccount } from 'src/pages/register/CreatePasswordOnNewAccount';
-
-export const RegisterRoutes = () => {
- const navigate = useNavigate();
-
- const handleSetUpComplete = () => {
- navigate('/login');
- };
-
- return (
-
-
- navigate('/register/seed-phrase')} />}
- />
- } />
- } />
- {
- navigate('/register/complete');
- }}
- />
- }
- />
- } />
-
-
- );
-};
diff --git a/nym-browser-extension/src/routes/user/accounts/accounts.tsx b/nym-browser-extension/src/routes/user/accounts/accounts.tsx
deleted file mode 100644
index 63ef6e2abf..0000000000
--- a/nym-browser-extension/src/routes/user/accounts/accounts.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import { Route, Routes } from 'react-router-dom';
-import { RegisterContextProvider } from 'src/context/register';
-import { Accounts, AddAccount, ConfirmPassword, ImportAccount, NameAccount, SetupComplete } from 'src/pages';
-
-export const AccountRoutes = () => (
-
-
- } />
- } />
- } />
- } />
- } />
- } />
-
-
-);
diff --git a/nym-browser-extension/src/routes/user/index.tsx b/nym-browser-extension/src/routes/user/index.tsx
deleted file mode 100644
index 30e9ea1e11..0000000000
--- a/nym-browser-extension/src/routes/user/index.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import React, { useEffect } from 'react';
-import { Route, Routes, useNavigate } from 'react-router-dom';
-import { useAppContext } from 'src/context';
-import { Delegation, BalancePage, Receive, Send, Settings } from 'src/pages';
-import { AccountRoutes } from './accounts/accounts';
-
-export const UserRoutes = () => {
- const { client } = useAppContext();
- const navigate = useNavigate();
-
- useEffect(() => {
- if (!client) navigate('/login');
- }, [client]);
-
- return (
-
- } />
- } />
- } />
- } />
- } />
- } />
-
- );
-};
diff --git a/nym-browser-extension/src/theme/NymBrowserExtensionTheme.tsx b/nym-browser-extension/src/theme/NymBrowserExtensionTheme.tsx
deleted file mode 100644
index dfde09cbc0..0000000000
--- a/nym-browser-extension/src/theme/NymBrowserExtensionTheme.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-import { CssBaseline, PaletteMode } from '@mui/material';
-import { createTheme, ThemeProvider } from '@mui/material/styles';
-import { getDesignTokens } from './theme';
-import '@assets/fonts/non-variable/fonts.css';
-
-type TNymBrowserExtThemeProps = { mode: PaletteMode; children: React.ReactNode };
-
-export const NymBrowserExtThemeWithMode = ({ mode, children }: TNymBrowserExtThemeProps) => {
- const theme = React.useMemo(() => createTheme(getDesignTokens(mode)), [mode]);
-
- return (
-
-
- {children}
-
- );
-};
diff --git a/nym-browser-extension/src/theme/mui-theme.d.ts b/nym-browser-extension/src/theme/mui-theme.d.ts
deleted file mode 100644
index 6145e0d330..0000000000
--- a/nym-browser-extension/src/theme/mui-theme.d.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-/* eslint-disable no-shadow,@typescript-eslint/no-unused-vars,@typescript-eslint/no-empty-interface */
-import { Theme, ThemeOptions, Palette, PaletteOptions } from '@mui/material/styles';
-import { PaletteMode } from '@mui/material';
-
-/**
- * If you are unfamiliar with Material UI theming, please read the following first:
- * - https://mui.com/customization/theming/
- * - https://mui.com/customization/palette/
- * - https://mui.com/customization/dark-mode/#dark-mode-with-custom-palette
- *
- * This file adds typings to the theme using Typescript's module augmentation.
- *
- * Read the following if you are unfamiliar with module augmentation and declaration merging. Then
- * look at the recommendations from Material UI docs for implementation:
- * - https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
- * - https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces
- * - https://mui.com/customization/palette/#adding-new-colors
- *
- *
- * IMPORTANT:
- *
- * The type augmentation must match MUI's definitions. So, notice the use of `interface` rather than
- * `type Foo = { ... }` - this is necessary to merge the definitions.
- */
-
-declare module '@mui/material/styles' {
- /**
- * This interface defines a palette used across Nym for branding
- */
- interface NymPalette {
- background: { light: string; dark: string };
- }
-
- interface NymPaletteVariant {
- mode: PaletteMode;
- }
-
- /**
- * A palette definition only for the Nym Browser Extension that extends the Nym palette
- */
- interface NymBrowserExtPalette {
- nymBrowserExt: NymPaletteVariant;
- }
-
- interface NymPaletteAndNymBrowserExtPalette {
- nym: NymPalette & NymBrowserExtPalette;
- }
-
- type NymPaletteAndNymBrowserExtPaletteOptions = Partial;
-
- /**
- * Add anything not palette related to the theme here
- */
- interface NymTheme {}
-
- /**
- * This augments the definitions of the MUI Theme with the Nym theme, as well as
- * a partial `ThemeOptions` type used by `createTheme`
- *
- * IMPORTANT: only add extensions to the interfaces above, do not modify the lines below
- */
- interface Theme extends NymTheme {}
- interface ThemeOptions extends Partial {}
- interface Palette extends NymPaletteAndNymBrowserExtPalette {}
- interface PaletteOptions extends NymPaletteAndNymBrowserExtPaletteOptions {}
-}
diff --git a/nym-browser-extension/src/theme/theme.ts b/nym-browser-extension/src/theme/theme.ts
deleted file mode 100644
index b4ab3ee20e..0000000000
--- a/nym-browser-extension/src/theme/theme.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-import { PaletteMode } from '@mui/material';
-import {
- PaletteOptions,
- NymPalette,
- NymBrowserExtPalette,
- ThemeOptions,
- createTheme,
- NymPaletteVariant,
-} from '@mui/material/styles';
-
-//-----------------------------------------------------------------------------------------------
-// Nym palette type definitions
-//
-
-/**
- * The Nym palette.
- *
- * IMPORTANT: do not export this constant, always use the MUI `useTheme` hook to get the correct
- * colours for dark/light mode.
- */
-const nymPalette: NymPalette = {
- /** emphasises important elements */
- background: { light: '#F4F6F8', dark: '#1D2125' },
-};
-
-const darkMode: NymPaletteVariant = {
- mode: 'dark',
-};
-
-const lightMode: NymPaletteVariant = {
- mode: 'light',
-};
-
-/**
- * Nym palette specific to the Nym Wallet
- *
- * IMPORTANT: do not export this constant, always use the MUI `useTheme` hook to get the correct
- * colours for dark/light mode.
- */
-const nymBrowserExtPalette = (variant: NymPaletteVariant): NymBrowserExtPalette => ({
- nymBrowserExt: variant,
-});
-
-//-----------------------------------------------------------------------------------------------
-// Nym palettes for light and dark mode
-//
-
-/**
- * Map a Nym palette variant onto the MUI palette
- */
-const variantToMUIPalette = (_: NymPaletteVariant): PaletteOptions => ({
- primary: {
- main: '#6750A4',
- },
-});
-
-/**
- * Returns the Network Explorer palette for light mode.
- */
-const createLightModePalette = (): PaletteOptions => ({
- nym: {
- ...nymPalette,
- ...nymBrowserExtPalette(lightMode),
- },
- ...variantToMUIPalette(lightMode),
-});
-
-/**
- * Returns the Network Explorer palette for dark mode.
- */
-const createDarkModePalette = (): PaletteOptions => ({
- nym: {
- ...nymPalette,
- ...nymBrowserExtPalette(darkMode),
- },
- ...variantToMUIPalette(darkMode),
-});
-
-/**
- * IMPORANT: if you need to get the default MUI theme, use the following
- *
- * import { createTheme as systemCreateTheme } from '@mui/system';
- *
- * // get the MUI system defaults for light mode
- * const systemTheme = systemCreateTheme({ palette: { mode: 'light' } });
- *
- *
- * return {
- * // change `primary` to default MUI `success`
- * primary: {
- * main: systemTheme.palette.success.main,
- * },
- * nym: {
- * ...nymPalette,
- * ...nymWalletPalette,
- * },
- * };
- */
-
-//-----------------------------------------------------------------------------------------------
-// Nym theme overrides
-//
-
-/**
- * Gets the theme options to be passed to `createTheme`.
- *
- * Based on pattern from https://mui.com/customization/dark-mode/#dark-mode-with-custom-palette.
- *
- * @param mode The theme mode: 'light' or 'dark'
- */
-export const getDesignTokens = (mode: PaletteMode): ThemeOptions => {
- // first, create the palette from user's choice of light or dark mode
- const { palette } = createTheme({
- palette: {
- mode,
- ...(mode === 'light' ? createLightModePalette() : createDarkModePalette()),
- },
- });
-
- // then customise theme and components
- return {
- typography: {
- fontFamily: [
- 'Open Sans',
- 'sans-serif',
- 'BlinkMacSystemFont',
- 'Roboto',
- 'Oxygen',
- 'Ubuntu',
- 'Helvetica Neue',
- ].join(','),
- },
- shape: {
- borderRadius: 8,
- },
- palette,
- };
-};
diff --git a/nym-browser-extension/src/types/global.ts b/nym-browser-extension/src/types/global.ts
deleted file mode 100644
index 370aa18e22..0000000000
--- a/nym-browser-extension/src/types/global.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export declare namespace NodeJS {
- interface ProcessEnv {
- development: string;
- }
-}
diff --git a/nym-browser-extension/src/types/index.ts b/nym-browser-extension/src/types/index.ts
deleted file mode 100644
index cbb355622f..0000000000
--- a/nym-browser-extension/src/types/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './tx';
diff --git a/nym-browser-extension/src/types/tx.ts b/nym-browser-extension/src/types/tx.ts
deleted file mode 100644
index afe264e119..0000000000
--- a/nym-browser-extension/src/types/tx.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-// TODO Add other transaction types later
-type TTransactionType = 'send';
-
-export type TTransaction = {
- type: TTransactionType;
- txHash?: string;
- status: 'loading' | 'success' | 'error';
- message?: string;
-};
diff --git a/nym-browser-extension/src/typings/jpeg.d.ts b/nym-browser-extension/src/typings/jpeg.d.ts
deleted file mode 100644
index cfe3695fd5..0000000000
--- a/nym-browser-extension/src/typings/jpeg.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.jpeg' {
- const value: any;
- export default value;
-}
diff --git a/nym-browser-extension/src/typings/json.d.ts b/nym-browser-extension/src/typings/json.d.ts
deleted file mode 100644
index b72dd46ee5..0000000000
--- a/nym-browser-extension/src/typings/json.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.json' {
- const content: any;
- export default content;
-}
diff --git a/nym-browser-extension/src/typings/png.d.ts b/nym-browser-extension/src/typings/png.d.ts
deleted file mode 100644
index dd84df40a4..0000000000
--- a/nym-browser-extension/src/typings/png.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.png' {
- const content: any;
- export default content;
-}
diff --git a/nym-browser-extension/src/typings/svg.d.ts b/nym-browser-extension/src/typings/svg.d.ts
deleted file mode 100644
index 091d25e210..0000000000
--- a/nym-browser-extension/src/typings/svg.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.svg' {
- const content: any;
- export default content;
-}
diff --git a/nym-browser-extension/src/urls/index.ts b/nym-browser-extension/src/urls/index.ts
deleted file mode 100644
index 10ab2d6aab..0000000000
--- a/nym-browser-extension/src/urls/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export const blockExplorerUrl = process.env.BLOCK_EXPLORER_URL;
-export const coinGeckoPriceAPI = 'https://api.coingecko.com/api/v3/simple/price?';
diff --git a/nym-browser-extension/src/utils/coin.ts b/nym-browser-extension/src/utils/coin.ts
deleted file mode 100644
index 6b46d9b56e..0000000000
--- a/nym-browser-extension/src/utils/coin.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import Big from 'big.js';
-
-export const unymToNym = (unym: number | Big, dp = 4) => {
- let nym;
- try {
- nym = Big(unym).div(1_000_000).toFixed(dp);
- } catch (e: any) {
- console.warn(`${unym} not a valid decimal number: ${e}`);
- }
- return Number(nym);
-};
-
-export const nymToUnym = (nym: number) => {
- let unym;
- try {
- unym = Big(nym).mul(1_000_000);
- } catch (e: any) {
- console.warn(`unable to convert nym to unym: ${e}`);
- }
- return Number(unym);
-};
diff --git a/nym-browser-extension/src/utils/crypto.ts b/nym-browser-extension/src/utils/crypto.ts
deleted file mode 100644
index 122149ac60..0000000000
--- a/nym-browser-extension/src/utils/crypto.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import cryptojs from 'crypto-js';
-
-const encrypt = (mnemonic: string, password: string) => cryptojs.AES.encrypt(mnemonic, password).toString();
-
-const decrypt = (cipher: string, password: string) =>
- cryptojs.AES.decrypt(cipher, password).toString(cryptojs.enc.Utf8);
-
-export { encrypt, decrypt };
diff --git a/nym-browser-extension/src/utils/fee.ts b/nym-browser-extension/src/utils/fee.ts
deleted file mode 100644
index 7357c6181f..0000000000
--- a/nym-browser-extension/src/utils/fee.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export const createFeeObject = (feeInUnyms?: number) => {
- if (!feeInUnyms) return undefined;
-
- return {
- amount: [{ amount: feeInUnyms.toString(), denom: 'unym' }],
- gas: '100000',
- };
-};
diff --git a/nym-browser-extension/src/utils/price.ts b/nym-browser-extension/src/utils/price.ts
deleted file mode 100644
index 8f38ca18db..0000000000
--- a/nym-browser-extension/src/utils/price.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { coinGeckoPriceAPI } from 'src/urls';
-
-export type Currency = 'gbp' | 'usd';
-export type TokenId = 'nym';
-
-type ResponseMap = { [token in T]: { [currency in C]: number } };
-
-const constructUrl = (tokenId: TokenId, currency: Currency) =>
- `${coinGeckoPriceAPI}ids=${tokenId}&vs_currencies=${currency}`;
-
-export async function getTokenPrice(
- tokenId: T,
- currency: C,
-): Promise> {
- const response = await fetch(constructUrl(tokenId, currency));
- const json = await response.json();
- return json;
-}
diff --git a/nym-browser-extension/src/validator-client/index.tsx b/nym-browser-extension/src/validator-client/index.tsx
deleted file mode 100644
index 0e007e3c26..0000000000
--- a/nym-browser-extension/src/validator-client/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import ValidatorClient from '@nymproject/nym-validator-client';
-import { config } from 'src/config';
-
-export const generateMnemonmic = () => ValidatorClient.randomMnemonic();
-
-export const connectToValidator = async (mnemonic: string) =>
- ValidatorClient.connect(
- mnemonic,
- config.rpcUrl,
- config.validatorUrl,
- config.prefix,
- config.mixnetContractAddress,
- config.vestingContractAddress,
- config.denom,
- );
diff --git a/nym-browser-extension/storage/.gitignore b/nym-browser-extension/storage/.gitignore
index 39e6cafa5c..821d2e38f2 100644
--- a/nym-browser-extension/storage/.gitignore
+++ b/nym-browser-extension/storage/.gitignore
@@ -1,2 +1,36 @@
pkg
-target
\ No newline at end of file
+target
+Cargo.lock
+
+*.wasm
+*.js
+*.ts
+*.d.ts
+
+.vscode/
+.idea/
+*.swp
+*.swo
+*~
+
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+node_modules/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+
+internal-dev/wasm/
\ No newline at end of file
diff --git a/nym-browser-extension/storage/Cargo.toml b/nym-browser-extension/storage/Cargo.toml
index f36511e735..ec61e945b8 100644
--- a/nym-browser-extension/storage/Cargo.toml
+++ b/nym-browser-extension/storage/Cargo.toml
@@ -1,9 +1,11 @@
[package]
name = "extension-storage"
-version = "1.3.0-rc.0"
-edition = "2021"
+version = "1.4.0-rc.0"
+edition = "2024"
license = "Apache-2.0"
repository = "https://github.com/nymtech/nym"
+description = "WebAssembly-based secure storage for browser extension mnemonics"
+authors = ["Nym Technologies SA "]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -11,15 +13,17 @@ repository = "https://github.com/nymtech/nym"
crate-type = ["cdylib", "rlib"]
[dependencies]
-bip39 = { workspace = true }
-js-sys = { workspace = true }
-serde-wasm-bindgen = { workspace = true }
-thiserror = { workspace = true }
-wasm-bindgen = { workspace = true }
-wasm-bindgen-futures = { workspace = true }
-zeroize = { workspace = true }
+bip39 = { workspace = true }
+zeroize = { workspace = true }
-console_error_panic_hook = { workspace = true, optional = true }
+js-sys = { workspace = true }
+wasm-bindgen = { workspace = true }
+wasm-bindgen-futures = { workspace = true }
+serde-wasm-bindgen = { workspace = true }
+
+thiserror = { workspace = true }
+
+console_error_panic_hook = { workspace = true, optional = true }
wasm-utils = { path = "../../common/wasm/utils" }
wasm-storage = { path = "../../common/wasm/storage" }
diff --git a/nym-browser-extension/storage/Makefile b/nym-browser-extension/storage/Makefile
index 80be2ad9da..137652b242 100644
--- a/nym-browser-extension/storage/Makefile
+++ b/nym-browser-extension/storage/Makefile
@@ -1,2 +1,65 @@
+# Nym Extension Storage - Build Configuration
+#
+# This Makefile helps build the WebAssembly storage component
+# and run development examples.
+
wasm-pack:
- wasm-pack build --scope nymproject --out-dir ../../dist/wasm/extension-storage
+ @echo "๐จ Building WebAssembly package..."
+ unset RUSTC_WRAPPER && wasm-pack build --target web --scope nymproject --out-dir ../../dist/wasm/extension-storage
+ @echo "โ Build complete! Output in ../../dist/wasm/extension-storage"
+
+wasm-pack-dev:
+ @echo "๐จ Building WebAssembly package (development mode)..."
+ unset RUSTC_WRAPPER && wasm-pack build --dev --target web --scope nymproject --out-dir ../../dist/wasm/extension-storage
+ @echo "โ Development build complete!"
+
+
+copy-wasm-to-demo:
+ @echo "๐ Copying WASM files to demo directory..."
+ @mkdir -p internal-dev/wasm
+ @cp ../../dist/wasm/extension-storage/extension_storage.js internal-dev/wasm/
+ @cp ../../dist/wasm/extension-storage/extension_storage_bg.wasm internal-dev/wasm/
+ @cp ../../dist/wasm/extension-storage/extension_storage.d.ts internal-dev/wasm/
+ @echo "โ WASM files copied to internal-dev/wasm/"
+
+
+clean:
+ @echo "๐งน Cleaning build artifacts..."
+ cargo clean
+ rm -rf ../../dist/wasm/extension-storage
+ rm -rf pkg
+ rm -rf internal-dev/wasm
+ @echo "โ Clean complete!"
+
+demo: wasm-pack-dev copy-wasm-to-demo
+ cd internal-dev && node serve.js
+
+
+check-deps:
+ @echo "๐ Checking dependencies..."
+ @command -v cargo >/dev/null 2>&1 || { echo "โ cargo is required but not installed. Please install Rust."; exit 1; }
+ @command -v wasm-pack >/dev/null 2>&1 || { echo "โ wasm-pack is required but not installed. Run: cargo install wasm-pack"; exit 1; }
+ @echo "โ All dependencies are installed!"
+
+help:
+ @echo "Nym Extension Storage Build Commands:"
+ @echo ""
+ @echo "๐ฆ Building:"
+ @echo " make wasm-pack - Build optimized WASM package for production"
+ @echo " make wasm-pack-dev - Build WASM package with debug symbols"
+ @echo " make copy-wasm-to-demo - Copy WASM files to demo directory"
+ @echo ""
+ @echo "๐งช Development:"
+ @echo " make demo - Build and serve the interactive demo (Node.js)"
+ @echo " make check-deps - Verify all required tools are installed"
+ @echo ""
+ @echo "๐งน Maintenance:"
+ @echo " make clean - Remove all build artifacts"
+ @echo " make help - Show this help message"
+ @echo ""
+ @echo "๐ก Quick start: make demo"
+
+
+.DEFAULT_GOAL := help
+
+.PHONY: wasm-pack wasm-pack-dev copy-wasm-to-demo clean demo check-deps help
diff --git a/nym-browser-extension/storage/internal-dev/index.html b/nym-browser-extension/storage/internal-dev/index.html
new file mode 100644
index 0000000000..bcbf4bbd53
--- /dev/null
+++ b/nym-browser-extension/storage/internal-dev/index.html
@@ -0,0 +1,161 @@
+
+
+
+
+
+ Nym Extension Storage - Demo
+
+
+
+
+
๐ Nym Extension Storage Demo
+
+
+ โ ๏ธ Demo Environment
+ This is a development demo. The mnemonics used here are for testing only and should never be used in production.
+
+
+
+ ๐ How to use this demo:
+ 1. Open your browser's developer console (F12)
+ 2. The demo will run automatically when the page loads
+ 3. You can also use the interactive functions shown below
+ 4. Check the IndexedDB in your browser's dev tools to see stored data
+
+
+
+ โ What this demo shows:
+ โข Creating encrypted storage instances
+ โข Storing and retrieving BIP39 mnemonics
+ โข Managing multiple wallets
+ โข Error handling for invalid data
+ โข Cleaning up stored data
+
Rust/WASM - Core storage logic compiled to WebAssembly
+
IndexedDB - Browser-native persistent storage
+
AES Encryption - Password-based encryption for sensitive data
+
BIP39 Validation - Ensures mnemonic phrases are valid
+
+
+
+ ๐ Security Notes:
+ โข All data is encrypted with your password before storage
+ โข Mnemonics are validated against BIP39 standards
+ โข Sensitive data is zeroed from memory when no longer needed
+ โข Storage is isolated per browser origin
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nym-browser-extension/storage/internal-dev/index.js b/nym-browser-extension/storage/internal-dev/index.js
index ab69f6e686..86e2ea016f 100644
--- a/nym-browser-extension/storage/internal-dev/index.js
+++ b/nym-browser-extension/storage/internal-dev/index.js
@@ -1,73 +1,303 @@
+/**
+ * Nym Extension Storage - Internal Development Example
+ *
+ * This file demonstrates how to use the ExtensionStorage WASM module
+ * for securely storing and managing BIP39 mnemonics in browser extensions.
+ *
+ * To run this example:
+ * 1. Build the WASM module: `cd .. && make wasm-pack`
+ * 2. Serve this directory: `python3 -m http.server 8000`
+ * 3. Open http://localhost:8000 in your browser
+ * 4. Open the browser's developer console to see the output
+ */
-import {
+import init, {
ExtensionStorage,
set_panic_hook
-} from "@nymproject/storage-extension"
+} from "./wasm/extension_storage.js"
-// // current limitation of rust-wasm for async stuff : (
-// let client = null
+/**
+ * Test mnemonics for demonstration
+ * Note: These are for testing only - never use these in production!
+ */
+const TEST_MNEMONICS = {
+ valid: {
+ wallet1: "figure aspect pill salute review sponsor army city muffin engine army kid rival chunk unit insect blouse paddle velvet shallow box crawl grace never",
+ wallet2: "salmon picture danger pill tomato hour hand chaos tray bargain frequent fuel scheme coil divert season lucky ginger mom stem mistake blanket lake suffer",
+ wallet3: "cat quiz circle letter trade unhappy quarter garlic sting gravity zone stock scatter merge account barrel forward fame club chest camp under crop connect",
+ wallet4: "mammal fashion rice two marble high brain achieve first harsh infant timber flush cloud hunt address brand immune tip identify aspect call beyond once"
+ },
+ invalid: "this is not a valid mnemonic phrase"
+};
-async function main() {
- // // sets up better stack traces in case of in-rust panics
- set_panic_hook();
+const STORAGE_PASSWORD = "my-super-secure-password-123";
- let storage = await new ExtensionStorage("my super duper password");
-
- const goodMnemonic = "figure aspect pill salute review sponsor army city muffin engine army kid rival chunk unit insect blouse paddle velvet shallow box crawl grace never"
- const badMnemonic = "foomp"
-
- let readEmpty = await storage.read_mnemonic("my-mnemonic1")
- console.log("value initial:", readEmpty);
-
- try {
- await storage.store_mnemonic("my-mnemonic1", badMnemonic);
- } catch (e) {
- console.log("store error: ",e)
+/**
+ * Helper function to log results with better formatting
+ */
+function logResult(operation, result, error = null) {
+ const timestamp = new Date().toISOString();
+ console.group(`๐ [${timestamp}] ${operation}`);
+
+ if (error) {
+ console.error("โ Error:", error);
+ } else {
+ console.log("โ Result:", result);
}
-
- let anotherRead = await storage.read_mnemonic("my-mnemonic1")
- console.log("value bad store:", anotherRead);
-
- await storage.store_mnemonic("my-mnemonic1", goodMnemonic)
-
- let yetAnotherRead = await storage.read_mnemonic("my-mnemonic1")
- console.log("value good store:", yetAnotherRead);
-
- await storage.remove_mnemonic("my-mnemonic1")
-
- let finalRead = await storage.read_mnemonic("my-mnemonic1")
- console.log("value removed:", finalRead);
-
- const anotherMnemonic = "salmon picture danger pill tomato hour hand chaos tray bargain frequent fuel scheme coil divert season lucky ginger mom stem mistake blanket lake suffer";
- const oneMore = "cat quiz circle letter trade unhappy quarter garlic sting gravity zone stock scatter merge account barrel forward fame club chest camp under crop connect"
-
- const key1 = "my-amazing-mnemonic"
- const key2 = "my-other-mnemonic"
-
- await storage.store_mnemonic(key1, anotherMnemonic)
- await storage.store_mnemonic(key2, oneMore)
-
- let allKeys = await storage.get_all_mnemonic_keys()
- console.log("keys:", allKeys)
-
- const anotherOne = "mammal fashion rice two marble high brain achieve first harsh infant timber flush cloud hunt address brand immune tip identify aspect call beyond once"
- const anotherKey = "some-mnemonic"
-
- let isPresent = await storage.has_mnemonic(anotherKey);
- console.log("has mnemonic: ", isPresent)
-
- await storage.store_mnemonic(anotherKey, anotherOne)
-
- let isPresentNew = await storage.has_mnemonic(anotherKey);
- console.log("has mnemonic: ", isPresentNew)
-
- await storage.remove_mnemonic(anotherKey)
-
- let isPresentEvenNewer = await storage.has_mnemonic(anotherKey);
- console.log("has mnemonic: ", isPresentEvenNewer)
-
+
+ console.groupEnd();
}
+/**
+ * Test basic storage operations
+ */
+async function testBasicOperations(storage) {
+ console.log("\n๐ฆ Testing Basic Storage Operations");
+ console.log("=" .repeat(50));
-// Let's get started!
-main();
\ No newline at end of file
+ // Test storing a valid mnemonic
+ try {
+ await storage.store_mnemonic("test-wallet", TEST_MNEMONICS.valid.wallet1);
+ logResult("Store valid mnemonic", "Successfully stored");
+ } catch (error) {
+ logResult("Store valid mnemonic", null, error);
+ }
+
+ // Test reading the stored mnemonic
+ try {
+ const result = await storage.read_mnemonic("test-wallet");
+ logResult("Read stored mnemonic", result);
+ } catch (error) {
+ logResult("Read stored mnemonic", null, error);
+ }
+
+ // Test reading a non-existent mnemonic
+ try {
+ const result = await storage.read_mnemonic("non-existent");
+ logResult("Read non-existent mnemonic", result);
+ } catch (error) {
+ logResult("Read non-existent mnemonic", null, error);
+ }
+
+ // Test storing an invalid mnemonic
+ try {
+ await storage.store_mnemonic("invalid-wallet", TEST_MNEMONICS.invalid);
+ logResult("Store invalid mnemonic", "Should not reach here");
+ } catch (error) {
+ logResult("Store invalid mnemonic", null, error.toString());
+ }
+
+ // Clean up
+ try {
+ await storage.remove_mnemonic("test-wallet");
+ logResult("Remove test wallet", "Successfully removed");
+ } catch (error) {
+ logResult("Remove test wallet", null, error);
+ }
+}
+
+/**
+ * Test multiple wallet management
+ */
+async function testMultipleWallets(storage) {
+ console.log("\n๐ฅ Testing Multiple Wallet Management");
+ console.log("=" .repeat(50));
+
+ // Store multiple wallets
+ const walletNames = Object.keys(TEST_MNEMONICS.valid);
+ const walletMnemonics = Object.values(TEST_MNEMONICS.valid);
+
+ for (let i = 0; i < walletNames.length; i++) {
+ try {
+ await storage.store_mnemonic(walletNames[i], walletMnemonics[i]);
+ logResult(`Store wallet: ${walletNames[i]}`, "Success");
+ } catch (error) {
+ logResult(`Store wallet: ${walletNames[i]}`, null, error);
+ }
+ }
+
+ // Get all wallet keys
+ try {
+ const allKeys = await storage.get_all_mnemonic_keys();
+ logResult("Get all wallet keys", allKeys);
+ } catch (error) {
+ logResult("Get all wallet keys", null, error);
+ }
+
+ // Check if specific wallets exist
+ for (const walletName of walletNames) {
+ try {
+ const exists = await storage.has_mnemonic(walletName);
+ logResult(`Check wallet exists: ${walletName}`, exists);
+ } catch (error) {
+ logResult(`Check wallet exists: ${walletName}`, null, error);
+ }
+ }
+
+ // Read each wallet
+ for (const walletName of walletNames) {
+ try {
+ const mnemonic = await storage.read_mnemonic(walletName);
+ logResult(`Read wallet: ${walletName}`, `${mnemonic.substring(0, 20)}...`);
+ } catch (error) {
+ logResult(`Read wallet: ${walletName}`, null, error);
+ }
+ }
+}
+
+/**
+ * Test wallet removal and cleanup
+ */
+async function testWalletRemoval(storage) {
+ console.log("\n๐๏ธ Testing Wallet Removal");
+ console.log("=" .repeat(50));
+
+ const walletNames = Object.keys(TEST_MNEMONICS.valid);
+
+ // Remove wallets one by one
+ for (const walletName of walletNames) {
+ try {
+ await storage.remove_mnemonic(walletName);
+ logResult(`Remove wallet: ${walletName}`, "Success");
+ } catch (error) {
+ logResult(`Remove wallet: ${walletName}`, null, error);
+ }
+
+ // Verify removal
+ try {
+ const exists = await storage.has_mnemonic(walletName);
+ logResult(`Verify removal: ${walletName}`, `Exists: ${exists}`);
+ } catch (error) {
+ logResult(`Verify removal: ${walletName}`, null, error);
+ }
+ }
+
+ // Check final state
+ try {
+ const allKeys = await storage.get_all_mnemonic_keys();
+ logResult("Final wallet count", `${allKeys.length} wallets remaining`);
+ } catch (error) {
+ logResult("Final wallet count", null, error);
+ }
+}
+
+/**
+ * Test storage existence check
+ */
+async function testStorageExistence() {
+ console.log("\n๐พ Testing Storage Existence");
+ console.log("=" .repeat(50));
+
+ try {
+ const exists = await ExtensionStorage.exists();
+ logResult("Storage database exists", exists);
+ } catch (error) {
+ logResult("Storage database exists", null, error);
+ }
+}
+
+/**
+ * Main demonstration function
+ */
+async function runDemo() {
+ console.log("๐ Nym Extension Storage Demo");
+ console.log("=" .repeat(60));
+ console.log("This demo shows how to use the ExtensionStorage WASM module");
+ console.log("Check the browser console for detailed output\n");
+
+ try {
+ // Initialize the WASM module
+ console.log("๐ง Initializing WASM module...");
+ await init();
+ console.log("โ WASM module initialized successfully\n");
+
+ // Set up better stack traces for Rust panics
+ set_panic_hook();
+ } catch (error) {
+ console.error("๐ฅ Failed to initialize WASM module:", error);
+ return;
+ }
+
+ // Test storage existence before creating instance
+ await testStorageExistence();
+
+ try {
+ // Create storage instance with password
+ console.log("๐ Creating storage instance with password...");
+ const storage = await new ExtensionStorage(STORAGE_PASSWORD);
+ console.log("โ Storage instance created successfully\n");
+
+ // Run all tests
+ await testBasicOperations(storage);
+ await testMultipleWallets(storage);
+ await testWalletRemoval(storage);
+
+ // Test storage existence after operations
+ await testStorageExistence();
+
+ console.log("\n๐ Demo completed successfully!");
+ console.log("Check the IndexedDB in your browser's developer tools to see the stored data.");
+
+ } catch (error) {
+ console.error("๐ฅ Fatal error during demo:", error);
+ }
+}
+
+/**
+ * Additional utility functions for interactive testing
+ */
+window.nymStorageDemo = {
+ /**
+ * Create a new storage instance for manual testing
+ */
+ async createStorage(password = STORAGE_PASSWORD) {
+ try {
+ await init();
+ set_panic_hook();
+ return await new ExtensionStorage(password);
+ } catch (error) {
+ console.error("Failed to initialize WASM or create storage:", error);
+ throw error;
+ }
+ },
+
+ /**
+ * Quick test with a storage instance
+ */
+ async quickTest(storage, name = "test", mnemonic = TEST_MNEMONICS.valid.wallet1) {
+ console.log(`Testing with wallet: ${name}`);
+
+ await storage.store_mnemonic(name, mnemonic);
+ console.log("โ Stored");
+
+ const retrieved = await storage.read_mnemonic(name);
+ console.log("โ Retrieved:", retrieved);
+
+ const exists = await storage.has_mnemonic(name);
+ console.log("โ Exists:", exists);
+
+ await storage.remove_mnemonic(name);
+ console.log("โ Removed");
+
+ return "Test completed";
+ },
+
+ /**
+ * Available test mnemonics
+ */
+ mnemonics: TEST_MNEMONICS
+};
+
+// Start the demo when the page loads
+document.addEventListener('DOMContentLoaded', () => {
+ console.log("๐ Interactive Demo Functions Available:");
+ console.log("- window.nymStorageDemo.createStorage() - Create storage instance");
+ console.log("- window.nymStorageDemo.quickTest(storage) - Run quick test");
+ console.log("- window.nymStorageDemo.mnemonics - Test mnemonic phrases");
+ console.log("\nStarting automated demo...\n");
+
+ runDemo();
+});
+
+// Export for module usage
+export { runDemo, TEST_MNEMONICS, STORAGE_PASSWORD };
\ No newline at end of file
diff --git a/nym-browser-extension/storage/src/storage.rs b/nym-browser-extension/storage/src/storage.rs
index 190105816a..ba484f46aa 100644
--- a/nym-browser-extension/storage/src/storage.rs
+++ b/nym-browser-extension/storage/src/storage.rs
@@ -18,7 +18,7 @@ use wasm_utils::check_promise_result;
use wasm_utils::error::{PromisableResult, PromisableResultError};
use zeroize::Zeroizing;
-const STORAGE_NAME: &str = "nym-wallet-extension";
+const STORAGE_NAME: &str = "nym-extension-storage";
const STORAGE_VERSION: u32 = 1;
// v1 tables
diff --git a/nym-browser-extension/tsconfig.eslint.json b/nym-browser-extension/tsconfig.eslint.json
deleted file mode 100644
index d1da615e58..0000000000
--- a/nym-browser-extension/tsconfig.eslint.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "jsx": "react-jsx",
- "noEmit": true
- },
- "include": [
- ".storybook/*.js",
- "webpack.*.js",
- "src/**/*.js",
- "src/**/*.jsx",
- "src/**/*.ts",
- "src/**/*.tsx",
- "src/**/*.stories.*"
- ],
- "exclude": ["node_modules", "dist"]
-}
diff --git a/nym-browser-extension/tsconfig.json b/nym-browser-extension/tsconfig.json
deleted file mode 100644
index 213619ac53..0000000000
--- a/nym-browser-extension/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- "noFallthroughCasesInSwitch": true,
- "skipLibCheck": true,
- "module": "esnext",
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": false,
- "jsx": "react-jsx",
- "sourceMap": true,
- "baseUrl": ".",
- "paths": {
- "@assets/*": ["../assets/*"]
- },
- "noEmit": true
- },
- "exclude": [
- "node_modules",
- "dist",
- "jest.config.js",
- "webpack.config.js",
- "webpack.prod.js",
- "webpack.common.js",
- "tsconfig.json"
- ]
-}
diff --git a/nym-browser-extension/webpack.common.js b/nym-browser-extension/webpack.common.js
deleted file mode 100644
index 3ca6344af8..0000000000
--- a/nym-browser-extension/webpack.common.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const path = require('path');
-const { mergeWithRules } = require('webpack-merge');
-const { webpackCommon } = require('@nymproject/webpack');
-
-module.exports = mergeWithRules({
- module: {
- rules: {
- test: 'match',
- use: 'replace',
- },
- },
-})(webpackCommon(__dirname), {
- entry: path.resolve(__dirname, 'src/index.tsx'),
- output: {
- clean: true,
- path: path.resolve(__dirname, 'dist'),
- publicPath: '/',
- },
- resolve: {
- fallback: {
- crypto: 'crypto-browserify',
- stream: 'stream-browserify',
- },
- },
- experiments: { asyncWebAssembly: true },
-});
diff --git a/nym-browser-extension/webpack.dev.js b/nym-browser-extension/webpack.dev.js
deleted file mode 100644
index 4554968e15..0000000000
--- a/nym-browser-extension/webpack.dev.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const { mergeWithRules } = require('webpack-merge');
-const webpack = require('webpack');
-const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
-const ReactRefreshTypeScript = require('react-refresh-typescript');
-const Dotenv = require('dotenv-webpack');
-const commonConfig = require('./webpack.common');
-
-module.exports = mergeWithRules({
- module: {
- rules: {
- test: 'match',
- use: 'replace',
- },
- },
-})(commonConfig, {
- mode: 'development',
- devtool: 'inline-source-map',
- module: {
- rules: [
- {
- test: /\.tsx?$/,
- use: 'ts-loader',
- exclude: /node_modules/,
- options: {
- getCustomTransformers: () => ({
- before: [ReactRefreshTypeScript()],
- }),
- // `ts-loader` does not work with HMR unless `transpileOnly` is used.
- // If you need type checking, `ForkTsCheckerWebpackPlugin` is an alternative.
- transpileOnly: true,
- },
- },
- ],
- },
- plugins: [
- new ReactRefreshWebpackPlugin(),
-
- // this can be included automatically by the dev server, however build mode fails if missing
- new webpack.HotModuleReplacementPlugin(),
- new Dotenv({ path: './env.dev' }),
- ],
-
- // recommended for faster rebuild
- optimization: {
- runtimeChunk: true,
- removeAvailableModules: false,
- removeEmptyChunks: false,
- splitChunks: false,
- },
-
- cache: {
- type: 'filesystem',
- buildDependencies: {
- // restart on config change
- config: ['./webpack.dev.js'],
- },
- },
-
- devServer: {
- port: 9000,
- compress: true,
- historyApiFallback: true,
- hot: true,
- client: {
- overlay: false,
- },
- },
-});
diff --git a/nym-browser-extension/webpack.prod.js b/nym-browser-extension/webpack.prod.js
deleted file mode 100644
index 359dc9f9a5..0000000000
--- a/nym-browser-extension/webpack.prod.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const path = require('path');
-const { default: merge } = require('webpack-merge');
-const common = require('./webpack.common');
-const CopyPlugin = require('copy-webpack-plugin');
-const Dotenv = require('dotenv-webpack');
-
-module.exports = merge(common, {
- mode: 'production',
- entry: path.resolve(__dirname, 'src/index.tsx'),
- plugins: [
- new CopyPlugin({
- patterns: [
- {
- from: './src/manifest.json',
- to: './',
- },
- ],
- }),
- new Dotenv({ path: './.env' }),
- ],
-});