Skip to content

Release: develop -> main - #1429

Merged
TaprootFreak merged 8 commits into
mainfrom
develop
Aug 31, 2026
Merged

Release: develop -> main#1429
TaprootFreak merged 8 commits into
mainfrom
develop

Conversation

@github-actions

Copy link
Copy Markdown

Automatic Release PR

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

Commits: 1 new commit(s)

Checklist

  • Review all changes
  • Verify CI passes
  • Approve and merge when ready for production

…ext step (#1424)

* fix(buy): never refill an amount field the user just cleared

Clearing the amount to retype it flipped the SPEND effect onto the
cross-side fallback: the target side recomputed the spend amount and the
exact-price echo wrote it back into the emptied field (300 default ->
299.98) while the user was typing, so custom amounts were hard to enter.

A non-empty -> empty transition of either amount field now counts as an
edit in progress: the cross-side fallback is suppressed, the quote state
clears, and the next typed value quotes normally. Fields that were never
set (deep links, first render) still resolve over the fallbacks, and the
exact-price echo still writes the computed side only.

* test(buy): pin the seamless clear-and-retype purchase path

After clearing, no quote may fire for the emptied side at all; after
retyping, every quote request carries exactly the typed amount.

* fix(sell,swap): never refill an amount field the user just cleared

Same cross-side fallback as on the buy screen: emptying the amount (or
target amount) let the opposite side recompute it and the exact-price
echo wrote the equivalent back into the emptied field mid-typing. The
identical non-empty -> empty guard now suppresses the fallback and
clears the quote state; fields that were never set still resolve over
the fallbacks.

* test(buy): cover clear/retype on the live buy page

Pin the emptied spend and target fields in the full-stack suite so a
cross-side exact-price echo cannot refill them, and extend the unit
harness for amountIn/amountOut plus target retype.

* test(sell): mount harness for the cleared-amount guard

Cover the sell screen with a real debounce and fake timers so emptying
an amount field cannot refill from the opposite side, and exercise the
quote, wallet-send and address-switch paths of the same screen.

* fix(buy): keep a cleared amount empty until the user types

The one-frame empty transition was not enough: a later currency or
asset update took the cross-side fallback and the exact-price echo
wrote back into the field. A spend/target field the user emptied now
stays an edit in progress until they type again; never-set fields
still resolve over the fallbacks. Unit and full-stack tests pin
clear, retype, and currency-change-after-clear.

* fix(buy): keep deep-link amounts empty after a user clear

Do not restore amountIn/amountOut into a field the user emptied, even
when the asset later changes. Typing a new spend or get amount resumes
quoting on that side without treating an exact-price echo as a user edit.

Lint the sell harness and add a swap-screen mount test for the same
cleared-amount guard.

* test: cover buy/sell/swap cleared-amount paths and drop dead card UI

Remove the unreachable CARD/NameEdit buy path (payment methods are bank
only). Expand the buy and swap mount harnesses, and pin sell/swap
clear-to-empty on the full-stack suite.

* test: close remaining quote-error and heading coverage gaps

Exercise additional TransactionError values on buy and sell, the
non-1 You-get heading, and a swap source-asset change after clear.
Drop leftover commented CARD payment-method wiring.

* test(buy): cover an unrecognized personal IBAN selector

An unknown personal-iban query value must show the blocking error and
the continue-without-personal-IBAN action instead of quoting.

* test: exercise personal-IBAN, confirm races and remaining screen edges

Cover Frick/Yapeal selector errors, quote-generation races on confirm,
empty first quotes, asset/blockchain fallbacks and empty wallet balances
on the buy, sell and swap mount harnesses.

* fix(buy): do not fall through to amountOut after spend is cleared

When amountIn is present, a user-cleared spend field must stay empty on
asset change instead of restoring amountOut into the target and quoting
spend back. Keep amountOut restore only when amountIn is absent.

Also translate the swap setAddress preference comment to English.

* fix(sell,swap): keep a cleared amount empty across asset changes

Persistent spend/target cleared-by-user refs now match /buy: defaults and
amountIn are not restored after a user clear, exact-price will not write
into that field, and switching asset no longer refills it.

* fix(sell,swap): align cleared-amount gates with the buy screen

Reset the opposite cleared-by-user flag on a real typed value change,
ignore exact-price writes, and do not quote the opposite side while the
user-cleared field is still empty.

* test: pin target-clear retype on swap and amountOut restore on buy

Spend quotes after a cleared target on swap, and a cleared target on buy
does not take amountOut back after an asset change.

* test: reach 100% coverage on buy, sell and swap screens

Drop unreachable generation and exact-price branches that the
cleared-amount guards already handle, and pin remaining currency,
address, quote-error and unmount paths in the mount harnesses.

* fix(sell,swap): drop in-flight exact-price after a user clear

Debounce keeps the quote effect running for 500ms after validatedData
clears, so an exact-price echo could still write into the emptied field.
Skip that write (and the payment-info commit) when the side it would
update is still marked cleared-by-user.

* fix(sell,swap): invalidate in-flight quotes on amount edit

Bump a quote generation on real spend/get edits (not exact-price
echoes) so a hanging exact-price cannot overwrite a cleared or
retyped field during the 500ms debounce. Clearing also drops
payment info immediately, matching /buy.

* test: assert outcomes on buy, sell and swap coverage paths

Empty onSubmit, unmount, zero-amount and retry cases now check the
quote/error UI (and receiveFor payloads) instead of clicking with no
expect. Sell/swap full-stack clear tests also require payment info
to disappear.

* fix(sell,swap): drop quote errors when the user clears an amount

Clearing spend or get must not leave a KYC or generic quote error on
screen: there is no live quote anymore. Reset kycError, errorMessage,
customAmountError and loading together with payment info, matching /buy.

* fix(sell,swap): always bump quote generation on a user clear

Clearing spend or get must invalidate in-flight quotes even when an
exact-price echo left isExactPriceWriteRef true (same amount written
back). Consume that flag on clear so a later retype is a real edit.

* test: hang exact-price after a no-op write before clear

The generation bump on clear is only visible if a stale exact-price
resolves afterwards and must not refill the emptied field.

* test(buy): hang exact-price across clear like sell and swap

Pin in-flight and no-op exact-price echoes so a resolve after the user
clears spend or target cannot refill the emptied field.

* fix(sell,swap): invalidate quotes on address change and no-op echo

Same-chain swap address changes now retrigger quoting. Exact-price
only marks a write as non-user-edit when the field value actually
changes, so a no-op echo cannot stick isExactPriceWriteRef. Drop the
unused committedQuoteGeneration ref on buy.

* fix: keep cleared buy fields editable and preserve spend on IBAN change

Clearing a buy amount now drops loading immediately so the user can
retype without waiting out debounce. Sell IBAN-only and swap
address-only changes requote the spend side instead of overwriting the
typed amount from the calculated target.

* fix(buy): abort stale quotes after a user-cleared amount

Live clear invalidates immediately, but debounce can still hold the
previous request. Extra effect deps must not restart that request.
Pin same-chain swap address changes so spend stays on the GET quote.

* test: assert clear stays editable and match titles to outcomes

Pass loading/disabled through the amount-input mocks so a cleared field
can be shown still editable. Align coverage-smoke titles with what they
measure, and pin Instant quotes to the bank payment method.

* fix(swap): disable spend while a spend-side quote is loading

Match buy/sell: the spend input shows loading and is disabled while
isLoading is SPEND, and a hanging spend-side quote then a user clear
leaves the field editable.

* fix(buy): ignore a stale debounce when extra quote deps change

A new typed amount updates validatedData immediately while debounce still
holds the previous request. Extra effect deps must not fire that snapshot
or write its opposite amount back into the form.

* fix(sell): keep only sellable fiats and stop IBAN create loop

The /sell currency dropdown listed buyable fiats that POST /sell
rejects. A bank-account query param posted /v1/bankAccount in a loop
instead of selecting the existing IBAN. Full-stack tests for both
paths now assert the corrected behaviour.

* fix(sell,swap): ignore exact-price after a live clear

Exact-price then-handlers now check spend/target cleared refs (set
during render, not only in effects) before writing. Preferred bank
currency is applied only when sellable. Invalid IBANs do not create
accounts, and a rejected create is not unhandled.

* fix(buy): ignore exact-price after a live clear

Latch cleared spend/target refs during render so a same-turn
resolveExact cannot refill the emptied field. Guard the exact-price
then() on those refs before generation and identity. Cover spend and
target same-act races on buy, and the target same-act on sell and swap.

* fix(swap): handle wallet reject and other send failures

Match sell: swallow wallet code 4001, show a retry hint otherwise.
Declare the buy-spec SQL depositLimit write. Pin bank-account query
param as select-existing (zero extra POSTs) and update comments.

* fix(buy,sell,swap): run the payment next step on form submit

Native form submit now calls the same confirm/handleNext path as the
visible CTA, with the same guards: cleared amount, missing quote, KYC
or error, private asset, and in-flight processing.

* fix(sell): keep a manual bank-account choice without a query param

Auto-select the default or only account only when nothing is selected.
A bank-account query param still forces the matching account.

* test(sell): pin formatted IBAN display and no retry after create reject

* fix(buy,sell,swap): attach form submit to a native form element

The shared Form component does not put onSubmit on its <form> tag.
Wrap each screen in a native form so Enter runs the payment next step.

* fix(buy,sell,swap): run next step on native submit without amount Required

Enter must match the payment CTA, which is enabled as soon as a quote
exists. Do not gate native submit on RHF amount Required. Tests fire
submit on the wrapping form.

* fix(buy,sell,swap): use onSubmit for the payment CTA and abort quotes when either side is cleared

The visible button now calls the same guarded onSubmit as native
Enter. Exact-price no longer commits if spend or target was cleared.
Tests submit the wrapping form instead of the mock button.

* test(buy,sell,swap): cover onSubmit for private assets with the flag

Private-asset onSubmit previously only tested the blocked path. Form
submit and the payment CTA now also confirm/complete when flags include
private, and swap form submit is blocked for a private target.

* fix(sell,swap): retry quotes with a token like buy

Retry was a no-op when the last quote already used the same GET
payload because useDebounce compares by deep equality. Increment a
retry token so the quote effect runs again. Tests now assert Retry
alone restores payment details.

* fix(sell,swap): always clear processing after handleNext

updateBankAccount and the disconnected-wallet return sat outside
try/finally, so a rejected account update left isProcessing true and
blocked onSubmit. Both paths now share the existing catch/finally.

* test(e2e): pin native form submit on buy, sell and swap

requestSubmit confirms a final quote the same way as the payment CTA
and does nothing after a cleared spend amount.

* test(e2e): require the manual CTA before sell/swap form submit

payment_info also matches the wallet button; handleNext then closes
instead of completing. Wait for the issued-transaction CTA first.

* fix(sell,swap): confirm only after the exact-price quote is final

onSubmit and the payment CTA used the first quote. Match buy: keep
isQuoteFinal false until exact-price resolves, then enable submit.

* fix(sell,swap): drop the previous quote as soon as inputs change

A bank-account or amount change bumped quoteGeneration but left the
old final quote submitable until debounce. Clear paymentInfo and
isQuoteFinal immediately, matching buy.

* test(swap): assert leftover target stays after spend is cleared

Changing the source asset after a cleared spend must not quote
the leftover get amount and must not refill spend.

* fix(sell,swap): do not restore spend default when a target is set

Buy already skips the asset default if targetAmount is filled.
Match that guard so clearing spend, typing a get amount, then
changing the asset cannot refill spend.

* fix(bank-account-selector): ignore stale createAccount results

A create started for a bank-account param must not call onChange
after that param has changed or the selector has unmounted.

* fix(buy,sell,swap): drop stale quote data when validation fails

Retry re-sent the previous request after the user typed an invalid
amount such as 0, because updateData left validatedData unchanged.

---------

Co-authored-by: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com>
TaprootFreak and others added 7 commits August 26, 2026 16:27
The API fail-loud boot guard added with the dedicated faucet wallet
crashes the e2e stack without this env. Same 0.05 as W2W gas.
* feat(support): add fiatOutput

* feat(support): Refactoring
* Point clone docs and repo identity at DFXswiss/app

* Keep the local API sibling folder named api in Quick Start

---------

Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
#1434)

* feat: add Settings verification-call handbook baselines

The consent UI on Settings (allow/deny a verification call) had no
Playwright snapshot and no handbook metadata. Add a mocked visual spec
for the three consent states and register the flow in the handbook.

* docs: complete the verification-call visual spec reality declaration

Name the remaining bootstrap mocks, the 501 catch-alls, and the synthetic
JWT so the entry states what a green run does not prove.

---------

Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
* fix: make handbook screenshot links survive Basic Auth

Hash fragments are dropped after the login prompt, so a #shot- URL
lands at the top of a page with every group open. Prefer ?shot= /
?group=, isolate that one card, and add a Direktlink on each
screenshot.

* test: run handbook deep-link units in CI and clear stale highlights

Wire node --test into handbook-check, document the layer, and remove a
previous handbook-target class before highlighting the new card.

* style: prettier the handbook deep-link test-architecture table

---------

Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
The API no longer 500s on changeRoute. test.fail now makes
the full-stack E2E red with "Expected to fail, but passed."

Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
* fix(compliance): hide AmlReason and priceDefinitionAllowedDate for a Reset decision

Reset hands the transaction back to the automatic AML run; the API clears
amlCheck, amlReason and priceDefinitionAllowedDate itself. The pending
decision form kept showing both inputs, which looked like they still had to
be set. They are now replaced by a hint while Reset is selected.

Brings aml-check-panel.tsx to 100 % coverage; fallbacks that the panel's own
filters make unreachable are removed and the filters narrow the type instead.

* test(compliance): cover clerk disable path and Reset-hint screenshots

Add unit tests for a loading or missing clerk after handleSave dropped
the !clerk guard. Capture the pending ManualCheck form in both visual
variants and extend handbook metadata.

* docs(test-architecture): declare pending ManualCheck visual variants

The compliance-review KYC-status spec now also screenshots the pending
decision form (inputs versus Reset hint), not only the resettable AML
reset path.

* test(compliance): screenshot Fail fields and Reset hint, drop pending

The unused Pending-with-fields baseline did not show the Reset change.
Capture Fail with AmlReason/priceDefinitionAllowedDate visible and Reset
with those fields replaced by the hint.

* fix(compliance): hide priceDefinitionAllowedDate for a Fail decision

Fail never sets that date (it is for Pass / payout price definition), so
the checkbox is omitted and the save payload does not send it. AmlReason
stays. Pass can still tick and send a date.

---------

Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
@TaprootFreak
TaprootFreak merged commit 1ccecc8 into main Aug 31, 2026
16 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.

4 participants