Skip to content

Redesign onboarding#465

Merged
dewabisma merged 94 commits into
feat/v3from
beast/redesign-onboarding
May 1, 2026
Merged

Redesign onboarding#465
dewabisma merged 94 commits into
feat/v3from
beast/redesign-onboarding

Conversation

@dewabisma

Copy link
Copy Markdown
Collaborator

Summary

Updated onboarding screens to follow figma design. This screen reuse the recovery phrase screens also before we show the account ready screen.

Screenshots

  • Initial loading
Simulator Screenshot - iPhone 8 - 2026-04-27 at 13 28 20
  • Welcome screen
Simulator Screenshot - iPhone 8 - 2026-04-27 at 13 28 24
  • Account ready screen
Simulator Screenshot - iPhone 8 - 2026-04-27 at 13 28 39

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color
- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color
- Rename button component to quantus button
- Update button styling
- Add success variant
- Updated styling for tx item
- Update color text
It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader
- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation
@dewabisma dewabisma requested a review from n13 April 27, 2026 05:29

@n13 n13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review: Redesign Onboarding

Nice wrap-up to the series. The new OnboardingLoadingScreenV2 with animated fade-in, the redesigned welcome screen with OnboardingBackground, and the consolidated SettingsCautionScaffoldData factory constructors all tie the design system together cleanly.

DRY Concerns

  1. Bottom bar duplication between RecoveryPhraseScreen and NewWalletRecoveryPhraseScreen — Both screens build a nearly identical bottom bar with the same layout: a row with two buttons (copy mnemonic + primary action), wrapped in ScaffoldBaseBottomContent. The copy logic (clipboard write, timer-based "Copied!" state, icon swap) is duplicated verbatim. Extract a RecoveryPhraseBottomBar widget (or at least the copy button) that both screens can share.

  2. SettingsCautionScaffoldData.recoveryPhrase() and .walletReset() factory constructors — Excellent DRY improvement. The hardcoded strings that were duplicated in RecoveryPhraseConfirmationScreen and ResetConfirmationScreen are now centralized. Well done.

Architectural Notes

  • OnboardingLoadingScreenV2 has a fixed 4-second timerFuture.delayed(Duration(seconds: 4)) then navigates forward. If wallet initialization is faster than 4 seconds, the user waits unnecessarily. If it's slower, the user hits the next screen before the wallet is ready. Consider tying the navigation to an actual readiness signal (e.g. await walletInitFuture) with a minimum display time, rather than a pure fixed delay.

  • Wallet creation business logic in NewWalletRecoveryPhraseScreen._continue — This method does mnemonic generation, HD wallet creation, account derivation, settings persistence, notification registration, and navigation. That's a lot of business logic in a widget. Consider extracting this into a service method (e.g. WalletCreationService.createNewWallet(name)) that returns the created account, keeping the screen focused on UI concerns only. This would also make the logic testable.

  • AccountReadyOverviewOrigin enum expansion — Renaming creation to newAccountInWallet and import to newWalletFromImport, and adding newWalletFromCreate, makes the intent much clearer. Good naming.

  • OnboardingBackground as a shared widget — Clean extraction. Both the welcome screen and loading screen can use the same background without duplicating the image + gradient stack.

Overall this is a solid series of PRs. The main recurring theme across all six: extract shared UI patterns more aggressively (recipient display in send flow, bottom-bar copy logic in recovery phrase screens, settings row content layout) and keep business logic out of widget _continue methods.

@n13

n13 commented Apr 27, 2026

Copy link
Copy Markdown
Collaborator

Looks very good!

These 2 should be fixed, the rest up to you:

(we do not want a fixed timer)

  • OnboardingLoadingScreenV2 has a fixed 4-second timerFuture.delayed(Duration(seconds: 4)) then navigates forward. If wallet initialization is faster than 4 seconds, the user waits unnecessarily. If it's slower, the user hits the next screen before the wallet is ready. Consider tying the navigation to an actual readiness signal (e.g. await walletInitFuture) with a minimum display time, rather than a pure fixed delay.

  • Wallet creation business logic in NewWalletRecoveryPhraseScreen._continue — This method does mnemonic generation, HD wallet creation, account derivation, settings persistence, notification registration, and navigation. That's a lot of business logic in a widget. Consider extracting this into a service method (e.g. WalletCreationService.createNewWallet(name)) that returns the created account, keeping the screen focused on UI concerns only. This would also make the logic testable.

@dewabisma dewabisma changed the base branch from beast/redesign-home-screen-again to feat/v3 April 28, 2026 12:53
@n13

n13 commented Apr 30, 2026

Copy link
Copy Markdown
Collaborator

PR #465 Review — Redesign Onboarding

Overall this is a polished UI redesign with a clean service extraction. Two real concerns, one nitpick, and one regression in WalletCreationService you'll want to fix before merging.


Must Fix

1. await on submitAddressToBackend() will stall onboarding UI

This is an unintentional regression hiding inside the otherwise nice service extraction.

Before (wallet_ready_screen.dart on feat/v3):

        try {
          _referralService.submitAddressToBackend();
        } catch (_) {}

Fire-and-forget — deliberate. The user navigates onward immediately while the referral POST runs in the background.

After (mobile-app/lib/services/wallet_creation_service.dart):

  @override
  Future<void> submitReferralForNewWallet() async {
    try {
      await _referral.submitAddressToBackend();
    } catch (_) {}
  }

Now awaited inside createNewWallet, which itself is awaited from NewWalletRecoveryPhraseScreen._continue before navigating to AccountReadyScreen. On a slow network the user is stuck on a "Next" spinner waiting for a backend the referral flow doesn't need to block on.

Fix: preserve the original semantics — kick the referral off without awaiting. e.g.:

@override
Future<void> submitReferralForNewWallet() async {
  unawaited(_referral.submitAddressToBackend().catchError((e, st) {
    print('Referral submission failed: $e\n$st');
  }));
}

While you're there: the existing catch (_) {} swallows the error silently, which violates the "fail early — never have a silent failure" rule. At minimum log it.

2. OnboardingLoadingScreenV2 still has a fixed 4-second timer

The latest commit message says "remove fixed timer loading", and you did fix the cold-start path (WalletInitializer now goes straight to WelcomeScreenV2 instead of the 4s screen). Good.

But the screen itself still exists and is now used after logout (logout_service.dart):

class _OnboardingLoadingScreenV2State extends State<OnboardingLoadingScreenV2> with SingleTickerProviderStateMixin {
  late final AnimationController _controller;
  final Duration _duration = const Duration(seconds: 4);

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this, duration: _duration)..forward();
    _controller.addStatusListener((status) {
      if (status == AnimationStatus.completed && mounted) {

A user who explicitly tapped "Reset Wallet" / "Logout" now waits 4 seconds on a branding splash before they can do anything. Either:

  • skip the splash on logout (just navigate to WelcomeScreenV2), or
  • shorten the duration significantly (1–1.5s feels right for a hand-off animation), or
  • delete OnboardingLoadingScreenV2 entirely if it has no other caller.

Should Fix — n13's Original DRY #1 Was Not Addressed

RecoveryPhraseScreen (settings/recovery_phrase_screen.dart) and the new NewWalletRecoveryPhraseScreen are nearly the same widget:

  • Same intro copy: "Write these words down in order and keep them somewhere only you can access. Do not screenshot or copy to a notes app."
  • Same MnemonicGrid(words: _words, isRevealed: true) inside a SingleChildScrollView
  • Same ScaffoldBaseBottomContent + Row with two QuantusButtons and a 24-px gap
  • Same _copyToClipboard() body

Only differences: where the mnemonic comes from (settings vs freshly generated), the right-hand button label/handler ("Done" pop vs "Next" continue), and an extra loading state during generation.

Per your DRY rule this needs a shared widget. Suggested shape:

class RecoveryPhraseView extends StatelessWidget {
  const RecoveryPhraseView({
    super.key,
    required this.appBarTitle,
    required this.words,
    required this.isLoading,
    required this.primaryLabel,
    required this.onPrimary,
    this.isPrimaryLoading = false,
    this.isPrimaryDisabled = false,
  });
  // ...
}

RecoveryPhraseScreen and NewWalletRecoveryPhraseScreen then become thin wrappers that supply the data + primary action.


Nice — Real Wins

  • WalletCreationService + unit tests. The WalletCreationDependencies seam is clean and the two tests (new root / existing root) cover the branches. Exactly what was asked for in the previous review (apart from the await regression above).
  • SettingsCautionScaffoldData.recoveryPhrase() / .walletReset() factories. Centralizes the warning copy. RecoveryPhraseConfirmationScreen, ResetConfirmationScreen, and the new WalletReadyScreen all reuse them. WalletReadyScreen shrinking from ~310 lines to ~30 by deferring to SettingsCautionScaffold is a great DRY win.
  • AccountReadyOverviewOrigin rename to accountCreated / walletCreated / walletImported — much clearer than created/imported. Confirmed all call sites updated (create_account_screen, new_wallet_recovery_phrase_screen); no orphans.
  • OnboardingBackground is a clean shared extraction — WelcomeScreenV2 and OnboardingLoadingScreenV2 both consume it, no copy-paste.
  • SettingsTappableRowUtils.titleAndSubtitle gaining named optional titleColor/subtitleColor is a reasonable extension and all existing call sites were updated.
  • Splash polish: Android windowSplashScreenBackground #141414#0E0E0E, iOS LaunchImage reshaped to a 160×160 square — matches the new icon.

Auth — Verified Clean

Confirmed no functional auth changes:

  • local_auth_service.dart, local_auth_provider.dart, auth_wrapper.dart, app_lifecycle_manager.dart, base_background.dart, recovery_phrase_screen.dart, send_sheet.dart, and the entire quantus_sdk/ are untouched.
  • The biometric gate in RecoveryPhraseConfirmationScreen._onContinue() is byte-identical; only its surrounding scaffolding moved into the data factory.
  • LogoutService.logout() keeps the same SettingsService.clearAll()SubstrateService.logout() → provider-reset sequence; only the post-logout route changed.

Nits (Optional)

  • recovery_phrase_confirmation_screen.dart has a stray blank line and trailing comma anomaly at the closing of SettingsCautionScaffold(...) — easy dart format fix:
          onCheckboxChanged: () => setState(() => _acknowledged = !_acknowledged),
          onContinue: _onContinue,
          
        );
      }
  • recovery_phrase_sheet.dart was deleted but worth a quick git grep to make sure no surviving showRecoveryPhraseSheet(...) callers were missed (I didn't find any, but worth a final sweep).
  • mnemonic_grid.dart horizontal padding tightened from 14 → 10 — not a regression, just flagging it as a knock-on layout change for any other screen that renders the grid.

TL;DR

Two blockers for me: un-await the referral submission (it was intentionally fire-and-forget) and either drop or shorten the 4-second post-logout splash. After that, address the recovery-phrase DRY duplication (n13's original #1, still pending), and ship. Auth is solidly untouched.

@n13

n13 commented Apr 30, 2026

Copy link
Copy Markdown
Collaborator

Also the wallet service is quite strange, can we maybe do this instead:

Use mock classes for services..

AI:
The project already has mockito: ^5.4.6 in dev deps. The three services are concrete singletons with simple async methods — mockito handles them out of the box. The whole WalletCreationDependencies / SdkWalletCreationDependencies layer is dead weight.

Here's how wallet_creation_service.dart collapses:

import 'dart:async';

import 'package:quantus_sdk/quantus_sdk.dart';
import 'package:resonance_network_wallet/services/referral_service.dart';

class WalletCreationService {
  WalletCreationService({
    SettingsService? settingsService,
    AccountsService? accountsService,
    ReferralService? referralService,
  }) : _settings = settingsService ?? SettingsService(),
       _accounts = accountsService ?? AccountsService(),
       _referral = referralService ?? ReferralService();

  final SettingsService _settings;
  final AccountsService _accounts;
  final ReferralService _referral;

  Future<Account> createNewWallet({
    required String name,
    required String mnemonic,
    required int walletIndex,
    required String accountId,
    required List<Account> existingAccounts,
  }) async {
    await _settings.setMnemonic(mnemonic, walletIndex);

    final existingRoot = existingAccounts
        .where((a) => a.walletIndex == walletIndex && a.index == 0)
        .firstOrNull;
    if (existingRoot != null) return existingRoot;

    final account = Account(walletIndex: walletIndex, index: 0, name: name, accountId: accountId);
    await _accounts.addAccount(account);

    unawaited(_referral.submitAddressToBackend().catchError((e, st) {
      print('Referral submission failed for new wallet: $e\n$st');
    }));

    return account;
  }
}

Two wins in the same change:

  • 67 lines → ~30 lines, no rename layer.
  • The unawaited(...) restores the original fire-and-forget referral semantics, fixing the UI-stall regression. Failure is logged, not swallowed (your "fail early" rule).

The test then mocks the real services. Add to the test file's top:

@GenerateNiceMocks([
  MockSpec<SettingsService>(),
  MockSpec<AccountsService>(),
  MockSpec<ReferralService>(),
])
import 'wallet_creation_service_test.mocks.dart';

…and run dart run build_runner build. The body becomes:

test('persists mnemonic, adds root account, and submits referral when no root exists', () async {
  final settings = MockSettingsService();
  final accounts = MockAccountsService();
  final referral = MockReferralService();
  when(referral.submitAddressToBackend()).thenAnswer((_) async {});

  final service = WalletCreationService(
    settingsService: settings,
    accountsService: accounts,
    referralService: referral,
  );

  await service.createNewWallet(
    name: 'Account 1',
    mnemonic: 'abandon abandon ...',
    walletIndex: 0,
    accountId: 'abc',
    existingAccounts: const [],
  );

  verify(settings.setMnemonic('abandon abandon ...', 0)).called(1);
  verify(accounts.addAccount(argThat(
    isA<Account>().having((a) => a.accountId, 'accountId', 'abc'),
  ))).called(1);
  verify(referral.submitAddressToBackend()).called(1);
});

If you'd rather skip codegen, hand-rolled fakes work too — but in that case keep them as class _FakeSettingsService implements SettingsService (etc.) with noSuchMethod overrides, not as a re-named contract layer. The point is: the seam is the real service interface, not an invented one.

Bottom line for the PR

Add this to the must-fix list: collapse WalletCreationDependencies / SdkWalletCreationDependencies, inject the three real services, restore unawaited(...) on the referral call. That single refactor fixes the UI-stall regression and removes the dead abstraction in one shot.

@n13

n13 commented May 1, 2026

Copy link
Copy Markdown
Collaborator

PR #465 Re-Review — Redesign Onboarding

Two new commits since last round (7142516 reusable recovery component, 2cf9d8d PR review fixes). All three previous blockers are addressed. One small "fail early" gap and a dart format nit remain.


Previously-Flagged Issues — Status

Must-Fix #1WalletCreationService await regression + DI layer collapse — FIXED

The whole WalletCreationDependencies / SdkWalletCreationDependencies indirection is gone. Service is now 30 lines of real logic with three injected real services, and the referral call is back to fire-and-forget:

  Future<Account> createNewWallet({
    required String name,
    required String mnemonic,
    required int walletIndex,
    required String accountId,
    required List<Account> existingAccounts,
  }) async {
    await _settings.setMnemonic(mnemonic, walletIndex);

    final hasRoot = existingAccounts.any((a) => a.walletIndex == walletIndex && a.index == 0);
    if (!hasRoot) {
      final account = Account(walletIndex: walletIndex, index: 0, name: name, accountId: accountId);
      await _accounts.addAccount(account);
      unawaited(_referral.submitAddressToBackend());
      return account;
    }

    return existingAccounts.firstWhere((a) => a.walletIndex == walletIndex && a.index == 0);
  }

Tests now use @GenerateNiceMocks against the real services (no invented contract layer):

@GenerateNiceMocks([MockSpec<SettingsService>(), MockSpec<AccountsService>(), MockSpec<ReferralService>()])
import 'wallet_creation_service_test.mocks.dart';

Verified locally — both tests pass (+2: All tests passed!). UI-stall regression is gone.

Must-Fix #2OnboardingLoadingScreenV2 4-second timer — FIXED (deleted)

The screen file no longer exists. git grep for OnboardingLoadingScreenV2|onboarding_loading returns zero matches anywhere. LogoutService now goes straight to WelcomeScreenV2:

    Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (_) => const WelcomeScreenV2()),
      (r) => false,
    );

Cleanest possible resolution.

Should-Fix — Recovery phrase DRY duplication — FIXED

New RecoveryPhraseBody widget owns the shared scaffold, intro copy, mnemonic grid, and copy-button bottom bar:

class RecoveryPhraseBody extends StatelessWidget {
  final String appBarTitle;
  final List<String> words;
  final String primaryButtonLabel;
  final VoidCallback onPrimary;
  final bool isGridLoading;
  final bool isPrimaryButtonDisabled;
  final bool isPrimaryButtonLoading;

  const RecoveryPhraseBody({
    super.key,
    required this.appBarTitle,
    required this.words,
    required this.primaryButtonLabel,
    required this.onPrimary,
    this.isGridLoading = false,
    this.isPrimaryButtonDisabled = false,
    this.isPrimaryButtonLoading = false,
  });

RecoveryPhraseScreen is now 42 lines (was ~95) and NewWalletRecoveryPhraseScreen.build collapses to 9 lines. Both call sites are clean wrappers.


New Issues / Lingering Items

1. unawaited(...) has no error handler — silent-failure risk

unawaited(_referral.submitAddressToBackend()) restores fire-and-forget, but a thrown future now becomes an unhandled async error in the runtime zone. Per the project rule "Fail early — never have a silent failure, all failures must produce error logging", this should explicitly log:

unawaited(
  _referral.submitAddressToBackend().catchError((Object e, StackTrace st) {
    debugPrint('Referral submission failed: $e\n$st');
  }),
);

debugPrint is the project's idiom (used in local_auth_service.dart, shared_address_action_sheet.dart, etc.). Two-line change.

2. dart format will rewrite three files

dart format --set-exit-if-changed reports changes in:

  • lib/v2/screens/settings/recovery_phrase_confirmation_screen.dart (the trailing-whitespace blank line I flagged last time is still there)
  • lib/v2/screens/welcome/welcome_screen.dart (the long Text(...) should split per Dart formatter)
  • lib/services/logout_service.dart

dart format lib/ will fix all three. Consider wiring it into pre-commit / CI so this stops recurring across the v3 series.

3. Generated wallet_creation_service_test.mocks.dart is checked in (753 lines)

Not a blocker — many Flutter projects do this. But if you'd rather not, add *.mocks.dart to .gitignore and run dart run build_runner build in CI before tests. Either choice is fine; just flagging because this is the first generated mocks file in the repo.


Re-Verified Clean

  • Auth surface untouchedgit diff origin/feat/v3...beast/redesign-onboarding -- mobile-app/lib/services/local_auth_service.dart mobile-app/lib/providers/local_auth_provider.dart mobile-app/lib/widgets/auth_wrapper.dart mobile-app/lib/services/app_lifecycle_manager.dart mobile-app/lib/v2/components/base_background.dart returns empty.
  • quantus_sdk/ untouched — diff returns empty.
  • recovery_phrase_sheet.dart references — zero matches anywhere for recovery_phrase_sheet|showRecoveryPhraseSheet.
  • AccountReadyOverviewOrigin rename — confirmed walletCreated flows through NewWalletRecoveryPhraseScreen._continue.
  • Tests pass locallyflutter test test/unit/wallet_creation_service_test.dart+2: All tests passed!
  • Static analysis cleandart analyze on all changed files: No issues found!

TL;DR

Both blockers from the prior round are gone, the DRY refactor landed cleanly, and the test approach is exactly the mockito-on-real-services shape we wanted. Two trivial polish items before merge:

  1. Wrap submitAddressToBackend() with .catchError(debugPrint(...)) to satisfy the no-silent-failure rule.
  2. Run dart format lib/ (3 files).

Ship after that.

Related prior chats: PR 465 review onboarding.

@n13 n13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think GTG, AI nits up to you

@dewabisma dewabisma merged commit ce5bf8a into feat/v3 May 1, 2026
@dewabisma dewabisma deleted the beast/redesign-onboarding branch May 3, 2026 08:02
dewabisma added a commit that referenced this pull request May 4, 2026
* Redesign home screen (#447)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: add myr to fiat currency

* Redesign activity screen and tx detail sheet (#453)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: add myr to fiat currency

* chore: formatting and extract magic number

* feat: fix naming issues, add new tx to send filter also

* Redesign send screen (#458)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: send confirm

* Improve scaffold base (#460)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* fix: review issues

* Beast/settings screen (#463)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* Beast/redesign account management (#461)

* wormhole: bring over miner UI from #407 (no SDK/rust)

Ports all miner-app changes from PR #407 (illuzen/wormhole) onto a
fresh branch off main, including the wormhole rewards setup flow,
balance card, withdrawal screen, new wallet/state/transfer-tracking
services, macOS icons/entitlements, and pubspec updates.

Deliberately excludes every quantus_sdk change (Dart + Rust + cargokit),
the CI workflow carve-outs for cargokit, and the unrelated
mobile-app/pubspec.lock bump. The SDK will be rebuilt from scratch to
support a new UX for entering the wormhole inner hash, so miner-app
will not compile on this branch until that work lands.

* AI cleanup

* Fix migration bug (#459)

* fix migration bug

add migration debug code

* lint

* remove migration test button

* update comment

* remove stats polling - no longer used

* format

* melos format again

* feat: finish updating button icon styling

* Build 100, Version 1.3.5

- Podfile fix for firebase, setting iOS version to 15
- upload file fix - force apple version of rsync

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* ndk upgrade as per gradle

* change gitignore to track android required resources

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* Miner release (#462)

* clean up code, remove features we don't need yet

* remove unused code

* info popup on mining

* UX fixes

* format

* N13/pos v2 check pending (#420)

* added pos mode v1

* add pos service

* format

* fix yellow underline

* Payment mode says 'Pay'

* format

* add watch

* add changes back in

* new charge fix, printouts, wait button added

* copy button for debug

* update rust crates to new chain version (planck)

* minor fix for dev accounts

* check pending first version

* format

* fix linter errors

* removing duplicate code

add pending transaction polling service, using it in transaction submission and also on pos screen

* format

* clear mining rewards on logout

rename mining rewards testnet rewards

* search for pending by extrinsic hash

* xcode stuff

* xcode stuff

* fix miner build

* miner app 0.4.0

* fix miner MacOS build workflow

* explicit team id so CI can build app

* Update Release.entitlements

* use defaults for flutter secure storage

* format

* restore entitlements - fix miner CI build

* Redesign send screen (#458)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: send confirm

* Improve scaffold base (#460)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* fix: review issues

* fix: DRY violation

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>

* fix: DRY violation, wrong border color

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>

* Beast/redesign home screen again (#464)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: finish updating homepage balance view

* feat: finish activity tx item update

* fix: review issues

* Redesign onboarding (#465)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: finish updating homepage balance view

* feat: finish activity tx item update

* feat: update splash

* feat: update onboarding welcome

* feat: finish oboarding redesign

* fix: review issues

* fix: build

* fix: not passing colors

* feat: remove fixed timer loading, refactor create wallet logic, add proper image for receive qr

* feat: make reusable component for recovery phrase

* fix: PR review issues

* Improve currency implementation (#470)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: finish updating homepage balance view

* feat: finish activity tx item update

* feat: update splash

* feat: update onboarding welcome

* feat: finish oboarding redesign

* fix: review issues

* fix: build

* fix: not passing colors

* feat: remove fixed timer loading, refactor create wallet logic, add proper image for receive qr

* feat: adding currency conversion in send flow

* feat: implement real currency conversion

* chore: formatting

* fix: formatting amount

* feat: make reusable component for recovery phrase

* fix: PR review issues

* fix: PR review issues

- App will hard‑error on first launch when there's no cached rates yet
- data.cast<String, double>() will TypeError when the API returns a whole number
- Silent catch (_) swallows parse failures (violates the project "fail early" rule)
- getRate throws but the docstring promises a fallback
- _setMax() non‑flipped path is asymmetric with the flipped path
- Hidden balance + flipped mode appends QUAN to the masked text
- Other small fixes

* feat: properly handle localization of number decimal

* chore: formatting

* fix: exchange rates consumption and cache handling, also fixed chain history service merge conflict

* feat: properly throw on broken convert fiat to quan

* fix round 4 issues

* more cases

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>

* fix: PR review issues

* chore: formatting

* fix: remove silent fallback in _toggleFlip QUAN->Fiat round-trip

The catch (_) silently swallowed parse failures, violating the project's
"fail early / no fallback code" rule. Round-trip is now stable after the
exchange-rate fiat rounding fix, so any genuine failure should surface.

* fix: failing tests

* chore: formatting

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>
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