Skip to content

v6.11.0 - #2251

Merged
ethicnology merged 243 commits into
mainfrom
develop
Jun 6, 2026
Merged

v6.11.0#2251
ethicnology merged 243 commits into
mainfrom
develop

Conversation

@ethicnology

Copy link
Copy Markdown
Member

No description provided.

kumulynja and others added 30 commits January 15, 2026 22:39
26-05-16_Update Translation_de_DE
Add null check to order error object check. Add timeout to order api client.
…ithub-translations

refactor: remove Weblate for translation contributions ensuring reviews from every maintainers on Github
Consolidate 5 separate FRB packages (ark_wallet, dart_bbqr, boltz, lwk,
plus bitbox_flutter split into bitbox_transport) behind a single bull_sdk
monorepo dep. Replaces per-package init with BullSdk.init() and renames
ark Transaction* types to ArkTransaction*. Ports SwapStreamStatusConverter
for the boltz-Rust SwapStreamStatus type. payjoin_flutter bumped to a
FRB-2.12 commit so it links against the same FRB runtime.

bull-sdk's satoshifier dep was bumped to i5hi/bdk-dart @ 6ddecbb for
ElectrumClient timeout/retry support (strict descendant of the prior
ethicnology fork — preserves all reproducibility commits).
The pre-commit hook captured flutter analyze into a variable, hiding all
progress and making it look stuck. It also referenced an undefined
REPO_ROOT and inherited git's hook env vars, which made Flutter detect
its own SDK version as the host repo's branch and fail with version
"0.0.0-unknown".
fix(hooks): pre-commit flutter analyze
- Pre-commit: stream flutter analyze output (no more "stuck" silence),
  scope $REPO_ROOT correctly, unset git env vars that made Flutter
  misdetect its SDK version, gate on `dart fix --dry-run`, print
  per-step timings.
- CI: add a `dart fix --dry-run` check after `flutter analyze`.
- Rename build-android workflow display name.
chore(ci,hooks): tighten lint gates + fix flaky pre-commit hook
Introduces SyncCoordinator (lib/core/sync/) that schedules bitcoin,
liquid and swaps syncs sequentially with per-kind dedup, drops requests
while the app is paused, and auto-fires a fresh sync on
`paused → resumed`. Eliminates the foreground-trigger overlap (wallet
sync vs swap watcher restart) that surfaced as "database is locked"
on the shared drift db.

WalletState gains `isRefreshing` set eagerly in _onRefreshed; the
bloc serializes refreshes with bloc_concurrency's droppable()
transformer. WalletHome surfaces the pull-to-refresh spinner via
GlobalKey<RefreshIndicatorState> on first mount or whenever
isRefreshing flips false→true.

Post-activity redirects now dispatch WalletRefreshed so the spinner
appears on walletHome arrival: broadcast, RBF, swap "go home",
buy success (incl. accelerate), receive payment received / in
progress / payjoin, vault recovery, recovery test, ARK setup,
PIN unlock. Imports and wallet delete already trigger refresh
upstream (WalletStarted / _onDeleted) and are unchanged.

Resume-driven swap watcher restart in main.dart removed — the
coordinator's lifecycle listener now owns it.
The five per-state handlers each just logged the state name (with two
also flushing the log). Now that resume-driven sync moved to the
SyncCoordinator, the indirection is dead weight. Inline both bits
directly into _onStateChanged.
feat(bull_sdk): optimizations for faster and smaller builds
Address PR review and the architectural concerns surfaced during audit.

SyncCoordinator
- Fix lifecycle resume: replace the dead `previous==paused && state==resumed`
  check with a `_wasBackgrounded` flag. Flutter routes the state machine
  through `paused -> hidden -> inactive -> resumed`, so the prior direct
  transition condition never fired and the foreground auto-sync was
  effectively disabled.
- Match `_isAppResumed` semantics between constructor and handler so a
  brief `inactive` state (iOS Control Center, system dialog) no longer
  drops every queued kind.
- Sanitize the SEVERE log: replace the raw exception in the Sentry payload
  with a synthetic `StateError` carrying the kind + runtimeType so wallet
  identifiers embedded in underlying messages don't reach Sentry.
- Aggregate per-kind failures into `SyncCoordinatorState.errors` and throw
  `SyncCoordinatorException` from `sync()` so callers (WalletBloc) emit
  a failure state instead of silently treating a failed drain as success.
- Iterate `SyncKind.values.where(only.contains)` so the documented
  bitcoin -> liquid -> swaps order holds regardless of how callers
  constructed the `only` set.
- Add a per-kind throttle: a kind that succeeded within
  `_minSyncInterval` (2s) is skipped on the next enqueue unless the
  caller passes `force: true`.

Route-aware refresh
- `AppRouter.routeObserver` registered on the GoRouter (already configured
  with `notifyRootObserver: true` on the shell). `_WalletHomeScreenState`
  mixes in `RouteAware` and dispatches `WalletRefreshed()` on `didPush`
  and `didPopNext`, replacing the 17 manual dispatches scattered across
  12 feature widgets (buy success, swap progress, RBF router, ark setup,
  recoverbull pages, receive screens, broadcast tx page, pin unlock,
  backup success).
- `WalletRefreshed({force})` carries the user-gesture flag. Pull-to-
  refresh on wallet home, wallet detail, and transactions all pass
  `force: true`. Route-triggered and lifecycle-triggered refreshes
  leave it at `false` and benefit from the coordinator throttle.

Cleanup
- Revert `test_completed_page.dart` to the `BackupSuccessScreen` wrapper
  now that the only reason for the inline copy (the manual
  `WalletRefreshed` dispatch) is gone.
docs(agents): add AGENTS.md as cross-tool agent contract
…ap-expiry-time

chore: add warning about swap expiry time
fix(localization): improve zh wallet and payment translations
basantagoswami and others added 21 commits June 3, 2026 10:08
The price is fetched live and ticks between calls; a slow setUpAll (Tor bootstrap) can delay these tests by tens of seconds, so exact-equality assertions against a price captured at registration time fail. Fetch the reference price next to each conversion and assert with a ~1% tolerance.
tool/gen_all_test.dart globs integration_test/*_test.dart and writes the
all_test.dart aggregator; make integration-test regenerates it on every run.
all_test.dart is now a gitignored build artifact (untracked), so adding a test
file needs no manual wiring and can't be silently left out of the suite.
Cold CI runners re-downloaded the Flutter SDK, re-resolved pub, and re-fetched
Rust crates on every PR. Restore actions/cache for ~/fvm/versions (keyed on
.fvmrc), ~/.pub-cache and ~/.cargo (keyed on pubspec.lock, which pins the
bull_sdk git commit) before the toolchain steps that use them.
harden

- checkout v4 -> v6
- pull_request[opened] on develop -> auto-review same-repo
  (collaborator) PRs;
  external/fork PRs stay on-demand via @claude (write-access only)
- install RTK (pinned v0.42.1), load its PreToolUse hook via the
  action's
  settings input, and print `rtk gain` to confirm savings
- drop unused id-token perm; add timeout-minutes and concurrency
ci: integration tests running in linux desktop
ci(claude): force tag mode on PR review so comments post
fix: use getUserPaymentProcessorCode API and remove currency gate from isKycOk
…fficient balance errors should be part of form validation. continue should be disabled until form is validated. Split warning into two boxes. Split backup warning into bull points.
fix: transfer flow should allow receive exact amount option for liquid. better errors in form validation. escalation backup warning content as a bulleted list.
@ethicnology
ethicnology requested a review from i5hi June 6, 2026 07:37
@ethicnology ethicnology self-assigned this Jun 6, 2026
ethicnology and others added 2 commits June 6, 2026 09:56
Resolve conflicts:
- pubspec.yaml: keep 6.11.0+185
- lib/main.dart: keep SyncCoordinator-based lifecycle handler, re-add 6.10.6 inactive-state log flush
- CHANGELOG.md: keep 6.11.0 entry plus main's 6.10.6/6.10.1 release notes
@ethicnology

Copy link
Copy Markdown
Member Author

conflicts resolved

@ethicnology

Copy link
Copy Markdown
Member Author

Once the CI is green I will trigger the build for the unsigned release candidate @i5hi

@ethicnology

Copy link
Copy Markdown
Member Author

@claude do you see anything I'm missing for this release ?

Exclude iOS @i5hi will update the version while building it

@claude

claude Bot commented Jun 6, 2026

Copy link
Copy Markdown

Claude finished @ethicnology's task in 1m 41s —— View job


Release readiness check — v6.11.0

I went through the release-critical pieces (version, changelog, Android build/signing, CI). Excluded iOS per your note — @i5hi will bump Info.plist while building.

✅ Looks good

  • Version bumped: pubspec.yaml 6.10.6+1846.11.0+185. Android versionCode/versionName are derived from this automatically (flutter.versionCode185), so no separate Android bump needed.
  • CHANGELOG: comprehensive and dated 2026-06-06, matches the PR title.
  • README: updated (Weblate widget → localization PR instructions).
  • Android beta channel is consistent end-to-endbuild.gradle flavors/signing, build-android.yml (beta secrets + fail-loud guard), makefile (make android beta, BULL-<flavor> naming), src/beta/AndroidManifest.xml, and the BETA banner in lib/main.dart (appFlavor != 'beta') all line up. Nice defensive comments around never debug-signing a distributed beta.
  • CI: Analyze and Test ✅ passed. The only pending runs are the Claude Code jobs (incl. this one) — no real failures.

⚠️ Worth double-checking before you cut the release

  1. Beta build secrets — triggering mode: beta requires BETA_KEYSTORE_BASE64, BETA_KEY_ALIAS, BETA_KEY_PASSWORD, BETA_STORE_PASSWORD to all be set as repo secrets, otherwise the Configure beta signing key step fails loud (by design). Confirm they're configured.
  2. CHANGELOG wording vs. reality — the Platform entry says the beta app ships "with its own icon and a BETA banner", but src/beta/AndroidManifest.xml only overrides android:label ("Bull Beta") and its comment explicitly says "the icon falls back to production". So it's the same icon, distinguished by name + banner. Either tweak the wording or add a beta icon. Minor, but it's a user-facing claim.
  3. Pinned git refs for reproducibilitypubspec.yaml pins payjoin_flutter and bull_sdk to specific commit SHAs. Make sure those commits live on permanent branches (not a feature branch that could be deleted/force-pushed), since reproducible builds depend on them resolving forever.
  4. Tag on merge — remember to tag v6.11.0 after merging develop → main so verify_build.sh/reproducibility can target it.

Not a blocker

  • iOS Info.plist has a small change in the diff — leaving that to @i5hi as you said.

Net: I don't see anything that blocks the release on the Android/metadata side. The version + changelog + build pipeline are all in order; just confirm the beta secrets exist and decide on the "own icon" wording.

@ethicnology
ethicnology merged commit ce6c5ac into main Jun 6, 2026
5 checks passed
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.

9 participants