Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
2bd075f
feat: implement deadline rounding utility and enhance withdrawal trac…
DiRaiks Mar 4, 2026
303feb7
feat: enhance gas limit handling in withdrawal hooks with rounding ut…
DiRaiks Mar 16, 2026
27c51ba
Merge branch 'develop' of github.com:lidofinance/ethereum-staking-wid…
DiRaiks Mar 16, 2026
6eab4a0
refactor: rename applyRoundUpGasLimit and update usages across multip…
DiRaiks Mar 17, 2026
a7f9f57
refactor: update staking apy endpoint to use getEthApiPath
alx-khramov Apr 15, 2026
393073e
feat(earn): update user balance display
alx-khramov Apr 16, 2026
ec697a0
refactor: remove outdated comments in withdrawal hooks for clarity
DiRaiks Apr 16, 2026
fe5e69d
fix: update balance condition to check sharesAmount instead of amount
alx-khramov Apr 17, 2026
01a3e8a
feat: decompose vault card component
alx-khramov Apr 17, 2026
563536c
refactor: remove unused vault position component
alx-khramov Apr 17, 2026
8147711
Merge branch 'develop' into feature/si-2546-earn-my-balance-token
alx-khramov Apr 20, 2026
da43d7d
fix: update label from "my balance" to "my deposit" in vault card and…
alx-khramov Apr 20, 2026
38d1b03
feat: reef-knot v8.0.0-alpha.3
alx-khramov Apr 20, 2026
51416f9
feat: reef-knot v8.0.0-alpha.4
alx-khramov Apr 20, 2026
8f33686
chore: remove unused wallet events from metrics
alx-khramov Apr 20, 2026
e0eb227
Merge branch 'develop' of github.com:lidofinance/ethereum-staking-wid…
DiRaiks Apr 21, 2026
cedef57
feat: add logging for Matomo withdrawal finish event tracking
DiRaiks Apr 21, 2026
fe3dc39
fix: utils import
DiRaiks Apr 21, 2026
f7dc682
test: set data-testId
jake4take Apr 23, 2026
b1b38d4
chore: resolve conflicts
jake4take Apr 23, 2026
cf50178
fix: fix locator
jake4take Apr 23, 2026
a22c504
feat: vault-card – rm usd amount
alx-khramov Apr 24, 2026
b8bc5c7
feat(earn): vault-page - update top-section for mobiles
alx-khramov Apr 27, 2026
a3e8821
Merge pull request #1037 from lidofinance/test/set-data-test-id
jake4take Apr 27, 2026
632567e
feat(earn): vault-page - show usd on mobiles
alx-khramov Apr 27, 2026
b33aaaf
Merge pull request #930 from lidofinance/feature/withdrawal-request-flag
jake4take Apr 27, 2026
6e52b10
Merge branch 'develop' into feature/reef-knot-8
alx-khramov Apr 27, 2026
913c706
feat: reef-knot v8.0.0
alx-khramov Apr 27, 2026
056d05d
Merge pull request #1028 from lidofinance/feature/reef-knot-8
jake4take Apr 27, 2026
3fe42d7
fix(earn): string interpolation for baseSymbol in vault tip
alx-khramov Apr 27, 2026
ff9f106
fix: update vault tip placement to bottomLeft
alx-khramov Apr 27, 2026
a0ce8b3
Merge pull request #1021 from lidofinance/refactor/earn-vault-chart-s…
jake4take Apr 27, 2026
af36001
Merge remote-tracking branch 'origin/develop' into feature/si-2546-ea…
alx-khramov Apr 27, 2026
6e8dd6e
fix(vault-card): update vault tip placement and zIndex
alx-khramov Apr 28, 2026
61df883
fix: legacy-vault-card – upd balance label and remove vault tip
alx-khramov Apr 28, 2026
23e4f81
fix: update loading state to include pending status for queries
alx-khramov Apr 28, 2026
3da2610
Merge pull request #1024 from lidofinance/feature/si-2546-earn-my-bal…
jake4take Apr 28, 2026
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
1 change: 1 addition & 0 deletions consts/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const enum ETH_API_ROUTES {
ETH_PRICE = '/v1/protocol/eth/price',
STETH_STATS = '/v1/protocol/steth/stats',
STETH_SMA_APR = '/v1/protocol/steth/apr/sma',
STETH_APR = '/v1/protocol/steth/apr',
SWAP_ONE_INCH = '/v1/swap/one-inch',
SWAP_JUMPER = '/v1/swap/jumper',
CURVE_APR = '/v1/pool/curve/steth-eth/apr/last',
Expand Down
8 changes: 0 additions & 8 deletions consts/matomo/matomo-wallets-events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,19 @@ type EventsData = Partial<Record<WalletIdsEthereum, [string, string]>>;

const EVENTS_DATA_CONNECT_START: EventsData = {
ambire: ['on Ambire', 'ambire'],
binanceWallet: ['Binance Web3', 'binance_web3'],
bitget: ['BitGet', 'bitget'],
brave: ['Brave', 'brave'],
browserExtension: ['Browser', 'browser'],
coin98: ['Coin98', 'coin98'],
coinbase: ['Coinbase Wallet', 'coinbase_wallet'],
coinbaseSmartWallet: ['Coinbase Smart Wallet', 'coinbase_smart_wallet'],
exodus: ['Exodus', 'exodus'],
imToken: ['imToken', 'imtoken'],
ledgerHID: ['Ledger', 'ledger'],
metaMask: ['Metamask', 'metamask'],
okx: ['OKX', 'okx'],
trust: ['Trust', 'trust'],
walletConnect: ['WalletConnect', 'walletconnect'],
ctrl: ['Ctrl', 'ctrl'],
} as const;

const EVENTS_DATA_CONNECT_SUCCESS: EventsData = {
...EVENTS_DATA_CONNECT_START,
ambire: ['Ambire', 'ambire'],
binanceWallet: ['Binance Web3', 'binance_web3_wallet'],
};

export const walletMetricProps: MetricProps = {
Expand Down
12 changes: 7 additions & 5 deletions features/earn/shared/drawer-right/drawer-right.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,19 @@ export const DrawerRight: FC<DrawerRightProps> = ({ onClose, isOpen }) => {
return (
<DrawerRightStyled onKeyDown={handleKeyDown} tabIndex={-1} isOpen={isOpen}>
<DrawerRightWrapper>
<DrawerRightContent>
<DrawerRightContent data-testid={'earn-side-panel'}>
<DrawerRightHeader>
<div>What is EarnETH Vault and how it works</div>
<div data-testid={'title'}>
What is EarnETH Vault and how it works
</div>
<DrawerRightClose
icon={<Close />}
size="xxs"
variant="ghost"
onClick={onClose}
/>
</DrawerRightHeader>
<DrawerDescription>
<DrawerDescription data-testid={'description'}>
EarnETH Vault is a meta-vault designed to optimize returns on
deployed assets across Lido Earn strategies. Today, it allocates
assets across GGV and stRATEGY, with the ability to dynamically
Expand All @@ -51,15 +53,15 @@ export const DrawerRight: FC<DrawerRightProps> = ({ onClose, isOpen }) => {
ETH-denominated assets.
</DrawerDescription>
<DrawerTable />
<DrawerRightText>
<DrawerRightText data-testid={'table-description'}>
The table above describes structural differences between accessing a
single vault strategy and accessing a meta-vault that allocates
across multiple strategies. It is provided for informational
purposes only and does not constitute a recommendation. Outcomes and
rewards may vary based on strategy composition, market conditions,
and protocol parameters.
</DrawerRightText>
<DrawerRightText>
<DrawerRightText data-testid={'mellow-points-text'}>
All Mellow points you accumulate remain yours, with your balance
visible on the{' '}
<Link
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ const renderCell = (cell: ReactNode | string[]): ReactNode => {
export const DrawerTable = () => {
return (
<div>
<TableHeader>
<TableHeader data-testid={'table-title'}>
Comparison between GGV/stRATEGY and the EarnETH Vault
</TableHeader>
{DATA.map((item) => (
Expand Down
1 change: 1 addition & 0 deletions features/earn/shared/v2/vault-card/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './vault-card';
export * from './legacy-vault-card';
170 changes: 170 additions & 0 deletions features/earn/shared/v2/vault-card/legacy-vault-card.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
import React from 'react';
import { Button } from '@lidofinance/lido-ui';

import {
CardWrapper,
CardOverlayLink,
CardHeader,
CardHeaderContent,
CardTitle,
CardDescription,
CardStats,
StatItem,
StatLabel,
StatValue,
CardDivider,
CardCta,
VaultIconWrapper,
CardTitleBadge,
ChevronsUpIcon,
StyledTooltip,
BadgeStyled,
TitleTextStyled,
} from './styles';
import { LocalLink } from 'shared/components/local-link';
import { EARN_PATH } from 'consts/urls';
import { EARN_VAULT_DEPOSIT_SLUG } from 'features/earn/consts';
import { FormatPercent } from 'shared/formatters/format-percent';
import { FormatLargeAmount } from 'shared/formatters/format-large-amount';
import { FormatToken } from 'shared/formatters/format-token';
import { Badge } from 'features/earn/shared/badge';
import { getTokenDecimals } from 'utils/token-decimals';
import { useConfig } from 'config/use-config';
import { InlineLoader } from '../../inline-loader';
import { VaultTip } from '../../vault-tip';

type VaultStats = {
tvl?: number | null;
apx?: number | null;
apxLabel: string;
isLoading?: boolean;
apxHint?: React.ReactNode;
};

type LegacyVaultPosition = {
sharesBalance?: bigint;
sharesSymbol: string;
isLoading?: boolean;
};

type LegacyVaultCardProps = {
title: string;
description?: string;
urlSlug: string;
stats: VaultStats;
ctaLabel: string;
position?: LegacyVaultPosition;
variant?: 'eth' | 'usd' | 'default';
illustration?: React.ReactNode;
depositLinkCallback?: () => void;
protectedBadgeTooltipText?: React.ReactNode;
};

export const LegacyVaultCard: React.FC<LegacyVaultCardProps> = ({
title,
description,
urlSlug,
stats,
position,
ctaLabel,
variant = 'default',
illustration,
depositLinkCallback,
protectedBadgeTooltipText,
}) => {
const isDeprecated = useConfig().externalConfig.earnVaults.find(
(vault) => vault.name === urlSlug,
)?.deprecated;

const depositHref = `${EARN_PATH}/${urlSlug}/${EARN_VAULT_DEPOSIT_SLUG}`;

return (
<CardWrapper $variant={variant} data-testid={`${urlSlug}-vault-card`}>
<CardOverlayLink
as={LocalLink}
href={depositHref}
onClick={depositLinkCallback}
data-testid={'open-vault-btn'}
aria-label={title}
/>
<CardHeader>
<CardHeaderContent>
<CardTitle>
<TitleTextStyled>{title}</TitleTextStyled>
{protectedBadgeTooltipText && (
<BadgeStyled>
<Badge
text="PROTECTED"
tooltipText={protectedBadgeTooltipText}
/>
</BadgeStyled>
)}
{isDeprecated && (
<StyledTooltip
title="Vault users can upgrade their tokens to the new unified EarnETH vault without withdrawal or downtime in rewards."
placement="bottom"
>
<CardTitleBadge variant="gradient" icon={<ChevronsUpIcon />}>
{' '}
Upgrading
</CardTitleBadge>
</StyledTooltip>
)}
</CardTitle>
<CardDescription>{description}</CardDescription>
</CardHeaderContent>
<VaultIconWrapper>{illustration}</VaultIconWrapper>
</CardHeader>
<CardDivider />
<CardStats>
<StatItem data-testid="apx-value">
<StatLabel>
{stats.apxLabel}
<VaultTip
placement="bottomLeft"
style={{ position: 'relative', zIndex: 20 }}
>
{stats.apxHint}
</VaultTip>
</StatLabel>
<StatValue $accent>
<InlineLoader isLoading={stats.isLoading} width={70}>
<FormatPercent value={stats.apx} decimals="percent" />
</InlineLoader>
</StatValue>
</StatItem>
<StatItem data-testid="tvl-value">
<StatLabel>TVL</StatLabel>
<StatValue>
<InlineLoader isLoading={stats.isLoading} width={70}>
<FormatLargeAmount amount={stats.tvl} />
</InlineLoader>
</StatValue>
</StatItem>
{!!position?.sharesBalance && (
<StatItem>
<StatLabel>My position</StatLabel>
<StatValue>
<InlineLoader width={32} isLoading={position.isLoading}>
<FormatToken
trimEllipsis
symbol={position.sharesSymbol}
decimals={getTokenDecimals(position.sharesSymbol)}
amount={position.sharesBalance}
fallback="—"
/>
</InlineLoader>
</StatValue>
</StatItem>
)}
</CardStats>
<CardCta>
<LocalLink href={depositHref} onClick={depositLinkCallback}>
<Button fullwidth variant="translucent">
{ctaLabel}
</Button>
</LocalLink>
</CardCta>
</CardWrapper>
);
};
11 changes: 11 additions & 0 deletions features/earn/shared/v2/vault-card/styles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,17 @@ export const StatValueIcon = styled.span`
height: 24px;
`;

export const StatSubValue = styled.span`
color: var(--lido-color-textSecondary);
font-size: ${({ theme }) => theme.fontSizesMap.xs}px;
font-weight: 400;
line-height: 24px;

${({ theme }) => theme.mediaQueries.md} {
display: none;
}
`;

export const CardCta = styled.div`
margin-top: 32px;
`;
Expand Down
Loading
Loading