Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
575311b
chore: yield polish
gomesalexandre Jan 11, 2026
5d6c60c
fix: yield modal SKIPPED transaction handling
gomesalexandre Jan 11, 2026
d1927d4
fix: await query refetch after yield transactions
gomesalexandre Jan 11, 2026
f2c504f
fix: dispatch yield actions as Complete instead of Pending
gomesalexandre Jan 11, 2026
14d003e
fix: refetch portfolio balance for second class chains after yield tx
gomesalexandre Jan 11, 2026
bf3bb78
fix: symbol page filters not working
gomesalexandre Jan 11, 2026
4f632c5
feat: preserve filters when navigating to asset page
gomesalexandre Jan 11, 2026
f063d64
fix: always fetch fresh quote when modal opens
gomesalexandre Jan 11, 2026
1a4a147
fix: remove cached quote on modal close
gomesalexandre Jan 11, 2026
4b8f8cd
Merge branch 'develop' into feat_yield_polish
gomesalexandre Jan 12, 2026
e93b6b1
Merge branch 'develop' into feat_yield_polish
NeOMakinG Jan 12, 2026
358ed56
feat(yields): add YieldEnterModal for staking from asset pages
gomesalexandre Jan 12, 2026
8fa0fd8
wip: yield enter modal polish and code cleanup
gomesalexandre Jan 12, 2026
7843007
Merge remote-tracking branch 'origin/feat_yield_polish' into feat_yie…
gomesalexandre Jan 12, 2026
2e027cc
[skip ci] wip: more yield feats, fixes, and polishes
gomesalexandre Jan 12, 2026
83c7e35
[skip ci] wip: yield cleanup - remove unused translations, naming con…
gomesalexandre Jan 12, 2026
7bea932
[skip ci] wip: fix remaining hardcoded colors, use semantic tokens
gomesalexandre Jan 12, 2026
0623238
[skip ci] chore: yield components cleanup pass
gomesalexandre Jan 12, 2026
14b7524
[skip ci] chore: YieldsList extract tab style constant, fix whiteAlph…
gomesalexandre Jan 12, 2026
8111b55
[skip ci] chore: replace remaining gray/whiteAlpha with semantic tokens
gomesalexandre Jan 12, 2026
5305b6f
wip: yield tab styling cleanup, remove unused variables
gomesalexandre Jan 12, 2026
6916645
feat: cosmos validator improvements - ShapeShift first, fallback APR
gomesalexandre Jan 12, 2026
9452076
refactor: yield asset page improvements
gomesalexandre Jan 12, 2026
a4e4d9d
refactor(yields): cleanup pass - extract component, reuse poll util, …
gomesalexandre Jan 12, 2026
dafa3b8
fix(yields): restore original poll impl, fix button text to show tran…
gomesalexandre Jan 12, 2026
c954a35
fix(yields): refactor YieldEnterModal to use click-per-step execution…
gomesalexandre Jan 12, 2026
89936b5
feat(yields): add provider/validator icon to success state in both mo…
gomesalexandre Jan 12, 2026
ac4fa04
fix(yields): wait for tx confirmation before advancing to next step
gomesalexandre Jan 12, 2026
4d132d8
wip
gomesalexandre Jan 12, 2026
1452d11
wip
gomesalexandre Jan 12, 2026
4326075
wip
gomesalexandre Jan 12, 2026
e8a06c1
Merge branch 'develop' into feat_yield_polish
gomesalexandre Jan 12, 2026
52c6556
Merge remote-tracking branch 'origin/feat_yield_polish' into feat_yie…
gomesalexandre Jan 12, 2026
3d0121e
fix(yields): mobile layout polish and bug fixes
gomesalexandre Jan 12, 2026
33fa0e7
feat: yield.xyz earn tab
gomesalexandre Jan 13, 2026
eac5579
feat(yields): add metric clarity tooltips for Available to Earn, APY,…
gomesalexandre Jan 13, 2026
446d666
feat(yields): add recommendation strip showing top 3 yield opportunit…
gomesalexandre Jan 13, 2026
f3aa05a
feat(yields): add type filter and reposition recommendations
gomesalexandre Jan 13, 2026
9b7f3f8
Refine yields mobile cards and labels
gomesalexandre Jan 13, 2026
1f4af9c
fix: lint
gomesalexandre Jan 13, 2026
4d276ee
fix: more lint
gomesalexandre Jan 13, 2026
41e1c08
feat(yields): refactor yield detail page with improved UX
gomesalexandre Jan 14, 2026
002b351
Merge origin/develop into feat_big_yield_consolidation_feat_polish_fixes
gomesalexandre Jan 14, 2026
966d2fd
fix: fml lint
gomesalexandre Jan 14, 2026
db2fb45
fix(yields): show success step when staking from earn CTA
gomesalexandre Jan 14, 2026
c0db870
fix(yields): remove duplicate close button on success step
gomesalexandre Jan 14, 2026
ce363eb
feat(yields): show available balance for yield opportunities
gomesalexandre Jan 14, 2026
14e6769
fix(yields): handle missing asset in min deposit eligibility check
gomesalexandre Jan 15, 2026
bfee3e7
fix: tackle @coderabbitai - resolve mad rabbit
gomesalexandre Jan 15, 2026
473b6a5
fix(yields): use || 1 for price division consistency
gomesalexandre Jan 15, 2026
58b3683
Merge remote-tracking branch 'origin/develop' into feat_big_yield_con…
gomesalexandre Jan 15, 2026
0d73b26
fix(yields): use translation key for /yr suffix
gomesalexandre Jan 15, 2026
8567c07
fix(yields): improve consistency and translations @coderabbitai
gomesalexandre Jan 15, 2026
8ce1b45
fix(yields): fetch validators in modal for consistent display @codera…
gomesalexandre Jan 15, 2026
bf72ef9
feat(yields): consistent validator/provider display across cards and …
gomesalexandre Jan 15, 2026
ba791fb
refactor: remove duplicate selectEarnHasUserEnteredAmount selector
gomesalexandre Jan 15, 2026
d71e6e6
refactor: address CodeRabbit review comments
gomesalexandre Jan 15, 2026
6639285
refactor(yields): use yieldProviders instead of parsing metadata strings
gomesalexandre Jan 15, 2026
e621081
fix(yields): recommended cards show Available instead of Balance
gomesalexandre Jan 15, 2026
dec7ccb
feat(yields): convert YieldSelector to Dialog pattern, change "Trade …
gomesalexandre Jan 15, 2026
be9a8a0
fix: address @NeOMakinG review comments
gomesalexandre Jan 15, 2026
10be817
fix(yields): address review feedback - code quality improvements
gomesalexandre Jan 15, 2026
d9acae3
fix(yields): import SHAPESHIFT_VALIDATOR_NAME from constants
gomesalexandre Jan 15, 2026
9e8f42c
fix(yields): handle base64-encoded Solana transactions from yield.xyz
gomesalexandre Jan 15, 2026
68f5dd6
fix(yields): fix Solana compute unit budget for yield transactions
gomesalexandre Jan 15, 2026
8d8a8f0
fix(yields): show individual unstaking entries with countdown
gomesalexandre Jan 15, 2026
4e30539
fix(yields): address CodeRabbit PR review feedback
gomesalexandre Jan 15, 2026
7d3886b
fix(yields): use Avatar component instead of external fallback image
gomesalexandre Jan 15, 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
2 changes: 2 additions & 0 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -309,5 +309,7 @@ VITE_FEATURE_KATANA=true

# Yield.xyz Feature Flag
VITE_FEATURE_YIELD_XYZ=false
VITE_FEATURE_YIELDS_PAGE=false
VITE_YIELD_XYZ_API_KEY=06903960-e442-4870-81eb-03ff3ad4c035
VITE_FEATURE_YIELD_MULTI_ACCOUNT=false
VITE_FEATURE_EARN_TAB=false
2 changes: 2 additions & 0 deletions .env.development
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,5 @@ VITE_FEATURE_AVNU_SWAP=true
VITE_FEATURE_NEAR=true
VITE_FEATURE_KATANA=true
VITE_FEATURE_YIELD_XYZ=true
VITE_FEATURE_YIELDS_PAGE=true
VITE_FEATURE_EARN_TAB=true
19 changes: 18 additions & 1 deletion src/Routes/RoutesCommon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { History } from '@/pages/History/History'
import { RFOX } from '@/pages/RFOX/RFOX'
import { TCYNavIndicator } from '@/pages/TCY/components/TCYNavIndicator'
import { TCY } from '@/pages/TCY/tcy'
import { EarnTab } from '@/pages/Trade/tabs/EarnTab'
import { LimitTab } from '@/pages/Trade/tabs/LimitTab'
import { RampTab } from '@/pages/Trade/tabs/RampTab'
import { TradeTab } from '@/pages/Trade/tabs/TradeTab'
Expand All @@ -37,6 +38,8 @@ export const TRADE_ROUTE_ASSET_SPECIFIC =
'/trade/:chainId/:assetSubId/:sellChainId/:sellAssetSubId/:sellAmountCryptoBaseUnit'
export const LIMIT_ORDER_ROUTE_ASSET_SPECIFIC =
'/limit/:chainId/:assetSubId/:sellChainId/:sellAssetSubId/:sellAmountCryptoBaseUnit/:limitPriceMode/:limitPriceDirection/:limitPrice'
export const EARN_ROUTE_ASSET_SPECIFIC =
'/earn/:sellChainId/:sellAssetSubId/:yieldId/:sellAmountCryptoBaseUnit'

const Dashboard = makeSuspenseful(
lazy(() =>
Expand Down Expand Up @@ -246,7 +249,7 @@ export const routes: Route[] = [
category: RouteCategory.Featured,
priority: 3,
mobileNav: false,
disable: !getConfig().VITE_FEATURE_YIELD_XYZ,
disable: !getConfig().VITE_FEATURE_YIELD_XYZ || !getConfig().VITE_FEATURE_YIELDS_PAGE,
},
{
path: '/ramp/*',
Expand Down Expand Up @@ -426,4 +429,18 @@ export const routes: Route[] = [
},
],
},
{
path: '/earn/*',
label: '',
hideDesktop: true,
main: EarnTab,
disable: !getConfig().VITE_FEATURE_EARN_TAB,
routes: [
{
path: EARN_ROUTE_ASSET_SPECIFIC,
main: EarnTab,
hide: true,
},
],
},
]
117 changes: 72 additions & 45 deletions src/assets/translations/en/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@
"insufficientAmountForGas": "Not enough %{assetSymbol}.%{chainSymbol} to cover gas",
"invalidAddress": "Invalid Address",
"deposit": "Deposit",
"supply": "Supply",
"withdraw": "Withdraw",
"withdrawal": "Withdrawal",
"claim": "Claim",
"claiming": "Claiming...",
"confirming": "Confirming...",
"withdrawAndClaim": "Withdraw & Claim",
"overview": "Overview",
"connectWallet": "Connect Wallet",
Expand Down Expand Up @@ -519,7 +521,8 @@
"markets": "Markets",
"tokens": "Tokens",
"swap": "Swap",
"yields": "Yields"
"yields": "Yields",
"earn": "Earn"
},
"shapeShiftMenu": {
"products": "Products",
Expand Down Expand Up @@ -2670,6 +2673,7 @@
"pageSubtitle": "Discover and manage yield opportunities across multiple chains",
"enter": "Enter",
"exit": "Exit",
"enterAsset": "Enter %{asset}",
"yield": "Yield",
"apy": "APY",
"apr": "APR",
Expand All @@ -2681,49 +2685,27 @@
"noYields": "No yield opportunities available",
"connectWallet": "Connect a wallet to view yields",
"stats": "Stats",
"minDeposit": "Min Deposit",
"mechanics": "Mechanics",
"minEnter": "Min Enter",
"rewardSchedule": "Reward Schedule",
"gasToken": "Gas Token",
"transactionSteps": "Transaction Steps",
"stepApprove": "Approve",
"stepApproveDesc": "Approve the token for deposit",
"stepDeposit": "Deposit",
"stepDepositDesc": "Deposit your assets into the strategy",
"stepComplete": "Complete",
"stepCompleteDesc": "Your deposit is complete and earning yield",
"gasFeeNote": "Gas fees are paid in the native token of the network",
"yourInfo": "Your Position",
"activeBalance": "Active Balance",
"entering": "Entering",
"entering": "Entering...",
"exiting": "Exiting...",
"unstaking": "Unstaking",
"availableDate": "available %{date}",
"withdrawable": "Withdrawable",
"locked": "Locked",
"enterDisabled": "Enter is currently disabled for this yield opportunity",
"exitDisabled": "Exit is currently disabled for this yield opportunity",
"type": "Type",
"inputToken": "Input Token",
"netApy": "Net APY",
"grossApy": "Gross APY",
"totalValue": "Total Value",
"myPosition": "My Position",
"myPositions": "My Positions",
"myValidatorPosition": "My %{validator} Position",
"vault": "Vault",
"lending": "Lending",
"yourDeposits": "Your Deposits",
"positions": "Positions",
"opportunities": "Opportunities",
"yields": "Yields",
"earnUpTo": "You could earn up to %{apy}% on your balance",
"earnUpToOnBalance": "You could earn up to %{apy} on your balance",
"startEarning": "Start earning",
"maxApy": "Max APY",
"nativeStaking": "Native Staking",
"validator": "Validator",
"validatorBreakdown": "Validator Breakdown",
"staked": "Staked",
"exiting": "Exiting",
"entered": "Entered",
"claimable": "Claimable",
"loadingQuote": "Loading Quote...",
"depositing": "Depositing...",
"withdrawing": "Withdrawing...",
"selectValidator": "Select Validator",
"allValidators": "All Validators",
"myValidators": "My Validators",
Expand All @@ -2739,20 +2721,25 @@
"nameZA": "Name (Z-A)",
"allNetworks": "All Networks",
"allProviders": "All Providers",
"allTypes": "All Types",
"showAll": "Show All",
"searchValidator": "Search for validator",
"depositYourToken": "Deposit your %{symbol} to start earning yield securely.",
"enterYourToken": "Enter your %{symbol} to start earning yield securely.",
"noActiveValidators": "You don't have any active validators yet.",
"confirming": "Confirming...",
"success": "Success!",
"transactions": "Transactions",
"currentApy": "Current APY",
"estYearlyEarnings": "Est. Yearly Earnings",
"allPositions": "All Positions",
"switch": "Switch",
"supplySymbol": "Supply %{symbol}",
"withdrawSymbol": "Withdraw %{symbol}",
"enterSymbol": "Enter %{symbol}",
"exitSymbol": "Exit %{symbol}",
"claimSymbol": "Claim %{symbol}",
"stakeSymbol": "Stake %{symbol}",
"unstakeSymbol": "Unstake %{symbol}",
"depositSymbol": "Deposit %{symbol}",
"withdrawSymbol": "Withdraw %{symbol}",
"claimableRewards": "Claimable rewards",
"noActivePositions": "You do not have any active yield positions.",
"connectWalletPositions": "Connect a wallet to view your active yield positions.",
"view": "View",
Expand All @@ -2769,31 +2756,36 @@
"assetYields": "%{asset} Yields",
"opportunitiesAvailable": "%{count} opportunities available",
"noYieldsMatchingFilters": "No yields found matching filters.",
"activeDeposits": "Active Deposits",
"activePositions": "Active Positions",
"acrossPositions": "Across %{count} positions",
"availableToEarn": "Available to Earn",
"idleAssetsEarning": "Idle assets that could be earning up to %{apy}% APY",
"potentialEarnings": "Potential Earnings",
"potentialEarningsTooltip": "Estimated yearly earnings based on your idle balance × best available APY for each asset.",
"availableToEarnTooltip": "Total idle balance across assets that have yield opportunities available.",
"apyTooltip": "Annual percentage yield shown by the provider. Rates may fluctuate over time.",
"perYear": "/yr",
"earningsPerYear": "%{amount} %{symbol} /yr",
"recommendedForYou": "Recommended for you",
"earn": "Earn",
"myBalance": "My Balance",
"providers": "Providers",
"deposit": "Deposit",
"withdraw": "Withdraw",
"successDeposit": "You successfully deposited %{amount} %{symbol}",
"successWithdraw": "You successfully withdrew %{amount} %{symbol}",
"successEnter": "You successfully entered %{amount} %{symbol}",
"successExit": "You successfully exited %{amount} %{symbol}",
"successClaim": "You successfully claimed %{amount} %{symbol}",
"viewPosition": "View Position",
"via": "via",
"resetAllowance": "Reset Allowance",
"transactionNumber": "Transaction %{number}",
"loading": {
"signInWallet": "Sign in Wallet",
"signNow": "Sign now...",
"waiting": "Waiting",
"done": "Done",
"preparing": "Preparing...",
"failed": "Failed",
"preparingTransaction": "Preparing transaction..."
},
"errors": {
"walletNotConnected": "Wallet not connected",
"unsupportedYieldNetwork": "Unsupported yield network",
"broadcastFailed": "Failed to broadcast transaction",
"transactionFailedTitle": "Transaction failed",
"transactionFailedDescription": "Please try again.",
Expand All @@ -2808,5 +2800,40 @@
"quoteFailedTitle": "Quote failed",
"quoteFailedDescription": "Unable to get a quote for this transaction. Please try again."
}
},
"earn": {
"enterFrom": "Enter from",
"stakeAmount": "Stake Amount",
"selectYieldOpportunity": "Select yield opportunity",
"selectYieldFor": "Select yield for %{asset}",
"noYieldsAvailable": "No yield opportunities available for %{asset}",
"estimatedYearlyEarnings": "Est. Yearly Earnings",
"yieldType": "Yield Type",
"yieldTypes": {
"native-staking": "Native Staking",
"pooled-staking": "Pooled Staking",
"liquid-staking": "Liquid Staking",
"staking": "Staking",
"lending": "Lending",
"vault": "Vault",
"restaking": "Restaking"
},
"confirmEarn": "Confirm Stake",
"earnWith": "Earn with",
"belowMinimum": "Below minimum deposit",
"minimumDeposit": "Minimum Deposit",
"explainers": {
"liquidStakingReceive": "You'll receive %{symbol} which you can trade at any time",
"liquidStakingTrade": "You can trade your liquid staking token at any time",
"liquidStakingWithdraw": "When withdrawing, your assets will be available immediately",
"rewardsSchedule": "Rewards are distributed every %{schedule} and accrue automatically",
"stakingUnbonding": "When unstaking, there is a %{days} day unbonding period before tokens are available",
"restakingYield": "Restaking rewards accrue to your position automatically",
"restakingWithdraw": "When withdrawing, your assets may have an unbonding period",
"vaultYield": "Yield accrues to your position automatically",
"vaultWithdraw": "When withdrawing, your assets will be available immediately",
"lendingYield": "Interest accrues to your position automatically",
"lendingWithdraw": "When withdrawing, your assets will be available immediately"
}
}
}
}
11 changes: 10 additions & 1 deletion src/components/Layout/Header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ const rightHStackSpacingSx = { base: 2, lg: 4 }
const searchBoxMaxWSx = { base: 'auto', lg: '400px' }
const searchBoxMinWSx = { base: 'auto', xl: '300px' }

const tradeSubMenuItems = [
const baseTradeSubMenuItems = [
{ label: 'navBar.swap', path: '/trade', icon: TbRefresh },
{ label: 'limitOrder.heading', path: '/limit', icon: TbLayersSelected },
{ label: 'fiatRamps.buy', path: '/ramp/buy', icon: TbCreditCard },
Expand Down Expand Up @@ -110,6 +110,15 @@ export const Header = memo(() => {
const isActionCenterEnabled = useFeatureFlag('ActionCenter')
const isNewWalletManagerEnabled = useFeatureFlag('NewWalletManager')
const isRfoxFoxEcosystemPageEnabled = useFeatureFlag('RfoxFoxEcosystemPage')
const isEarnTabEnabled = useFeatureFlag('EarnTab')

const tradeSubMenuItems = useMemo(
() =>
isEarnTabEnabled
? [...baseTradeSubMenuItems, { label: 'navBar.earn', path: '/earn', icon: TbTrendingUp }]
: baseTradeSubMenuItems,
[isEarnTabEnabled],
)
const { degradedChainIds } = useDiscoverAccounts()

const hasWallet = Boolean(walletInfo?.deviceId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ export const NavigationDropdown = ({ label, items, defaultPath }: NavigationDrop
return (
currentPath.startsWith('/trade') ||
currentPath.startsWith('/limit') ||
currentPath.startsWith('/ramp')
currentPath.startsWith('/ramp') ||
currentPath.startsWith('/earn')
)
}

Expand Down
Loading