Skip to content

chore: sync main with upstream babylonlabs-io/babylon-toolkit - #5

Open
apple-juice wants to merge 316 commits into
mainfrom
sync-upstream-main
Open

chore: sync main with upstream babylonlabs-io/babylon-toolkit#5
apple-juice wants to merge 316 commits into
mainfrom
sync-upstream-main

Conversation

@apple-juice

@apple-juice apple-juice commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

!!!!!!!! Ignore CI errors. !!!!!!!!!

Syncs our main with babylonlabs-io/babylon-toolkit:main.

Why a PR instead of the GitHub "Sync fork" button

The org ruleset default-ruleset-sf-engineering applies to ~DEFAULT_BRANCH and requires changes to go through a pull request (2 approvals + code owner review, no bypass actors). The Sync fork button pushes directly to main, so it was silently rejected — that's why it appeared to do nothing while main sat 316 commits behind.

Contents

Please merge with "Create a merge commit"

Do not squash or rebase. Rebasing rewrites all 316 upstream SHAs, which is what caused the existing duplicate-commit history on staging (commits such as babylonlabs-io#1624 appear there with different SHAs than upstream's own copies). Preserving upstream SHAs keeps future syncs clean fast-forwards.

🤖 Generated with Claude Code

jeremy-babylonlabs and others added 30 commits June 19, 2026 11:04
…nlabs-io#1894)

* feat(vault): wire reserve available liquidity and utilization

Surface the reserve-level Available liquidity and Utilization figures in
the borrow flow, read live from the Aave Hub.

- Read available liquidity (getAssetLiquidity) and total borrowed
  (getAssetTotalOwed) per reserve from the Hub in a batched, fault-
  isolated multicall; utilization = borrowed / (available + borrowed).
  Reads go through the app-side eth-contract layer, not the shared SDK.
- Show Available liquidity and Utilization in the borrow metrics card
  and the per-asset Available column in the asset picker, each falling
  back to the empty placeholder while the read is loading or unavailable.
- Project Available liquidity as current -> post-borrow once an amount
  is entered, mirroring the health-factor row.
- Format large amounts compactly (K/M/B) via formatCompactTokenAmount.

* fix(vault): source projection arrow from copy and round compact boundary

- Use COPY.common.valueTransitionArrow for the current → projected separators
  in the borrow metrics card instead of an inline glyph (and align the
  adjacent health-factor arrow to the same source).
- Round formatCompactTokenAmount to two decimals before testing the compact
  threshold, so a value that rounds up to 1,000 (e.g. 999.995) renders as
  "1K" rather than "1,000" and the boundary stays consistent.

* feat(vault): cap borrow amount by available reserve liquidity

The borrow Max button and validation used only the collateral-based max, so a
user could enter or select more than the reserve holds — the metrics row would
project to 0 while the button stayed enabled and the on-chain draw would revert.

- Cap the effective max at the reserve's available liquidity when the Hub read
  succeeds; fall back to the collateral max while it is loading or unavailable,
  so a best-effort display read never blocks an otherwise-fundable borrow.
- Drive the Max button, slider range, "Available" field, and validation off the
  capped max.
- Show a distinct "exceeds available liquidity" message when liquidity is the
  binding constraint, rather than the generic "exceeds maximum".

* fix(vault): margin the liquidity cap and clarify the Hub decimals scale

- Cap borrowable liquidity slightly below the reserve's available amount so
  "Max" doesn't advertise a drain-to-zero figure that some pool configs revert
  on; the on-chain draw remains the backstop.
- Document that the Hub reports liquidity and owed in underlying-token base
  units, so the token decimals are the correct conversion scale.
* feat(vault): redesign disconnected entry screen

Replace the Protocol Cap + hero + 3-step explainer disconnected view with a
self-contained entry screen: hero, a Cap / Max LTV / Loan process time stat row,
Connect CTA, and a list of five feature cards. The rates card always shows live
USDT/USDC/WBTC borrow APRs; Self-custodial and Trustless are expandable
(single-open, collapsed bodies truncate to one line). Hide Protocol Cap /
Collateral / Loans on the disconnected view via an early return in DashboardPage;
OverviewSection is now connected-only.

Cap is wired from useApplicationCap and APRs from useLandingBorrowAprs. Max LTV
and loan process time are placeholders pending data integration (TODOs in copy.ts).

* chore(vault): drop explanatory comments from entry screen

Keep only the placeholder TODOs and concise file docblocks.

* refactor(vault): split entry feature cards and address review feedback

- Split DisconnectedFeatureCards into one component per file
- Use useId() for the partial-liquidation mask to avoid duplicate DOM ids
- Memoize aprStats and featureCards in DisconnectedOverview
- Correct the docstring: the rates card shows live APRs statically, only the last two cards expand
…abylonlabs-io#1897)

* feat(vault): show projected post-borrow rate in borrow metrics card

* fix(vault): pass live deficit to rate strategy and withhold stale projection

* docs(vault): note current-rate leg equals getAssetDrawnRate
* feat(vault): wire Max CF on entry page from reserve collateral factor

Replace the hardcoded Max LTV placeholder on the disconnected entry page
with the live collateral factor read from the Core Spoke contract via
useVaultSplitParams, rendered as a percentage with an empty-value fallback
while loading. Rename the stat to Max CF to match the on-chain value. Loan
process time stays a placeholder.

* feat(vault): promote entry-page loan process time to a fixed value

There is no on-chain source for the end-to-end loan process time, so it
stays a hardcoded "~3 hours". Drop the placeholder naming and TODO so the
stat is no longer flagged as pending contract integration.
* fix(wallet): harden wallet links and stop ETH disconnect re-entrancy

* feat(wallet-connector): add copy button and middle-truncate connected address
…abylonlabs-io#1862)

* feat(vault): add subresource integrity hashes to built script assets

* fix(vault): strip duplicate crossorigin and fail loud on unprotected scripts
…ylonlabs-io#1860)

* fix(vault): validate ETH wallet addresses at the wallet boundary

* fix(vault): return undefined from toCheckedAddress instead of throwing
…bs-io#1919)

* feat(vault): redesign connected dashboard Overview section

* fix(vault): suppress stale BTC price and address overview review feedback

* fix(ci): keep full history in critical-path-check to fix merge-base error

* feat(packages): revisions
* feat(wallet-connector): render new pill design

* feat(packages): revision
…me (babylonlabs-io#1933)

The footer's inner Container was capped at max-w-[1400px] to match the
navbar but kept core-ui Container's default px-4 sm:px-0, dropping its
horizontal inset at the sm breakpoint. Navbar and page content use
PAGE_CONTENT_CLASS (px-5 at all breakpoints), so on wide viewports the
footer content sat flush against the 1400px edge while everything above
was inset 20px. Add [&>div]:!px-5 to realign the footer with the rest of
the page chrome.
babylonlabs-io#1932)

* feat(vault): in-page disabled-deposit state and oversized-amount guard

Behind the DISABLE_DEPOSIT flag, replace the bare "Depositing Unavailable"
CTA with an in-page disabled experience: an orange top banner, disabled
Deposit buttons (header and Collateral section), and a grayed-out BTC logo
empty state with explanatory copy.

Also guard useOptimalSplit against implausibly large amounts so an oversized
input returns the empty split result instead of tripping the ts-sdk precision
assertion and crashing the deposit form.

* fix(vault): close kill-switch leak and surface oversized-amount error

Restore a central FeatureFlags.isDepositDisabled guard so every deposit entry
point is blocked: getDepositCtaState returns a disabled CTA and handleDeposit
bails before starting the flow, covering paths that bypass the disabled buttons
(Activity empty-state CTA, urgent Add Collateral banner).

In useOptimalSplit, return an explicit RangeError for amounts above the BTC
supply cap instead of a silent zeroed result that downstream split planning
cannot distinguish from a normal no-split state.

* fix(vault): align disabled-deposit banner copy with staking phrasing

* fix(vault): make oversized-amount guard defensive-only and tidy grayscale class

Drop the unconsumed amountError plumbing from useOptimalSplit — the oversized
amount is already rejected for the user by the form's balance/max validation, so
the supply-cap check is a documented defensive crash-guard and its test now
verifies the no-throw/empty behavior production relies on.

Use twJoin for the empty-state logo grayscale toggle instead of duplicating the
base class string.

* chore(vault): simplify oversized-amount guard comment
* feat(wallet-connector): adds new activity page

* fix(vault): correct activity expired tooltip to say Deposit expired

* feat(wallet-connector): ui audit fix (babylonlabs-io#1922)

* refactor(vault): rename isRefunded to isExpired, extract PENDING_DEPOSIT_TYPE

Addresses PR review notes: align the activity red-dot field name with its
'Deposit expired' label, and centralize the 'Pending Deposit' sentinel.
…abylonlabs-io#1926)

* feat(vault): show compact deposit summary as initial signing screen

The deposit signing modal previously auto-started the flow on mount and
rendered the fully-expanded step list immediately. Replace that initial
state with a compact summary card (heading, explanation, the four step
groups collapsed with their signature counts, single Sign CTA); the flow
now starts only when the depositor clicks Sign, after which the existing
live stepper renders unchanged.

Counts derive from STEP_GROUPS, so the Activate vault group reads 0/3 (the
real step count); the live stepper, resume flows, and deposit logic are
untouched.

* refactor(vault): hoist summary groups and share deposit-view width

Address PR review: hoist the DepositSummaryCard group array to a module
constant so it is not reallocated per render, and extract the shared
max-w-[520px] into DEPOSIT_VIEW_MAX_WIDTH_CLASS used by both the summary
card and the live progress view.

* refactor(vault): extract reusable DepositCardShell for all deposit states

Make the deposit card the shared shell for the whole progress flow, not just
the pre-sign summary. DepositCardShell owns the chrome — border, heading +
estimate, explanation, optional progress bar, full-bleed divider, body slot,
and footer (CTA + optional footnote). DepositSummaryCard now supplies only the
collapsed group rows and the Sign CTA.

This readies the card for the in-flight states: the live stepper can render its
expanded GroupedProgress (with per-step detail panels) as the body, pass a
progress bar, and swap the footer to close-and-continue + the do-not-spend
footnote — all inside the same card. No behavior change yet; the live stepper
migration is follow-up work.

* fix(vault): guard deposit Sign against double-start broadcast

Restore the exactly-once guarantee that useRunOnce previously provided. The
Sign button now starts the deposit flow at most once via a hasStartedRef
guard in handleSign: executeDeposit broadcasts BTC and has no internal
re-entrancy guard, so a fast double-click could otherwise start (and
broadcast) the deposit twice before the started re-render unmounts the button.

Adds a regression test that fires onSign twice synchronously and asserts
executeDeposit runs once.
* feat(vault): show optimistic activating collateral

* chore(pr): comments
…ase (babylonlabs-io#1938)

* ci(vault-publish): add env scoping + correlation id for orchestrated release

Add ENVIRONMENT and CORRELATION_ID workflow_dispatch inputs. ENVIRONMENT
scopes the S3 publish to a single environment (the unified redeploy
pipeline targets one env); empty/all and push/tag runs publish all three
as before, via a dynamic matrix. CORRELATION_ID is echoed into run-name
so an orchestrating workflow can locate this run.

* ci(vault-publish): derive valid-env list in dispatch error from matrix source

* ci(vault-publish): fail loud on a scoped prod publish

continue-on-error tolerated a prod (vault-testnet) failure unconditionally;
with env scoping a single ENVIRONMENT=vault-testnet dispatch would go green
even if OIDC failed and nothing published. Scope it to the multi-env run
only (setup.outputs.multi), so a single requested prod env fails loud.

---------

Co-authored-by: toroviej0x0 <toroviej0x0@users.noreply.github.com>
* feat(core-ui): add Notification severity primitive

Add a dashboard-level Notification component: left severity accent bar,
icon chip, title/description, optional suggestion sub-box, optional
dismiss control, and severity-aware action pills.

Variants: error (with subtle red tint), warning, info, success, paused
(teal), and suggestion (gold). Actions are passed as a structured
NotificationAction[] and rendered as primary (accent-filled) or
secondary (outlined) pills, so consumers never hand-style severity
colors. Storybook stories cover every severity and slot combination.

Leaves Callout untouched. Vault PositionNotificationBanner migration
is deferred; this primitive unblocks the notification cards.

* refactor(core-ui): address review on Notification primitive

- Move the action pill into its own NotificationActionButton file to
  satisfy the one-component-per-file convention.
- Require onClick on NotificationAction so an action pill always has a
  handler (no inert, focusable buttons).
- Gate the title, description, and suggestion slots on presence rather
  than truthiness so numeric content (e.g. 0) is not dropped.
jrwbabylonlab and others added 21 commits August 19, 2026 14:31
babylonlabs-io#2269)

* feat(ledger-vault-signer): wire provider signPsbt/signPsbts onto signVaultPsbt

* fix(ledger-vault-signer): address babylonlabs-io#2269 review

* chore(ledger-sdk): trim comments

* fix(ledger-vault-signer): address babylonlabs-io#2269 review round 2
…bylonlabs-io#2242)

* perf(vault): cache the IRM curve read and stop per-minute polling

The interest-rate-model curve is a pure function of governance-set
strategy parameters (calculateInterestRate ignores its deficit argument),
so per-minute polling re-read a shape that cannot move between governance
actions. The curve query now caches for an hour (refetching hourly while
mounted, retrying every 60s while errored, single attempt per cycle) and
withholds retained data on error. The live Current marker derives entirely
from the page's existing 60s reserve reads: its callout APR is read off
the cached curve at the live utilization, so the dot and label share one
source. Per-viewer RPC cost drops from 3 eth_calls per minute to 3 per
hour.

* feat(vault): read the IRM curve from the indexer endpoint

The curve query now fetches the indexer's Redis-cached
/api/aave/reserves/:id/irm route instead of issuing three multicalls from
every browser, so total RPC load for the chart is bounded by the server's
cache TTL instead of scaling with the audience. The endpoint returns 200
only with a complete curve — every degraded state is a non-200 — which is
what lets the hour-long client cache treat any 200 as complete. The
browser-side sampling client is deleted; hub helpers it exported become
internal to aaveHub.

Depends on the indexer deploying the /irm route first.

* fix(vault): carry IRM curve failures as data and harden the client

Review follow-ups on the curve query. A thrown queryFn error took the
global QueryCache.onError path into Sentry once per 60s error cycle, and
one failed hourly refetch blanked a curve that is hour-stable by
construction. Failures now ride in the query data (functional staleTime
zeroes the cache window while errored; the functional refetchInterval
keeps the 60s-retry/1h-refresh cadence) and a failed refetch retains the
last-good curve while the retry heals silently. The indexer client now
also validates the curve's semantic invariants at parse (bounds, strict
ascending order, exact kink sample, apr ceiling), aprAtUtilization
documents and enforces its sorted-input precondition, and the accepted
governance-window drift between the stats bar and the hour-cached curve
is written down in the hook doc. Cadence and interpolation are pinned by
tests.

* fix(vault): close the gaps the error-as-data path left open

Resolving IRM failures as query data keeps the 60s retry from billing a Sentry
issue per cycle, but it also took the query out of QueryCache.onError entirely
and let the retained curve chain forward unbounded. Three consequences, all
addressed here.

Report the failure from the queryFn itself, once, on the ok -> error edge. The
global handler cannot see a queryFn that resolves, so a broken endpoint was
raising nothing at all; billing every retry would recreate the alert storm
queryClient.ts documents.

Cap the retained curve by the age of the last SUCCESSFUL read. React Query's
dataUpdatedAt cannot serve — the queryFn always resolves, so a failed refetch
refreshes it forever. The ceiling is deliberately wider than the cache window:
the healthy refetch lands exactly on that boundary, so a ceiling equal to it
would drop the shape on the first failed refetch and leave no retention at all.
Past the ceiling the curve is dropped and the card's existing unavailable state
makes the outage visible.

Degrade instead of throwing when a curve carries no exact kink sample.
parseIrmPayload already rejects that at the fetch boundary, so this lookup is
the second line of defence — and the nearest boundary above it is the app-wide
one, so throwing traded the whole app for the global error screen over a single
missing marker.

Stop requiring aprRay. Nothing reads it, so demanding it let the indexer blank
every chart by trimming a field no client consumes.

Also covers the request timeout across response.text(), which bounded a stalled
body with no test behind it.
…-io#2275)

The rail column was pinned at 460px with shrink-0 while the stat labels
give the left column a ~470px min-content floor. The xl breakpoint reads
the viewport, but the 242px sidebar plus the page and card padding leave
the card ~370px narrower, so between roughly 1280px and 1330px the row
needs more width than the card has and the rail runs past its edge.

Dropping shrink-0 lets the rail column absorb the difference. The rail is
already width-driven (w-full plus a ResizeObserver), so ticks, markers and
the gap arrow follow the new width.
babylonlabs-io#2279)

* fix(ci): give the integrity-manifest publish a real propagation window

Every vault-publish / simple-staking-publish failure on main since babylonlabs-io#253
landed is the same step: `gh release create` succeeds, then the public
download URL is probed for only 30s (6 x 5s) before the job is declared
broken. GitHub's release-asset CDN regularly takes 30-60s to serve a
freshly created immutable release - successful runs already sat at
25-28s - and every one of those "failed" releases exists and serves 200
minutes later. Re-running only mints a wasted -rN slot for the same sha.

Probe on a wall-clock deadline of 10 minutes at 10s intervals, with a
per-probe curl --max-time so a stalled request cannot stretch the
window past the bound. The already-published and concurrent-run
branches are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(release): drive the integrity-manifest publish off the Releases API

The action decided slot occupancy, concurrent-run races and publish
success by probing the public release download URL. That URL is served
by a CDN that lags a fresh immutable release by 30-60s, so ~85% of runs
went red with "manifest not retrievable" even though every release
existed, and the re-runs minted byte-identical -rN slots.

Also fix a latent bug: `gh release create` without --target tags the
default-branch HEAD at creation time, not the commit the manifests
describe - 9 of 81 existing fm-* tags point at the wrong commit.

- Slot occupancy, race detection and verification go through the
  Releases API (strongly consistent): GET /releases/tags/<tag> 200 =
  taken, 404 = free, anything else fails loudly; both assets must be
  state=uploaded. An existing release is only skipped if complete - an
  incomplete one is a dead slot and fails closed, after a short grace
  for a concurrent run still attaching.
- `--target "$GITHUB_SHA"`, explicit `--repo`.
- The public URL is probed as a bounded soft check (warning, not
  failure) with a per-probe curl timeout.
- service/environment inputs validated against [a-z0-9-]; gh stderr
  flattened before it reaches a workflow command.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(release): keep the CDN probe inside its window

Cap the sleep between probes to the time left, so the soft check ends
at CDN_PROBE_TIMEOUT_SECONDS instead of overrunning by up to one
interval (review feedback).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…babylonlabs-io#2278)

* feat(ts-sdk): reconstruct peg-in parameters from a stranded pre-pegin

* chore(pr): comments

* chore(pr): comments

* chore(pr): comment
babylonlabs-io#2274)

* feat(vault): rebuild DepositTerms on presign resume; map typed deposit errors

* fix(vault): type presign rebuild refusals and gate them before the chain reads
…abs-io#2291)

* feat(ts-sdk, vault): reach the refund from a reconstruction

* chore(pr): additions

* chore(pr): additions

* chore(pr): comments

* chore(pr): comments
babylonlabs-io#2272)

* fix(ci): show the before and after pictures even when the set is large

The publish step caps what one pull request may add to the images branch at
512KB and refuses the whole set past it. Nothing on the composing side knew
that ceiling was there, so on babylonlabs-io#2241 five vault composites came to 678KB, the
publish was refused, and the comment fell back to the list of filenames the
pictures exist to replace.

visual-embed.mjs now owns a byte budget below that ceiling and fits the set
to it: the pictures are published at the first width in 1280/960/800/640 the
whole set fits under, so a run that moves one screen still publishes it at
the capture's own width and a run that moves five publishes all five,
smaller. Full resolution stays in the visual-report artifact, which the
comment already points at. Only when the smallest width still busts the
budget is a picture given up, from the bottom of the ranking, and the
comment already says how many it is not showing.

Also: publishes truecolour rather than RGBA, since every source is an opaque
screenshot and the alpha channel was around a tenth of the bytes; reduces to
an arbitrary width instead of a whole factor, so the rung under 1280 is 960
and not 640; and pins the order of the two caps in a test, which is the
check that was missing when they drifted apart.

* fix(ci): keep the picture set honest when it has to shrink

Averaging dropped the last source column and row - the right edge of the
rightmost panel and the bottom of the bottom panel, which is the hairline
the averaging exists to catch.

The byte budget gave up pictures from the tail of a global ranking, and the
vault screens sit at that tail, so a token repaint published a
Storybook-only comment. It now gives up from whichever surface is holding
the most, and a picture too large to fit on its own goes first rather than
evicting every picture that would have fit on the way to being dropped
itself. A picture that cannot be encoded costs that picture instead of the
whole comment, and anything given up is named in the comment rather than
only in the run log.

Also corrects three claims the code made about itself: the reason the
budget sits under the workflow ceiling, what keeps the alpha channel
constant, and that the ladder rung is a cap rather than a scale factor.

* fix(ci): correct the comments the width ladder made wrong

`panelLayout` still argued from the integer reduction this branch
deleted: two 1280px screens side by side were said to publish at 428px,
a third of life size. Under `reduceToWidth` they publish at 639px, half
life size - the conclusion survives, the arithmetic did not. Same figure
was repeated in the test.

`EMBED_MAX_WIDTH` is now rung 0 of the ladder rather than the width every
composite is reduced to, and `MAX_EMBEDDED_GROUPS` still promised there
was no third cap on the total when the byte budget is exactly that.

`screenCaption` reported its trim in capture rows without saying so, so a
reduced run read "trimmed to 1800px of 3000px" over a 900px-tall picture.
It now says which screen the number describes.

The ceiling guard also accepts a plain byte count, and is anchored to an
assignment line so the prose above the constant cannot be read as it.

* fix(ci): correct the panel width and two claims the last commit missed

The reduced side-by-side panel is 638px, not 639: at a factor of 2.00625 the
639th column straddles the gutter, and 639 + gutter + 639 does not fit 1280.
Measured against `reduceToWidth` rather than derived.

`panelLayout` was credited with keeping every composite inside the top rung.
It only bounds the side-by-side case; stacked and single composites are as
wide as their capture and stay inside the rung only because nothing captured
here is wider than it.

The byte-budget docblock still said anything given up is named in the
comment, twelve lines below the paragraph correcting that to a count in the
comment and names in the run log. The anchor rationale in the test cited
prose that is not in the workflow; the real reason is the bare-literal
branch making a run of digits enough to match.
…onlabs-io#2273)

* fix(release): publish the real version of each sibling package

Packages that depend on another package in this repo were published with
the wrong version of that dependency. wallet-connector's latest release
cannot be installed at all, and ts-sdk resolves a WASM build missing 14
of the 20 functions it calls.

The release now writes each sibling's real version into the manifest
before publishing, refuses to publish when any of those versions is
stale, a placeholder, or missing from npm, and creates git tags only
after a successful publish so a failed one can be retried.

* fix(release): address review on the sibling version gate

Unblocks the first release after merge: core-ui 1.109.0 is a git tag that
was never published, so pinning it would have aborted every run. All six
on-disk versions are now set to their latest release tag, which also makes
each package co-release and satisfy the gate.

Fixes a regression where releaseChangelog was filtered but releasePublish
was not, which would publish a dependent with no tag. Detects nx's on-disk
version fallback by checking the tag list rather than the version string,
keeps the range a workspace caret asked for, rejects any local protocol
that survives into a published manifest, and rethrows a failed tag push on
the prerelease path where nothing else creates the tag.

Adds a typecheck target and a dry-run rehearsal to CI, and takes the
release driver from 13 tests to 61.

* fix(release): tell a skipped publish apart from an unpublishable package

The new dry-run rehearsal in CI caught this on its first run. A project
missing from the publish results was treated as a package nx had no publish
target for, but nx also omits a project it skipped because one of its
dependencies failed - which is what every dry run does.

Publishability is now checked before publishing, where a private package can
be named directly, and a missing result afterwards is reported as the failed
publish it is.

* fix(release): only demand a release tag where the version becomes a pin

A package under the release globs that has never been released has no tag,
so checking every versioned project would block the whole release over a
package nothing depends on. The check now runs where the version is used
as a dependency pin, which is the only place a version read off disk can
do damage.

Also runs the release-driver typecheck through its nx target.

* fix(release): stop a release candidate publishing a stable dependent

nx bumps a dependent dragged in by `updateDependents` with a hardcoded
`patch` that ignores the preid. Dispatching an RC for the WASM package
therefore also versioned ts-sdk at a stable number, and the driver
published and stable-tagged it - pinned to the release-candidate engine.
A `next` dist-tag does not keep it away from consumers, because dist-tags
do not constrain semver range resolution, and the stable tag means no
later run ever republishes that number.

A prerelease run now publishes prereleases or nothing.

* docs(release): say what to do when a release stops

The runbook told you to hand-create a tag for a new package, which under
the sibling gate blocks every dependent's release with no forward path.
It also had nothing on the failure modes the gate introduces.

Adds the missing caveat to the new-package section and a table mapping
each message the driver can stop on to its recovery step.

* refactor(release): keep file-local helpers out of the module surface

`readJsonFile`, `isLocalDependencySpec`, `isPlaceholderVersion` and
`LOCAL_DEPENDENCY_PROTOCOLS` are only ever called a few lines below their
own definitions, while comparable helpers in the same files are already
private.

Also drops the `'(unnamed package)'` fallback on the consumer name. It is
unreachable - `readReleasePackages` throws on a nameless manifest and keys
the map by that name - and the only call site already holds the
authoritative name, so it is threaded in instead.

* docs(release): say which commit to put a restored tag on

"Tag the version that is actually on NPM" left out the part that matters.
Tagging `HEAD` makes nx read every unreleased commit before it as part of
the already-published version, so those changes drop out of the next
release entirely. The tag has to go on the commit that produced the
published version.

Also labels the output block, which is release output rather than a
command.

* fix(release): check a sibling the prerelease gate dropped from the run

`publishedByThisRun` is what suppresses both registry guards for a sibling,
so it has to mean "this run will actually publish it". It was derived from
`newVersion !== null`, which was the same predicate as the publish set until
the prerelease gate started dropping stable-numbered dependents from it.

A dropped project left marked published would have its version pinned into
a sibling with no check at all - the phantom pin this module exists to stop.
Derives the flag from the publish set instead, so a dropped sibling falls
through to the release-tag and registry checks and the run stops loudly.

* fix(release): fail a prerelease run the gate leaves empty

"No project release needed" was covering two different outcomes. It is true
when nx bumped nothing; it is false when nx bumped projects and every one of
them was gated out for not being a prerelease - that run published nothing
and exited 0, which is how a preid that never reached the version step would
look like success.

* docs(release): correct two rows of the failure table

`latestStableVersion` filters prereleases out before that version is
reported, so "a range or a prerelease" named a cause the error cannot have.

`readReleasePackages` rejects any `release.projects` entry that is not
`<directory>/*`, so narrowing that config is not a recovery - following it
trades one stopped release for another.
* feat(wasm): add tx-graph v3 support

* chore(pr): regenerate docs

* chore(pr): comment
* feat(ledger-vault-signer): read master fingerprint and verbatim account xpub

The default wallet policy and the PoP input's TAP_BIP32_DERIVATION both
need the device master fingerprint, and the policy key info must embed the
device's own xpub serialization — the firmware byte-compares it.

* feat(ledger-vault-signer, wallet-connector, ts-sdk): ledger BIP-322 proof of possession

* feat(ledger-vault-signer, wallet-connector, ts-sdk, vault): ledger Pre-PegIn wallet-policy path

* fix(ts-sdk, ledger-vault-signer): regenerate API docs; bound hardened policy indices

* docs(ts-sdk): align supportsDepositApproval docs; test coinType overflow

* fix(wallet-connector): mark bitcoinjs-lib as ESM for bundled CJS interop

* feat(ledger-vault): skip the redundant re-ceremony at Pre-PegIn broadcast

* feat(ledger-vault): complete the depositor deposit → payout flow

* fix(ledger-sdk): fix review comments

* fix(ledger-vault): reject a device whose xpub and depositor key disagree

* fix(ledger-vault): broken build
* feat(vault): align the fee breakdown rows with the v3 row system

* feat(vault): restyle the withdraw and refund flows

* feat(vault): add the disabled-deposit states to Overview and Vaults
babylonlabs-io#2296)

* fix(vault): stop the collateral stat column collapsing under its label

* fix(vault): compress the stat columns in the 1280-1439 band instead of clipping
…iew (babylonlabs-io#2280)

* feat(vault): chart the live position on the embedded liquidation preview

* feat(vault): retire the liquidation analysis chart feature flag

* fix(vault): exclude activating vaults, guard empty cascades, recompute at the simulated price

* test(vault): assert the selected cascade result identity in the preview tests

* style(vault): drop a stray blank line left by the rebase
…y page (babylonlabs-io#2286)

* feat(vault): show the per-row USD value on activity rows

The Figma "after deposit" Activity frame carries a USD sub-line under each
row's amount; the v3 restyle deferred it because ActivityLog only had a
preformatted token amount.

ActivityAmount now also carries the amount as a plain number, set wherever
the source knows it unambiguously, and the row derives the sub-line from
that number times the CURRENT price out of usePrices — the same Chainlink
source the dashboard and deposit form read. There is no historical price
plumbing in the activity projection, so an old row's USD value reflects
today's price, not the price when the transaction happened.

A row that cannot be priced — unknown symbol, no numeric amount, or a
non-positive product — renders no sub-line rather than "$0 USD".

* fix(vault): derive the deposit row status from live vault state

A settled Deposit row read "In use" purely because of its row type, so a
deposit that had since been withdrawn kept claiming its collateral was
locked.

The row now correlates the deposit with current vault state. The join is
`ActivityLog.vaultId` against `Vault.id` — the only correlation the row
type documents as safe, since an indexed row's `id` is its event, not its
vault. A vault still at `ContractStatus.ACTIVE` reads "In use"; one that
has left ACTIVE — redeemed, withdrawn, liquidated, expired — reads "Done".

The vault ids come from `useVaults(ethAddress)` in ActivityListWithRefund,
which shares its query key with the deposit lifecycle already mounted
there, so this adds no fetch. The set is undefined until that read
resolves, and an undefined set (or a row with no vault id) keeps the
type-derived label rather than flashing a status the data has not
confirmed. Pending and expired keep taking precedence.
babylonlabs-io#2298)

* feat(ledger-vault, vault): typed device errors, signing cancel, no version pin

* fix(vault): bind signing cancel to the originating provider
…bs-io#2299)

* feat(ts-sdk): verify P2WPKH depositor signatures host-side

* fix(ts-sdk): derive and enforce MockBitcoinWallet key consistency

* docs(ts-sdk): regenerate API docs for the P2WPKH verifiers
babylonlabs-io#2300)

* fix(vault, ledger-vault): stop the payout loop on cancel; honest cancel copy

* test(vault): split the cancellation tests into one-behavior cases
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
stakefish-babylon-dashboard Error Error Aug 24, 2026 11:00am

Request Review

@github-actions

Copy link
Copy Markdown

Critical path PR

This PR touches files defined as critical in CLAUDE.md. Changes here handle irreversible value movement - silent bugs produce wrong BTC amounts.

Paths touched:

  • packages/babylon-ledger-vault-signer/scripts/check-dist-types.cjs
  • packages/babylon-ledger-vault-signer/scripts/gen_command_traces.py
  • packages/babylon-ledger-vault-signer/scripts/gen_vectors.py
  • packages/babylon-ledger-vault-signer/scripts/requirements.txt
  • packages/babylon-ledger-vault-signer/src/__tests__/derivation.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/dmkApduSender.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/dmkRawApduSender.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/dmkSession.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/e2e/peginFixture.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/e2e/speculos.e2e.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/e2e/speculosClient.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/e2e/speculosClient.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/envelope.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/expectedSignatures.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/intentTlv.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/policyPsbt.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/popPsbt.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/rawApdu.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/signPsbt.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/signPsbtLoop.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/signPsbtMerge.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/signPsbtPrepare.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/tapLeafHash.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/varint.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/vaultCommands.test.ts
  • packages/babylon-ledger-vault-signer/src/__tests__/walletPolicy.test.ts
  • packages/babylon-ledger-vault-signer/src/bip86Path.ts
  • packages/babylon-ledger-vault-signer/src/derivation.ts
  • packages/babylon-ledger-vault-signer/src/deviceCaps.ts
  • packages/babylon-ledger-vault-signer/src/dmkApduSender.ts
  • packages/babylon-ledger-vault-signer/src/dmkSession.ts
  • packages/babylon-ledger-vault-signer/src/envelope.ts
  • packages/babylon-ledger-vault-signer/src/errors.ts
  • packages/babylon-ledger-vault-signer/src/expectedSignatures.ts
  • packages/babylon-ledger-vault-signer/src/index.ts
  • packages/babylon-ledger-vault-signer/src/intentTlv.ts
  • packages/babylon-ledger-vault-signer/src/policyPsbt.ts
  • packages/babylon-ledger-vault-signer/src/popPsbt.ts
  • packages/babylon-ledger-vault-signer/src/rawApdu.ts
  • packages/babylon-ledger-vault-signer/src/signPsbt.ts
  • packages/babylon-ledger-vault-signer/src/signPsbtLoop.ts
  • packages/babylon-ledger-vault-signer/src/signPsbtMerge.ts
  • packages/babylon-ledger-vault-signer/src/signPsbtPrepare.ts
  • packages/babylon-ledger-vault-signer/src/tapLeafHash.ts
  • packages/babylon-ledger-vault-signer/src/types.ts
  • packages/babylon-ledger-vault-signer/src/vaultCommands.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/LICENSE
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/README.md
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/buffertools.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/clientCommands.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/clientCommands.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/merkelizedPsbt.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/merkle.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/merkleMap.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/policy.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/psbtv2.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/varint.golden.test.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/command-traces/deposit-flow__claimer_payout__2.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/command-traces/deposit-flow__pre_pegin__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/command-traces/generated__deposit-flow__depositor_graph__1.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/command-traces/generated__deposit-flow__pegin__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/command-traces/index.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/command-traces/synthetic__deep_tree.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/merkle_mth.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__claimer_payout__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__claimer_payout__1.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__claimer_payout__2.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__claimer_payout__3.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__claimer_payout__4.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__1.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__2.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__3.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__4.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__5.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__6.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__7.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__depositor_graph__8.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__pegin__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/deposit-flow__pre_pegin__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/generated__deposit-flow__claimer_payout__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/generated__deposit-flow__depositor_graph__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/generated__deposit-flow__depositor_graph__1.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/generated__deposit-flow__depositor_graph__2.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/generated__deposit-flow__pegin__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/signpsbt/generated__deposit-flow__pre_pegin__0.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/__tests__/vectors/varint.json
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/buffertools.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/clientCommands.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/merkelizedPsbt.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/merkle.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/merkleMap.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/policy.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/psbtv2.ts
  • packages/babylon-ledger-vault-signer/src/vendor/ledger-bitcoin/varint.ts
  • packages/babylon-ledger-vault-signer/src/walletPolicy.ts
  • packages/babylon-tbv-rust-wasm/scripts/build-wasm.js
  • packages/babylon-tbv-rust-wasm/src/index-node.ts
  • packages/babylon-tbv-rust-wasm/src/index.ts
  • packages/babylon-ts-sdk/src/tbv/core/clients/eth/onChainBtcPubkey.ts
  • packages/babylon-ts-sdk/src/tbv/core/managers/PeginManager.ts
  • packages/babylon-ts-sdk/src/tbv/core/primitives/psbt/payout.ts
  • packages/babylon-ts-sdk/src/tbv/core/services/deposit/signDepositorGraph.ts
  • packages/babylon-ts-sdk/src/tbv/core/vault-secrets/__tests__/expand.test.ts
  • packages/babylon-ts-sdk/src/tbv/core/vault-secrets/deriveVaultRoot.ts
  • packages/babylon-ts-sdk/src/tbv/core/vault-secrets/index.ts
  • packages/babylon-ts-sdk/src/tbv/integrations/aave/utils/vaultSplit.ts
  • services/vault/src/hooks/deposit/depositFlowSteps/payoutSigning.ts
  • services/vault/src/services/vault/vaultActivationService.ts

Required before merge:

  • Two code-owner approvals
  • Author can walk every changed line without an AI assistant open (generated golden vectors: reviewer-repeated re-derivation instead — see the per-path rule)
  • Per-path rule in CLAUDE.md is satisfied

@github-actions

Copy link
Copy Markdown

Visual regression

🖼️ 204 of 349 screens render differently than the merge-base.

vault - 20 of 20 screens changed

Showing 2 of 10 changed groups. The rest are in the full list at the end.

activity - 2 screens, 2 size-changed

desktop - 1280x860 to 1280x800 - before on top, after underneath

activity--desktop, merge-base on top and this PR underneath

mobile - 390x1059 to 390x844 - before on the left, after on the right

activity--mobile, merge-base on the left and this PR on the right

deposit-amount-entered - 2 screens, 2 added

desktop - added by this PR - after only

deposit-amount-entered--desktop, this PR only

mobile - added by this PR - after only

deposit-amount-entered--mobile, this PR only

storybook - 184 of 329 screens changed

Showing 3 of 43 changed groups. The rest are in the full list at the end.

components-data-display-charts-linechart - 14 screens, 14 added

animated - added by this PR - after only

components-data-display-charts-linechart--animated, this PR only

annotated-markers-clear - added by this PR - after only

components-data-display-charts-linechart--annotated-markers-clear, this PR only

12 more changed screens in this group - listed in full below.

components-data-display-charts-seizuremap - 18 screens, 18 added

all-liquidated - added by this PR - after only

components-data-display-charts-seizuremap--all-liquidated, this PR only

compact - added by this PR - after only

components-data-display-charts-seizuremap--compact, this PR only

16 more changed screens in this group - listed in full below.

components-data-display-charts-timeline - 20 screens, 20 added

area-series - added by this PR - after only

components-data-display-charts-timeline--area-series, this PR only

colliding-levels - added by this PR - after only

components-data-display-charts-timeline--colliding-levels, this PR only

18 more changed screens in this group - listed in full below.

All 204 changed screens
### vault
20 of 20 screens changed:
  size-changed  activity--desktop.png
  size-changed  activity--mobile.png
  added         deposit-amount-entered--desktop.png
  added         deposit-amount-entered--mobile.png
  added         deposit-connected--desktop.png
  added         deposit-connected--mobile.png
  added         deposit-form--desktop.png
  added         deposit-form--mobile.png
  added         deposit-split-options--desktop.png
  added         deposit-split-options--mobile.png
  added         explore--desktop.png
  added         explore--mobile.png
  added         liquidations--desktop.png
  added         liquidations--mobile.png
  added         loans--desktop.png
  added         loans--mobile.png
  size-changed  overview--desktop.png
  size-changed  overview--mobile.png
  added         vaults--desktop.png
  added         vaults--mobile.png
### storybook
184 of 329 screens changed:
  changed       components-containers-panels-dismissiblesubsection--default.png (0.181% of pixels)
  changed       components-containers-panels-dismissiblesubsection--with-custom-styles.png (0.214% of pixels)
  changed       components-containers-panels-dismissiblesubsection--without-icon.png (0.181% of pixels)
  added         components-data-display-charts-linechart--animated.png
  added         components-data-display-charts-linechart--annotated-markers-clear.png
  added         components-data-display-charts-linechart--annotated-markers-colliding.png
  added         components-data-display-charts-linechart--annotated-markers-crowded.png
  added         components-data-display-charts-linechart--custom-color.png
  added         components-data-display-charts-linechart--default.png
  added         components-data-display-charts-linechart--fitted-y-domain.png
  added         components-data-display-charts-linechart--grid-none.png
  added         components-data-display-charts-linechart--hover-anywhere.png
  added         components-data-display-charts-linechart--narrow.png
  added         components-data-display-charts-linechart--rate-history.png
  added         components-data-display-charts-linechart--single-point.png
  added         components-data-display-charts-linechart--squarer-aspect.png
  added         components-data-display-charts-linechart--stepped.png
  added         components-data-display-charts-seizuremap--all-liquidated.png
  added         components-data-display-charts-seizuremap--compact.png
  added         components-data-display-charts-seizuremap--compressed-share-axis.png
  added         components-data-display-charts-seizuremap--dropout-ladder.png
  added         components-data-display-charts-seizuremap--full.png
  added         components-data-display-charts-seizuremap--grid-dotted.png
  added         components-data-display-charts-seizuremap--grid-horizontal-only.png
  added         components-data-display-charts-seizuremap--grid-none.png
  added         components-data-display-charts-seizuremap--grid-solid.png
  added         components-data-display-charts-seizuremap--hidden-labels.png
  added         components-data-display-charts-seizuremap--long-labels.png
  added         components-data-display-charts-seizuremap--narrow.png
  added         components-data-display-charts-seizuremap--no-price-line-label.png
  added         components-data-display-charts-seizuremap--no-share-legend.png
  added         components-data-display-charts-seizuremap--partially-liquidated.png
  added         components-data-display-charts-seizuremap--price-line-custom-colors.png
  added         components-data-display-charts-seizuremap--simulator.png
  added         components-data-display-charts-seizuremap--vault-configuration.png
  added         components-data-display-charts-timeline--area-series.png
  added         components-data-display-charts-timeline--colliding-levels.png
  added         components-data-display-charts-timeline--compact.png
  added         components-data-display-charts-timeline--crosshair.png
  added         components-data-display-charts-timeline--full.png
  added         components-data-display-charts-timeline--grid-horizontal-solid.png
  added         components-data-display-charts-timeline--grid-none.png
  added         components-data-display-charts-timeline--hidden-labels.png
  added         components-data-display-charts-timeline--line-series.png
  added         components-data-display-charts-timeline--many-events.png
  added         components-data-display-charts-timeline--narrow.png
  added         components-data-display-charts-timeline--no-candles.png
  added         components-data-display-charts-timeline--no-gutter-line-series.png
  added         components-data-display-charts-timeline--no-gutter.png
  added         components-data-display-charts-timeline--no-safe-zone.png
  added         components-data-display-charts-timeline--pannable.png
  added         components-data-display-charts-timeline--simulator.png
  added         components-data-display-charts-timeline--tight-safe-zone.png
  added         components-data-display-charts-timeline--two-tick-axis.png
  added         components-data-display-charts-timeline--zoomable.png
  added         components-data-display-indicators-banner--critical.png
  added         components-data-display-indicators-banner--notice.png
  added         components-data-display-indicators-callout--error.png
  added         components-data-display-indicators-callout--info-strong.png
  added         components-data-display-indicators-callout--info.png
  added         components-data-display-indicators-callout--long-body.png
  added         components-data-display-indicators-callout--success.png
  added         components-data-display-indicators-callout--warning.png
  added         components-data-display-indicators-callout--with-actions.png
  added         components-data-display-indicators-callout--without-title.png
  changed       components-data-display-indicators-loader--default.png (0.031% of pixels)
  added         components-data-display-indicators-notification--all-variants.png
  added         components-data-display-indicators-notification--error-inline-actions.png
  added         components-data-display-indicators-notification--halted.png
  added         components-data-display-indicators-notification--info-dismissible.png
  added         components-data-display-indicators-notification--paused.png
  added         components-data-display-indicators-notification--success.png
  added         components-data-display-indicators-notification--suggestion-below-actions.png
  added         components-data-display-indicators-notification--warning-no-icon-with-label.png
  added         components-data-display-indicators-notification--warning-with-suggestion.png
  added         components-data-display-indicators-topbanner--non-dismissible-alert.png
  changed       components-data-display-indicators-warning--custom-alt-text.png (0.029% of pixels)
  changed       components-data-display-indicators-warning--custom-styled.png (0.029% of pixels)
  changed       components-data-display-indicators-warning--default.png (0.029% of pixels)
  changed       components-data-display-indicators-warning--long-text.png (0.029% of pixels)
  changed       components-data-display-typography-text--default.png (0.100% of pixels)
  changed       components-footer--default.png (1.436% of pixels)
  changed       components-footer--with-custom-links.png (1.069% of pixels)
  changed       components-footer--with-custom-year.png (1.436% of pixels)
  changed       components-header--with-multiple-nav-items.png (0.023% of pixels)
  added         components-identity-icons-icons--warning-icon-variants.png
  changed       components-inputs-controls-select--custom-selected-display.png (0.015% of pixels)
  changed       components-inputs-controls-select--default.png (0.015% of pixels)
  changed       components-inputs-controls-select--disabled-options-with-tooltip.png (0.016% of pixels)
  changed       components-inputs-controls-select--responsive-truncation.png (0.040% of pixels)
  changed       components-inputs-controls-select--various-text-lengths.png (0.051% of pixels)
  added         components-sidebar--default.png
  changed       components-stepper--all-pending.png (0.268% of pixels)
  changed       components-stepper--default.png (0.151% of pixels)
  changed       components-stepper--with-descriptions.png (0.134% of pixels)
  changed       components-tabs--controlled.png (0.016% of pixels)
  changed       components-tabs--simple-variant.png (0.044% of pixels)
  changed       elements-data-display-collections-list--adaptive-regular.png (0.025% of pixels)
  changed       elements-data-display-collections-list--horizontal-regular.png (0.016% of pixels)
  changed       elements-data-display-collections-list--long-content-horizontal.png (0.041% of pixels)
  changed       elements-data-display-collections-list--long-content-vertical.png (0.047% of pixels)
  changed       elements-data-display-collections-list--vertical-regular.png (0.016% of pixels)
  changed       elements-data-display-collections-list--with-stat-items.png (0.037% of pixels)
  changed       elements-data-display-collections-providerslist--default.png (0.021% of pixels)
  changed       elements-data-display-collections-providerslist--mixed-providers.png (0.027% of pixels)
  changed       elements-data-display-collections-providerslist--without-logos.png (0.016% of pixels)
  changed       elements-data-display-collections-simpletable--long-names.png (0.011% of pixels)
  changed       elements-data-display-collections-simpletable--multiple-pairs.png (0.011% of pixels)
  changed       elements-data-display-collections-simpletable--single-pair.png (0.011% of pixels)
  changed       elements-data-display-collections-table--controlled-selection.png (0.072% of pixels)
  changed       elements-data-display-collections-table--custom-configuration.png (0.083% of pixels)
  changed       elements-data-display-collections-table--default.png (0.064% of pixels)
  changed       elements-data-display-collections-table--frozen-columns.png (0.075% of pixels)
  changed       elements-data-display-collections-table--header-visibility.png (0.051% of pixels)
  changed       elements-data-display-collections-table--style-presets.png (0.089% of pixels)
  changed       elements-data-display-containers-accordion--default.png (0.011% of pixels)
  changed       elements-data-display-keyvaluelist--default.png (0.065% of pixels)
  changed       elements-data-display-keyvaluelist--formatted-addresses.png (0.179% of pixels)
  changed       elements-data-display-keyvaluelist--long-content.png (0.143% of pixels)
  changed       elements-data-display-keyvaluelist--small.png (0.035% of pixels)
  changed       elements-data-display-keyvaluelist--with-react-node.png (0.049% of pixels)
  changed       elements-data-display-keyvaluelist--without-divider.png (0.065% of pixels)
  changed       elements-data-display-providers-finalityprovideritem--long-names.png (0.029% of pixels)
  changed       elements-data-display-providers-finalityprovideritem--without-provider-logo.png (0.010% of pixels)
  changed       elements-data-display-providers-tableelement--default.png (0.026% of pixels)
  changed       elements-data-display-providers-tableelement--not-selectable.png (0.026% of pixels)
  changed       elements-data-display-providers-tableelement--selected.png (0.026% of pixels)
  changed       elements-data-display-providers-tableelement--without-header.png (0.026% of pixels)
  changed       elements-inputs-controls-amountitem--default.png (0.033% of pixels)
  changed       elements-inputs-controls-numberfield--default.png (0.054% of pixels)
  changed       elements-inputs-controls-selectfield--default.png (0.037% of pixels)
  changed       elements-inputs-controls-textfield--default.png (0.053% of pixels)
  changed       widgets-menus-settingmenu--default.png (0.065% of pixels)
  changed       widgets-menus-settingmenu--with-theme-toggle.png (0.065% of pixels)
  changed       widgets-menus-settingsmenupresets--default.png (0.065% of pixels)
  added         widgets-menus-walletmenu--btc-eth-no-inscriptions.png
  changed       widgets-modals-previewmodal--default.png (0.011% of pixels)
  changed       widgets-modals-rewardspreviewmodal--default.png (0.046% of pixels)
  changed       widgets-modals-rewardspreviewmodal--long-token-list.png (0.072% of pixels)
  changed       widgets-modals-rewardspreviewmodal--one-receiving-token.png (0.021% of pixels)
  changed       widgets-modals-rewardspreviewmodal--tokens-without-icons.png (0.034% of pixels)
  changed       widgets-modals-validatorselector--confirm-footer-no-back.png (0.390% of pixels)
  changed       widgets-modals-validatorselector--default.png (0.807% of pixels)
  changed       widgets-modals-validatorselector--grid-layout.png (0.241% of pixels)
  changed       widgets-modals-validatorselector--grid-with-filter-and-confirm.png (0.216% of pixels)
  changed       widgets-modals-validatorselector--with-confirm-footer.png (0.608% of pixels)
  changed       widgets-modals-validatorselector--with-filter.png (0.674% of pixels)
  changed       widgets-rewards-activitycard--basic.png (0.020% of pixels)
  changed       widgets-rewards-activitycard--complete.png (0.054% of pixels)
  changed       widgets-rewards-activitycard--error-state.png (0.014% of pixels)
  changed       widgets-rewards-activitycard--large-amount.png (0.016% of pixels)
  changed       widgets-rewards-activitycard--with-icon.png (0.015% of pixels)
  changed       widgets-rewards-activitycard--with-list-items.png (0.031% of pixels)
  changed       widgets-rewards-activitycard--with-optional-details.png (0.043% of pixels)
  changed       widgets-rewards-activitycard--with-primary-action.png (0.027% of pixels)
  changed       widgets-rewards-activitycard--with-secondary-actions.png (0.018% of pixels)
  changed       widgets-rewards-costakingamountitem--default.png (0.017% of pixels)
  changed       widgets-rewards-costakingamountitem--with-custom-class.png (0.012% of pixels)
  changed       widgets-rewards-costakingrewardssubsection--default.png (0.064% of pixels)
  changed       widgets-rewards-costakingrewardssubsection--disabled-claim.png (0.064% of pixels)
  changed       widgets-rewards-costakingrewardssubsection--large-numbers.png (0.064% of pixels)
  changed       widgets-rewards-costakingrewardssubsection--no-avatar.png (0.064% of pixels)
  changed       widgets-rewards-costakingrewardssubsection--without-co-staking-bonus.png (0.036% of pixels)
  changed       widgets-rewards-rewardssubsection--default.png (0.032% of pixels)
  changed       widgets-rewards-rewardssubsection--disabled-claim.png (0.032% of pixels)
  changed       widgets-rewards-rewardssubsection--multiple-rewards.png (0.061% of pixels)
  changed       widgets-sections-amountslider--default.png (0.019% of pixels)
  changed       widgets-sections-amountslider--rainbow-variant.png (0.018% of pixels)
  changed       widgets-sections-amountslider--with-custom-active-color.png (0.012% of pixels)
  changed       widgets-sections-amountslider--with-custom-background-color.png (0.229% of pixels)
  changed       widgets-sections-amountslider--with-steps.png (0.019% of pixels)
  changed       widgets-staking-amountsubsection--bitcoin-currency.png (0.035% of pixels)
  changed       widgets-staking-amountsubsection--custom-min-step.png (0.031% of pixels)
  changed       widgets-staking-amountsubsection--default.png (0.041% of pixels)
  changed       widgets-staking-amountsubsection--large-balance.png (0.040% of pixels)
  changed       widgets-staking-amountsubsection--no-auto-focus.png (0.029% of pixels)
  changed       widgets-staking-amountsubsection--no-prefix.png (0.041% of pixels)
  changed       widgets-staking-amountsubsection--restricted-decimals.png (0.035% of pixels)
  changed       widgets-staking-amountsubsection--small-balance.png (0.049% of pixels)
  changed       widgets-staking-amountsubsection--without-usd-price.png (0.023% of pixels)
  changed       widgets-staking-amountsubsection--zero-balance.png (0.025% of pixels)
  changed       widgets-staking-finalityprovidersubsection--at-maximum-capacity.png (0.025% of pixels)
  changed       widgets-staking-finalityprovidersubsection--multiple-items.png (0.018% of pixels)
  changed       widgets-staking-finalityprovidersubsection--providers-without-logos.png (0.018% of pixels)

10 screens pictured, cropped to the part that changed - a sample across the worst-hit groups on each surface, not a ranking. Full-resolution before / after / diff for every screen: open the run, download visual-report, open index.html.

If these changes are intentional there is nothing to update - this repo stores no baseline images. The baseline is recomputed from the merge-base on every run.

Compared 4ccda5a9dedad897f760e713c24fb1a45d57869f against the merge-base. Images are pruned when this pull request closes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.