QA report: external/app.unitflow.finance at hosted
A domain allowlist misconfiguration breaks WalletConnect integration, and token inversion clears user inputs in the swap interface.
The test run evaluated 12 scenarios covering token swap configurations, liquidity pool search and management interfaces, input validation boundaries, and network rejection handling. Of the 12 scenarios, 7 passed, 1 failed, and 4 were blocked due to wallet connection constraints in the test environment and a missing transaction deadline setting.
Two functional issues were identified during testing. The most severe is a 403 authorization error from WalletConnect (Reown) due to the host domain not being present on the allowlist, preventing proper wallet connection initialization. Additionally, clicking the flip tokens button on the swap form resets entered amounts to empty instead of preserving input values and recalculating the exchange quote.
Full end-to-end execution of live swap and liquidity transactions was not covered because connected, funded Web3 wallets could not be exercised in the headless environment. Resolving the WalletConnect domain configuration is critical to unblock standard wallet connectivity workflows for end users.
Run summary
| Metric | Count |
|---|
| Scenarios executed | 12 |
| Passed | 7 |
| Failed | 1 |
| Blocked | 4 |
| Findings raised | 1 |
| Issues after the audit | 2 |
| Withdrawn by the audit | 0 |
| Critical / high / medium / low | 0 / 1 / 1 / 0 |
Target: https://app.unitflow.finance · Testing level: deep_feature · Stack: unknown
Issues
High severity
F2 · WalletConnect/Reown integration fails due to domain missing from allowlist
Severity: high · Type: functional · Verdict: promoted · Scenario: S4
Surfaced by the audit of S4, which the Tester passed, and reproduced live: I clicked 'Connect Wallet' and then 'WalletConnect', but the button simply became disabled and the WalletConnect QR modal failed to appear. This is consistent with a background initialization error (such as a 403 Forbidden from Reown) preventing WalletConnect from functioning correctly, as described in the issue. The page reported 2 console errors during the scenario.
Expected: The application domain should be properly whitelisted in the Reown configuration so that WalletConnect services initialize without 403 Forbidden errors.
Actual: The console logs a 403 error indicating the domain is not found on the allowlist, which prevents WalletConnect from functioning correctly.
Steps to reproduce:
- Navigate to the application.
- Open the browser developer console.
- Observe the logged configuration error.
Evidence: screenshots/critic-M1-1.png
Medium severity
F1 · Flip Tokens button resets input amounts instead of recalculating quote
Severity: medium · Type: functional · Verdict: confirmed · Scenario: S8
The scenario observations explicitly confirm that clicking the flip tokens button clears both input fields, directly supporting the reported defect. The page reported 2 console errors during the scenario.
Expected: When flipping tokens, the token amount should be retained/inverted and the output amount automatically recalculated for the new swap direction.
Actual: Clicking the 'Flip tokens' button swaps the selected tokens (e.g. USDC to EURC) but clears both the Pay and Receive amount input fields to empty rather than preserving/transferring the entered amount and recalculating the swap quote.
Steps to reproduce:
- Navigate to https://app.unitflow.finance/
- Enter '10' into the 'You Pay' amount input field.
- Wait for the 'You Receive' field to calculate a quote (e.g. 8.630608 EURC).
- Click the 'Flip tokens' button.
- Observe the token inputs and values.
Evidence: screenshots/S8-4.png, screenshots/S8-6.png, screenshots/S8-11.png
Scenario results
| Scenario | Priority | Result | Issues |
|---|
| S1 Swap using MAX native USDC with gas reservation | high | blocked (No funded wallet is connected on the required Arc Mainnet network to populate MAX balance or execute the swap transaction.) | none |
| S2 Add Liquidity using MAX native USDC with gas reservation | high | blocked (Unable to connect wallet with native USDC balance due to headless browser environment lacking extension UI confirmation capability.) | none |
| S3 Remove 100% Liquidity position | high | blocked (Cannot connect a Web3 wallet or access active liquidity positions required to submit the remove liquidity form.) | none |
| S4 Prevent swap with insufficient balance | medium | pass | F2 |
| S5 Prevent swap with zero input amount | medium | pass | none |
| S6 Validate Swap slippage tolerance boundaries | medium | pass | none |
| S7 Validate Swap transaction deadline boundaries | medium | blocked (The 'Transaction Deadline' field does not exist in the Swap Settings panel or anywhere in the swap interface, preventing step 3 from being executed.) | none |
| S8 Invert tokens using Flip Tokens button | medium | fail | F1 |
| S9 Filter liquidity pools by search input | medium | pass | none |
| S10 Graceful handling of network switcher rejection | medium | pass | none |
| S11 Verify functional resilience against expected console errors | low | pass | none |
| S12 Prevent Add Liquidity with empty amounts | low | pass | none |
The audit
The Critic reviewed 1 finding and re-verified 2 of them live in the browser, replaying the reported steps on a fresh page.
- A WalletConnect (Reown) domain allowlist misconfiguration was ignored in multiple passed scenarios, despite it likely being the root cause of the wallet connection hangs in the blocked scenarios.
- A 503 Service Unavailable error was overlooked during passed scenario S11, which ironically was intended to verify resilience against console errors.
- A possible defect in S11 ("Service Unavailable (503) HTTP error logged during application usage") was not promoted: the live replay came back inconclusive.
What to fix first
- Add the application domain to the WalletConnect/Reown allowlist to eliminate 403 authorization errors during wallet connection (F2).
- Update the flip tokens action in the swap interface to retain input values and recalculate quote estimates rather than clearing the fields (F1).
Coverage and caveats
In scope: Token Swap core flow and validation; Add Liquidity core flow and validation; Remove Liquidity full lifecycle; Gas reservation mechanics on native USDC MAX shortcuts; Pools searching and filtering functionality; Swap settings validation (slippage, deadline).
Not covered: UnitFactory token generation (Out of scope for Swap/Liquidity deep feature focus); Unit-Suite cross-chain tools (Out of scope for Swap/Liquidity deep feature focus); Farms and Yield staking (Out of scope for Swap/Liquidity deep feature focus); UnitPoints and Genesis Pass (Out of scope for Swap/Liquidity deep feature focus).
- The injected test wallet has a sufficient native USDC balance on Arc testnet to perform swaps and add liquidity.
- Arc testnet is chain ID 5042002 and USDC is the native gas token, meaning MAX shortcuts must reserve gas.
- Network switch prompts to mainnet will be rejected by the wallet as a known environment constraint, and the app is expected to remain functional on testnet.
- A MAX button or shortcut exists adjacent to token input fields for balance population.
- S1 could not be executed: No funded wallet is connected on the required Arc Mainnet network to populate MAX balance or execute the swap transaction..
- S2 could not be executed: Unable to connect wallet with native USDC balance due to headless browser environment lacking extension UI confirmation capability..
- S3 could not be executed: Cannot connect a Web3 wallet or access active liquidity positions required to submit the remove liquidity form..
- S7 could not be executed: The 'Transaction Deadline' field does not exist in the Swap Settings panel or anywhere in the swap interface, preventing step 3 from being executed..
By the numbers
| Metric | Value |
|---|
| Scenarios | 7 passed, 1 failed, 4 blocked of 12 (49 planned steps) |
| Browser actions | 218 (61 clicks, 15 inputs, 29 navigations, 113 snapshots) |
| Screenshots | 39 (4 explore, 34 scenario, 1 critic), 34 captioned |
| Coverage | 10 pages, 6 forms, 4 flows, 8 console errors |
| Audit | 1 findings, 2 re-verified live, 1 confirmed, 1 promoted, 0 withdrawn |
| Model calls | 190 |
| Tokens | 1,036,257 input, 10,817 output, 22,210 thinking |
| Time | 16 min |
| Wallet | 0 transactions, 0 signatures, 0 refusals on chain 5042002 |
| Stage | Calls | Input | Output | Thinking | Seconds |
|---|
| explore | 30 | 214,570 | 3,296 | 2,561 | 208 |
| plan | 1 | 5,517 | 2,296 | 4,801 | 56 |
| test | 141 | 740,276 | 4,057 | 8,703 | 576 |
| critique | 17 | 74,169 | 857 | 5,596 | 132 |
| report | 1 | 1,725 | 311 | 549 | 8 |