Skip to content

Release: develop -> main - #1176

Merged
TaprootFreak merged 7 commits into
mainfrom
develop
Jul 22, 2026
Merged

Release: develop -> main#1176
TaprootFreak merged 7 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

…h node (#1166)

openDetail() reset detailError but not loadMoreError, and loadMoreError is only
cleared inside loadNeighbors() — which handleActivate() runs solely for an
expandable, not-yet-loaded node. So after a failed expand (e.g. HTTP 500),
selecting a non-expandable or already-loaded node opened its panel without
clearing the stale expand error, which then rendered under a node that never
failed. Clear loadMoreError in openDetail() alongside detailError so the
panel-scoped error stays scoped to the currently selected node.
Blume1977 and others added 2 commits July 13, 2026 11:52
…1177)

* feat(realunit): REALU balance column in compliance list and detail

Renders the api-resolved balance (share count) as a right-aligned
column in the customer list and as a row in the KYC/Status panel;
unknown balance (indexer unavailable) shows as a dash.

* docs(realunit): note the deliberate check-evidence exception in the dto header
…st (#1179)

* feat(realunit): default-hide empty and internal test accounts in compliance customer list

* simplify to a single empty-accounts toggle; fail open on unresolved balance

* require untouched kycStatus in empty filter; test screen and edge cases

- isEmptyAccount now also requires kycStatus 'NA', so a level-0 account
  with a compliance-relevant status (e.g. Check/Rejected/Terminated) can
  never be hidden as empty
- pin filter edge cases: numeric wire-format kycLevel, empty and
  non-numeric level strings, empty-string name/mail, fractional and
  negative balances
- add component tests for the screen wiring: default filter, toggle,
  search bypass, and both empty-state messages
- render the hide-empty toggle only when there is something to hide
- e2e fixtures: mirror the balance field, add an empty account, assert
  default-hide and search-bypass behaviour

* regenerate realunit compliance search baseline

The summary bar and the extended fixture set (balance values, one empty
account) change the rendered search state; baseline regenerated on macOS
against the local api stack.

* fail open on missing kycLevel; test filter re-engagement after cleared search

A missing (undefined/null) kycLevel now counts as unresolved and keeps the
account visible, matching the balance fail-open semantics; only a resolved
level of 0 counts as no progress. New component test pins that clearing an
active search re-engages the default filter and re-renders the toggle.

* treat blank kycLevel as unresolved; pin null-level fail-open; clarify toggle persistence

A blank/whitespace-only level string is a degenerate wire value, not a
resolved level, and now fails open to visible like missing levels. The
JSON-null case is pinned by its own test. The screen comment now states
that the toggle state deliberately persists across searches.

* use single quotes for a test title (prettier)

---------

Co-authored-by: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Author

🤖 PR Review Bot

❌ Security: 1 critical vulnerabilities


This is an automated review. Please address the issues above.

…anual checks (#1180)

* feat(scorechain): add compliance screening view with deep-link from manual checks

Add a compliance-only page (compliance/scorechain/user/:id) that lists all of a
customer's Scorechain screenings with risk score, severity, signature validity and
the per-analysis exposure breakdown, and make the internal ScorechainHighRisk
manual-check signal a clickable deep-link into it (highlighting the screening of the
flagged transaction).

- useScorechain hook (getUserScreenings, retriggerBuyCrypto) via the generic
  authenticated call — no SDK release needed
- frontend scorechain DTO mirroring the api response (severity bands + sentinels,
  context, trigger, object/analysis type); unknown values render neutral, never crash
- clickable ScorechainHighRisk in the AML manual-check panel and the shared
  TransactionDetailRows (optional, all existing callers unchanged)
- per-screening re-screen action behind a cost-warning confirm
- de/fr/it translations; unit tests for the detection predicate and highlight parsing

* fix(scorechain): use a dedicated risk badge for isHighRisk (red when true)

* fix(scorechain): focus the fresh screening after a re-screen

* fix(scorechain): correct medium-risk color class and translate error strings

* refactor(scorechain): move helpers into a util so the dto is types-only
…1185)

* fix(deps): override tar and websocket-driver to clear critical advisories

npm audit flags 2 critical vulnerabilities, both transitive:
- tar (<=7.5.18, pulled by swarm-js) — path traversal / arbitrary file write
- websocket-driver (<=0.7.4) — resource-limit bypass / message corruption

Pin both to patched versions via the existing overrides block. websocket-driver
0.7.5 is a clean patch bump; tar is forced across the major (swarm-js pulls
tar@4, a web3/Swarm transitive that is not exercised in the browser build).
The lockfile regeneration follows in a separate commit.

* chore(deps): regenerate lockfile for tar/websocket-driver overrides

npm audit: critical 2 -> 0 (tar 4.x -> 7.5.21, websocket-driver 0.7.4 -> 0.7.5).
Verified on Node 20: build succeeds and all 422 tests pass.
* ci: dual-deploy to Cloudflare Pages alongside Azure

Add a wrangler 'pages deploy' step to prd.yml/dev.yml that deploys the build
to the Cloudflare Pages projects (dfx-app-prd on main, dfx-app-dev on develop)
in addition to the existing Azure Blob upload. The Azure deploy stays during
the transition so the live app is never frozen; a follow-up removes it after
the DNS cutover to Pages is verified.

Add public/_headers and public/_redirects so the Pages deployment replicates
the CDN cache/CORS semantics (immutable hashed assets, no-cache entry points,
cross-origin widget) and serves the SPA deep-link fallback (/* -> /index.html).

* ci: cache widget assets for 1h on Pages to match the previous CDN

The embedded widget was served with max-age=3600 by the CDN; add the same
Cache-Control to /widget/* in public/_headers so the Pages deployment keeps
that behavior instead of Pages' default.
#1186)

* fix: reload once on ChunkLoadError to recover stale chunks after a deploy

A new deploy replaces the content-hashed chunks. A tab left open across a deploy
can request a chunk that no longer exists; the static host serves index.html (200)
for it, which surfaces as a ChunkLoadError. Add a global handler in index.tsx that
reloads the page once (guarded against a reload loop via sessionStorage) so the tab
picks up the new chunks. Listens on both 'error' and 'unhandledrejection'.

* fix: make the ChunkLoadError guard loop-safe on session/login URLs

Review (Codex) found a high-severity loop: the guard key lived in sessionStorage,
but index.tsx calls sessionStorage.clear() on session/login URLs (address+signature
or session param), which wiped the guard on every reload — a persistent chunk error
on such an entry point looped unbounded. Move the guard to localStorage (survives the
clear()), wrap storage access in try/catch (embedded/iframe contexts can block it, and
skip the reload then to avoid an unguarded loop), and widen the window to 30s so a
persistent failure reloads at most once per window.
@TaprootFreak
TaprootFreak merged commit 856fa5f into main Jul 22, 2026
8 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.

2 participants