Release: develop -> main - #1429
Merged
Merged
Conversation
…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>
github-actions
Bot
requested review from
TaprootFreak and
davidleomay
as code owners
August 26, 2026 12:39
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automatic Release PR
This PR was automatically created after changes were pushed to develop.
Commits: 1 new commit(s)
Checklist