Fork sync - #36
Open
mateumiralles wants to merge 1121 commits into
Open
Conversation
- restore curatedOperatorForm testid
- drop extra <div> wrapper in token-select, pass data-testid to <Note>
- widen Note props to allow data-testid override
- widen WeightChip, KeysItem, ParamSection, SummaryRow types
so data-testid is exposed in the public prop contract
- move default data-testid before {...props} in owner-chip
and icon-tooltip so callers can override
- use plain string literals (no template) in gate-card
- drop leftover fieldName arg in token-amount-input-hook-form
to match updated testableError signature
feat: added data attr for elements
* fix: update Node.js version to 24 and clean up workflow files * fix: add encryption and upload for Playwright report in CI workflows * fix: remove artifact upload and add Slack notification for skipped tests * feat: add Slack notification action for broken workflows * feat: add Slack notification action for broken workflows * fix: update Slack notification action to use environment variable for duty tag * fix: update Node.js version from 24 to 20 in workflow * fix: update Node.js version from 20 to 24 in workflow * fix: update navigation paths and improve test assertions for manager and rewards address pages * fix: increase test timeout to 60 minutes and update Slack notification condition for scheduled runs * fix: increase test timeout to 60 minutes and update Slack notification condition for scheduled runs * fix: update bond rewards reference in dashboard page open method * fix: update upload-artifact action to v7 and increase test timeout to 90 minutes
feat: iDVTC apply form and DVT description page
Badges used --lido-color-foreground as a stand-in for white, but lido-ui overrides it per theme (#fff light, #34343d dark), so labels on the fixed gradients were near-invisible in dark mode. Use primaryContrast, which is theme-invariant #fff. CM variants painted --lido-color-text, which also flips, so they move to textDark to keep white text legible. Counter branches on the variant since its non-curve backgrounds are theme-reactive.
Cards get a 220px minimum width and wrap into balanced rows, so four types show as 4-across on wide screens and 2+2 instead of 3+1 when there is no room for a full row.
Validate the resolved gateway URL instead of the raw template, so {cid} in the host (https://{cid}.ipfs.dweb.link) passes — the is-url host char class has no '{'. Path-style templates only passed before because the regex is unanchored.
Proofs resolve against the pinned CSM SDK, so a CSM_02 active operator could be reported as eligible to claim.
The graph read depositData via getValues, a one-shot read with no subscription, so the submitting-keys legend only appeared once an unrelated re-render happened (hovering a legend). Bind useWatch to a detached control when no form is above, keeping the hook unconditional.
useSmSDK(m) returns undefined unless m is active, so the CSM default curve id went missing on /create while a CSM_02 operator was selected. Same reason the DKG section must classify curveId against targetModule: per-module curve maps do not overlap, so the active module would hide the field the flow expects.
Shown on non-production stands, gated by IS_TEST_ENV. Ports lidofinance/ethereum-staking-widget#1182. Restrict the webpack svg rule with `issuer` so svgr does not intercept the banner's CSS url() background, and offset LayoutStyle's min-height by the banner height to avoid a permanent 60px scroll on every page. Also fixes two pre-existing header issues the banner exposed: the banner was caught in the mobile nav overlay's backdrop-filter, and the header's opaque background sat on the inset HeaderStyle rather than the bleeding HeaderWrapper, leaking page content through ~20px side gutters on narrow viewports.
The create page treated the `?type=` query param as authorization rather than a preselection, so /create?type=0x02 bypassed the hasOperatorIn check and allowed duplicate operators. useRequestedOperatorType now validates against a new creatableTypes set and ignores anything not currently creatable, falling back to plain /create behaviour.
useInvites resolved its SDK through useSmSDK(), which follows the active module. A wallet with no operator falls back to the primary module, so invites belonging to a secondary one were never fetched — on the semi-unified CSM build a CSM_02 invite left the inbox empty, the nav counter at zero and HAS_INVITES false. It now fans out over deployedModules the way operator discovery already does. Invites are module-qualified as a consequence: getInviteId carries the module (the radio value must be unique, or onChange resolves the wrong invite), the row gained a CurveBadge so the modules are told apart, and accepting resolves confirmAddress against the invite own module instead of the active one. The e2e inbox locators match the value by suffix. useAppendOperator now takes the module on the payload — it varies per event, not per render.
Type-scoped curve ids only exist in the module that owns the type, but useCurveParameters/useCurveMetadata defaulted to the active operator's SDK — so ICS/IDVTC parameters never resolved for a CSM_02 operator, and cross-module curve id comparison could report a type as already claimed.
- share one fetchAcrossModules helper between operator and invite discovery - collapse the no-op target/active SDK ternary into useTargetSmSDK - parameterize useDefaultCurveId and drop the CSM_02 clone - use the SDK's module capability sets instead of hand-rolled family checks - memoize useCanCreateNodeOperator, precompute the parameters table
feat: add test env banner
…gets feat: one CSM widget serving two modules — CSM and CSM 0x02
Creatability was implied by a single `creatableModules` list that mixed
module-level and type-level conditions. It is now a pure predicate per
type, named and unit-testable, surfaced as per-type show rules that the
create routes gate on. Answers the standing question: a wallet holding
only an IDVTC operator cannot create DEF - the ICS<->IDVTC pair is the
only sanctioned second CSM operator.
/create/{def,ics,idvtc,0x02} each pass an OPERATOR_TYPE literal into a
CreateTypeProvider, and the page title, submit-keys form, share-limit
banner, deposit queue and curve-derived FAQ figures read the type from
there instead of re-deriving it. /create lists the types the wallet can
create and sends a wallet with a single option straight to it, both when
resolving links and on page load. The ?type= query and the hook that
validated it are gone, so the flow no longer has two ways to learn the
operator type.
Curve ids are per-module and collide, so a curve id and its module now
travel together - a create page could otherwise read one module's curve
id against another module's registry and show a different type's
parameters.
- rename operator-type-modal/ to operator-type-cards/, dropping the modal,
its should-show hook and the header type badge that opened it
- move the create-type context to providers/ so shared/hooks no longer
imports a feature
- fold createOptions into useCanCreateNodeOperator, which already reads
every proof/paused query it needed - useShowFlags subscribed the tree
twice, per LocalLink and per Gate
- share the parameters-modal trigger between TypeButton and TypeBadgeButton,
and drop the badge's eager curve-parameters prefetch
- type cards go two-column (details | parameters); the submit-keys form
gets a header with back link, step track, title and selected type badge,
both rendered only when the wallet actually has a choice
- Default reads as "CSM 0x01" in copy
A curve id or operator id is only meaningful next to its module, so producers and consumers pass CurveRef and OperatorRef instead of a bare id plus an implied module. Covers the curve producers/consumers and the switch-operator flow.
One useCanCreateNodeOperator mega-hook became a shared/hooks/can-create folder: useCanCreate0x01/0x02/ICS/IDVTC/CM compose from useModuleOpen, useHasOperatorIn and useCanCreatePairedType, and the aggregate is their disjunction. useShowRule reads each type flag directly, so CAN_CREATE_* no longer round-trips through a creatableTypes array. isOpen drops its deployedModules guard because a non-deployed module has no SDK and its query never enables; isPending keeps the guard, since a disabled react-query stays pending forever. Guards move from CreateOperatorRoute into the four pages/create/* files, matching how every other page declares its own gate ladder.
- address the card CTA through its link: the type badge is a button now, so
`card.getByRole('button')` hit two elements
- `MainPage.openCreateForm()` walks the type-selection page when a wallet has
several creatable types (Hoodi deploys CSM_02 next to CSM)
- assert the created type on `createTypeBadge`, not the page title
- re-adopt the parameters-modal coverage lost with headerBadge.spec, now
driven from the create-page badge
The create type reaches the submit-keys form as a prop rather than through context, so CreateTypeProvider shrinks to the route-level literal. The DKG files section gates on that type instead of the curve, the back button folds into StepTrack, and the selected type renders in a Latice card.
useSmSDK(module) is a plain lookup - that module's SDK whether or not it is active, undefined when the module is not deployed - and useActiveSmSDK(module) returns it only while it is the active operator's module, which is what operator-scoped queries want as their `enabled` gate. useSmSDKByModule goes; useSmSDK(undefined) keeps returning undefined. The hand-maintained MODULE_AVAILABILITY table is replaced by the SDK's own MODULE_CONFIG, and deployedModules.includes() checks become the honest !!sdk predicate they stood in for. Fixes carried along: - useCuratedGatesEligibility gated on a predicate weaker than the query it guards - pages/create/index.tsx routed by isModuleCSM, so a CSM_02-primary deployment reached the CM-only CreateNodeOperatorPage instead of SelectTypePage - fetch-across-modules restores the falsy-sdk filter the Object.entries refactor dropped, avoiding a synchronous throw inside entries.map
…tions/setup-node-7 chore(deps): bump actions/setup-node from 6 to 7
fast-uri resolution 3.1.5 -> 3.1.6 (CVE-2026-75899/75931/75975/76172). ua-parser-js scoped under lido-shared-ui, which pins 2.0.3 exactly, so the resolution is the only route to 2.0.10 (CVE-2026-48125 ReDoS).
A sole new 0x02 operator becomes active, flipping the module to CSM_02 and turning the apply-form flag off, which hid the ICS/IDVTC cards on /create while the per-type route gates still allowed them. Only the apply fallback depends on that flag now. The DEF gate itself refuses a wallet holding an unconsumed ICS/IDVTC proof, so /create/0x01 and the card agree.
Appending flips the CAN_CREATE_* gate on the create page, whose Navigate fallback pushed /create and cancelled the in-flight push to /.
feat: restyle create-operator flow as a 2-step layout
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.
Fork sync