Skip to content

Promote: staging -> develop - #940

Merged
TaprootFreak merged 5 commits into
developfrom
staging
Aug 25, 2026
Merged

Promote: staging -> develop#940
TaprootFreak merged 5 commits into
developfrom
staging

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automatic Staging PR

This PR was automatically created after changes were pushed to staging.

Commits: 1 new commit(s)

Checklist

  • Review all changes
  • Verify CI passes
  • Approve and merge to promote into develop

TaprootFreak and others added 3 commits August 24, 2026 18:05
…935)

EN:
The buy screen shows the Rappen-exact charge under the amount field
without overwriting what the user typed. Labelling a draft for handbook
flows and later marking it ready no longer starts a second Maestro run.

DE:
Die Kaufseite zeigt den rappengenauen Betrag unter dem Feld, ohne die
Eingabe zu überschreiben. Ein gelabelter Draft startet beim Ready keinen
zweiten Maestro-Lauf.

<details>
<summary>Details</summary>

Buy:
- `payableText` already holds the conversion result. A read-only line
under the amount field renders it when it is non-empty and differs from
the typed amount (e.g. field `300`, line `299.46 CHF`).
- Comparison is numeric, so `300` and `300.00` stay hidden. Punctuation
lives in the widget template, not the ARB value.
- Tests pin visibility of `299.46` and hide when payable is empty,
string-equal, or numerically equal.
- Visual regression: `buy_charged_amount` golden (field `300`, exact
charge `299.46 CHF` under it). Baseline generated on the self-hosted
runner.

CI:
- Observed on #934: `tier3:full` started Maestro; `ready_for_review`
started a second macos-latest run on the same SHA because the labeled
concurrency group is unique.
- `ready_for_review` is removed from Tier 3 `pull_request` types.
`labeled` starts a run only when the event label is `tier3:full`;
`unlabeled` does not start a run. `pull-request.yaml` is unchanged
(draft-skip means ready is the first real Analyze/Visual run).

</details>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
EN:
These tests pin that a EUR buy sends currency EUR and shows the EUR
settlement IBAN from the quote, not a leftover CHF IBAN.
Production buy code is unchanged: it already forwards the selected
currency and renders the IBAN the API returns.
The confirm button is not locked; an EUR quote can still be tapped to
confirm.

DE:
Diese Tests stellen sicher, dass ein EUR-Kauf die Währung EUR sendet und
die EUR-IBAN aus der Quote zeigt, nicht eine übrig gebliebene CHF-IBAN.
Der Produktionscode bleibt unverändert: er leitet die gewählte Währung
bereits weiter und zeigt die IBAN der API.
Der Bestätigen-Button wird nicht gesperrt; eine EUR-Quote lässt sich
weiterhin bestätigen.

<details>
<summary>Details</summary>

Pins the EUR vs CHF buy-quote IBAN contract in existing test files:

- Request body for `PUT /v1/realunit/buy` with `Currency.eur` is
`currency: EUR` and maps the EUR IBAN from the mock response.
- Default/CHF path maps the CHF settlement IBAN.
- `RealUnitBuyPaymentInfoDto.fromJson` parses EUR IBAN + EUR currency.
- `BuyPaymentInfoCubit` success for EUR keeps the EUR IBAN.
- After converter settlement in EUR, `BuyView` refetches the quote with
`Currency.eur`.
- On an EUR `BuyPaymentInfoSuccess`, `BuyConfirmButton` receives the EUR
IBAN (not the CHF leftover).
- Tapping confirm on an EUR quote still calls `confirmPayment`.
- Payment details (after confirm) render the formatted EUR IBAN and
amount-in EUR.

IBANs used as distinct fixtures:

- CHF: `CH2208307000560946309` → `CH22 0830 7000 5609 4630 9`
- EUR: `CH9708307000560946317` → `CH97 0830 7000 5609 4631 7`

No production `lib/` changes.

</details>
…olden (#939)

EN:
A 502 with a plain-text body no longer crashes JSON parsing into a
FormatException on the buy quote screen. The quote retry button remains;
if the API sent no JSON message, only Retry is shown. A visual baseline
pins that retry-only state.

DE:
Ein 502 mit Klartext-Body erscheint auf dem Kauf-Quote-Screen nicht mehr
als FormatException. Der Wiederholen-Button bleibt; ohne JSON-Message
zeigt die UI nur Wiederholen. Eine visuelle Baseline pinnt diesen
Zustand.

<details>
<summary>Details</summary>

Gateway 502 responses with a non-JSON body (e.g. `error code: 502`) were
passed through `jsonDecode`, which threw `FormatException`. That string
was stored on `BuyPaymentInfoFailure.message` and rendered as the info
title.

`ApiException.fromBody` now decodes JSON objects via `fromJson` and
otherwise yields an empty user-facing message with the HTTP status. The
buy payment-info service uses it on error paths. HTTP 502 is mapped like
503 (`priceSourceUnavailable`). The catch-all no longer copies
`Object.toString()` into the UI.

A golden (`buy_price_source_unavailable_empty`) pins the empty-message
retry-only buy screen. The PNG is generated on the self-hosted runner
via `golden-regenerate.yaml`, not locally.

</details>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@TaprootFreak

Copy link
Copy Markdown
Contributor

Wir warten noch auf den EUR PR

TaprootFreak and others added 2 commits August 24, 2026 22:49
EN:
Buying a large CHF amount no longer dies on Retry. The app now shows the
quote cap when the order is above inventory, and it reads 105.000 /
90'000 as one hundred five thousand / ninety thousand instead of
rejecting the input.

DE:
Ein grosser CHF-Betrag stirbt nicht mehr am Retry. Die App zeigt die
Quote-Obergrenze, wenn der Auftrag über dem Bestand liegt, und liest
105.000 / 90'000 als einhundertfünftausend / neunzigtausend statt die
Eingabe zu verwerfen.

<details>
<summary>Details</summary>

Two buy-CTA failures:

1. Quote `AmountTooHigh` / `LimitExceeded` with `maxVolume` used to map
to unknown + Retry, which re-quoted the same over-limit amount.
2. CHF/EUR have at most two decimal places, so `105.000` / `90,000` /
`90'000` are thousands groups. The parser treated them as invalid (or,
on the raw quote API, `105.000` is 105 francs). The field now accepts
the apostrophe and the parser keeps the thousands.

Screenshots of min/max and other quote outcomes now show the typed
amount in the fields, as on the live screen. The max-amount hint still
appears only after an over-inventory quote.

</details>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
#941)

EN:
The app no longer infers a default currency from the phone locale.
Until the user picks one, the display currency is EUR, then the account
currency from GET /v2/user (set from residence on the API: CH/LI → CHF,
otherwise EUR).
A late apply is dropped if the wallet closed or was replaced.

DE:
Die App rät die Default-Währung nicht mehr aus der Telefon-Locale.
Ohne gespeicherte Wahl gilt EUR, danach die Account-Währung von GET
/v2/user (API setzt sie aus dem Wohnsitz: CH/LI → CHF, sonst EUR).
Eine späte Apply wird verworfen, wenn die Wallet geschlossen oder
ersetzt wurde.

<details>
<summary>Details</summary>

Local prefs still win. `ApplyAccountCurrencyEvent` is ignored when a
currency is already stored and is not written to prefs.

Wallet open fetches GET /v2/user and applies that currency. Wallet close
restores the unset default (EUR). Replacing the open wallet instance
clears then re-applies. KYC applies the field after `getUser` only while
that same wallet instance is still open.

Buy reads the settings currency from context. The quote is cleared when
the converter currency changes, and Confirm stays hidden while the
success quote currency lags the picker. Dashboard drops in-flight
price/chart/history for the previous currency.

Sell is unchanged.

</details>
@TaprootFreak TaprootFreak added the tier3:full Opt-in: run Tier 3 Maestro handbook flows on this PR label Aug 25, 2026
@TaprootFreak
TaprootFreak merged commit 9e75d18 into develop Aug 25, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

tier3:full Opt-in: run Tier 3 Maestro handbook flows on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant