Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
f7aef19
feat: init the authenticator
vvava Aug 16, 2025
02528b8
Merge branch 'main' into feat/CP-11530_seedless-recovery-methods
vvava Aug 18, 2025
5b6f11b
feat: add card
vvava Aug 25, 2025
3743617
Merge branch 'main' into feat/CP-11530_seedless-recovery-methods
vvava Aug 25, 2025
4640cad
fix: providers order
vvava Aug 25, 2025
aab20b5
feat: add methods list, methods and details screen
vvava Aug 27, 2025
9b038b1
chore: general cleanup
vvava Aug 27, 2025
231673c
feaT: add fullscreen method placeholder
vvava Aug 29, 2025
f1c8b4d
Merge branch 'main' into feat/CP-11530_seedless-recovery-methods
vvava Aug 29, 2025
165b318
feat: functionality
vvava Sep 5, 2025
52904d1
feat: the recovery method management flow
vvava Sep 11, 2025
d24a3d5
refactor: remove logs and add title
vvava Sep 11, 2025
e41a726
Merge branch 'main' into feat/CP-11530_seedless-recovery-methods
vvava Sep 11, 2025
46734e2
chore: localization
vvava Sep 11, 2025
1b7df97
chore: remoce logs
vvava Sep 12, 2025
fd60b1c
refactor: loading states fullscreen back
vvava Sep 12, 2025
75dfd57
chore: remove unused component and log
vvava Sep 12, 2025
0050344
feat: add confirm pages
vvava Sep 12, 2025
7051349
chore: translation
vvava Sep 12, 2025
0232170
fix: mfa loading
vvava Sep 12, 2025
ce82f1d
fix: typecheck
vvava Sep 12, 2025
6a0ba1c
Merge branch 'main' into feat/CP-11530_seedless-recovery-methods
vvava Sep 22, 2025
c9731a1
refactor: code reorganization
vvava Sep 24, 2025
e21b543
feat: handle feature flag changes
vvava Sep 25, 2025
7f76dc5
Merge branch 'main' into feat/CP-11530_seedless-recovery-methods
vvava Sep 25, 2025
0cec531
chore: localization
vvava Sep 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions apps/next/src/localization/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,17 @@
"Accounts updated": "Accounts updated",
"Action was not approved. Please try again.": "Action was not approved. Please try again.",
"Activity": "Activity",
"Add Authenticator": "Add Authenticator",
"Add Avalanche C-Chain Address": "Add Avalanche C-Chain Address",
"Add Avalanche X/P-Chain Address": "Add Avalanche X/P-Chain Address",
"Add Bitcoin Address": "Add Bitcoin Address",
"Add Custom Token": "Add Custom Token",
"Add Passkey": "Add Passkey",
"Add RPC URL": "Add RPC URL",
"Add Solana": "Add Solana",
"Add Solana Address": "Add Solana Address",
"Add Token": "Add Token",
"Add Yubikey": "Add Yubikey",
"Add a display name for your wallet. You can change it at any time in the settings.": "Add a display name for your wallet. You can change it at any time in the settings.",
"Add a name so that it is easier to find later.": "Add a name so that it is easier to find later.",
"Add an account or connect a wallet": "Add an account or connect a wallet",
Expand All @@ -44,6 +47,7 @@
"Add next": "Add next",
"Add optional recovery methods": "Add optional recovery methods",
"Add optional recovery methods to securely restore access in case you lose your credentials.": "Add optional recovery methods to securely restore access in case you lose your credentials.",
"Add recovery method": "Add recovery method",
"Add token name": "Add token name",
"Add token symbol": "Add token symbol",
"Add using Keystone": "Add using Keystone",
Expand All @@ -67,16 +71,20 @@
"Approves all {{token}}": "Approves all {{token}}",
"Approving will give this dApp access to your active account.": "Approving will give this dApp access to your active account.",
"Are you sure that you want to cancel this request?": "Are you sure that you want to cancel this request?",
"Are you sure you want to change the authenticator?": "Are you sure you want to change the authenticator?",
"Are you sure you want to delete selected accounts?": "Are you sure you want to delete selected accounts?",
"Are you sure you want to delete this contact?": "Are you sure you want to delete this contact?",
"Are you sure you want to delete this network?": "Are you sure you want to delete this network?",
"Are you sure you want to delete {{name}} account?": "Are you sure you want to delete {{name}} account?",
"Are you sure you want to remove this recovery method?": "Are you sure you want to remove this recovery method?",
"Are you sure you want to reset the RPC URL?": "Are you sure you want to reset the RPC URL?",
"As a Core user, you have the option to opt-in for airdrop rewards based on your activity and engagement. Core will collect anonymous interaction data to power this feature.": "As a Core user, you have the option to opt-in for airdrop rewards based on your activity and engagement. Core will collect anonymous interaction data to power this feature.",
"Assets": "Assets",
"Attempted to use an unknown derivation path": "Attempted to use an unknown derivation path",
"Authenticator": "Authenticator",
"Authenticator added!": "Authenticator added!",
"Authenticator app": "Authenticator app",
"Authenticator app removed successfully!": "Authenticator app removed successfully!",
"Authenticator apps generate secure, time-based codes for wallet recovery.": "Authenticator apps generate secure, time-based codes for wallet recovery.",
"Auto": "Auto",
"Auto • {{name}}": "Auto • {{name}}",
Expand Down Expand Up @@ -109,6 +117,7 @@
"Cancelling...": "Cancelling...",
"Chain": "Chain",
"Chain ID": "Chain ID",
"Change Authenticator App": "Change Authenticator App",
"Change password": "Change password",
"Chinese - Simplified": "Chinese - Simplified",
"Chinese - Traditional": "Chinese - Traditional",
Expand Down Expand Up @@ -200,12 +209,14 @@
"Enter a valid email address": "Enter a valid email address",
"Enter a value": "Enter a value",
"Enter chain ID": "Enter chain ID",
"Enter code manually": "Enter code manually",
"Enter explorer URL": "Enter explorer URL",
"Enter header name": "Enter header name",
"Enter logo URL": "Enter logo URL",
"Enter name": "Enter name",
"Enter password": "Enter password",
"Enter private key": "Enter private key",
"Enter the code generated from the authenticator app": "Enter the code generated from the authenticator app",
"Enter the code generated from your authenticator app.": "Enter the code generated from your authenticator app.",
"Enter the code generated in your authenticator app.": "Enter the code generated in your authenticator app.",
"Enter token name": "Enter token name",
Expand All @@ -217,12 +228,14 @@
"Enter your password to view your recovery phrase": "Enter your password to view your recovery phrase",
"Enter your recovery phrase": "Enter your recovery phrase",
"Enter your recovery phrase to import a wallet": "Enter your recovery phrase to import a wallet",
"Error occurred. Please try again.": "Error occurred. Please try again.",
"Error while deriving address": "Error while deriving address",
"Exit": "Exit",
"Explorer URL": "Explorer URL",
"Export Cancelled": "Export Cancelled",
"Export Failed": "Export Failed",
"Extended public key not found": "Extended public key not found",
"FIDO device removed!": "FIDO device removed!",
"Failed to Initialize": "Failed to Initialize",
"Failed to add network": "Failed to add network",
"Failed to change account": "Failed to change account",
Expand All @@ -245,6 +258,7 @@
"File Upload Failed": "File Upload Failed",
"Fill out your wallet details": "Fill out your wallet details",
"Filter": "Filter",
"Finish setting up recovery methods": "Finish setting up recovery methods",
"Flagged as malicious. Disconnect now!": "Flagged as malicious. Disconnect now!",
"Floating": "Floating",
"Follow the instructions in your browser window to add this key to your account.": "Follow the instructions in your browser window to add this key to your account.",
Expand Down Expand Up @@ -385,6 +399,7 @@
"No custom headers are configured.": "No custom headers are configured.",
"No matching results": "No matching results",
"No matching sites found": "No matching sites found",
"No recovery methods set up": "No recovery methods set up",
"No routes found with enough liquidity.": "No routes found with enough liquidity.",
"No saved addresses": "No saved addresses",
"No thanks": "No thanks",
Expand All @@ -393,6 +408,7 @@
"Only Keystore files from the Avalanche Wallet are supported": "Only Keystore files from the Avalanche Wallet are supported",
"Only keystore files exported from the Avalanche Wallet are supported.": "Only keystore files exported from the Avalanche Wallet are supported.",
"Oops! It seems like you have no internet connection. Please try again later.": "Oops! It seems like you have no internet connection. Please try again later.",
"Open any authenticator app and scan the QR code below or enter the code manually": "Open any authenticator app and scan the QR code below or enter the code manually",
"Open the Solana app on your Ledger device": "Open the Solana app on your Ledger device",
"Open the {{appName}} app on your Ledger device in order to continue with this transaction": "Open the {{appName}} app on your Ledger device in order to continue with this transaction",
"Options": "Options",
Expand Down Expand Up @@ -433,6 +449,7 @@
"Please try again later or choose a different token pair.": "Please try again later or choose a different token pair.",
"Please try again later or contact support.": "Please try again later or contact support.",
"Please try again later.": "Please try again later.",
"Please try again.": "Please try again.",
"Please try switching to a different network.": "Please try switching to a different network.",
"Please update the Avalanche Application on your Ledger device to continue.": "Please update the Avalanche Application on your Ledger device to continue.",
"Please update the {{appName}} app on your Ledger device to {{version}} or higher to be able to continue": "Please update the {{appName}} app on your Ledger device to {{version}} or higher to be able to continue",
Expand Down Expand Up @@ -470,7 +487,9 @@
"Recovery phrase copied to clipboard": "Recovery phrase copied to clipboard",
"Refresh": "Refresh",
"Reject": "Reject",
"Remove FIDO Device": "Remove FIDO Device",
"Remove account": "Remove account",
"Remove recovery method": "Remove recovery method",
"Rename": "Rename",
"Rename Account": "Rename Account",
"Rename Wallet": "Rename Wallet",
Expand Down Expand Up @@ -522,6 +541,8 @@
"Sending this token is not supported yet.": "Sending this token is not supported yet.",
"Sending this type of token is not supported by Core": "Sending this type of token is not supported by Core",
"Set a limit that you will allow to automatically spend.": "Set a limit that you will allow to automatically spend.",
"Set up ": "Set up ",
"Setting up your authenticator app.": "Setting up your authenticator app.",
"Settings": "Settings",
"Show me Trending Tokens": "Show me Trending Tokens",
"Show password": "Show password",
Expand All @@ -536,7 +557,9 @@
"Solana": "Solana",
"Some of the required parameters are invalid.": "Some of the required parameters are invalid.",
"Some of the required parameters are missing.": "Some of the required parameters are missing.",
"Something Went Wrong": "Something Went Wrong",
"Something bad happened please try again later!": "Something bad happened please try again later!",
"Something went wrong": "Something went wrong",
"Something went wrong. Please try again.": "Something went wrong. Please try again.",
"Sort": "Sort",
"Spanish": "Spanish",
Expand All @@ -545,6 +568,7 @@
"Stay updated on latest airdrops, events and more! You can unsubscribe anytime. For more details, see our <policyLink>Privacy Policy</policyLink>": "Stay updated on latest airdrops, events and more! You can unsubscribe anytime. For more details, see our <policyLink>Privacy Policy</policyLink>",
"Storage update failed": "Storage update failed",
"Strong password! Keep this one!": "Strong password! Keep this one!",
"Success!": "Success!",
"Successfully imported the keystore file.": "Successfully imported the keystore file.",
"Successfully swapped {{srcAmount}} {{srcToken}} to {{destAmount}} {{destToken}}": "Successfully swapped {{srcAmount}} {{srcToken}} to {{destAmount}} {{destToken}}",
"Suggested slippage - your transaction will fail if the fail price changes unfavorable more than this percentage": "Suggested slippage - your transaction will fail if the fail price changes unfavorable more than this percentage",
Expand Down Expand Up @@ -658,6 +682,7 @@
"Unsupported network": "Unsupported network",
"Unsupported token type": "Unsupported token type",
"Update Required": "Update Required",
"Update your recovery methods": "Update your recovery methods",
"Updating accounts...": "Updating accounts...",
"Upload a JSON file to import": "Upload a JSON file to import",
"Upload keystore file": "Upload keystore file",
Expand Down Expand Up @@ -687,6 +712,7 @@
"Wallet not found": "Wallet not found",
"Wallet renamed": "Wallet renamed",
"Wallet secrets not found for the requested ID": "Wallet secrets not found for the requested ID",
"We encountered an unexpected issue.": "We encountered an unexpected issue.",
"We were not able to verify this code. Please try again.": "We were not able to verify this code. Please try again.",
"We're unable to cover the gas fees for your transaction at this time. As a result, this feature has been disabled.": "We're unable to cover the gas fees for your transaction at this time. As a result, this feature has been disabled.",
"Weak password! Try adding more characters": "Weak password! Try adding more characters",
Expand All @@ -698,13 +724,16 @@
"You are about to exit the recovery phrase export process. Are you sure you want to exit?": "You are about to exit the recovery phrase export process. Are you sure you want to exit?",
"You can now close this window and continue using Core.": "You can now close this window and continue using Core.",
"You can now start buying, swapping, sending, receiving crypto and collectibles with no added fees": "You can now start buying, swapping, sending, receiving crypto and collectibles with no added fees",
"You cannot add a new recovery method for your wallet! Try again later!": "You cannot add a new recovery method for your wallet! Try again later!",
"You do not have enough funds to cover the network fees.": "You do not have enough funds to cover the network fees.",
"You may need to enable popups to continue, you can find this setting near the address bar.": "You may need to enable popups to continue, you can find this setting near the address bar.",
"You must allow access to scan the QR code.": "You must allow access to scan the QR code.",
"You need to grant access to the camera feed first.": "You need to grant access to the camera feed first.",
"You pay": "You pay",
"You receive": "You receive",
"You will be prompted {{remaining}} more time(s).": "You will be prompted {{remaining}} more time(s).",
"You will no longer be able to use this authenticator once you switch. You will need to re-add an authenticator": "You will no longer be able to use this authenticator once you switch. You will need to re-add an authenticator",
"You will no longer be able to use this method once you removed.": "You will no longer be able to use this method once you removed.",
"You're about to terminate this session": "You're about to terminate this session",
"Your account's private key is a fixed password for accessing the\n specific addresses above. Keep it secure, anyone with this private key\n can access the account associated with it.": "Your account's private key is a fixed password for accessing the\n specific addresses above. Keep it secure, anyone with this private key\n can access the account associated with it.",
"Your device is now connected to Core!": "Your device is now connected to Core!",
Expand Down
30 changes: 22 additions & 8 deletions apps/next/src/pages/Onboarding/components/CardMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
StackProps,
styled,
Typography,
useTheme,
} from '@avalabs/k2-alpine';
import { FC, ReactNode, type ReactElement } from 'react';
import { useHistory } from 'react-router-dom';
Expand All @@ -26,35 +27,51 @@ type CardMenuItemProps = {
icon: ReactElement;
text: string;
description?: string;
size?: string;
itemGap?: string;
} & (
| {
link: string;
}
| {
onClick: () => void;
onClick?: () => void;
}
);

export const CardMenuItem: FC<CardMenuItemProps> = ({
icon,
text,
description,
size,
...props
}) => {
const history = useHistory();
const theme = useTheme();

const onClick =
'onClick' in props ? props.onClick : () => history.push(props.link);
'onClick' in props
? props.onClick
: 'link' in props
? () => history.push(props.link)
: undefined;

return (
<CardMenuItemContainer onClick={onClick}>
<CardMenuItemContainer
onClick={onClick}
sx={{
gap: theme.spacing(size === 'small' ? 1.5 : 3),
paddingX: theme.spacing(size === 'small' ? 1.5 : 2.5),
}}
>
{icon}
<Stack className="CardLikeMenuItem-text-wrapper">
<Stack gap={0.5}>
<Typography variant="button">{text}</Typography>
<Typography variant={size === 'small' ? 'subtitle3' : 'button'}>
{text}
</Typography>
{description && (
<Typography
variant="subtitle1"
variant={size === 'small' ? 'caption2' : 'subtitle1'}
color="text.secondary"
whiteSpace="normal"
>
Expand All @@ -78,10 +95,7 @@ export const CardMenuItem: FC<CardMenuItemProps> = ({
const CardMenuItemContainer = styled(MenuItem)(({ theme }) => ({
flexDirection: 'row',
justifyContent: 'space-between',
gap: theme.spacing(3),
color: theme.palette.text.primary,
paddingLeft: theme.spacing(2.5),
paddingRight: theme.spacing(2.5),
transition: 'background-color .15s ease-in-out',

'& .CardLikeMenuItem-chevron': {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import { FC, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { MdOutlinePassword } from 'react-icons/md';
import { Divider, EncryptedIcon, Stack, StackProps } from '@avalabs/k2-alpine';
import {
Divider,
EncryptedIcon,
SecurityKeyIcon,
Stack,
StackProps,
} from '@avalabs/k2-alpine';

import {
FullscreenModalActions,
Expand Down Expand Up @@ -63,7 +69,7 @@ export const SeedlessChooseSetupMethod: FC<SeedlessChooseSetupMethodProps> = ({
/>
<CardMenuItem
onClick={() => onMethodChosen('yubikey')}
icon={<MdOutlinePassword size={24} />} // TODO: replace with YubiKey icon
icon={<SecurityKeyIcon size={24} />}
text={t('Yubikey')}
description={t(
`Use a YubiKey for physical, hardware-based protection and strong authentication.`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@ import { NavButton } from '@/pages/Onboarding/components/NavButton';
type SeedlessNameFidoKeyProps = {
keyType: 'passkey' | 'yubikey';
onNext: (name: string) => void;
required?: boolean;
};

export const SeedlessNameFidoKey: FC<SeedlessNameFidoKeyProps> = ({
keyType,
onNext,
required,
}) => {
const { t } = useTranslation();
const [name, setName] = useState('');
Expand Down Expand Up @@ -50,9 +52,11 @@ export const SeedlessNameFidoKey: FC<SeedlessNameFidoKeyProps> = ({
</Stack>
</FullscreenModalContent>
<FullscreenModalActions>
<NavButton variant="text" onClick={() => onNext('')}>
{t(`Skip`)}
</NavButton>
{!required && (
<NavButton variant="text" onClick={() => onNext('')}>
{t(`Skip`)}
</NavButton>
)}
<NavButton
disabled={!name}
color="primary"
Expand Down
13 changes: 13 additions & 0 deletions apps/next/src/pages/Settings/Settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import { ChangePassword } from './components/ChangePassword';
import { ConnectedSites } from './components/ConnectedSites';
import { SettingsHomePage } from './components/Home';
import { RecoveryPhrase } from './components/RecoveryPhrase';
import { RecoveryMethods } from './components/RecoveryMethods';
import { Authenticator } from './components/RecoveryMethods/Authenticator';
import { FIDO } from './components/RecoveryMethods/FIDO/FIDO';
import { NetworkManagement } from './components/NetworkManagement';

export const Settings: FC = () => {
Expand All @@ -15,6 +18,16 @@ export const Settings: FC = () => {
<Route path={`${path}/change-password`} component={ChangePassword} />
<Route path={`${path}/connected-sites`} component={ConnectedSites} />
<Route path={`${path}/recovery-phrase`} component={RecoveryPhrase} />
<Route
path={`${path}/recovery-method/authenticator`}
component={Authenticator}
/>
<Route path={`${path}/recovery-method/fido/:id`} component={FIDO} exact />
<Route
path={`${path}/recovery-methods`}
component={RecoveryMethods}
exact
/>
<Route
path={`${path}/network-management`}
component={NetworkManagement}
Expand Down
Loading
Loading