feat(money): bind the live APY to the onboarding animation (MUSD-1206) - #33903
Conversation
The onboarding artboard reads the APY from data binding instead of the value baked into the artwork: apyValue carries the formatted rate and apyAmountDigit the digit count its APY container sizes from. Both re-push when the rate changes, and fall back to the existing placeholder rate until the balance service resolves.
v25 adds the apyValue and apyAmountDigit fields to the Main view model, plus apyOneDigit/apyTwoDigit/apyThreeDigit timelines on the content artboard, so the APY is driven by data binding instead of being baked into the artwork. The artboard, state machine and step names are unchanged, and the file size is flat.
|
CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes. |
🔍 Smart E2E Test Selection
click to see 🤖 AI reasoning detailsE2E Test Selection:
These changes affect the Money onboarding flow UI/animation, which is directly covered by SmokeMoney tests. The changes don't touch:
SmokeMoney is the appropriate and sufficient tag for validating these Money onboarding view changes. Performance Test Selection: |
|



Description
The APY shown in the Money onboarding animation is the live rate, read through Rive data binding. Previously the value was baked into the artwork, so it could disagree with the APY shown everywhere else in the app.
The onboarding animation is upgraded to
onboarding_flow_v25.riv, which adds two fields to theMainview model:apyValuecarries the formatted rate including the percent sign, andapyAmountDigitcarries how many digits that rate has. The artboard uses the digit count to pick between its newapyOneDigit/apyTwoDigit/apyThreeDigittimelines, which is what keeps the APY container laid out correctly on the second step. Both are pushed whenever the rate changes, and fall back to the placeholder rate the screen already used until the balance service resolves.The rate comes from
useMoneyAccountBalance, the same source as the Money home screen, so the two cannot drift apart.Verified against the shipped asset rather than assuming the contract held:
apyValueis a string andapyAmountDigita number on theMainview model, and the artboard name, state machine and every step/transition name are unchanged from v24. File size is essentially unchanged (5.97 MB vs 5.98 MB), so there is no bundle impact.Changelog
CHANGELOG entry: Fixed the Money onboarding animation showing a fixed APY, so it now displays the live rate and stays in step with the APY shown elsewhere in the app.
Related issues
Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-1206
Manual testing steps
Screenshots/Recordings
Before
The APY in the animation was part of the artwork and did not change with the live rate.
After
Simulator.Screen.Recording.-.iPhone.17.-.2026-07-28.at.14.15.54.mov
Pre-merge author checklist
Performance checks (if applicable)
trace()for usage andaddTokenfor an exampleFor performance guidelines and tooling, see the Performance Guide.
Pre-merge reviewer checklist
Note
Low Risk
Scoped Money onboarding UI and Rive bindings with fallbacks and unit tests; no auth, payments, or shared balance logic changes beyond reading an existing formatted APY field.
Overview
Money onboarding no longer shows a fixed APY baked into the artwork. It switches to
onboarding_flow_v25.rivand pushes the same formatted rate as Money home via Rive data binding:apyValue(e.g.4.6%) andapyAmountDigitso the artboard picks the right one/two/three-digit layout on the APY step.A dedicated
apyDigitCounthelper clamps digit counts to what the artboard supports. APY updates run in their own effect so rate changes refresh the animation without re-running transition speed, button text, and overlay fade setup. Until the balance hook returns a rate, the screen keeps using the existing4%placeholder.Tests cover live APY binding, digit count, fallback when APY is missing, and path-aware Rive mock setters.
Reviewed by Cursor Bugbot for commit 185294c. Bugbot is set up for automated code reviews on this repo. Configure here.