Skip to content

fix(rewards): stop the stuck "No higher tier has been confirmed" notice - #2665

Merged
MusabShakeel576 merged 1 commit into
masterfrom
claude/pensive-fermi-ose55a
Oct 8, 2026
Merged

MusabShakeel576 merged 1 commit into
masterfrom
claude/pensive-fermi-ose55a

Conversation

@MusabShakeel576

@MusabShakeel576 MusabShakeel576 commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Problem

At the top of Explore Tiers, users see "Savings refreshed. No higher tier has been confirmed yet. Check your FUSE Savings balance and tier requirement before adding more." It shows up for people who are already on the tier they're looking at, including Ultra, which has nothing above it. It stays there until the app restarts.

It comes from a 90-second "wait for a promotion" window in useRewardsUpgradeStore. If the window ran out without a higher tier, timedOut was set and the screen showed the notice. These actions all opened the window, and none of them can raise a tier any more:

  • yield-boost claims (useClaimYieldBoost)
  • FUSE savings deposits (useDepositFromSolidFuse)
  • realtime balance events
  • cancelling or resuming a membership
  • a lock that keeps a trial tier (the "Keep Ultra" button), where the tier never goes up

How many users this hit (Oct 1–8)

Trigger Users Count
Yield-boost claims (yieldBoostClaims, all paid) 84 191 claims
… of which on an active Ultra trial 13 32
… of which on an active Prime trial 37 62
Tier locks (Amplitude Tier Lock Completed, last 30d) 19 16 Prime / 3 Ultra
Annual-fee subscriptions 4 —

A yield-boost claim almost always ended on the notice, so about 84 users have likely seen it since the boost launched on Oct 1. Our data can't tell which of the 19 lockers already held their tier through the old soFUSE rule, so we don't know how many of them saw it. I found no existing monday.com item for this bug.

Fix

Only a lock or an annual fee raises a tier now, so:

  • savingsChanged → tierPurchased. Only useLockFuseForTier and useSubscribeToTier start the window. Cancel and resume now just refresh data.
  • refreshRewardsAfterSavings still refetches rewards and balances, but no longer starts the window. The confirmedSavings flag is gone.
  • The window now ends silently. The lock or subscription is already confirmed on-chain when the window opens, so running out only means the new tier is slow to appear. The notice and the timedOut / savingsConfirmed state are removed.
  • The pending selectors on the benefits and Buy FUSE screens are now just !!pendingUntil.

The celebration after a real upgrade, and the 90-second polling that catches it, work the same as before.

Testing

  • jest on the reward-store, rewards-hook, deposit, realtime, swap and Buy FUSE suites, plus a new refreshRewardsAfterSavings test: 8 suites, 82 tests pass.
  • eslint and prettier --check pass on the changed files.
  • tsc --noEmit reports no errors in the changed files. The 8 errors it does report are in files this PR doesn't touch and are already on master.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CcwfLYRST5mRidUcxWBQjX


Generated by Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

The Explore Tiers screen showed "Savings refreshed. No higher tier has been
confirmed yet…" at the top whenever a 90-second promotion window ran out
without a higher tier. That window was armed by actions that cannot raise a
tier any more — yield-boost claims, FUSE savings deposits, realtime balance
events, cancelling or resuming a membership — and by a lock that keeps a
trial tier the user already holds, including on Ultra where there is nothing
higher. Every one of those ended on the notice, and it stayed until the
session ended.

Only a lock or an annual fee raises a tier now, so only those arm the
window (`tierPurchased`). Savings refreshes still refetch the rewards
payload and balances, but no longer wait for a promotion. The window now
ends quietly: a purchase is confirmed on chain before it opens, so running
out means the tier is slow to show, not that it failed. The notice, and the
`timedOut` / `savingsConfirmed` state behind it, are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcwfLYRST5mRidUcxWBQjX
@vercel

vercel Bot commented Oct 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Actions Updated
solid-app Ignored Ignored Oct 8, 2026 8:30am UTC
solid-app-staging Ignored Ignored Oct 8, 2026 8:30am UTC

Request Review

@claude

claude Bot commented Oct 8, 2026

Copy link
Copy Markdown

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

🤖 Generated with Claude Code

@MusabShakeel576
MusabShakeel576 merged commit a4ba19b into master Oct 8, 2026
5 checks passed
@MusabShakeel576
MusabShakeel576 deleted the claude/pensive-fermi-ose55a branch October 8, 2026 08:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants